72 lines
3.9 KiB
TypeScript
72 lines
3.9 KiB
TypeScript
import type { Theme } from "@tauri-apps/api/window";
|
|
|
|
export const APP_THEME_STORAGE_KEY = "dbx-theme";
|
|
export const APP_THEME_PALETTE_STORAGE_KEY = "dbx-theme-palette";
|
|
export const APP_CORNER_STYLE_STORAGE_KEY = "dbx-corner-style";
|
|
|
|
export type AppThemeMode = "light" | "dark" | "system";
|
|
export type AppThemeAppearance = "light" | "dark";
|
|
export type AppThemePalette = "pearl" | "mist" | "graphite" | "cobalt" | "sage" | "amber" | "blush" | "vscode" | "idea" | "xcode" | "jetbrains" | "cursor" | "claude";
|
|
export type AppCornerStyle = "none" | "small" | "large";
|
|
|
|
export type AppThemePaletteOption = {
|
|
value: AppThemePalette;
|
|
labelKey: string;
|
|
className: string | null;
|
|
previewColor: string;
|
|
};
|
|
|
|
export const APP_THEME_PALETTES: AppThemePaletteOption[] = [
|
|
{ value: "pearl", labelKey: "settings.themePalettePearl", className: null, previewColor: "#ffffff" },
|
|
{ value: "mist", labelKey: "settings.themePaletteMist", className: "theme-soft", previewColor: "#e4eaf2" },
|
|
{ value: "graphite", labelKey: "settings.themePaletteGraphite", className: "theme-graphite", previewColor: "#d8dce4" },
|
|
{ value: "cobalt", labelKey: "settings.themePaletteCobalt", className: "theme-cobalt", previewColor: "#d8e6f7" },
|
|
{ value: "sage", labelKey: "settings.themePaletteSage", className: "theme-sage", previewColor: "#dbe9e2" },
|
|
{ value: "amber", labelKey: "settings.themePaletteAmber", className: "theme-amber", previewColor: "#f4e4b8" },
|
|
{ value: "blush", labelKey: "settings.themePaletteBlush", className: "theme-blush", previewColor: "#f4d9e6" },
|
|
{ value: "vscode", labelKey: "settings.themePaletteVscode", className: "theme-vscode", previewColor: "#007acc" },
|
|
{ value: "idea", labelKey: "settings.themePaletteIdea", className: "theme-idea", previewColor: "#4b6eaf" },
|
|
{ value: "xcode", labelKey: "settings.themePaletteXcode", className: "theme-xcode", previewColor: "#0a84ff" },
|
|
{ value: "jetbrains", labelKey: "settings.themePaletteJetbrains", className: "theme-jetbrains", previewColor: "#7b61ff" },
|
|
{ value: "cursor", labelKey: "settings.themePaletteCursor", className: "theme-cursor", previewColor: "#6ba4ff" },
|
|
{ value: "claude", labelKey: "settings.themePaletteClaude", className: "theme-claude", previewColor: "#c47a50" },
|
|
];
|
|
|
|
export const APP_THEME_PALETTE_CLASS_NAMES = APP_THEME_PALETTES.map((palette) => palette.className).filter((className): className is string => Boolean(className));
|
|
|
|
export function normalizeAppThemeMode(value: string | null): AppThemeMode {
|
|
if (value === "soft-light") return "light";
|
|
if (value === "soft-dark") return "dark";
|
|
if (value === "soft-system") return "system";
|
|
if (value === "dark" || value === "light" || value === "system") return value;
|
|
return "light";
|
|
}
|
|
|
|
export function normalizeAppThemePalette(value: string | null): AppThemePalette {
|
|
if (value === "mist" || value === "graphite" || value === "cobalt" || value === "sage" || value === "amber" || value === "blush" || value === "vscode" || value === "idea" || value === "xcode" || value === "jetbrains" || value === "cursor" || value === "claude" || value === "pearl") return value;
|
|
return "pearl";
|
|
}
|
|
|
|
export function normalizeAppCornerStyle(value: string | null): AppCornerStyle {
|
|
if (value === "none" || value === "small") return value;
|
|
return "large";
|
|
}
|
|
|
|
export function getAppThemePaletteClass(palette: AppThemePalette): string | null {
|
|
return APP_THEME_PALETTES.find((option) => option.value === palette)?.className ?? null;
|
|
}
|
|
|
|
export function isSystemAppThemeMode(mode: AppThemeMode): boolean {
|
|
return mode === "system";
|
|
}
|
|
|
|
export function resolveAppThemeAppearance(mode: AppThemeMode, systemPrefersDark: boolean): AppThemeAppearance {
|
|
if (isSystemAppThemeMode(mode)) return systemPrefersDark ? "dark" : "light";
|
|
return mode === "dark" ? "dark" : "light";
|
|
}
|
|
|
|
export function getTauriThemeForMode(mode: AppThemeMode): Theme | null {
|
|
if (isSystemAppThemeMode(mode)) return null;
|
|
return resolveAppThemeAppearance(mode, false);
|
|
}
|