Skip to content

Commit ad3166a

Browse files
fix bugs and refactor theme.js
1 parent ea489a4 commit ad3166a

4 files changed

Lines changed: 42 additions & 45 deletions

File tree

_includes/header.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@
249249
<div class="header-right">
250250
<button id="theme-toggle" type="button" class="theme-btn" title="change theme" aria-label="Toggle light or dark mode">
251251
<span id="icon-moon">{% include icons/moon.svg %}</span>
252-
<span id="icon-sun" style="display: none;">{% include icons/sun.svg %}</span>
252+
<span id="icon-sun">{% include icons/sun.svg %}</span>
253253
</button>
254254
{% include language-picker.html %}
255255
{% include language-picker-mobile.html %}

css/style.css

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,19 @@ a.openjs-logo {
760760
width: 125px;
761761
height: 39px;
762762
cursor: pointer;
763+
background-color: inherit;
764+
color: var(--fg);
765+
display: flex;
766+
justify-content: center;
767+
align-items: center;
768+
}
769+
770+
#icon-moon,
771+
#icon-sun {
772+
display: none;
773+
}
774+
html.light-mode #icon-moon {
775+
display: inline;
763776
}
764777

765778
/* theme and lang btn */

css/themes/dark-theme.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
html.dark-mode {
22

3+
#icon-sun {
4+
display: inline;
5+
}
6+
37
.submenu-content {
48
box-shadow: 1px 2px var(--hover-bg);
59
background-color: var(--card-bg);

js/theme.js

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,31 @@ const themeWatcher = watchColorSchemeChange((colorScheme) => {
1010
const systemTheme = localStorage.getItem('system-theme')
1111
// setting stored in local storage
1212
const localTheme = localStorage.getItem('local-theme')
13-
// // if no local theme set - system is default
13+
// if no local theme set - system is default
1414
if (localTheme === null) {
1515
setTheme(colorScheme)
16-
localStorage.setItem('system-theme', colorScheme || 'light')
16+
localStorage.setItem('system-theme', colorScheme)
1717
// page load - load any stored themes or set theme
1818
} else {
1919
// listen for system changes, update if any
2020
if (colorScheme != systemTheme) {
2121
setTheme(colorScheme)
22-
localStorage.setItem('system-theme', colorScheme || 'light')
23-
// override local theme
24-
localStorage.removeItem('local-theme')
22+
localStorage.setItem('system-theme', colorScheme)
2523
} else {
2624
// else load local theme
27-
if (localTheme === 'light') {
28-
lightModeOn()
29-
} else if (localTheme === 'dark') {
30-
darkModeOn()
31-
}
25+
setTheme(localTheme);
3226
}
3327
}
34-
// wait for load then and add listner on button
28+
// wait for load then and add listener on button
3529
document.addEventListener('DOMContentLoaded', () => {
36-
37-
document
38-
.querySelector('#theme-toggle')
39-
.addEventListener('click', toggleLocalStorageTheme)
30+
const themeToggle = document?.querySelector('#theme-toggle');
31+
themeToggle.addEventListener('click', toggleLocalStorageTheme);
32+
// set area-label for screen readers
33+
themeToggle.setAttribute('aria-label', colorScheme ? 'Switch to light mode' : 'Switch to dark mode');
4034
})
4135
}
4236
})
43-
// set the theme to given value
37+
// apply current theme
4438
function setTheme(theme) {
4539
// only support dark else any other defaults to light
4640
if (theme === 'dark') {
@@ -49,39 +43,26 @@ function setTheme(theme) {
4943
lightModeOn()
5044
}
5145
}
52-
// toggle btwn themes or set a theme if none set
53-
function toggleLocalStorageTheme(e) {
54-
const localTheme = localStorage.getItem('local-theme')
46+
// toggle btn themes
47+
function toggleLocalStorageTheme() {
48+
const localTheme = localStorage.getItem('local-theme');
5549
if (localTheme === 'light') {
56-
localStorage.setItem('local-theme', 'dark')
57-
darkModeOn()
58-
} else if (localTheme === 'dark') {
59-
localStorage.setItem('local-theme', 'light')
60-
lightModeOn()
61-
// localTheme still null
50+
setTheme('dark');
6251
} else {
63-
// need to check page state then set
64-
if (darkModeState()) {
65-
localStorage.setItem('local-theme', 'light')
66-
lightModeOn()
67-
} else {
68-
localStorage.setItem('local-theme', 'dark')
69-
darkModeOn()
70-
}
52+
setTheme('light');
7153
}
7254
}
7355
function darkModeOn() {
7456
document?.documentElement?.classList?.remove('light-mode')
7557
document?.documentElement?.classList?.add('dark-mode')
7658
updateThemeIcon('dark');
59+
localStorage.setItem('local-theme', 'dark');
7760
}
7861
function lightModeOn() {
7962
document?.documentElement?.classList.remove('dark-mode')
8063
document?.documentElement?.classList?.add('light-mode')
8164
updateThemeIcon('light');
82-
}
83-
function darkModeState() {
84-
return document?.documentElement?.classList.contains('dark-mode')
65+
localStorage.setItem('local-theme', 'light');
8566
}
8667
function hasLocalStorage() {
8768
return typeof Storage !== 'undefined'
@@ -102,16 +83,15 @@ function watchColorSchemeChange(callback) {
10283
}
10384

10485
function updateThemeIcon (theme) {
105-
const sun = document.getElementById('icon-sun');
106-
const moon = document.getElementById('icon-moon');
107-
if (!sun || !moon) return;
108-
86+
const sun = document?.getElementById('icon-sun');
87+
const moon = document?.getElementById('icon-moon');
88+
const themeToggle = document?.getElementById('theme-toggle');
89+
if (!sun || !moon || !themeToggle) return;
10990
const isDark = theme === 'dark';
110-
111-
// Show the icon representing the *next* theme
112-
sun.style.display = isDark ? 'block' : 'none'; // Show sun in dark mode
113-
moon.style.display = isDark ? 'none' : 'block'; // Show moon in light mode
11491
// improve accessibility for screen readers
92+
sun.hidden = !isDark;
93+
moon.hidden = isDark;
11594
sun.setAttribute('aria-hidden', isDark ? 'false' : 'true');
11695
moon.setAttribute('aria-hidden', isDark ? 'true' : 'false');
96+
themeToggle.setAttribute('aria-label', isDark ? 'Switch to light mode' : 'Switch to dark mode');
11797
};

0 commit comments

Comments
 (0)