diff --git a/docs_theme/nav.html b/docs_theme/nav.html index 2f6f78e94..255fc46cd 100644 --- a/docs_theme/nav.html +++ b/docs_theme/nav.html @@ -10,7 +10,7 @@ @@ -47,7 +47,7 @@ Next @@ -58,12 +58,77 @@ Github + + + + + + + + + + + + Dark + + + + + + + + Light + + + + + + + + Auto + + + + localStorage.getItem("theme"); +const setStoredTheme = (theme) => localStorage.setItem("theme", theme); + +const getPreferredTheme = () => { + 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()); + +const showActiveTheme = (theme, focus = false) => { + const themeSwitcher = document.querySelector("#bd-theme"); + + if (!themeSwitcher) { + return; + } + + const activeThemeIcon = document.querySelector(".theme-icon-active"); + const btnToActive = document.querySelector( + `[data-bs-theme-value="${theme}"]` + ); + const svgOfActiveBtn = btnToActive.querySelector("svg").cloneNode(true); + + document.querySelectorAll("[data-bs-theme-value]").forEach((element) => { + element.classList.remove("active"); + element.setAttribute("aria-pressed", "false"); + }); + + btnToActive.classList.add("active"); + btnToActive.setAttribute("aria-pressed", "true"); + activeThemeIcon.innerHTML = null; + activeThemeIcon.appendChild(svgOfActiveBtn); + const themeSwitcherLabel = `Toggle Theme (${btnToActive.dataset.bsThemeValue})`; + themeSwitcher.setAttribute("aria-label", themeSwitcherLabel); + + if (focus) { + themeSwitcher.focus(); + } +}; + +window + .matchMedia("(prefers-color-scheme: dark)") + .addEventListener("change", () => { + const storedTheme = getStoredTheme(); + if (storedTheme !== "light" && storedTheme !== "dark") { + setTheme(getPreferredTheme()); + } + }); + +window.addEventListener("DOMContentLoaded", () => { + showActiveTheme(getPreferredTheme()); + + document.querySelectorAll("[data-bs-theme-value]").forEach((toggle) => { + toggle.addEventListener("click", () => { + const theme = toggle.getAttribute("data-bs-theme-value"); + setStoredTheme(theme); + setTheme(theme); + showActiveTheme(theme, true); + }); + }); +});