This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
(() => {
|
||||
const storageKey = "gl-theme";
|
||||
const root = document.documentElement;
|
||||
|
||||
const storedTheme = () => {
|
||||
try {
|
||||
const value = localStorage.getItem(storageKey);
|
||||
return value === "dark" || value === "light" ? value : "";
|
||||
} catch (_) {
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
const systemTheme = () =>
|
||||
window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
||||
|
||||
const updateControls = (theme) => {
|
||||
document.querySelectorAll("[data-theme-toggle]").forEach((control) => {
|
||||
const dark = theme === "dark";
|
||||
control.setAttribute("aria-pressed", String(dark));
|
||||
control.setAttribute("aria-label", dark ? control.dataset.lightLabel : control.dataset.darkLabel);
|
||||
const icon = control.querySelector("[data-theme-icon]");
|
||||
if (icon) icon.textContent = dark ? "☀" : "☾";
|
||||
});
|
||||
};
|
||||
|
||||
const applyTheme = (theme) => {
|
||||
root.dataset.theme = theme;
|
||||
root.style.colorScheme = theme;
|
||||
updateControls(theme);
|
||||
};
|
||||
|
||||
applyTheme(storedTheme() || systemTheme());
|
||||
|
||||
document.addEventListener("DOMContentLoaded", () => updateControls(root.dataset.theme));
|
||||
document.addEventListener("htmx:afterSwap", () => updateControls(root.dataset.theme));
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!(event.target instanceof Element)) return;
|
||||
const control = event.target.closest("[data-theme-toggle]");
|
||||
if (!control) return;
|
||||
const theme = root.dataset.theme === "dark" ? "light" : "dark";
|
||||
try {
|
||||
localStorage.setItem(storageKey, theme);
|
||||
} catch (_) {
|
||||
// The selected theme still applies for this page when storage is unavailable.
|
||||
}
|
||||
applyTheme(theme);
|
||||
});
|
||||
|
||||
const media = window.matchMedia("(prefers-color-scheme: dark)");
|
||||
media.addEventListener?.("change", () => {
|
||||
if (!storedTheme()) applyTheme(systemTheme());
|
||||
});
|
||||
})();
|
||||
Reference in New Issue
Block a user