File size: 1,048 Bytes
d1f3f31 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | export const THEME_STORAGE_KEY = 'nexus-theme';
export type ThemePreference = 'light' | 'dark' | 'system';
export type ResolvedTheme = 'light' | 'dark';
export function getSystemTheme(): ResolvedTheme {
if (typeof window === 'undefined') return 'dark';
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
export function resolveTheme(preference: ThemePreference): ResolvedTheme {
if (preference === 'system') return getSystemTheme();
return preference;
}
export function applyTheme(preference: ThemePreference) {
const resolved = resolveTheme(preference);
const root = document.documentElement;
root.classList.toggle('dark', resolved === 'dark');
root.dataset.theme = resolved;
root.style.colorScheme = resolved;
}
export function readStoredTheme(): ThemePreference {
if (typeof window === 'undefined') return 'dark';
const stored = window.localStorage.getItem(THEME_STORAGE_KEY);
if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;
return 'dark';
}
|