← back to Malden House
theme.js
60 lines
// Malden House — theme switcher
const THEMES = {
1: { name: "Editorial" },
2: { name: "Sunbaked" },
3: { name: "LA Eclipse" },
4: { name: "Monograph" },
5: { name: "Retro '84" },
6: { name: "Postcard" },
7: { name: "Arch Mono" },
8: { name: "Block Sport" },
9: { name: "Citrus Grove" },
10: { name: "Blueprint" },
};
const html = document.documentElement;
const toggle = document.getElementById("switcher-toggle");
const panel = document.getElementById("switcher-panel");
const num = document.getElementById("switcher-num");
const name = document.getElementById("switcher-name");
const chips = document.querySelectorAll(".chip[data-set]");
function apply(n) {
const t = THEMES[n]; if (!t) return;
html.setAttribute("data-theme", n);
num.textContent = String(n).padStart(2, "0");
name.textContent = t.name;
chips.forEach(c => c.classList.toggle("active", c.dataset.set === String(n)));
try { localStorage.setItem("malden-theme", n); } catch (e) {}
}
toggle.addEventListener("click", () => {
const open = !panel.hasAttribute("hidden");
if (open) { panel.setAttribute("hidden", ""); toggle.setAttribute("aria-expanded", "false"); }
else { panel.removeAttribute("hidden"); toggle.setAttribute("aria-expanded", "true"); }
});
document.addEventListener("click", e => {
if (!panel.hasAttribute("hidden") && !e.target.closest(".switcher")) {
panel.setAttribute("hidden", ""); toggle.setAttribute("aria-expanded", "false");
}
});
chips.forEach(c => c.addEventListener("click", () => apply(c.dataset.set)));
// Keyboard: 1-9 sets themes 1-9, 0 sets 10
document.addEventListener("keydown", e => {
if (e.target.closest("input, textarea")) return;
if (e.key >= "1" && e.key <= "9") apply(Number(e.key));
else if (e.key === "0") apply(10);
else if (e.key === "[") apply(Math.max(1, Number(html.dataset.theme) - 1));
else if (e.key === "]") apply(Math.min(10, Number(html.dataset.theme) + 1));
});
// Restore preference
try {
const saved = Number(localStorage.getItem("malden-theme"));
if (saved >= 1 && saved <= 10) apply(saved);
else apply(1);
} catch (e) { apply(1); }