theme.ts (730B)
1 import { create } from "zustand"; 2 3 type Theme = "dark" | "light"; 4 5 interface ThemeState { 6 theme: Theme; 7 toggleTheme: () => void; 8 setTheme: (theme: Theme) => void; 9 } 10 11 function getInitialTheme(): Theme { 12 const stored = localStorage.getItem("theo-theme"); 13 if (stored === "light" || stored === "dark") return stored; 14 return "dark"; 15 } 16 17 export const useThemeStore = create<ThemeState>((set) => ({ 18 theme: getInitialTheme(), 19 toggleTheme: () => 20 set((state) => { 21 const next: Theme = state.theme === "dark" ? "light" : "dark"; 22 localStorage.setItem("theo-theme", next); 23 return { theme: next }; 24 }), 25 setTheme: (theme) => { 26 localStorage.setItem("theo-theme", theme); 27 set({ theme }); 28 }, 29 }));