Skip to content

Commit caeb852

Browse files
committed
Fix setDarkMode when JS not started yet
1 parent c9e1fde commit caeb852

File tree

1 file changed

+31
-18
lines changed

1 file changed

+31
-18
lines changed

src/lib/darkMode.ts

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ export type ColorScheme = "light" | "dark";
99

1010
export const data_fr_theme = "data-fr-theme";
1111
export const data_fr_scheme = "data-fr-scheme";
12+
const data_fr_js = "data-fr-js";
13+
1214
export const rootColorSchemeStyleTagId = "dsfr-root-color-scheme";
1315

1416
const $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

Comments
 (0)