All checks were successful
Deploy / deploy (push) Successful in 11s
Previously unstaged files from prior sessions: ThemeContext, ThemeToggle, KanbanCard, useKeyboardShortcuts hook, and updated Header, KanbanBoard, Issues, Tasks, PostProduction, index.css. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
39 lines
1.1 KiB
JavaScript
39 lines
1.1 KiB
JavaScript
import { createContext, useContext, useState, useEffect } from 'react'
|
|
|
|
const ThemeContext = createContext()
|
|
|
|
export function ThemeProvider({ children }) {
|
|
const [darkMode, setDarkMode] = useState(() => {
|
|
// Check localStorage or system preference
|
|
const stored = localStorage.getItem('darkMode')
|
|
if (stored !== null) return stored === 'true'
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
})
|
|
|
|
useEffect(() => {
|
|
// Apply dark mode class to document
|
|
if (darkMode) {
|
|
document.documentElement.classList.add('dark')
|
|
} else {
|
|
document.documentElement.classList.remove('dark')
|
|
}
|
|
localStorage.setItem('darkMode', String(darkMode))
|
|
}, [darkMode])
|
|
|
|
const toggleDarkMode = () => setDarkMode(prev => !prev)
|
|
|
|
return (
|
|
<ThemeContext.Provider value={{ darkMode, toggleDarkMode }}>
|
|
{children}
|
|
</ThemeContext.Provider>
|
|
)
|
|
}
|
|
|
|
export function useTheme() {
|
|
const context = useContext(ThemeContext)
|
|
if (!context) {
|
|
throw new Error('useTheme must be used within ThemeProvider')
|
|
}
|
|
return context
|
|
}
|