Skip to content

Commit 201ce3f

Browse files
authored
fix(theme-toggle): quick flash (light/dark) (#768)
* fix(theme-toggle): quick flash (light/dark) * chore: simplify * chore: simplify * chore: simplify
1 parent 18a9335 commit 201ce3f

File tree

2 files changed

+24
-33
lines changed

2 files changed

+24
-33
lines changed

assets/js/theme.js

Lines changed: 6 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,22 @@
11
// Light / Dark theme toggle
22
(function () {
33
const defaultTheme = '{{ site.Params.theme.default | default `system`}}'
4+
const themes = ["light", "dark"];
45

56
const themeToggleButtons = document.querySelectorAll(".hextra-theme-toggle");
67
const themeToggleOptions = document.querySelectorAll(".hextra-theme-toggle-options p");
78

8-
function setSystemTheme() {
9-
const prefersColorScheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
10-
11-
document.documentElement.classList.remove("dark", "light");
12-
document.documentElement.classList.add(prefersColorScheme);
13-
14-
document.documentElement.style.colorScheme = prefersColorScheme;
15-
}
16-
179
function applyTheme(theme) {
10+
theme = themes.includes(theme) ? theme : "system";
11+
1812
themeToggleButtons.forEach((btn) => btn.parentElement.dataset.theme = theme );
1913

2014
localStorage.setItem("color-theme", theme);
2115
}
2216

2317
function switchTheme(theme) {
24-
switch (theme) {
25-
case "light":
26-
document.documentElement.classList.remove("dark");
27-
document.documentElement.classList.add(theme);
28-
document.documentElement.style.colorScheme = theme;
29-
30-
applyTheme(theme);
31-
32-
break;
33-
case "dark":
34-
document.documentElement.classList.remove("light");
35-
document.documentElement.classList.add(theme);
36-
document.documentElement.style.colorScheme = theme;
37-
38-
applyTheme(theme);
39-
40-
break;
41-
default:
42-
setSystemTheme();
43-
applyTheme("system");
44-
45-
break;
46-
}
18+
setTheme(theme);
19+
applyTheme(theme);
4720
}
4821

4922
const colorTheme = "color-theme" in localStorage ? localStorage.getItem("color-theme") : defaultTheme;
@@ -112,7 +85,7 @@
11285
// Listen for system theme changes
11386
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
11487
if (localStorage.getItem("color-theme") === "system") {
115-
setSystemTheme();
88+
setTheme("system");
11689
}
11790
});
11891
})();

layouts/_partials/head.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,24 @@
5959
{{ partial "google-analytics.html" . -}}
6060
{{- end }}
6161

62+
<script>
63+
// The section must not be in the theme.js file because it can create a quick flash (switch between light and dark).
64+
65+
function setTheme(theme) {
66+
document.documentElement.classList.remove("light", "dark");
67+
68+
if (theme !== "light" && theme !== "dark") {
69+
theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
70+
}
71+
72+
document.documentElement.classList.add(theme);
73+
document.documentElement.style.colorScheme = theme;
74+
}
75+
76+
setTheme("color-theme" in localStorage ? localStorage.getItem("color-theme") : '{{ site.Params.theme.default | default `system`}}')
77+
78+
</script>
79+
6280
<!-- Math engine -->
6381
{{ $noop := .WordCount -}}
6482
{{- $engine := site.Params.math.engine | default "katex" -}}

0 commit comments

Comments
 (0)