Skip to content

Commit f660161

Browse files
committed
Make the dark mode js more robust (I hope)
1 parent 34825f6 commit f660161

File tree

1 file changed

+56
-15
lines changed

1 file changed

+56
-15
lines changed

themes/CodeMeta-Pyramids/static/js/codemeta.js

Lines changed: 56 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,27 +32,68 @@ document.addEventListener('DOMContentLoaded', (event) => {
3232
const switchEl = document.getElementById('darkModeSwitch');
3333
const darkEl = document.getElementById('dark-mode-bi');
3434
const lightEl = document.getElementById('light-mode-bi');
35+
36+
function setIcon(mode) {
37+
if (mode == 'dark' && darkEl.classList.contains('d-none')) {
38+
lightEl.classList.add('d-none');
39+
darkEl.classList.remove('d-none');
40+
} else if (mode == 'light' && lightEl.classList.contains('d-none')) {
41+
darkEl.classList.add('d-none');
42+
lightEl.classList.remove('d-none');
43+
}
44+
}
45+
46+
function toggleIcon(mode) {
47+
if (mode == 'dark') {
48+
setIcon('light');
49+
} else if (mode == 'light') {
50+
setIcon('dark');
51+
}
52+
}
3553

54+
function switchMode(mode, bsTheme) {
55+
if (mode == true) {
56+
htmlEl.setAttribute('data-bs-theme', 'dark');
57+
if (bsTheme == true) {
58+
localStorage.setItem('bsTheme', 'dark');
59+
}
60+
toggleIcon('dark');
61+
} else {
62+
htmlEl.setAttribute('data-bs-theme', 'light');
63+
if (bsTheme == true) {
64+
localStorage.setItem('bsTheme', 'light');
65+
}
66+
toggleIcon('light');
67+
}
68+
}
69+
const currentTheme = localStorage.getItem('bsTheme') || null;
70+
71+
// Set the theme by OS preferences
72+
if (window.matchMedia) {
73+
var osMode = window.matchMedia('(prefers-color-scheme: dark)')
74+
if (currentTheme == null) {
75+
switchEl.setAttribute('checked', osMode.matches);
76+
switchMode(osMode.matches, false);
77+
}
78+
osMode.addEventListener('change', e => {
79+
if (currentTheme == null) {
80+
switchEl.setAttribute('checked', osMode.matches);
81+
switchMode(osMode.matches, false);
82+
}
83+
})
84+
85+
}
3686
// Set the default theme to light if no setting is found in local storage
37-
const currentTheme = localStorage.getItem('bsTheme') || 'light';
38-
htmlEl.setAttribute('data-bs-theme', currentTheme);
39-
switchEl.checked = currentTheme === 'light';
87+
88+
toggleIcon(currentTheme);
4089

4190
switchEl.addEventListener('change', function () {
4291
if (this.checked) {
43-
htmlEl.setAttribute('data-bs-theme', 'light');
44-
localStorage.setItem('bsTheme', 'light');
45-
if (darkEl.classList.contains('d-none')) {
46-
lightEl.classList.add('d-none');
47-
darkEl.classList.remove('d-none');
48-
}
92+
switchMode(false, true);
93+
setIcon('dark');
4994
} else {
50-
htmlEl.setAttribute('data-bs-theme', 'dark');
51-
localStorage.setItem('bsTheme', 'dark');
52-
if (lightEl.classList.contains('d-none')) {
53-
darkEl.classList.add('d-none');
54-
lightEl.classList.remove('d-none');
55-
}
95+
switchMode(true, true);
96+
setIcon('light');
5697
}
5798
});
5899
});

0 commit comments

Comments
 (0)