mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-07 18:14:10 +00:00

- toggle in upper right - stored in localStorage - adds btn-contrast, btn-outline-contrast for light-on-dark / dark-on-light
60 lines
1.7 KiB
JavaScript
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);
|
|
});
|
|
});
|