37 lines
1.1 KiB
TypeScript
37 lines
1.1 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
type Theme = 'dark' | 'light';
|
|
|
|
interface ThemeState {
|
|
theme: Theme;
|
|
toggleTheme: () => void;
|
|
initTheme: () => void;
|
|
}
|
|
|
|
export const useThemeStore = create<ThemeState>((set) => ({
|
|
theme: 'dark',
|
|
toggleTheme: () => set((state) => {
|
|
const newTheme = state.theme === 'dark' ? 'light' : 'dark';
|
|
localStorage.setItem('theme-preference', newTheme);
|
|
if (newTheme === 'dark') {
|
|
document.documentElement.classList.add('dark');
|
|
} else {
|
|
document.documentElement.classList.remove('dark');
|
|
}
|
|
return { theme: newTheme };
|
|
}),
|
|
initTheme: () => set(() => {
|
|
const saved = localStorage.getItem('theme-preference');
|
|
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
const initialTheme = saved ? (saved as Theme) : (prefersDark ? 'dark' : 'light');
|
|
|
|
if (initialTheme === 'dark') {
|
|
document.documentElement.classList.add('dark');
|
|
} else {
|
|
document.documentElement.classList.remove('dark');
|
|
}
|
|
|
|
return { theme: initialTheme };
|
|
})
|
|
}));
|