Spaces:
Running
Running
| import * as React from "react"; | |
| type Theme = "dark" | "light"; | |
| interface ThemeCtx { | |
| theme: Theme; | |
| toggle: () => void; | |
| } | |
| const ThemeContext = React.createContext<ThemeCtx>({ theme: "dark", toggle: () => {} }); | |
| export function ThemeProvider({ children }: { children: React.ReactNode }) { | |
| const [theme, setTheme] = React.useState<Theme>(() => { | |
| const saved = localStorage.getItem("gridlock-theme") as Theme | null; | |
| return saved ?? "dark"; | |
| }); | |
| React.useEffect(() => { | |
| const root = document.documentElement; | |
| root.classList.remove("dark", "light"); | |
| root.classList.add(theme); | |
| localStorage.setItem("gridlock-theme", theme); | |
| }, [theme]); | |
| const toggle = React.useCallback( | |
| () => setTheme((t) => (t === "dark" ? "light" : "dark")), | |
| [] | |
| ); | |
| return ( | |
| <ThemeContext.Provider value={{ theme, toggle }}> | |
| {children} | |
| </ThemeContext.Provider> | |
| ); | |
| } | |
| export const useTheme = () => React.useContext(ThemeContext); | |