Skip to content

Commit 110aa45

Browse files
author
Guillermo Moraleda
committed
Auto-apply theme from OS preference
1 parent 35d88a5 commit 110aa45

1 file changed

Lines changed: 53 additions & 12 deletions

File tree

assets/javascript/toggleDark.js

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,53 @@
1-
var checkbox = document.querySelector('input[name=mode]')
2-
checkbox.addEventListener('change', function() {
3-
if(this.checked) {
4-
document.documentElement.setAttribute('data-theme', 'dark')
5-
var moon = document.getElementById('moon')
6-
moon.innerHTML = feather.icons['sun'].toSvg({'fill': 'var(--fg-color-dark)'})
7-
} else {
8-
document.documentElement.setAttribute('data-theme', 'light')
9-
var moon = document.getElementById('moon')
10-
moon.innerHTML = feather.icons['moon'].toSvg({'fill': 'var(--fg-color-dark)'})
11-
}
12-
})
1+
var checkbox = document.querySelector('input[name=mode]');
2+
var moon = document.getElementById('moon');
3+
var storageKey = 'theme-preference';
4+
var mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
5+
6+
function setIcon(theme) {
7+
if (!moon || typeof feather === 'undefined') {
8+
return;
9+
}
10+
11+
var iconName = theme === 'dark' ? 'sun' : 'moon';
12+
moon.innerHTML = feather.icons[iconName].toSvg({ fill: 'var(--fg-color-dark)' });
13+
}
14+
15+
function applyTheme(theme) {
16+
document.documentElement.setAttribute('data-theme', theme);
17+
if (checkbox) {
18+
checkbox.checked = theme === 'dark';
19+
}
20+
setIcon(theme);
21+
}
22+
23+
function getPreferredTheme() {
24+
var saved = localStorage.getItem(storageKey);
25+
if (saved === 'light' || saved === 'dark') {
26+
return saved;
27+
}
28+
return mediaQuery.matches ? 'dark' : 'light';
29+
}
30+
31+
if (checkbox) {
32+
applyTheme(getPreferredTheme());
33+
34+
checkbox.addEventListener('change', function() {
35+
var theme = this.checked ? 'dark' : 'light';
36+
localStorage.setItem(storageKey, theme);
37+
applyTheme(theme);
38+
});
39+
}
40+
41+
function handleSystemThemeChange(event) {
42+
var saved = localStorage.getItem(storageKey);
43+
if (saved === 'light' || saved === 'dark') {
44+
return;
45+
}
46+
applyTheme(event.matches ? 'dark' : 'light');
47+
}
48+
49+
if (typeof mediaQuery.addEventListener === 'function') {
50+
mediaQuery.addEventListener('change', handleSystemThemeChange);
51+
} else if (typeof mediaQuery.addListener === 'function') {
52+
mediaQuery.addListener(handleSystemThemeChange);
53+
}

0 commit comments

Comments
 (0)