import { useState, useEffect, useCallback } from 'react';
type Theme = 'dark' | 'light';
const STORAGE_KEY = 'sz_theme';
function getInitial(): Theme {
try {
const saved = localStorage.getItem(STORAGE_KEY);
if (saved === 'light' || saved === 'dark') return saved;
} catch { /* localStorage unavailable */ }
return window.matchMedia?.('(prefers-color-scheme: light)').matches ? 'light' : 'dark';
}
function applyTheme(theme: Theme) {
document.documentElement.setAttribute('data-theme', theme);
const metaTheme = document.querySelector('meta[name="theme-color"]');
if (metaTheme) {
metaTheme.setAttribute('content', theme === 'dark' ? '#0c1c22' : '#f8f9fa');
}
}
export function useTheme() {
const [theme, setTheme] = useState<Theme>(getInitial);
useEffect(() => {
applyTheme(theme);
try { localStorage.setItem(STORAGE_KEY, theme); } catch { /* ignore */ }
}, [theme]);
const toggleTheme = useCallback(() => {
setTheme(t => t === 'dark' ? 'light' : 'dark');
}, []);
return { theme, toggleTheme };
}
📜 Git History
0c802dffeat(theme): Phase 2 token reskin — Olympus palette (navy + electric green)12 days ago
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...