/** * Goon theme — warm dark + oxblood, NOT generic navy/purple AI-default. * * Audit 2026-05-29 (impeccable.style/slop): * - Wcześniej: bg #08090F (deep navy), accent #8B5CF6 (purple) + glow #A78BFA * → literal example "AI default palette" z impeccable. * - Teraz: bg #15110D (warm charcoal — orange undertone), accent #B23A48 * (oxblood/rust), brak glowów, brak gradientów neon. * * Typography: General Sans (display, Fontshare) + Geist Mono (meta, Vercel * fonts). Font files w `mobile/assets/fonts/` — `useFonts()` w App.tsx * graceful-fallback do system gdy brak (development). */ export const theme = { // Warm dark — charcoal z orange undertone (NIE navy). // Filmowy, premium feel — jak Letterboxd/Mubi/A24. bg: '#15110D', bgElevated: '#1E1A14', card: '#26201A', border: '#3A3128', borderFocus: '#B23A48', // Foreground — warm off-white (nie pure white żeby nie biło na warm dark). fg: '#F5EDE0', muted: '#A89B85', mutedDim: '#6F6555', // Accent — oxblood/rust. Distinctive, niekonwencjonalne dla "media app". // Brak glow/neon. Deep wariant dla pressed states. accent: '#B23A48', accentGlow: '#B23A48', // alias — back-compat, ale bez prawdziwego glow accentDeep: '#7A1F2A', accentSecondary: '#D89B4A', // muted amber dla secondary CTAs // Status — tonowane do palety (nie generic green/red). good: '#5E8C5A', // muted olive-green bad: '#C44545', warn: '#D89B4A', // amber } as const; /** * Font family — General Sans (display + body, Fontshare) + Geist Mono (meta, * Vercel OFL). Pliki .ttf w `mobile/assets/fonts/`, ładowane przez useFonts() * w App.tsx (runtime load — działa przez OTA bo expo-font native jest w APK). * * WAŻNE (custom-font gotcha): RN NIE syntezuje weightów dla custom fontów — * fontWeight:'700' na fontFamily:'GeneralSans-Regular' NIE pogrubi. Trzeba * jawnie wskazać rodzinę per-weight. Stąd 4 osobne sloty: * - body → Regular (400) — domyślny tekst * - medium → Medium (500) — labels, tab inactive * - display → Semibold (600)— headingi, tytuły, bold * - mono → Geist Mono — meta, duration, liczby, kategorie * * Gdy useFonts jeszcze nie ready, App.tsx blokuje render (fonty z bundla * ładują się <100ms), więc te stałe są zawsze valid przy pierwszym paint. */ export const fonts = { body: 'GeneralSans-Regular', medium: 'GeneralSans-Medium', display: 'GeneralSans-Semibold', mono: 'GeistMono-Regular', } as const; export function scoreColor(score: number): string { if (score >= 0.92) return theme.good; if (score >= 0.75) return theme.warn; return theme.bad; } /** * Type-scale (impeccable: "at least 1.25 ratio between steps"). * Base 14 → 17 → 22 → 28 → 36. Użyj zamiast hardcodowanego fontSize. */ export const type = { micro: 11, meta: 13, body: 14, bodyLarge: 17, title: 22, display: 28, hero: 36, } as const; /** * Spacing scale — "tight groupings, generous between sections" (impeccable). * Pomijamy 12/20 — preferuj 8/16/24/32 dla widocznej hierarchii sekcji. */ export const space = { xs: 4, sm: 8, md: 16, lg: 24, xl: 32, xxl: 48, } as const;