Skip to content

Commit ff87ef1

Browse files
committed
add third "auto" toggle state, adjusting to browser settings
1 parent 6382fde commit ff87ef1

File tree

3 files changed

+45
-13
lines changed

3 files changed

+45
-13
lines changed

static/icons/auto.svg

Lines changed: 4 additions & 0 deletions
Loading

static/js/themetoggle.js

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ function toggleTheme() {
1010
setTheme("dark");
1111
updateItemToggleTheme();
1212
} else if (localStorage.getItem("theme-storage") === "dark") {
13+
setTheme("auto");
14+
updateItemToggleTheme();
15+
} else {
1316
setTheme("light");
1417
updateItemToggleTheme();
1518
}
@@ -20,38 +23,57 @@ function updateItemToggleTheme() {
2023

2124
const darkModeStyle = document.getElementById("darkModeStyle");
2225
if (darkModeStyle) {
23-
darkModeStyle.disabled = (mode === "light");
26+
if (mode === "dark" || (mode === "auto" && getSystemPrefersDark())) {
27+
darkModeStyle.disabled = false;
28+
} else {
29+
darkModeStyle.disabled = true;
30+
}
2431
}
2532

2633
const sunIcon = document.getElementById("sun-icon");
2734
const moonIcon = document.getElementById("moon-icon");
28-
if (sunIcon && moonIcon) {
29-
sunIcon.style.display = (mode === "dark") ? "block" : "none";
30-
moonIcon.style.display = (mode === "light") ? "block" : "none";
35+
const autoIcon = document.getElementById("auto-icon");
36+
if (sunIcon && moonIcon && autoIcon) {
37+
sunIcon.style.display = (mode === "light") ? "block" : "none";
38+
moonIcon.style.display = (mode === "dark") ? "block" : "none";
39+
autoIcon.style.display = (mode === "auto") ? "block" : "none";
40+
41+
if (mode === "auto") {
42+
autoIcon.style.filter = getSystemPrefersDark() ? "invert(1)" : "invert(0)";
43+
}
3144
}
3245

3346
let htmlElement = document.querySelector("html");
34-
if (mode === "dark") {
47+
if (mode === "dark" || (mode === "auto" && getSystemPrefersDark())) {
3548
htmlElement.classList.remove("light")
3649
htmlElement.classList.add("dark")
37-
} else if (mode === "light") {
50+
} else {
3851
htmlElement.classList.remove("dark")
3952
htmlElement.classList.add("light")
4053
}
4154
}
4255

56+
function getSystemPrefersDark() {
57+
return window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
58+
}
59+
4360
function getSavedTheme() {
4461
let currentTheme = localStorage.getItem("theme-storage");
4562
if(!currentTheme) {
46-
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
47-
currentTheme = "dark";
48-
} else {
49-
currentTheme = "light";
50-
}
63+
currentTheme = getSystemPrefersDark() ? "dark" : "light";
5164
}
5265

5366
return currentTheme;
5467
}
5568

5669
// Update the toggle theme on page load
5770
updateItemToggleTheme();
71+
72+
// Listen for system theme changes in auto mode
73+
if (window.matchMedia) {
74+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function(e) {
75+
if (getSavedTheme() === "auto") {
76+
updateItemToggleTheme();
77+
}
78+
});
79+
}

templates/partials/nav.html

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,15 @@ <h1 id="modalTitle" class="page-header">
7979
href="#">
8080
<img src="{{ get_url(path='icons/sun.svg') }}"
8181
id="sun-icon"
82-
style="filter: invert(1)"
8382
alt="Light" />
84-
<img src={{ get_url(path="icons/moon.svg") }} id="moon-icon" alt="Dark" />
83+
<img src="{{ get_url(path='icons/moon.svg') }}"
84+
id="moon-icon"
85+
style="filter: invert(1)"
86+
alt="Dark" />
87+
<img src="{{ get_url(path='icons/auto.svg') }}"
88+
id="auto-icon"
89+
style="filter: invert(1)"
90+
alt="Auto" />
8591
</a>
8692

8793
<!-- Initialize the theme toggle icons -->

0 commit comments

Comments
 (0)