mirror of
https://github.com/shishantbiswas/bknd.git
synced 2026-03-16 20:37:21 +00:00
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { useBknd } from "ui/client/bknd";
|
|
import { create } from "zustand";
|
|
import { combine, persist } from "zustand/middleware";
|
|
|
|
const themes = ["dark", "light", "system"] as const;
|
|
export type AppTheme = (typeof themes)[number];
|
|
|
|
const themeStore = create(
|
|
persist(
|
|
combine({ theme: null as AppTheme | null }, (set) => ({
|
|
setTheme: (theme: AppTheme | any) => {
|
|
if (themes.includes(theme)) {
|
|
document.startViewTransition(() => {
|
|
set({ theme });
|
|
});
|
|
}
|
|
},
|
|
})),
|
|
{
|
|
name: "bknd-admin-theme",
|
|
},
|
|
),
|
|
);
|
|
|
|
export function useTheme(fallback: AppTheme = "system") {
|
|
const b = useBknd();
|
|
const theme_state = themeStore((state) => state.theme);
|
|
const theme_set = themeStore((state) => state.setTheme);
|
|
|
|
// 1. override
|
|
// 2. local storage
|
|
// 3. fallback
|
|
// 4. default
|
|
const override = b?.options?.theme;
|
|
const prefersDark =
|
|
typeof window !== "undefined" && window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
|
|
const theme = override ?? theme_state ?? fallback;
|
|
|
|
return {
|
|
theme: (theme === "system" ? (prefersDark ? "dark" : "light") : theme) as AppTheme,
|
|
value: theme,
|
|
themes,
|
|
setTheme: theme_set,
|
|
state: theme_state,
|
|
prefersDark,
|
|
override,
|
|
};
|
|
}
|