website/static/src/js/dark-mode.js

47 lines
1.4 KiB
JavaScript
Raw Normal View History

const DARK_MODE_CLASS = "dark-mode";
2022-08-20 15:31:14 +01:00
const STORAGE_KEY = "dark-mode";
2022-08-20 17:45:12 +01:00
const htmlTag = document.getElementsByTagName("html")[0];
2022-08-20 15:31:14 +01:00
const darkModeToggle = document.getElementById("dark-mode-toggle");
const matchesDarkMode = window.matchMedia("(prefers-color-scheme: dark)");
2022-08-20 17:45:12 +01:00
const darkModeCodeStyles = document.getElementById("pygments-dark");
const lightModeCodeStyles = document.getElementById("pygments-light");
function handleDarkMode(darkMode) {
2022-08-20 15:31:14 +01:00
window.localStorage.setItem(STORAGE_KEY, darkMode.toString());
2022-08-20 17:45:12 +01:00
if (darkMode) {
2022-08-20 17:45:12 +01:00
htmlTag.classList.add(DARK_MODE_CLASS);
} else {
2022-08-20 17:45:12 +01:00
htmlTag.classList.remove(DARK_MODE_CLASS);
}
if (darkModeCodeStyles) {
darkModeCodeStyles.sheet.disabled = !darkMode;
lightModeCodeStyles.sheet.disabled = darkMode;
}
}
2022-08-20 15:31:14 +01:00
if (window.localStorage.getItem(STORAGE_KEY) === null) {
window.localStorage.setItem(STORAGE_KEY, matchesDarkMode.matches);
handleDarkMode(matchesDarkMode.matches);
} else {
handleDarkMode(window.localStorage.getItem(STORAGE_KEY) === "true");
}
window.addEventListener("load", () => {
matchesDarkMode.addEventListener("change", (event) =>
handleDarkMode(event.matches)
);
2022-08-20 15:31:14 +01:00
darkModeToggle.addEventListener("click", () => {
handleDarkMode(window.localStorage.getItem(STORAGE_KEY) !== "true");
});
2022-08-20 15:55:50 +01:00
window.setTimeout(() => {
2022-08-20 17:45:12 +01:00
htmlTag.classList.add("dark-mode-animate");
2022-08-20 15:55:50 +01:00
}, 1000);
2022-08-20 15:31:14 +01:00
});