import 'package:flutter/material.dart'; /// FikoYT Stüdyo tasarım token'ları — design system'in semantic + ölçek katmanı. /// Akademik denetim (Material 3 token hiyerarşisi, 8pt grid, modüler tipografi, /// WCAG 2.2 kontrast, Material Motion easing) sonrası eklendi. Ham hex/literal /// değerler ekranlardan buraya taşınır; tek doğruluk kaynağı. /// Boşluk skalası — 4pt tabanlı grid (8pt grid uyumlu). abstract final class FikoBosluk { static const xs = 4.0; static const sm = 8.0; static const md = 12.0; static const lg = 16.0; static const xl = 24.0; static const xxl = 32.0; } /// Köşe yarıçapı skalası (M3 shape scale). abstract final class FikoYaricap { static const xs = 4.0; static const sm = 8.0; static const md = 12.0; static const lg = 16.0; static const tam = 999.0; static BorderRadius get rXs => BorderRadius.circular(xs); static BorderRadius get rSm => BorderRadius.circular(sm); static BorderRadius get rMd => BorderRadius.circular(md); static BorderRadius get rLg => BorderRadius.circular(lg); } /// Tipografik ramp — modüler skala (~1.2). Dağınık literal fontSize yerine. abstract final class FikoTipo { static const baslikL = TextStyle(fontSize: 18, fontWeight: FontWeight.w800); static const baslikM = TextStyle(fontSize: 15, fontWeight: FontWeight.w700); static const baslikS = TextStyle(fontSize: 13, fontWeight: FontWeight.w700); static const govde = TextStyle(fontSize: 12.5, fontWeight: FontWeight.w500); static const govdeK = TextStyle(fontSize: 11.5); static const etiket = TextStyle(fontSize: 10.5, fontWeight: FontWeight.w600); static const mikro = TextStyle(fontSize: 10); } /// Hareket (motion) token'ları — süre + easing. Material emphasized/standard. abstract final class FikoHareket { static const aninda = Duration(milliseconds: 100); static const kisa = Duration(milliseconds: 150); static const orta = Duration(milliseconds: 250); static const uzun = Duration(milliseconds: 400); static const vurgulu = Duration(milliseconds: 500); /// Material 3 standart easing (giriş+çıkış). static const standart = Cubic(0.2, 0, 0, 1); /// Material 3 emphasized — dikkat çeken geçişler. static const vurguluEgri = Cubic(0.05, 0.7, 0.1, 1); static const cikis = Curves.easeOutCubic; static const giris = Curves.easeInCubic; /// Bırakma/yerleşme (drop settle) — hafif yaylanma. static const yay = Curves.easeOutBack; } /// Gölge / derinlik (elevation) token'ları — şekil-zemin ayrımı + premium his. abstract final class FikoGolge { /// Kart düzeyi yumuşak gölge (tema parlaklığına göre). static List kart(bool koyu) => [ BoxShadow( color: koyu ? Colors.black.withValues(alpha: 0.28) : const Color(0xFF4B4B78).withValues(alpha: 0.10), blurRadius: 16, offset: const Offset(0, 4), ), ]; /// Hover/aktif kart — yükselen gölge. static List hover(bool koyu) => [ BoxShadow( color: koyu ? Colors.black.withValues(alpha: 0.40) : const Color(0xFF4B4B78).withValues(alpha: 0.18), blurRadius: 24, offset: const Offset(0, 8), ), ]; /// Neon glow (vurgu/seçili öğeler için tutarlı parıltı). static List glow(Color renk, {double guc = 0.3, double yaricap = 18}) => [ BoxShadow( color: renk.withValues(alpha: guc), blurRadius: yaricap, spreadRadius: -2, ), ]; } /// Durum katmanı (state layer) opaklıkları — M3 standardı. abstract final class FikoDurum { static const hover = 0.08; static const focus = 0.12; static const pressed = 0.12; static const secili = 0.16; } /// WCAG 2.2 erişilebilir neon varyantları. /// Koyu temada ham neon (zemin koyu → kontrast yeterli), açık temada /// koyulaştırılmış varyant (≥4.5:1) döner. METİN için kullanılır; ham neon /// yalnız glow/dolgu için. Denetim bulgusu: açık temada ham neon ~1.5:1. abstract final class FikoNeon { static const _acikVaryant = { 0xFF9D4EDD: Color(0xFF7B2FB5), // mor 0xFF00E5FF: Color(0xFF0088A8), // cyan 0xFFFF2E93: Color(0xFFC71E6E), // pembe 0xFF39FF88: Color(0xFF1F9D5A), // yeşil 0xFFFFB300: Color(0xFFB37A00), // amber }; /// Verilen neon rengin tema-güvenli METİN varyantı. static Color metin(BuildContext context, Color neon) { if (Theme.of(context).brightness == Brightness.dark) return neon; return _acikVaryant[neon.toARGB32()] ?? neon; } }