47 lines
1.2 KiB
JavaScript
47 lines
1.2 KiB
JavaScript
(function () {
|
|
var STORAGE_KEY = "zhihua-theme-mode";
|
|
var MODES = ["auto", "light", "dark"];
|
|
|
|
function normalize(mode) {
|
|
return MODES.indexOf(mode) >= 0 ? mode : "auto";
|
|
}
|
|
|
|
function readMode() {
|
|
try {
|
|
return normalize(localStorage.getItem(STORAGE_KEY));
|
|
} catch (error) {
|
|
return "auto";
|
|
}
|
|
}
|
|
|
|
function applyMode(mode) {
|
|
var normalized = normalize(mode);
|
|
document.documentElement.setAttribute("data-theme", normalized);
|
|
try {
|
|
localStorage.setItem(STORAGE_KEY, normalized);
|
|
} catch (error) {
|
|
/* ignore */
|
|
}
|
|
updateButtons(normalized);
|
|
}
|
|
|
|
function updateButtons(mode) {
|
|
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
|
|
var active = button.getAttribute("data-theme-mode") === mode;
|
|
button.classList.toggle("active", active);
|
|
button.setAttribute("aria-pressed", active ? "true" : "false");
|
|
});
|
|
}
|
|
|
|
function bindControls() {
|
|
document.querySelectorAll("[data-theme-mode]").forEach(function (button) {
|
|
button.addEventListener("click", function () {
|
|
applyMode(button.getAttribute("data-theme-mode"));
|
|
});
|
|
});
|
|
}
|
|
|
|
applyMode(readMode());
|
|
document.addEventListener("DOMContentLoaded", bindControls);
|
|
})();
|