theme.js javascript
47 lines 1.6 KB
Raw
sha256:c079680aa72b38cf20f7891daeadbb28f6ec71301dff7c1973565401e6f23a34 docs: align public documentation and website with bounded v1 Human minor ⚠ breaking 7 days ago
1 /** Landing theme toggle — preference only (not auth). Default is always dark. */
2 (function () {
3 // v2: ignore legacy stored preference so first paint stays dark by default.
4 var KEY = "overseer-landing-theme-v2";
5 var root = document.documentElement;
6
7 function preferred() {
8 try {
9 var stored = localStorage.getItem(KEY);
10 // Only honor an explicit user choice; ignore OS prefers-color-scheme.
11 if (stored === "light" || stored === "dark") return stored;
12 } catch (_e) {
13 /* file:// or blocked storage — fall through */
14 }
15 return "dark";
16 }
17
18 function apply(theme) {
19 root.setAttribute("data-theme", theme);
20 var btn = document.getElementById("theme-toggle");
21 if (!btn) return;
22 btn.hidden = false;
23 var next = theme === "dark" ? "light" : "dark";
24 btn.setAttribute("aria-label", "Switch to " + next + " mode");
25 btn.setAttribute("title", next === "light" ? "Light mode" : "Dark mode");
26 }
27
28 // Apply immediately so first paint is not light on light-preferring OSes.
29 apply(preferred());
30
31 document.addEventListener("DOMContentLoaded", function () {
32 apply(root.getAttribute("data-theme") || preferred());
33 var btn = document.getElementById("theme-toggle");
34 if (!btn) return;
35 btn.hidden = false;
36 btn.addEventListener("click", function () {
37 var current = root.getAttribute("data-theme") === "light" ? "light" : "dark";
38 var next = current === "dark" ? "light" : "dark";
39 apply(next);
40 try {
41 localStorage.setItem(KEY, next);
42 } catch (_e) {
43 /* ignore */
44 }
45 });
46 });
47 })();
File History 1 commit
sha256:c079680aa72b38cf20f7891daeadbb28f6ec71301dff7c1973565401e6f23a34 docs: align public documentation and website with bounded v1 Human minor ⚠ 7 days ago