Skip to content

Commit b5788ba

Browse files
committed
fix(theme-toggle): quick flash (light/dark)
1 parent 18a9335 commit b5788ba

File tree

2 files changed

+47
-17
lines changed

2 files changed

+47
-17
lines changed

assets/js/theme.js

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,6 @@
55
const themeToggleButtons = document.querySelectorAll(".hextra-theme-toggle");
66
const themeToggleOptions = document.querySelectorAll(".hextra-theme-toggle-options p");
77

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-
178
function applyTheme(theme) {
189
themeToggleButtons.forEach((btn) => btn.parentElement.dataset.theme = theme );
1910

@@ -23,18 +14,12 @@
2314
function switchTheme(theme) {
2415
switch (theme) {
2516
case "light":
26-
document.documentElement.classList.remove("dark");
27-
document.documentElement.classList.add(theme);
28-
document.documentElement.style.colorScheme = theme;
29-
17+
setLightTheme()
3018
applyTheme(theme);
3119

3220
break;
3321
case "dark":
34-
document.documentElement.classList.remove("light");
35-
document.documentElement.classList.add(theme);
36-
document.documentElement.style.colorScheme = theme;
37-
22+
setDarkTheme()
3823
applyTheme(theme);
3924

4025
break;

layouts/_partials/head.html

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,51 @@
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+
const defaultTheme = '{{ site.Params.theme.default | default `system`}}'
66+
67+
function setLightTheme() {
68+
document.documentElement.classList.remove("dark");
69+
document.documentElement.classList.add("light");
70+
document.documentElement.style.colorScheme = "light";
71+
}
72+
73+
function setDarkTheme() {
74+
document.documentElement.classList.remove("light");
75+
document.documentElement.classList.add("dark");
76+
document.documentElement.style.colorScheme = "dark";
77+
}
78+
79+
function setSystemTheme() {
80+
const prefersColorScheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
81+
82+
document.documentElement.classList.remove("dark", "light");
83+
document.documentElement.classList.add(prefersColorScheme);
84+
85+
document.documentElement.style.colorScheme = prefersColorScheme;
86+
}
87+
88+
const colorTheme = "color-theme" in localStorage ? localStorage.getItem("color-theme") : defaultTheme;
89+
90+
switch (colorTheme) {
91+
case "light":
92+
setLightTheme();
93+
94+
break;
95+
case "dark":
96+
setDarkTheme()
97+
98+
break;
99+
default:
100+
setSystemTheme();
101+
102+
break;
103+
}
104+
105+
</script>
106+
62107
<!-- Math engine -->
63108
{{ $noop := .WordCount -}}
64109
{{- $engine := site.Params.math.engine | default "katex" -}}

0 commit comments

Comments
 (0)