@@ -22,8 +22,11 @@ const defaultState = {
2222
2323export const ThemeManagerContext = createContext ( defaultState ) ;
2424
25+ // Safe check for browser environment
26+ const isBrowser = typeof window !== "undefined" ;
27+
2528const systemDarkModeSetting = ( ) =>
26- window . matchMedia ? window . matchMedia ( "(prefers-color-scheme: dark)" ) : null ;
29+ isBrowser && window . matchMedia ? window . matchMedia ( "(prefers-color-scheme: dark)" ) : null ;
2730const isDarkModeActive = ( ) => {
2831 // Assume that dark mode is not active if there's no system dark mode setting available
2932 return ! ! systemDarkModeSetting ( ) ?. matches ;
@@ -36,15 +39,29 @@ export const ThemeManagerProvider = (props) => {
3639 const [ isDark , setIsDark ] = useState ( false ) ;
3740
3841 useEffect ( ( ) => {
42+ if ( ! isBrowser ) return ;
43+
3944 const root = window . document . documentElement ;
4045 const initialColorValue = root . style . getPropertyValue (
4146 "--initial-color-mode"
4247 ) ;
4348 setIsDark ( initialColorValue === ThemeSetting . DARK ) ;
4449 setDidLoad ( true ) ;
45- } , [ ] ) ;
50+
51+ // Add listener for system color scheme changes
52+ const darkModeMediaQuery = systemDarkModeSetting ( ) ;
53+ if ( darkModeMediaQuery && themeSetting === ThemeSetting . SYSTEM ) {
54+ const handleChange = ( e ) => {
55+ setIsDark ( e . matches ) ;
56+ } ;
57+ darkModeMediaQuery . addEventListener ( "change" , handleChange ) ;
58+ return ( ) => darkModeMediaQuery . removeEventListener ( "change" , handleChange ) ;
59+ }
60+ } , [ themeSetting ] ) ;
4661
4762 const toggleDark = ( value ) => {
63+ if ( ! isBrowser ) return ;
64+
4865 const newIsDark = value ?? ! isDark ;
4966 const theme = newIsDark ? ThemeSetting . DARK : ThemeSetting . LIGHT ;
5067 setIsDark ( newIsDark ) ;
@@ -53,6 +70,8 @@ export const ThemeManagerProvider = (props) => {
5370 } ;
5471
5572 const changeThemeSetting = ( setting ) => {
73+ if ( ! isBrowser ) return ;
74+
5675 switch ( setting ) {
5776 case ThemeSetting . SYSTEM : {
5877 setIsDark ( isDarkModeActive ( ) ) ;
0 commit comments