;
const num = (k: string): string => {
const v = d[k];
return typeof v === "number" ? v.toFixed(2) : "—";
};
const vetoes = Object.keys(d)
.filter((k) => k.endsWith("_veto") && d[k] === true)
.map((k) => k.replace(/_veto$/, ""));
const reason = typeof d.reason === "string" ? ` reason=${d.reason}` : "";
const time = new Date().toLocaleTimeString("zh-CN", { hour12: false });
const cls = r.passed ? "pass" : "fail";
const html =
`${time}` +
`${r.passed ? "通过" : "未通过"}` +
`${r.score.toFixed(3)}` +
` · S_DTW ${num("s_dtw")} · S_Bio ${num("s_bio")}` +
(vetoes.length ? ` · 否决 ${vetoes.join(",")}` : "") +
`${reason}
`;
logEntries.unshift(html);
if (logEntries.length > 30) logEntries.pop();
box.innerHTML = logEntries.join("");
}
function initTheme(): void {
const mode = storedTheme();
applyTheme(mode);
renderToggleIcon(mode);
const btn = document.getElementById("theme-toggle");
btn?.addEventListener("click", () => {
const cur = storedTheme();
const next = CYCLE[(CYCLE.indexOf(cur) + 1) % CYCLE.length];
localStorage.setItem(THEME_KEY, next);
applyTheme(next);
renderToggleIcon(next);
mountWidget(next);
});
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", () => {
if (storedTheme() === "system") {
applyTheme("system");
mountWidget("system");
}
});
}
initTheme();
mountWidget(storedTheme());
initTunePanel();