@@ -26,34 +26,42 @@ export function ThemeProvider({
26
26
storageKey = 'vite-ui-theme' ,
27
27
...props
28
28
} : ThemeProviderProps ) {
29
- const [ theme , setTheme ] = useState < Theme > (
29
+ const [ theme , _setTheme ] = useState < Theme > (
30
30
( ) => ( localStorage . getItem ( storageKey ) as Theme ) || defaultTheme
31
31
)
32
32
33
33
useEffect ( ( ) => {
34
34
const root = window . document . documentElement
35
+ const mediaQuery = window . matchMedia ( '(prefers-color-scheme: dark)' )
35
36
36
- root . classList . remove ( 'light' , 'dark' )
37
-
38
- if ( theme === 'system' ) {
39
- const systemTheme = window . matchMedia ( '(prefers-color-scheme: dark)' )
40
- . matches
41
- ? 'dark'
42
- : 'light'
37
+ const applyTheme = ( theme : Theme ) => {
38
+ root . classList . remove ( 'light' , 'dark' ) // Remove existing theme classes
39
+ const systemTheme = mediaQuery . matches ? 'dark' : 'light'
40
+ const effectiveTheme = theme === 'system' ? systemTheme : theme
41
+ root . classList . add ( effectiveTheme ) // Add the new theme class
42
+ }
43
43
44
- root . classList . add ( systemTheme )
45
- return
44
+ const handleChange = ( ) => {
45
+ if ( theme === 'system' ) {
46
+ applyTheme ( 'system' )
47
+ }
46
48
}
47
49
48
- root . classList . add ( theme )
50
+ applyTheme ( theme )
51
+
52
+ mediaQuery . addEventListener ( 'change' , handleChange )
53
+
54
+ return ( ) => mediaQuery . removeEventListener ( 'change' , handleChange )
49
55
} , [ theme ] )
50
56
57
+ const setTheme = ( theme : Theme ) => {
58
+ localStorage . setItem ( storageKey , theme )
59
+ _setTheme ( theme )
60
+ }
61
+
51
62
const value = {
52
63
theme,
53
- setTheme : ( theme : Theme ) => {
54
- localStorage . setItem ( storageKey , theme )
55
- setTheme ( theme )
56
- } ,
64
+ setTheme,
57
65
}
58
66
59
67
return (
0 commit comments