/** * Windows 11 Fluent Design: LayerFillColorDefault (#F3F3F3), AccentDark1 (#0067C0), * 6px radius (WinUI 3 cards), subtle Mica-style chrome. * Source: Microsoft Fluent 2 Design Tokens — https://fluent2.microsoft.design/color */ import type { ThemePreset } from './types'; /** Segoe UI Variable typography (Fluent Design: 14pt base, neutral spacing) */ const fluentTypography = { 'font-sans': '"Segoe UI Variable", "Segoe UI", ui-sans-serif, system-ui, sans-serif', 'font-mono': '"Cascadia Code", "Cascadia Mono", Consolas, "Courier New", monospace', 'font-size-base': '0.875rem', 'font-size-sm': '0.8125rem', 'font-size-xs': '0.75rem', 'font-size-lg': '1rem', 'font-size-xl': '1.125rem', 'line-height-base': '1.5', 'letter-spacing-base': '0em', } as const; export const windowsPreset: ThemePreset = { light: { // #F3F3F3 — LayerFillColorDefault background: 'hsl(0 0% 95%)', foreground: 'hsl(0 0% 9%)', // CardBackgroundFillColorDefault card: 'hsl(0 0% 100%)', 'card-foreground': 'hsl(0 0% 9%)', popover: 'hsl(0 0% 100%)', 'popover-foreground': 'hsl(0 0% 9%)', // #0067C0 — AccentDark1 (WCAG AA on white) primary: 'hsl(210 100% 38%)', 'primary-foreground': 'hsl(0 0% 100%)', // SubtleFillColorSecondaryBackground #F0F0F0 secondary: 'hsl(0 0% 94%)', 'secondary-foreground': 'hsl(0 0% 9%)', // SubtleFillColorTertiaryBackground #EBEBEB muted: 'hsl(0 0% 92%)', 'muted-foreground': 'hsl(0 0% 42%)', accent: 'hsl(210 60% 94%)', 'accent-foreground': 'hsl(210 100% 28%)', destructive: 'hsl(0 90% 55%)', 'destructive-foreground': 'hsl(0 0% 100%)', // ControlStrokeColorDefault: rgba(0,0,0,0.0578) border: 'hsl(0 0% 87%)', input: 'hsl(0 0% 90%)', // Hairline between rows — slightly lighter than border divider: 'hsl(0 0% 84%)', ring: 'hsl(210 100% 45%)', // WinUI 3: 4px controls, 8px cards/dialogs radius: '0.375rem', 'sidebar-background': 'hsl(0 0% 92%)', 'sidebar-foreground': 'hsl(0 0% 9%)', 'sidebar-primary': 'hsl(210 100% 38%)', 'sidebar-primary-foreground': 'hsl(0 0% 100%)', 'sidebar-accent': 'hsl(210 50% 93%)', 'sidebar-accent-foreground': 'hsl(210 100% 28%)', 'sidebar-border': 'hsl(0 0% 86%)', 'sidebar-ring': 'hsl(210 100% 45%)', 'chart-1': 'hsl(210 100% 38%)', 'chart-2': 'hsl(145 63% 38%)', 'chart-3': 'hsl(262 83% 55%)', 'chart-4': 'hsl(35 100% 48%)', 'chart-5': 'hsl(346 77% 50%)', // Status surfaces — Fluent system colors warning: 'hsl(38 92% 50%)', 'warning-background': 'hsl(38 100% 95%)', 'warning-foreground': 'hsl(30 80% 28%)', 'warning-border': 'hsl(38 85% 78%)', success: 'hsl(120 78% 27%)', 'success-background': 'hsl(120 55% 95%)', 'success-foreground': 'hsl(120 60% 28%)', 'success-border': 'hsl(120 45% 78%)', 'destructive-background': 'hsl(0 90% 96%)', 'destructive-border': 'hsl(0 85% 78%)', info: 'hsl(210 100% 38%)', 'info-background': 'hsl(210 100% 95%)', 'info-foreground': 'hsl(210 90% 28%)', 'info-border': 'hsl(210 80% 78%)', // On-fill ink: Fluent's light success/info fills are DARK (27%/38% L), so // near-black (base --on-*) fails — these two need WHITE ink instead. // on-success vs success (120 78% 27%) → 5.5:1 (AA) // on-info vs info (210 100% 38%) → 6.0:1 (AA) // warning/destructive light fills stay near-black (base value is correct). 'on-success': 'hsl(0 0% 100%)', 'on-info': 'hsl(0 0% 100%)', ...fluentTypography, }, dark: { // #202020 — SolidBackgroundFillColorBase dark background: 'hsl(0 0% 13%)', foreground: 'hsl(0 0% 96%)', // #2B2B2B — CardBackgroundFillColorDefault dark card: 'hsl(0 0% 17%)', 'card-foreground': 'hsl(0 0% 96%)', // #323232 — elevated surface popover: 'hsl(0 0% 20%)', 'popover-foreground': 'hsl(0 0% 96%)', // #60CDFF — AccentLight2 dark mode primary: 'hsl(200 100% 69%)', 'primary-foreground': 'hsl(0 0% 9%)', secondary: 'hsl(0 0% 22%)', 'secondary-foreground': 'hsl(0 0% 90%)', muted: 'hsl(0 0% 18%)', 'muted-foreground': 'hsl(0 0% 62%)', accent: 'hsl(210 25% 20%)', 'accent-foreground': 'hsl(200 100% 75%)', destructive: 'hsl(0 90% 62%)', 'destructive-foreground': 'hsl(0 0% 100%)', // ControlStrokeColorDefault dark: rgba(255,255,255,0.0837) border: 'hsl(0 0% 28%)', input: 'hsl(0 0% 24%)', // Hairline between rows — softer than border divider: 'hsl(0 0% 22%)', ring: 'hsl(200 100% 69%)', radius: '0.375rem', // NavigationView pane background 'sidebar-background': 'hsl(0 0% 10%)', 'sidebar-foreground': 'hsl(0 0% 90%)', 'sidebar-primary': 'hsl(200 100% 69%)', 'sidebar-primary-foreground': 'hsl(0 0% 9%)', 'sidebar-accent': 'hsl(210 20% 18%)', 'sidebar-accent-foreground': 'hsl(200 100% 75%)', 'sidebar-border': 'hsl(0 0% 22%)', 'sidebar-ring': 'hsl(200 100% 69%)', 'chart-1': 'hsl(200 100% 69%)', 'chart-2': 'hsl(145 65% 50%)', 'chart-3': 'hsl(262 83% 65%)', 'chart-4': 'hsl(35 100% 58%)', 'chart-5': 'hsl(346 77% 58%)', // Status surfaces — Fluent system colors warning: 'hsl(38 95% 58%)', 'warning-background': 'hsl(38 60% 10%)', 'warning-foreground': 'hsl(38 90% 72%)', 'warning-border': 'hsl(38 50% 28%)', success: 'hsl(120 60% 55%)', 'success-background': 'hsl(120 40% 10%)', 'success-foreground': 'hsl(120 55% 72%)', 'success-border': 'hsl(120 35% 28%)', 'destructive-background': 'hsl(0 60% 11%)', 'destructive-border': 'hsl(0 50% 30%)', info: 'hsl(200 100% 69%)', 'info-background': 'hsl(200 60% 11%)', 'info-foreground': 'hsl(200 90% 74%)', 'info-border': 'hsl(200 50% 30%)', ...fluentTypography, }, };