Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
1.4 kB · 45 lines
TypeScript
12345678910111213141516171819202122232425262728293031323334353637383940414243444546// Color scheme provider. Reads persisted preference from localStorage,// listens to system prefers-color-scheme for "system" mode, and// syncs the `.dark` class on <html>.const STORAGE_KEY = "streamplace:theme";
export type ThemePreference = "light" | "dark" | "system";
function getSystemScheme(): "light" | "dark" { if (typeof window === "undefined") return "dark"; return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";}
export function getStoredPreference(): ThemePreference { if (typeof localStorage === "undefined") return "system"; const stored = localStorage.getItem(STORAGE_KEY); if (stored === "light" || stored === "dark" || stored === "system") { return stored; } return "system";}
export function getEffectiveScheme( preference?: ThemePreference,): "light" | "dark" { const pref = preference ?? getStoredPreference(); if (pref === "system") return getSystemScheme(); return pref;}
export function setThemePreference(pref: ThemePreference) { localStorage.setItem(STORAGE_KEY, pref); syncThemeClass(pref);}
export function syncThemeClass(preference?: ThemePreference) { const scheme = getEffectiveScheme(preference); const root = document.documentElement; if (scheme === "dark") { root.classList.add("dark"); } else { root.classList.remove("dark"); }}