// Default values mirroring index.css export const DEFAULT_THEME = { light: { gradientStart: 'oklch(0.985 0.005 220)', gradientEnd: 'oklch(0.945 0.014 215)', card: 'oklch(0.995 0.004 210 / 0.92)', primary: 'oklch(0.52 0.124 192)', primaryDim: 'oklch(0.42 0.1 192)', primaryForeground: 'oklch(0.99 0.005 192)', secondaryAccent: 'oklch(0.47 0.2 350)', secondaryAccentForeground: 'oklch(0.99 0 0)', destructive: 'oklch(0.5 0.21 3.958)', warning: 'oklch(0.62 0.13 75)', success: 'oklch(0.5 0.12 181)', }, dark: { gradientStart: 'oklch(0.105 0.018 252)', gradientEnd: 'oklch(0.145 0.028 228)', card: 'oklch(0.19 0.024 242 / 0.78)', primary: 'oklch(0.82 0.14 192)', primaryDim: 'oklch(0.65 0.12 192)', primaryForeground: 'oklch(0.1 0.02 220)', secondaryAccent: 'oklch(0.65 0.26 350)', secondaryAccentForeground: 'oklch(0.99 0 0)', }, radius: '0.625rem', smoothScrollEnabled: true, smoothScrollIntensity: 60, }; export type ThemeConfig = typeof DEFAULT_THEME; type SlotKey = | 'gradientStart' | 'gradientEnd' | 'card' | 'primary' | 'primaryDim' | 'primaryForeground' | 'secondaryAccent' | 'secondaryAccentForeground' | 'destructive' | 'warning' | 'success'; const slotToCssVar: Record = { gradientStart: '--gradient-start', gradientEnd: '--gradient-end', card: '--card', primary: '--primary', primaryDim: '--primary-dim', primaryForeground: '--primary-foreground', secondaryAccent: '--secondary-accent', secondaryAccentForeground: '--secondary-accent-foreground', destructive: '--destructive', warning: '--warning', success: '--success', }; function buildCssBlock( selector: string, slots: Partial>, radius?: string ): string { const declarations: string[] = []; for (const [key, value] of Object.entries(slots)) { const cssVar = slotToCssVar[key as SlotKey]; if (cssVar && value) { declarations.push(` ${cssVar}: ${value};`); } } if (radius) { declarations.push(` --radius: ${radius};`); } if (declarations.length === 0) return ''; return `${selector} {\n${declarations.join('\n')}\n}`; } /** * Apply theme overrides by injecting/updating a