import 'package:flutter/material.dart'; abstract final class FikoRenkler { static const neonMor = Color(0xFF9D4EDD); static const neonCyan = Color(0xFF00E5FF); static const neonPembe = Color(0xFFFF2E93); static const neonYesil = Color(0xFF39FF88); static const neonAmber = Color(0xFFFFB300); static const koyuZemin = Color(0xFF0B0D14); static const koyuYuzey = Color(0xFF141826); static const koyuKart = Color(0xFF1A1F32); static const koyuCizgi = Color(0xFF2A3050); static const acikZemin = Color(0xFFF3F4FA); static const acikYuzey = Color(0xFFFFFFFF); static const acikKart = Color(0xFFF8F9FF); static const acikCizgi = Color(0xFFDDE1F0); } /// Null-fontSize'lı rolleri bozmadan tüm tipografiyi [k] oranında ölçekler. /// (TextTheme.apply(fontSizeFactor:) null fontSize'da assertion atar.) TextTheme _kompaktTipo(TextTheme t, double k) { TextStyle? f(TextStyle? s) => s == null || s.fontSize == null ? s : s.copyWith(fontSize: s.fontSize! * k); return t.copyWith( displayLarge: f(t.displayLarge), displayMedium: f(t.displayMedium), displaySmall: f(t.displaySmall), headlineLarge: f(t.headlineLarge), headlineMedium: f(t.headlineMedium), headlineSmall: f(t.headlineSmall), titleLarge: f(t.titleLarge), titleMedium: f(t.titleMedium), titleSmall: f(t.titleSmall), bodyLarge: f(t.bodyLarge), bodyMedium: f(t.bodyMedium), bodySmall: f(t.bodySmall), labelLarge: f(t.labelLarge), labelMedium: f(t.labelMedium), labelSmall: f(t.labelSmall), ); } abstract final class FikoTema { static ThemeData koyu() => _olustur( parlaklik: Brightness.dark, zemin: FikoRenkler.koyuZemin, yuzey: FikoRenkler.koyuYuzey, kart: FikoRenkler.koyuKart, cizgi: FikoRenkler.koyuCizgi, ); static ThemeData acik() => _olustur( parlaklik: Brightness.light, zemin: FikoRenkler.acikZemin, yuzey: FikoRenkler.acikYuzey, kart: FikoRenkler.acikKart, cizgi: FikoRenkler.acikCizgi, ); static ThemeData _olustur({ required Brightness parlaklik, required Color zemin, required Color yuzey, required Color kart, required Color cizgi, }) { final koyu = parlaklik == Brightness.dark; final sema = ColorScheme.fromSeed( seedColor: FikoRenkler.neonMor, brightness: parlaklik, surface: yuzey, primary: FikoRenkler.neonMor, secondary: FikoRenkler.neonCyan, tertiary: FikoRenkler.neonPembe, error: const Color(0xFFFF5370), ); final base = ThemeData(brightness: parlaklik); return ThemeData( useMaterial3: true, colorScheme: sema, scaffoldBackgroundColor: zemin, canvasColor: yuzey, dividerColor: cizgi, visualDensity: VisualDensity.compact, // Kompakt tipografi — Ant yoğunluğu. fontSizeFactor null-fontSize'lı // rollerde assertion atıyor; null-güvenli ölçekleme. textTheme: _kompaktTipo(base.textTheme, 0.92), cardTheme: CardThemeData( color: kart, // Şekil-zemin ayrımı için yumuşak gölge (denetim: flat kart sorunu). elevation: 3, shadowColor: koyu ? Colors.black : const Color(0xFF4B4B78), surfaceTintColor: Colors.transparent, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: BorderSide(color: cizgi), ), margin: EdgeInsets.zero, ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: koyu ? FikoRenkler.koyuYuzey : FikoRenkler.acikKart, isDense: true, contentPadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), border: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: cizgi), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: BorderSide(color: cizgi), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(8), borderSide: const BorderSide(color: FikoRenkler.neonMor, width: 1.4), ), labelStyle: const TextStyle(fontSize: 12.5), hintStyle: const TextStyle(fontSize: 12), ), chipTheme: ChipThemeData( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(8), side: BorderSide(color: cizgi), ), backgroundColor: yuzey, selectedColor: FikoRenkler.neonMor.withValues(alpha: 0.22), labelStyle: const TextStyle(fontSize: 11.5), padding: const EdgeInsets.symmetric(horizontal: 7, vertical: 2), ), sliderTheme: const SliderThemeData( showValueIndicator: ShowValueIndicator.onDrag, trackHeight: 2.5, ), tooltipTheme: TooltipThemeData( decoration: BoxDecoration( color: kart, borderRadius: BorderRadius.circular(8), border: Border.all(color: cizgi), ), textStyle: TextStyle( color: koyu ? Colors.white : Colors.black87, fontSize: 12, ), ), scrollbarTheme: ScrollbarThemeData( thumbVisibility: const WidgetStatePropertyAll(true), thickness: const WidgetStatePropertyAll(6), radius: const Radius.circular(3), ), pageTransitionsTheme: const PageTransitionsTheme(builders: { TargetPlatform.windows: FadeForwardsPageTransitionsBuilder(), }), ); } }