Skip to content

Commit 036569f

Browse files
committed
feat(docs): add system/light/dark theme toggle
- Default to system preference (follows OS setting) - Click to cycle: System -> Light -> Dark -> System - Automatically updates when OS preference changes (in System mode) - Persists preference to localStorage
1 parent 1cdb891 commit 036569f

2 files changed

Lines changed: 37 additions & 21 deletions

File tree

docs/_includes/head_custom.html

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
<script>
22
// Apply saved theme on page load (before render to prevent flash)
33
(function() {
4-
var savedTheme = localStorage.getItem('theme');
5-
if (savedTheme) {
6-
document.documentElement.setAttribute('data-theme', savedTheme);
4+
var savedMode = localStorage.getItem('theme-mode') || 'system';
5+
var theme;
6+
if (savedMode === 'system') {
7+
theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
8+
} else {
9+
theme = savedMode;
710
}
11+
document.documentElement.setAttribute('data-theme', theme);
812
})();
913
</script>
Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,38 @@
1-
<button class="btn js-toggle-dark-mode">Toggle dark mode</button>
1+
<button class="btn js-toggle-dark-mode">Theme: System</button>
22

33
<script>
4-
const toggleDarkMode = document.querySelector('.js-toggle-dark-mode');
4+
(function() {
5+
var toggleBtn = document.querySelector('.js-toggle-dark-mode');
6+
var modes = ['system', 'light', 'dark'];
7+
var labels = { system: 'System', light: 'Light', dark: 'Dark' };
58

6-
jtd.addEvent(toggleDarkMode, 'click', function(){
7-
if (jtd.getTheme() === 'dark') {
8-
jtd.setTheme('light');
9-
localStorage.setItem('theme', 'light');
10-
toggleDarkMode.textContent = 'Toggle dark mode';
11-
} else {
12-
jtd.setTheme('dark');
13-
localStorage.setItem('theme', 'dark');
14-
toggleDarkMode.textContent = 'Toggle light mode';
9+
function getSystemTheme() {
10+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
1511
}
16-
});
1712

18-
// Set initial button text based on current theme
19-
(function() {
20-
var savedTheme = localStorage.getItem('theme');
21-
if (savedTheme === 'dark') {
22-
toggleDarkMode.textContent = 'Toggle light mode';
23-
jtd.setTheme('dark');
13+
function applyMode(mode) {
14+
var theme = (mode === 'system') ? getSystemTheme() : mode;
15+
jtd.setTheme(theme);
16+
toggleBtn.textContent = 'Theme: ' + labels[mode];
17+
localStorage.setItem('theme-mode', mode);
2418
}
19+
20+
// Initialize
21+
var currentMode = localStorage.getItem('theme-mode') || 'system';
22+
applyMode(currentMode);
23+
24+
// Listen for system preference changes
25+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function() {
26+
if (localStorage.getItem('theme-mode') === 'system') {
27+
jtd.setTheme(getSystemTheme());
28+
}
29+
});
30+
31+
// Cycle through modes on click
32+
jtd.addEvent(toggleBtn, 'click', function() {
33+
var current = localStorage.getItem('theme-mode') || 'system';
34+
var nextIndex = (modes.indexOf(current) + 1) % modes.length;
35+
applyMode(modes[nextIndex]);
36+
});
2537
})();
2638
</script>

0 commit comments

Comments
 (0)