| 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'; | |
| } | |