// Theme Context
const ThemeContext = React.createContext({ theme: 'dark', toggleTheme: () => {} });
function ThemeProvider({ children }) {
const [theme, setTheme] = React.useState(() => {
try {
return localStorage.getItem('ofuq.theme') || window.__OFUQ_THEME__ || 'dark';
} catch(e) { return 'dark'; }
});
const toggleTheme = React.useCallback(() => {
setTheme(prev => {
const next = prev === 'dark' ? 'light' : 'dark';
try { localStorage.setItem('ofuq.theme', next); } catch(e) {}
if (next === 'light') {
document.documentElement.classList.add('light');
} else {
document.documentElement.classList.remove('light');
}
return next;
});
}, []);
// Sync on mount
React.useEffect(() => {
if (theme === 'light') {
document.documentElement.classList.add('light');
} else {
document.documentElement.classList.remove('light');
}
}, []);
return (
{children}
);
}
function useTheme() {
return React.useContext(ThemeContext);
}
// Sun icon
function SunIcon() {
return (
);
}
// Moon icon
function MoonIcon() {
return (
);
}
// The toggle button component used in the header
function ThemeToggle() {
const { theme, toggleTheme } = useTheme();
const isLight = theme === 'light';
return (
);
}
window.ThemeProvider = ThemeProvider;
window.useTheme = useTheme;
window.ThemeToggle = ThemeToggle;