Repository navigation
Expand file tree
/
Copy paththeme.js
More file actions
77 lines (62 loc) · 2.08 KB
/
Copy paththeme.js
File metadata and controls
77 lines (62 loc) · 2.08 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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
(function () {
function isAuto() {
return !localStorage.getItem('theme');
}
function currentTheme() {
var explicit = document.documentElement.getAttribute('data-theme');
if (explicit === 'light' || explicit === 'dark') return explicit;
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
localStorage.setItem('theme', theme);
}
function buildToggle() {
var wrapper = document.createElement('label');
wrapper.className = 'theme-toggle';
wrapper.setAttribute('title', 'Toggle dark mode');
var autoLabel = document.createElement('span');
autoLabel.className = 'theme-toggle-auto';
autoLabel.textContent = 'Auto';
autoLabel.setAttribute('aria-hidden', 'true');
var input = document.createElement('input');
input.type = 'checkbox';
input.setAttribute('aria-label', 'Toggle dark mode');
input.checked = currentTheme() === 'dark';
function syncState() {
wrapper.classList.toggle('theme-toggle--auto', isAuto());
wrapper.classList.toggle('theme-toggle--checked', input.checked);
}
syncState();
input.addEventListener('change', function () {
setTheme(input.checked ? 'dark' : 'light');
syncState();
});
wrapper.appendChild(input);
wrapper.appendChild(autoLabel);
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', function (e) {
if (!isAuto()) return;
input.checked = e.matches;
syncState();
});
return wrapper;
}
function injectToggle() {
var toggle = buildToggle();
var navLinks = document.querySelector('.nav-links');
if (navLinks) {
var li = document.createElement('li');
li.appendChild(toggle);
navLinks.appendChild(li);
return;
}
var nav = document.querySelector('nav');
if (nav) {
nav.appendChild(toggle);
return;
}
toggle.classList.add('theme-toggle--fixed');
document.body.appendChild(toggle);
}
injectToggle();
})();