|
1 | 1 | // Light / Dark theme toggle |
2 | 2 | (function () { |
3 | 3 | const defaultTheme = '{{ site.Params.theme.default | default `system`}}' |
| 4 | + const themes = ["light", "dark"]; |
4 | 5 |
|
5 | 6 | const themeToggleButtons = document.querySelectorAll(".hextra-theme-toggle"); |
6 | 7 | const themeToggleOptions = document.querySelectorAll(".hextra-theme-toggle-options p"); |
7 | 8 |
|
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 | | - |
17 | 9 | function applyTheme(theme) { |
| 10 | + theme = themes.includes(theme) ? theme : "system"; |
| 11 | + |
18 | 12 | themeToggleButtons.forEach((btn) => btn.parentElement.dataset.theme = theme ); |
19 | 13 |
|
20 | 14 | localStorage.setItem("color-theme", theme); |
21 | 15 | } |
22 | 16 |
|
23 | 17 | 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); |
47 | 20 | } |
48 | 21 |
|
49 | 22 | const colorTheme = "color-theme" in localStorage ? localStorage.getItem("color-theme") : defaultTheme; |
|
112 | 85 | // Listen for system theme changes |
113 | 86 | window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => { |
114 | 87 | if (localStorage.getItem("color-theme") === "system") { |
115 | | - setSystemTheme(); |
| 88 | + setTheme("system"); |
116 | 89 | } |
117 | 90 | }); |
118 | 91 | })(); |
0 commit comments