34 lines
880 B
TypeScript
34 lines
880 B
TypeScript
export type ThemeMode = "light" | "dark";
|
|
|
|
export const THEME_STORAGE_KEY = "xunlou-theme";
|
|
|
|
export function isThemeMode(value: string | null | undefined): value is ThemeMode {
|
|
return value === "light" || value === "dark";
|
|
}
|
|
|
|
export function readStoredTheme(): ThemeMode | null {
|
|
if (typeof window === "undefined") return null;
|
|
try {
|
|
const stored = localStorage.getItem(THEME_STORAGE_KEY);
|
|
return isThemeMode(stored) ? stored : null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
export function applyTheme(mode: ThemeMode) {
|
|
document.documentElement.setAttribute("data-theme", mode);
|
|
document.documentElement.style.colorScheme = mode;
|
|
}
|
|
|
|
export function persistTheme(mode: ThemeMode) {
|
|
try {
|
|
localStorage.setItem(THEME_STORAGE_KEY, mode);
|
|
} catch {
|
|
/* ignore quota / private mode */
|
|
}
|
|
applyTheme(mode);
|
|
}
|
|
|
|
export const DEFAULT_THEME: ThemeMode = "light";
|