디자인 토큰을 Figma 실측값으로 교체 · 42dot Sans · ABeeZee 폰트 동봉
This commit is contained in:
@@ -6,70 +6,74 @@ import 'dart:ui' show Color;
|
||||
|
||||
/// 컬러 토큰. app 은 cosmic* 계열이 기본 서피스다(결정 D-19).
|
||||
abstract final class AppColors {
|
||||
static const primary = Color(0xFFAC5992); // color-primary #ac5992
|
||||
static const primary = Color(0xFFB93074); // color-primary #b93074
|
||||
static const onPrimary = Color(0xFFFFFFFF); // color-on-primary #ffffff
|
||||
static const primaryContainer = Color(0xFFF0E1EB); // color-primary-container #f0e1eb
|
||||
static const onPrimaryContainer = Color(0xFF924C7C); // color-on-primary-container #924c7c
|
||||
static const surface = Color(0xFFF8F5FA); // color-surface #f8f5fa
|
||||
static const surfaceContainer = Color(0xFFEBE7ED); // color-surface-container #ebe7ed
|
||||
static const onSurface = Color(0xFF1A1C1E); // color-on-surface #1a1c1e
|
||||
static const onSurfaceVariant = Color(0xFF4B4753); // color-on-surface-variant #4b4753
|
||||
static const outline = Color(0xFF7A7481); // color-outline #7a7481
|
||||
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(0xFF1A1C1E); // web-foreground #1a1c1e
|
||||
static const webPrimary = Color(0xFFAC5992); // web-primary #ac5992
|
||||
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(0xFFF1EEF4); // web-muted #f1eef4
|
||||
static const webMutedForeground = Color(0xFF4B4753); // web-muted-foreground #4b4753
|
||||
static const webBorder = Color(0xFFDED7DF); // web-border #ded7df
|
||||
static const cosmicVoid = Color(0xFF000000); // color-cosmic-void #000000
|
||||
static const cosmicSurface = Color(0xFF05070F); // color-cosmic-surface #05070F
|
||||
static const cosmicSurfaceContainer = Color(0xFF0D1220); // color-cosmic-surface-container #0D1220
|
||||
static const cosmicSurfaceRaised = Color(0xFF141A2B); // color-cosmic-surface-raised #141A2B
|
||||
static const onCosmic = Color(0xFFF4F0F7); // color-on-cosmic #F4F0F7
|
||||
static const onCosmicVariant = Color(0xFFB4AEC0); // color-on-cosmic-variant #B4AEC0
|
||||
static const cosmicAccent = Color(0xFFFF85D9); // color-cosmic-accent #FF85D9
|
||||
static const onCosmicAccent = Color(0xFF05070F); // color-on-cosmic-accent #05070F
|
||||
static const neonCyan = Color(0xFF00F2FF); // color-neon-cyan #00F2FF
|
||||
static const onNeonCyan = Color(0xFF05070F); // color-on-neon-cyan #05070F
|
||||
static const neonEmerald = Color(0xFF34D399); // color-neon-emerald #34D399
|
||||
static const onNeonEmerald = Color(0xFF05070F); // color-on-neon-emerald #05070F
|
||||
static const neonMagenta = Color(0xFFFF007A); // color-neon-magenta #FF007A
|
||||
static const onNeonMagenta = Color(0xFF05070F); // color-on-neon-magenta #05070F
|
||||
static const neonViolet = Color(0xFFA855F7); // color-neon-violet #A855F7
|
||||
static const onNeonViolet = Color(0xFF05070F); // color-on-neon-violet #05070F
|
||||
static const cosmicMint = Color(0xFFC1FFED); // color-cosmic-mint #C1FFED
|
||||
static const onCosmicMint = Color(0xFF05070F); // color-on-cosmic-mint #05070F
|
||||
static const cosmicOutline = Color(0xFF2A3348); // color-cosmic-outline #2A3348
|
||||
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 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 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
|
||||
// 네이버는 확정 가입 수단 5종에서 빠졌다(정책 §P-01 · 답변서 Q7). 토큰은
|
||||
// 남겨 둔다 — 발주사께서 다시 넣으시면 그대로 쓴다.
|
||||
static const naver = Color(0xFF03C75A); // brand-naver #03C75A
|
||||
static const naverLabel = Color(0xFFFFFFFF); // brand-naver-label #FFFFFF
|
||||
static const line = Color(0xFF06C755); // brand-line #06C755
|
||||
static const lineLabel = Color(0xFFFFFFFF); // brand-line-label #FFFFFF
|
||||
// 이메일은 브랜드가 없다. 앱 강조색을 그대로 쓴다.
|
||||
static const email = AppColors.cosmicAccent;
|
||||
static const emailLabel = AppColors.onCosmicAccent;
|
||||
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(0x0DFFFFFF); // glass-fill rgba(255,255,255,.05)
|
||||
static const glassFillStrong = Color(0x14FFFFFF); // glass-fill-strong rgba(255,255,255,.08)
|
||||
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)
|
||||
@@ -98,10 +102,10 @@ abstract final class AppSpace {
|
||||
|
||||
/// 코너 반경.
|
||||
abstract final class AppRadius {
|
||||
static const xs = 8.0; // corner-xs
|
||||
static const sm = 10.0; // corner-sm
|
||||
static const md = 14.0; // corner-md
|
||||
static const lg = 18.0; // corner-lg
|
||||
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
|
||||
}
|
||||
|
||||
@@ -110,7 +114,11 @@ 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 = 14.0; // body-min-web
|
||||
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
|
||||
}
|
||||
|
||||
/// 오버레이 순서.
|
||||
@@ -135,23 +143,25 @@ abstract final class AppMotion {
|
||||
|
||||
/// 폰트 패밀리명. 폰트 파일은 리포에 없다 — 미투입 시 시스템 폰트로 폴백된다(README 「미투입 항목」).
|
||||
abstract final class AppFonts {
|
||||
static const display = 'Gmarket Sans'; // font-display = 'Gmarket Sans', Pretendard Variable, sans-serif
|
||||
static const body = 'Pretendard Variable'; // font-body = Pretendard Variable, system-ui, sans-serif
|
||||
static const mono = 'JetBrains Mono'; // font-mono = JetBrains Mono, IBM Plex Mono, ui-monospace, monospace
|
||||
// font-source: Gmarket Sans = webfontworld/jsdelivr · 본문 Pretendard = jsdelivr
|
||||
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: 44.0, weight: 700, height: 1.06, letterSpacing: -0.44); // type-display-l
|
||||
static const displayM = TypeToken(family: AppFonts.display, size: 32.0, weight: 700, height: 1.11, letterSpacing: -0.32); // type-display-m
|
||||
static const titleL = TypeToken(family: AppFonts.display, size: 24.0, weight: 700, height: 1.2, letterSpacing: -0.24); // type-title-l
|
||||
static const displayM = TypeToken(family: AppFonts.display, size: 32.0, weight: 700, height: 1.2, letterSpacing: -0.224); // type-display-m
|
||||
static const titleL = TypeToken(family: AppFonts.display, size: 24.0, weight: 700, height: 1.3, letterSpacing: 0.0); // type-title-l
|
||||
static const titleM = TypeToken(family: AppFonts.body, size: 18.0, weight: 600, height: 1.3); // type-title-m
|
||||
static const bodyL = TypeToken(family: AppFonts.body, size: 18.0, weight: 400, height: 1.6); // type-body-l
|
||||
static const bodyM = TypeToken(family: AppFonts.body, size: 16.0, weight: 400, height: 1.6); // type-body-m
|
||||
static const bodyS = TypeToken(family: AppFonts.body, size: 14.0, weight: 400, height: 1.55); // type-body-s
|
||||
static const labelL = TypeToken(family: AppFonts.body, size: 14.0, weight: 500, height: 1.2); // type-label-l
|
||||
static const eyebrow = TypeToken(family: AppFonts.body, size: 12.0, weight: 600, letterSpacing: 0.72); // type-eyebrow
|
||||
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, letterSpacing: 0.48); // type-eyebrow
|
||||
static const caption = TypeToken(family: AppFonts.body, size: 12.0, weight: 500, height: 1.4); // type-caption
|
||||
// type-mono-num: {'family': 'font-mono', 'feature': 'tnum', 'note': '가격·지표·표는 tabular'} (크기 없는 지시자 — TextStyle 로 못 옮긴다)
|
||||
}
|
||||
@@ -173,4 +183,4 @@ class TypeToken {
|
||||
final double? letterSpacing;
|
||||
}
|
||||
|
||||
// 생성 제외된 cosmic_fx: glow-sm, glow-md, glow-lg, glow-accent, glow-cyan, glow-emerald, glow-magenta, grad-action, grad-brand, grad-eclipse, grad-veil, nebula, starfield
|
||||
// 생성 제외된 cosmic_fx: glow-live, grad-action, grad-brand, grad-gold, grad-eclipse, grad-veil, nebula, starfield, foil
|
||||
|
||||
Reference in New Issue
Block a user