'use client'; import { createContext, useContext, useState, useEffect, ReactNode } from 'react'; type Theme = 'dark' | 'light'; interface ThemeContextType { theme: Theme; toggleTheme: () => void; } const ThemeContext = createContext(undefined); export function ThemeProvider({ children }: { children: ReactNode }) { const [theme, setTheme] = useState('dark'); useEffect(() => { // Check localStorage first const saved = localStorage.getItem('theme') as Theme | null; if (saved) { setTheme(saved); return; } // Fall back to system preference const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; setTheme(prefersDark ? 'dark' : 'light'); }, []); // Listen for system preference changes (only if no manual preference set) useEffect(() => { const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); const handleChange = (e: MediaQueryListEvent) => { // Only update if user hasn't manually set a preference if (!localStorage.getItem('theme')) { setTheme(e.matches ? 'dark' : 'light'); } }; mediaQuery.addEventListener('change', handleChange); return () => mediaQuery.removeEventListener('change', handleChange); }, []); useEffect(() => { const root = document.documentElement; if (theme === 'dark') { root.classList.add('dark'); } else { root.classList.remove('dark'); } }, [theme]); const toggleTheme = () => { const newTheme = theme === 'dark' ? 'light' : 'dark'; setTheme(newTheme); localStorage.setItem('theme', newTheme); }; return ( {children} ); } export function useTheme() { const context = useContext(ThemeContext); if (!context) { throw new Error('useTheme must be used within a ThemeProvider'); } return context; }