Files
Shade/packages/shade-widgets/src/theme.ts

73 lines
1.8 KiB
TypeScript
Raw Normal View History

2026-04-10 19:00:21 +02:00
/**
* Theme tokens for Shade widgets.
*
* Self-contained no external CSS required. Each widget reads tokens
* from the active theme via context.
*/
export interface ShadeTheme {
bg: string;
bgElevated: string;
border: string;
text: string;
textMuted: string;
textDim: string;
accent: string;
accentMuted: string;
success: string;
warning: string;
danger: string;
font: string;
fontMono: string;
radius: string;
shadow: string;
}
export const darkTheme: ShadeTheme = {
bg: '#0a0a0a',
bgElevated: '#161616',
border: '#262626',
text: '#e5e5e5',
textMuted: '#a3a3a3',
textDim: '#525252',
accent: '#f7c948',
accentMuted: 'rgba(247, 201, 72, 0.15)',
success: '#22c55e',
warning: '#eab308',
danger: '#ef4444',
font: 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif',
fontMono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
radius: '8px',
shadow: '0 4px 12px rgba(0, 0, 0, 0.4)',
};
export const lightTheme: ShadeTheme = {
bg: '#ffffff',
bgElevated: '#f5f5f5',
border: '#e5e5e5',
text: '#0a0a0a',
textMuted: '#525252',
textDim: '#a3a3a3',
accent: '#ca8a04',
accentMuted: 'rgba(202, 138, 4, 0.1)',
success: '#16a34a',
warning: '#ca8a04',
danger: '#dc2626',
font: 'system-ui, -apple-system, Segoe UI, Roboto, sans-serif',
fontMono: 'ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace',
radius: '8px',
shadow: '0 4px 12px rgba(0, 0, 0, 0.08)',
};
export type ThemeMode = 'dark' | 'light' | 'auto';
export function resolveTheme(mode: ThemeMode): ShadeTheme {
if (mode === 'dark') return darkTheme;
if (mode === 'light') return lightTheme;
// auto: use prefers-color-scheme
if (typeof window !== 'undefined' && window.matchMedia?.('(prefers-color-scheme: light)').matches) {
return lightTheme;
}
return darkTheme;
}