@@ -35,6 +35,13 @@ export function getIsDarkClientSide() {
35
35
return $isAfterFirstEffect . current ? $clientSideIsDark . current : ssrWasPerformedWithIsDark ;
36
36
}
37
37
38
+ function getSystemColorScheme ( ) {
39
+ return typeof window . matchMedia === "function" &&
40
+ window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
41
+ ? "dark"
42
+ : "light" ;
43
+ }
44
+
38
45
export const useIsDarkClientSide : UseIsDark = ( ) => {
39
46
useRerenderOnChange ( $clientSideIsDark ) ;
40
47
useRerenderOnChange ( $isAfterFirstEffect ) ;
@@ -54,10 +61,7 @@ export const useIsDarkClientSide: UseIsDark = () => {
54
61
: newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
55
62
) {
56
63
case "system" :
57
- return typeof window . matchMedia === "function" &&
58
- window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
59
- ? "dark"
60
- : "light" ;
64
+ return getSystemColorScheme ( ) ;
61
65
case true :
62
66
return "dark" ;
63
67
case false :
@@ -113,20 +117,40 @@ export function startClientSideIsDarkLogic(params: {
113
117
trustedTypesPolicyName
114
118
} = params ;
115
119
116
- reset_user_preference : {
120
+ reset_persisted_value_if_website_config_changed : {
117
121
const localStorageKey = "scheme-default" ;
118
122
119
123
const localStorageValue = localStorage . getItem ( localStorageKey ) ;
120
124
121
125
if ( localStorageValue === colorSchemeExplicitlyProvidedAsParameter ) {
122
- break reset_user_preference ;
126
+ break reset_persisted_value_if_website_config_changed ;
123
127
}
124
128
125
129
localStorage . removeItem ( "scheme" ) ;
126
130
127
131
localStorage . setItem ( localStorageKey , colorSchemeExplicitlyProvidedAsParameter ) ;
128
132
}
129
133
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
+
130
154
const { clientSideIsDark, ssrWasPerformedWithIsDark : ssrWasPerformedWithIsDark_ } = ( ( ) : {
131
155
clientSideIsDark : boolean ;
132
156
ssrWasPerformedWithIsDark : boolean ;
0 commit comments