feat: improve app ui and project metadata
This commit is contained in:
36
apps/web/lib/ui/theme.ts
Normal file
36
apps/web/lib/ui/theme.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
export type ThemeMode = "paper" | "night";
|
||||
|
||||
export const DEFAULT_THEME_MODE: ThemeMode = "paper";
|
||||
export const THEME_STORAGE_KEY = "ww.theme_mode";
|
||||
|
||||
export function isThemeMode(value: unknown): value is ThemeMode {
|
||||
return value === "paper" || value === "night";
|
||||
}
|
||||
|
||||
export function normalizeThemeMode(value: unknown): ThemeMode {
|
||||
return isThemeMode(value) ? value : DEFAULT_THEME_MODE;
|
||||
}
|
||||
|
||||
export function nextThemeMode(current: ThemeMode): ThemeMode {
|
||||
return current === "night" ? "paper" : "night";
|
||||
}
|
||||
|
||||
export function themeModeLabel(mode: ThemeMode): string {
|
||||
return mode === "night" ? "夜读模式" : "纸感模式";
|
||||
}
|
||||
|
||||
export function themeToggleLabel(mode: ThemeMode): string {
|
||||
return mode === "night" ? "切换到纸感模式" : "切换到夜读模式";
|
||||
}
|
||||
|
||||
export function themeBootstrapScript(): string {
|
||||
return `
|
||||
try {
|
||||
var mode = localStorage.getItem(${JSON.stringify(THEME_STORAGE_KEY)});
|
||||
if (mode !== "paper" && mode !== "night") mode = ${JSON.stringify(DEFAULT_THEME_MODE)};
|
||||
document.documentElement.dataset.theme = mode;
|
||||
} catch (error) {
|
||||
document.documentElement.dataset.theme = ${JSON.stringify(DEFAULT_THEME_MODE)};
|
||||
}
|
||||
`.trim();
|
||||
}
|
||||
Reference in New Issue
Block a user