Skip to content

Commit 764be5c

Browse files
committed
feat: configure theme from settings
1 parent ca06a1e commit 764be5c

File tree

1 file changed

+45
-2
lines changed

1 file changed

+45
-2
lines changed

XMOJ.user.js

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,24 @@ let CurrentUsername = document.querySelector("#profile").innerText;
552552
CurrentUsername = CurrentUsername.replaceAll(/[^a-zA-Z0-9]/g, "");
553553
let IsAdmin = AdminUserList.indexOf(CurrentUsername) !== -1;
554554

555+
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
556+
const applyTheme = (theme) => {
557+
document.querySelector("html").setAttribute("data-bs-theme", theme);
558+
localStorage.setItem("UserScript-Setting-DarkMode", theme === "dark" ? "true" : "false");
559+
};
560+
const applySystemTheme = (e) => applyTheme(e.matches ? "dark" : "light");
561+
let initTheme = () => {
562+
const saved = localStorage.getItem("UserScript-Setting-Theme") || "auto";
563+
if (saved === "auto") {
564+
applyTheme(prefersDark.matches ? "dark" : "light");
565+
prefersDark.addEventListener("change", applySystemTheme);
566+
} else {
567+
applyTheme(saved);
568+
prefersDark.removeEventListener("change", applySystemTheme);
569+
}
570+
};
571+
initTheme();
572+
555573

556574
class NavbarStyler {
557575
constructor() {
@@ -1359,7 +1377,32 @@ async function main() {
13591377
} else if (Data[i].Type == "D") {
13601378
Row.classList.add("list-group-item-danger");
13611379
}
1362-
if (Data[i].Children == undefined) {
1380+
if (Data[i].ID == "Theme") {
1381+
let Label = document.createElement("label");
1382+
Label.classList.add("me-2");
1383+
Label.htmlFor = "UserScript-Setting-Theme";
1384+
Label.innerText = Data[i].Name;
1385+
Row.appendChild(Label);
1386+
let Select = document.createElement("select");
1387+
Select.classList.add("form-select", "form-select-sm", "w-auto", "d-inline");
1388+
Select.id = "UserScript-Setting-Theme";
1389+
[
1390+
["light", "亮色"],
1391+
["dark", "暗色"],
1392+
["auto", "跟随系统"]
1393+
].forEach(opt => {
1394+
let option = document.createElement("option");
1395+
option.value = opt[0];
1396+
option.innerText = opt[1];
1397+
Select.appendChild(option);
1398+
});
1399+
Select.value = localStorage.getItem("UserScript-Setting-Theme") || "auto";
1400+
Select.addEventListener("change", () => {
1401+
localStorage.setItem("UserScript-Setting-Theme", Select.value);
1402+
initTheme();
1403+
});
1404+
Row.appendChild(Select);
1405+
} else if (Data[i].Children == undefined) {
13631406
let CheckBox = document.createElement("input");
13641407
CheckBox.classList.add("form-check-input");
13651408
CheckBox.classList.add("me-1");
@@ -1417,7 +1460,7 @@ async function main() {
14171460
}, {"ID": "ResetType", "Type": "F", "Name": "重新排版*"}, {
14181461
"ID": "AddColorText", "Type": "A", "Name": "增加彩色文字"
14191462
}, {"ID": "AddUnits", "Type": "A", "Name": "状态界面内存与耗时添加单位"}, {
1420-
"ID": "DarkMode", "Type": "A", "Name": "使用暗色模式"
1463+
"ID": "Theme", "Type": "A", "Name": "界面主题"
14211464
}, {"ID": "AddAnimation", "Type": "A", "Name": "增加动画"}, {
14221465
"ID": "ReplaceYN", "Type": "F", "Name": "题目前状态提示替换为好看的图标"
14231466
}, {"ID": "RemoveAlerts", "Type": "D", "Name": "去除多余反复的提示"}, {

0 commit comments

Comments
 (0)