@@ -9,6 +9,8 @@ export type ColorScheme = "light" | "dark";
99
1010export const data_fr_theme = "data-fr-theme" ;
1111export const data_fr_scheme = "data-fr-scheme" ;
12+ const data_fr_js = "data-fr-js" ;
13+
1214export const rootColorSchemeStyleTagId = "dsfr-root-color-scheme" ;
1315
1416const $clientSideIsDark = createStatefulObservable < boolean > ( ( ) => {
@@ -33,24 +35,35 @@ const useIsDarkClientSide: UseIsDark = () => {
3335 : ssrWasPerformedWithIsDark ;
3436
3537 const setIsDark = useConstCallback < ReturnType < UseIsDark > [ "setIsDark" ] > (
36- newIsDarkOrDeduceNewIsDarkFromCurrentIsDark =>
37- document . documentElement . setAttribute (
38- data_fr_scheme ,
39- ( ( ) : ColorScheme | "system" => {
40- switch (
41- typeof newIsDarkOrDeduceNewIsDarkFromCurrentIsDark === "function"
42- ? newIsDarkOrDeduceNewIsDarkFromCurrentIsDark ( isDark )
43- : newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
44- ) {
45- case "system" :
46- return "system" ;
47- case true :
48- return "dark" ;
49- case false :
50- return "light" ;
51- }
52- } ) ( )
53- )
38+ newIsDarkOrDeduceNewIsDarkFromCurrentIsDark => {
39+ const data_fr_js_value = document . documentElement . getAttribute ( data_fr_js ) ;
40+
41+ const newColorScheme = ( ( ) : ColorScheme => {
42+ switch (
43+ typeof newIsDarkOrDeduceNewIsDarkFromCurrentIsDark === "function"
44+ ? newIsDarkOrDeduceNewIsDarkFromCurrentIsDark ( isDark )
45+ : newIsDarkOrDeduceNewIsDarkFromCurrentIsDark
46+ ) {
47+ case "system" :
48+ return typeof window . matchMedia === "function" &&
49+ window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches
50+ ? "dark"
51+ : "light" ;
52+ case true :
53+ return "dark" ;
54+ case false :
55+ return "light" ;
56+ }
57+ } ) ( ) ;
58+
59+ document . documentElement . setAttribute ( data_fr_scheme , newColorScheme ) ;
60+
61+ if ( data_fr_js_value !== "true" ) {
62+ //NOTE: DSFR not started yet.
63+ document . documentElement . setAttribute ( data_fr_theme , newColorScheme ) ;
64+ localStorage . setItem ( "scheme" , newColorScheme ) ;
65+ }
66+ }
5467 ) ;
5568
5669 return {
0 commit comments