49 lines
980 B
TypeScript
49 lines
980 B
TypeScript
import type { Theme } from "./theme";
|
|
|
|
export type ResolvedTheme = "light" | "dark";
|
|
export type ThemeQueryMode = "light" | "dark" | "system";
|
|
|
|
export function parseThemeQuery(value: string | null | undefined): ThemeQueryMode | null {
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
|
|
const normalized = value.toLowerCase();
|
|
|
|
if (normalized === "light" || normalized === "dark") {
|
|
return normalized;
|
|
}
|
|
|
|
if (normalized === "auto" || normalized === "system") {
|
|
return "system";
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
export function resolveStoredTheme(
|
|
theme: Theme,
|
|
prefersDark: boolean,
|
|
): ResolvedTheme {
|
|
if (theme === "system") {
|
|
return prefersDark ? "dark" : "light";
|
|
}
|
|
|
|
return theme;
|
|
}
|
|
|
|
export function resolveIncomingThemeMode(
|
|
mode: unknown,
|
|
prefersDark: boolean,
|
|
): ResolvedTheme | null {
|
|
if (mode === "light" || mode === "dark") {
|
|
return mode;
|
|
}
|
|
|
|
if (mode === "auto" || mode === "system") {
|
|
return prefersDark ? "dark" : "light";
|
|
}
|
|
|
|
return null;
|
|
}
|