// GENERATED FILE — 손으로 고치지 마라. // 원본: design/design-tokens.md ( 머신블록) // 재생성: cd app && python3 tool/gen_tokens.py import 'dart:ui' show Color; /// 컬러 토큰. app 은 cosmic* 계열이 기본 서피스다(결정 D-19). abstract final class AppColors { static const primary = Color(0xFFB93074); // color-primary #b93074 static const onPrimary = Color(0xFFFFFFFF); // color-on-primary #ffffff static const primaryContainer = Color(0xFFFFE3F3); // color-primary-container #ffe3f3 static const onPrimaryContainer = Color(0xFF8A2E62); // color-on-primary-container #8a2e62 static const surface = Color(0xFFFAF7F9); // color-surface #faf7f9 static const surfaceContainer = Color(0xFFF0EAEE); // color-surface-container #f0eaee static const onSurface = Color(0xFF201826); // color-on-surface #201826 static const onSurfaceVariant = Color(0xFF55495A); // color-on-surface-variant #55495a static const outline = Color(0xFF7D7383); // color-outline #7d7383 static const error = Color(0xFFC53030); // color-error #c53030 static const onError = Color(0xFFFFFFFF); // color-on-error #ffffff static const webBackground = Color(0xFFFFFFFF); // web-background #ffffff static const webForeground = Color(0xFF201826); // web-foreground #201826 static const webPrimary = Color(0xFFB93074); // web-primary #b93074 static const webPrimaryForeground = Color(0xFFFFFFFF); // web-primary-foreground #ffffff static const webMuted = Color(0xFFF6F0F4); // web-muted #f6f0f4 static const webMutedForeground = Color(0xFF6E6878); // web-muted-foreground #6e6878 static const webBorder = Color(0xFFE9E2E8); // web-border #e9e2e8 static const cosmicVoid = Color(0xFF141414); // color-cosmic-void #141414 static const cosmicSurface = Color(0xFF101010); // color-cosmic-surface #101010 static const cosmicSurfaceContainer = Color(0xFF1A1A1C); // color-cosmic-surface-container #1A1A1C static const cosmicSurfaceRaised = Color(0xFF232324); // color-cosmic-surface-raised #232324 static const onCosmic = Color(0xFFFFFFFF); // color-on-cosmic #FFFFFF static const onCosmicVariant = Color(0xFFA3A2A0); // color-on-cosmic-variant #A3A2A0 static const onCosmicMuted = Color(0xFF767676); // color-on-cosmic-muted #767676 static const cosmicSheet = Color(0xFF2C2C2E); // color-cosmic-sheet #2C2C2E static const cosmicDialog = Color(0xFF2D2D2D); // color-cosmic-dialog #2D2D2D static const cosmicAccent = Color(0xFFFF7DDD); // color-cosmic-accent #FF7DDD static const onCosmicAccent = Color(0xFF141414); // color-on-cosmic-accent #141414 static const neonCyan = Color(0xFF64EFF9); // color-neon-cyan #64EFF9 static const onNeonCyan = Color(0xFF141414); // color-on-neon-cyan #141414 static const neonEmerald = Color(0xFF00C60C); // color-neon-emerald #00C60C static const onNeonEmerald = Color(0xFF141414); // color-on-neon-emerald #141414 static const neonMagenta = Color(0xFFFF4141); // color-neon-magenta #FF4141 static const onNeonMagenta = Color(0xFFFFFFFF); // color-on-neon-magenta #FFFFFF static const neonViolet = Color(0xFF6866F3); // color-neon-violet #6866F3 static const onNeonViolet = Color(0xFFFFFFFF); // color-on-neon-violet #FFFFFF static const cosmicMint = Color(0xFF56CD9E); // color-cosmic-mint #56CD9E static const onCosmicMint = Color(0xFF141414); // color-on-cosmic-mint #141414 static const cosmicBlue = Color(0xFF52C1F9); // color-cosmic-blue #52C1F9 static const onCosmicBlue = Color(0xFF141414); // color-on-cosmic-blue #141414 static const cosmicOrange = Color(0xFFE4975D); // color-cosmic-orange #E4975D static const onCosmicOrange = Color(0xFF141414); // color-on-cosmic-orange #141414 static const cosmicTeal = Color(0xFF4BC2AE); // color-cosmic-teal #4BC2AE static const onCosmicTeal = Color(0xFF141414); // color-on-cosmic-teal #141414 static const cosmicOutline = Color(0xFF2C2C2E); // color-cosmic-outline #2C2C2E static const gold = Color(0xFFFFD34D); // color-gold #FFD34D static const onGold = Color(0xFF241A02); // color-on-gold #241A02 } /// 소셜 제공자 브랜드 색. 각 사 가이드라인 고정값이라 테마와 무관하게 그대로 쓴다. abstract final class BrandColors { static const kakao = Color(0xFFFEE500); // brand-kakao #FEE500 static const kakaoLabel = Color(0xFF000000); // brand-kakao-label #000000 static const naver = Color(0xFF03C75A); // brand-naver #03C75A static const naverLabel = Color(0xFFFFFFFF); // brand-naver-label #FFFFFF static const apple = Color(0xFF000000); // brand-apple #000000 static const appleLabel = Color(0xFFFFFFFF); // brand-apple-label #FFFFFF static const appleOnlight = Color(0xFFFFFFFF); // brand-apple-onlight #FFFFFF static const googleFill = Color(0xFFFFFFFF); // brand-google-fill #FFFFFF static const googleStroke = Color(0xFF747775); // brand-google-stroke #747775 static const googleLabel = Color(0xFF1F1F1F); // brand-google-label #1F1F1F static const line = Color(0xFF06C755); // brand-line #06C755 static const lineLabel = Color(0xFFFFFFFF); // brand-line-label #FFFFFF static const email = Color(0xFFFF7DDD); // brand-email #FF7DDD static const emailLabel = Color(0xFF141414); // brand-email-label #141414 } /// 글래스 FX. CSS 전용 표현(glow-*/grad-*/nebula/starfield)은 생성하지 않는다 — gen_tokens.py 헤더 참고. abstract final class AppFx { static const glassFill = Color(0x0FFFFFFF); // glass-fill rgba(255,255,255,.06) static const glassFillStrong = Color(0x17FFFFFF); // glass-fill-strong rgba(255,255,255,.09) static const glassStroke = Color(0x1AFFFFFF); // glass-stroke rgba(255,255,255,.10) static const glassBlur = 16.0; // glass-blur 16px static const orbitStroke = Color(0x1AFFFFFF); // orbit-stroke rgba(255,255,255,.10) } /// 여백 스케일. 임의값 금지 — 여기 있는 값에서만 고른다. abstract final class AppSpace { static const s0 = 0.0; // space-0 static const s1 = 4.0; // space-1 static const s2 = 8.0; // space-2 static const s3 = 12.0; // space-3 static const s4 = 16.0; // space-4 static const s5 = 24.0; // space-5 static const s6 = 32.0; // space-6 static const s7 = 48.0; // space-7 static const s8 = 64.0; // space-8 static const s9 = 96.0; // space-9 static const card = 24.0; // space-card static const sectionDesktop = 96.0; // space-section-desktop static const sectionMobile = 56.0; // space-section-mobile static const containerMax = 1200.0; // container-max static const gutterDesktop = 32.0; // gutter-desktop static const gutterMobile = 16.0; // gutter-mobile static const measureCh = 70.0; // measure-ch } /// 코너 반경. abstract final class AppRadius { static const xs = 4.0; // corner-xs static const sm = 8.0; // corner-sm static const md = 12.0; // corner-md static const lg = 16.0; // corner-lg static const full = 9999.0; // corner-full } /// 터치 타깃·본문 최소 크기. app 터치 타깃 48 미만으로 내리지 마라. abstract final class AppSizing { static const touchMinApp = 48.0; // touch-min-app static const touchMinWeb = 36.0; // touch-min-web static const bodyMinApp = 16.0; // body-min-app static const bodyMinWeb = 16.0; // body-min-web static const uiMinDesktop = 14.0; // ui-min-desktop static const uiMinMobile = 16.0; // ui-min-mobile static const metaMinDesktop = 12.0; // meta-min-desktop static const metaMinMobile = 13.0; // meta-min-mobile } /// 오버레이 순서. abstract final class AppZ { static const base = 0; // z-base static const sticky = 1100; // z-sticky static const dropdown = 1200; // z-dropdown static const popover = 1300; // z-popover static const overlay = 1400; // z-overlay static const modal = 1500; // z-modal static const toast = 1700; // z-toast } /// 모션 지속시간. 이징 곡선은 Cubic 리터럴로 아래 주석 값을 쓴다. abstract final class AppMotion { static const fast = Duration(milliseconds: 120); // motion-fast static const base = Duration(milliseconds: 180); // motion-base static const slow = Duration(milliseconds: 260); // motion-slow // motion-ease: cubic-bezier(.2,.8,.2,1) (cubic-bezier — Flutter 는 Cubic() 으로 화면에서 조립) // motion-ease-in-out: cubic-bezier(.4,0,.2,1) (cubic-bezier — Flutter 는 Cubic() 으로 화면에서 조립) } /// 폰트 패밀리명. 폰트 파일은 리포에 없다 — 미투입 시 시스템 폰트로 폴백된다(README 「미투입 항목」). abstract final class AppFonts { static const display = 'ABeeZee'; // font-display = 'ABeeZee', '42dot Sans', sans-serif static const body = '42dot Sans'; // font-body = '42dot Sans', 'Pretendard Variable', system-ui, sans-serif static const mono = 'ABeeZee'; // font-mono = 'ABeeZee', ui-monospace, monospace // font-source: 42dot Sans = Google Fonts OFL 가변 ttf · ABeeZee = Google Fonts OFL (app/assets/fonts/, 2026-09-02) } /// 타입 스케일. 값은 design-tokens.md 의 type 블록 그대로다. abstract final class AppType { static const displayL = TypeToken(family: AppFonts.display, size: 46.0, weight: 400, height: 1.0); // type-display-l static const displayM = TypeToken(family: AppFonts.display, size: 32.0, weight: 400, height: 1.4, letterSpacing: -0.8); // type-display-m static const titleL = TypeToken(family: AppFonts.body, size: 20.0, weight: 600, height: 1.4, letterSpacing: -0.5); // type-title-l static const titleM = TypeToken(family: AppFonts.body, size: 16.0, weight: 600, height: 1.4, letterSpacing: -0.4); // type-title-m static const bodyL = TypeToken(family: AppFonts.body, size: 16.0, weight: 500, height: 1.4, letterSpacing: -0.4); // type-body-l static const bodyM = TypeToken(family: AppFonts.body, size: 14.0, weight: 500, height: 1.3, letterSpacing: -0.35); // type-body-m static const bodyS = TypeToken(family: AppFonts.body, size: 12.0, weight: 500, height: 1.3, letterSpacing: -0.3); // type-body-s static const labelL = TypeToken(family: AppFonts.body, size: 14.0, weight: 600, height: 1.3, letterSpacing: -0.35); // type-label-l static const labelMobile = TypeToken(family: AppFonts.body, size: 16.0, weight: 700, height: 1.4); // type-label-mobile static const metaMobile = TypeToken(family: AppFonts.body, size: 13.0, weight: 600, height: 1.4); // type-meta-mobile static const eyebrow = TypeToken(family: AppFonts.body, size: 12.0, weight: 600, height: 1.0, letterSpacing: -0.3); // type-eyebrow static const caption = TypeToken(family: AppFonts.body, size: 12.0, weight: 500, height: 1.3, letterSpacing: -0.3); // type-caption static const meta = TypeToken(family: AppFonts.body, size: 10.0, weight: 500, height: 1.3, letterSpacing: -0.25); // type-meta static const navTitle = TypeToken(family: AppFonts.body, size: 16.0, weight: 600, height: 1.5); // type-nav-title static const tabTitle = TypeToken(family: AppFonts.display, size: 20.0, weight: 400, height: 1.4); // type-tab-title static const navLabel = TypeToken(family: AppFonts.display, size: 10.0, weight: 400, height: 1.6); // type-nav-label // type-mono-num: {'family': 'font-mono', 'feature': 'tnum', 'note': '가격·지표·표는 tabular'} (크기 없는 지시자 — TextStyle 로 못 옮긴다) } /// 타입 토큰 1개. app_theme.dart 가 TextStyle 로 변환한다. class TypeToken { const TypeToken({ required this.family, required this.size, required this.weight, this.height, this.letterSpacing, }); final String family; final double size; final int weight; final double? height; final double? letterSpacing; } // 생성 제외된 cosmic_fx: glow-live, grad-action, grad-brand, grad-gold, grad-eclipse, grad-veil, nebula, starfield, foil