HMCL-docs/assets/js/theme.js
2026-03-15 12:44:04 +00:00

68 lines
2.1 KiB
JavaScript

window.addEventListener("DOMContentLoaded", function () {
var skinLink = document.getElementById("skin");
var darkModeQuery = window.matchMedia("(prefers-color-scheme: dark)");
function applyDarkSkin() {
skinLink.href = "/assets/css/skins/" + settings.get("appearance_skin_dark", "dark") + ".css";
}
function applyLightSkin() {
skinLink.href = "/assets/css/skins/" + settings.get("appearance_skin_light", "default") + ".css";
}
function autoSchemeHandler() {
if (darkModeQuery.matches) {
applyDarkSkin();
} else {
applyLightSkin();
}
}
var activeModeIndex = 0;
var modeKeys = ["light", "dark", "auto"];
var modeLabels = ["亮色", "暗色", "自动"];
var menuList = document.querySelector(".masthead .visible-links");
var modeSwitcher = null;
if (menuList) {
modeSwitcher = document.createElement("a");
modeSwitcher.className = "masthead__menu-item";
modeSwitcher.textContent = modeLabels[activeModeIndex];
modeSwitcher.href = "javascript:;";
modeSwitcher.onclick = function () {
var nextIndex = (activeModeIndex + 1) % modeKeys.length;
settings.set("appearance_color", modeKeys[nextIndex]);
}
menuList.appendChild(modeSwitcher);
}
function applyTheme(mode) {
var newIndex = modeKeys.indexOf(mode);
if (newIndex < 0) newIndex = 0;
if (modeKeys[activeModeIndex] === "auto") {
darkModeQuery.removeEventListener("change", autoSchemeHandler);
}
activeModeIndex = newIndex;
var resolvedMode = modeKeys[activeModeIndex];
if (modeSwitcher) {
modeSwitcher.textContent = modeLabels[activeModeIndex];
}
if (resolvedMode === "light") {
applyLightSkin();
}
else if (resolvedMode === "dark") {
applyDarkSkin();
}
else {
darkModeQuery.addEventListener("change", autoSchemeHandler);
autoSchemeHandler();
}
}
settings.onChange("appearance_color", applyTheme);
settings.onChange("appearance_skin_dark", function () {
settings.refresh("appearance_color");
});
settings.onChange("appearance_skin_light", function () {
settings.refresh("appearance_color");
});
});