mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-11-01 00:03:53 +08:00
1 parent
c2d390e945
commit
cd191ac679
8 files changed
+98
-18
No files matched your search
@@ -3,7 +3,8 @@
|
||||
const preference = matchMedia("(prefers-color-scheme: dark)");
|
||||
const key = "ofdgo.theme";
|
||||
let mode = root.dataset.themeMode || "system";
|
||||
let host = null, report = null, pending = Promise.resolve();
|
||||
let material = root.dataset.titlebarChoice || "mica";
|
||||
let host = null, report = null, pending = Promise.resolve(), revision = 0, committed = null;
|
||||
if (!root.dataset.themeMode) {
|
||||
try { mode = localStorage.getItem(key) || "system"; } catch {}
|
||||
}
|
||||
@@ -13,11 +14,21 @@
|
||||
root.dataset.theme = mode === "system" ? preference.matches ? "dark" : "light" : mode;
|
||||
document.querySelector('meta[name="theme-color"]').content = root.dataset.theme === "dark" ? "#272e33" : "#fafbfc";
|
||||
for (const button of document.querySelectorAll("[data-theme-choice]")) button.dataset.pressed = String(button.dataset.themeChoice === mode);
|
||||
const select = document.querySelector("#titleBarMaterial");
|
||||
if (select) select.value = material;
|
||||
}
|
||||
function sync() {
|
||||
if (!host) return;
|
||||
const value = {mode, dark: root.dataset.theme === "dark"};
|
||||
pending = pending.then(() => host.call("appearance", value)).catch(error => report(error));
|
||||
const value = {mode, dark: root.dataset.theme === "dark", material};
|
||||
const current = ++revision;
|
||||
pending = pending.then(() => host.call("appearance", value)).then(() => { committed = value; }).catch(error => {
|
||||
if (current === revision) {
|
||||
mode = committed.mode;
|
||||
material = committed.material;
|
||||
apply();
|
||||
}
|
||||
report(error);
|
||||
});
|
||||
}
|
||||
function set(value) {
|
||||
mode = value;
|
||||
@@ -37,6 +48,19 @@
|
||||
mode = ["light", "dark"].includes(event.newValue) ? event.newValue : "system";
|
||||
apply();
|
||||
});
|
||||
window.ofdgoTheme = {set, connect(value, onError) { host = value; report = onError; apply(); sync(); }};
|
||||
window.ofdgoTheme = {set, connect(value, onError) {
|
||||
host = value;
|
||||
report = onError;
|
||||
const select = document.querySelector("#titleBarMaterial");
|
||||
const materials = (root.dataset.titlebarMaterials || "").split(",");
|
||||
if (host && materials.length > 1) {
|
||||
for (const option of [...select.options]) if (!materials.includes(option.value)) option.remove();
|
||||
select.closest(".appearance-material").hidden = false;
|
||||
select.addEventListener("change", () => { material = select.value; sync(); });
|
||||
}
|
||||
apply();
|
||||
sync();
|
||||
}};
|
||||
apply();
|
||||
committed = {mode, material};
|
||||
})();
|
||||
Reference in new issue
Block a user