31 lines
760 B
TypeScript
31 lines
760 B
TypeScript
export const THEME_STORAGE_KEY = 'dyolink-theme';
|
|
|
|
export type ThemeMode = 'light' | 'dark';
|
|
|
|
export function getStoredTheme(): ThemeMode {
|
|
if (typeof window === 'undefined') return 'dark';
|
|
try {
|
|
const v = localStorage.getItem(THEME_STORAGE_KEY);
|
|
if (v === 'light' || v === 'dark') return v;
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
return 'dark';
|
|
}
|
|
|
|
export function applyTheme(mode: ThemeMode) {
|
|
if (typeof document === 'undefined') return;
|
|
document.documentElement.setAttribute('data-theme', mode);
|
|
try {
|
|
localStorage.setItem(THEME_STORAGE_KEY, mode);
|
|
} catch {
|
|
/* ignore */
|
|
}
|
|
}
|
|
|
|
export function toggleTheme(): ThemeMode {
|
|
const next: ThemeMode = getStoredTheme() === 'dark' ? 'light' : 'dark';
|
|
applyTheme(next);
|
|
return next;
|
|
}
|