Files
Leader.DriveThru/bin/wwwroot/_content/Blazor.Bootstrap/blazor.bootstrap.theme-switcher.js
2025-09-19 08:29:49 +08:00

83 lines
2.7 KiB
JavaScript

// THEMES
const STORAGE_KEY = "blazorbootstrap-theme";
const DEFAULT_THEME = "light";
const LIGHT_THEME = "light";
const DARK_THEME = "dark";
const SYSTEM_THEME = "system";
const state = {
chosenTheme: SYSTEM_THEME, // light|dark|system
appliedTheme: DEFAULT_THEME // light|dark
};
const showActiveTheme = () => {
let themeIndicatorEls = document.querySelectorAll(".blazorbootstrap-theme-indicator>i");
if (themeIndicatorEls.length > 0) {
themeIndicatorEls.forEach((el, index) => {
if (state.chosenTheme === SYSTEM_THEME
&& state.chosenTheme !== state.appliedTheme) {
el.className = "bi bi-circle-half";
}
else if (state.appliedTheme === LIGHT_THEME) {
el.className = "bi bi-sun-fill";
} else if (state.appliedTheme === DARK_THEME) {
el.className = "bi bi-moon-stars-fill";
} else {
el.className = "bi bi-circle-half";
}
});
}
let themeSwitcherItemEls = document.querySelectorAll(".blazorbootstrap-theme-item>button");
if (themeSwitcherItemEls) {
themeSwitcherItemEls.forEach((el) => {
const bsThemeValue = el.dataset.bsThemeValue;
const iEl = el.querySelector(".bi.bi-check2");
if (state.chosenTheme === bsThemeValue) {
el.classList.add("active");
if (iEl)
iEl.classList.remove("d-none");
} else {
el.classList.remove("active");
if (iEl)
iEl.classList.add("d-none");
}
});
}
};
export function setTheme(dotNetHelper, theme, save = true) {
state.chosenTheme = theme;
state.appliedTheme = theme;
if (theme === SYSTEM_THEME) {
state.appliedTheme = window.matchMedia(`(prefers-color-scheme: ${DARK_THEME})`).matches ? DARK_THEME : LIGHT_THEME;
}
document.documentElement.setAttribute("data-bs-theme", state.appliedTheme);
if (save) {
window.localStorage.setItem(STORAGE_KEY, state.chosenTheme);
}
showActiveTheme();
if (dotNetHelper)
dotNetHelper.invokeMethodAsync("OnThemeChangedJS", state.appliedTheme);
};
export function initializeTheme(dotNetHelper) {
const localTheme = window.localStorage.getItem(STORAGE_KEY);
if (localTheme) {
setTheme(dotNetHelper, localTheme, false);
} else {
setTheme(dotNetHelper, SYSTEM_THEME);
}
// register events
window
.matchMedia(`(prefers-color-scheme: ${DARK_THEME})`)
.addEventListener("change", (event) => {
//const theme = event.matches ? DARK_THEME : LIGHT_THEME;
//setTheme(theme);
setTheme(dotNetHelper, SYSTEM_THEME);
});
}