@@ -35,6 +35,13 @@ export function getIsDarkClientSide() {
3535 return $isAfterFirstEffect . current ? $clientSideIsDark . current : ssrWasPerformedWithIsDark ;
3636}
3737
38+ function getSystemColorScheme ( ) {
39+ return typeof window . matchMedia === "function" &&
40+ window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
41+ ? "dark"
42+ : "light" ;
43+ }
44+
3845export const useIsDarkClientSide : UseIsDark = ( ) => {
3946 useRerenderOnChange ( $clientSideIsDark ) ;
4047 useRerenderOnChange ( $isAfterFirstEffect ) ;
@@ -54,10 +61,7 @@ export const useIsDarkClientSide: UseIsDark = () => {
5461 : newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
5562 ) {
5663 case "system" :
57- return typeof window . matchMedia === "function" &&
58- window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
59- ? "dark"
60- : "light" ;
64+ return getSystemColorScheme ( ) ;
6165 case true :
6266 return "dark" ;
6367 case false :
@@ -113,20 +117,40 @@ export function startClientSideIsDarkLogic(params: {
113117 trustedTypesPolicyName
114118 } = params ;
115119
116- reset_user_preference : {
120+ reset_persisted_value_if_website_config_changed : {
117121 const localStorageKey = "scheme-default" ;
118122
119123 const localStorageValue = localStorage . getItem ( localStorageKey ) ;
120124
121125 if ( localStorageValue === colorSchemeExplicitlyProvidedAsParameter ) {
122- break reset_user_preference ;
126+ break reset_persisted_value_if_website_config_changed ;
123127 }
124128
125129 localStorage . removeItem ( "scheme" ) ;
126130
127131 localStorage . setItem ( localStorageKey , colorSchemeExplicitlyProvidedAsParameter ) ;
128132 }
129133
134+ reset_persisted_value_if_system_pref_changed: {
135+ if ( colorSchemeExplicitlyProvidedAsParameter !== "system" ) {
136+ break reset_persisted_value_if_system_pref_changed;
137+ }
138+
139+ const localStorageKey = "scheme-system" ;
140+
141+ const localStorageValue = localStorage . getItem ( localStorageKey ) ;
142+
143+ const systemColorScheme = getSystemColorScheme ( ) ;
144+
145+ if ( localStorageValue === systemColorScheme ) {
146+ break reset_persisted_value_if_system_pref_changed;
147+ }
148+
149+ localStorage . removeItem ( "scheme" ) ;
150+
151+ localStorage . setItem ( localStorageKey , systemColorScheme ) ;
152+ }
153+
130154 const { clientSideIsDark, ssrWasPerformedWithIsDark : ssrWasPerformedWithIsDark_ } = ( ( ) : {
131155 clientSideIsDark : boolean ;
132156 ssrWasPerformedWithIsDark : boolean ;
0 commit comments