haixunMaster/lib/theme.ts

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";