Files
jupyterhub/share/jupyterhub/static/js/darkmode.js
Min RK d519bacd8a add dark mode toggle button
- toggle in upper right
- stored in localStorage
- adds btn-contrast, btn-outline-contrast for light-on-dark / dark-on-light
2024-08-28 11:08:59 +02:00

60 lines
1.7 KiB
JavaScript

"use strict";
/* Simplified from bootstrap dark mode toggle
https://getbootstrap.com/docs/5.3/customize/color-modes/#javascript
*/
// theme is stored in localStorage
const getStoredTheme = () => localStorage.getItem("jupyterhub-bs-theme");
const setStoredTheme = (theme) =>
localStorage.setItem("jupyterhub-bs-theme", theme);
const getPreferredTheme = () => {
// return chosen theme. Pick value in localStorage if there,
// otherwise use system setting if defined
const storedTheme = getStoredTheme();
if (storedTheme) {
return storedTheme;
}
return window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light";
};
const setTheme = (theme) => {
if (theme === "auto") {
document.documentElement.setAttribute(
"data-bs-theme",
window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light",
);
} else {
document.documentElement.setAttribute("data-bs-theme", theme);
}
};
setTheme(getPreferredTheme());
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", () => {
// handle system change if no explicit theme preference is stored
const storedTheme = getStoredTheme();
if (storedTheme !== "light" && storedTheme !== "dark") {
setTheme(getPreferredTheme());
}
});
window.addEventListener("DOMContentLoaded", () => {
// clicking #dark-theme-toggle toggles dark theme
// (in page.html)
const toggle = document.getElementById("dark-theme-toggle");
toggle.addEventListener("click", () => {
const currentTheme = document.documentElement.getAttribute("data-bs-theme");
const theme = currentTheme == "dark" ? "light" : "dark";
setStoredTheme(theme);
setTheme(theme);
});
});