-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththeme.js
More file actions
57 lines (48 loc) · 1.36 KB
/
Copy paththeme.js
File metadata and controls
57 lines (48 loc) · 1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
var THEME_LABELS = {
auto: '⚙️ Theme (Auto)',
light: '☀️ Light',
dark: '🌙 Dark'
};
var CYCLE_ORDER = ['auto', 'light', 'dark'];
function getPreference() {
return localStorage.getItem('theme-preference') || 'auto';
}
function applyTheme(pref) {
if (pref === 'auto') {
document.documentElement.removeAttribute('data-theme');
} else {
document.documentElement.setAttribute('data-theme', pref);
}
var btn = document.getElementById('theme-toggle');
if (btn) {
btn.textContent = THEME_LABELS[pref] || THEME_LABELS.auto;
}
}
function setPreference(value) {
localStorage.setItem('theme-preference', value);
applyTheme(value);
}
function cycleTheme() {
var current = getPreference();
var idx = CYCLE_ORDER.indexOf(current);
var next = CYCLE_ORDER[(idx + 1) % CYCLE_ORDER.length];
setPreference(next);
}
function setupToggle() {
var btn = document.getElementById('theme-toggle');
if (btn) {
btn.textContent = THEME_LABELS[getPreference()] || THEME_LABELS.auto;
btn.addEventListener('click', cycleTheme);
}
}
applyTheme(getPreference());
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', setupToggle);
} else {
setupToggle();
}
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function () {
if (getPreference() === 'auto') {
applyTheme('auto');
}
});