105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
|
// Theme Initialization
|
||
|
(function () {
|
||
|
// Get the default theme from the HTML data-theme attribute.
|
||
|
const defaultTheme = document.documentElement.getAttribute("data-theme");
|
||
|
|
||
|
// Set the data-default-theme attribute only if defaultTheme is not null.
|
||
|
if (defaultTheme) {
|
||
|
document.documentElement.setAttribute("data-default-theme", defaultTheme);
|
||
|
}
|
||
|
|
||
|
// Attempt to retrieve the current theme from the browser's local storage.
|
||
|
const storedTheme = localStorage.getItem("theme");
|
||
|
|
||
|
if (storedTheme && storedTheme !== "system") {
|
||
|
document.documentElement.setAttribute("data-theme", storedTheme);
|
||
|
} else if (defaultTheme && storedTheme !== "system") {
|
||
|
document.documentElement.setAttribute("data-theme", defaultTheme);
|
||
|
} else {
|
||
|
// If no theme is found in local storage and no default theme is set, hand over control to the CSS.
|
||
|
document.documentElement.removeAttribute("data-theme");
|
||
|
}
|
||
|
|
||
|
// Expose defaultTheme to the outer scope.
|
||
|
window.defaultTheme = defaultTheme;
|
||
|
})();
|
||
|
|
||
|
// Icon Update and Theme Switching
|
||
|
function setTheme(theme, saveToLocalStorage = false) {
|
||
|
if (theme === "system") {
|
||
|
document.documentElement.removeAttribute("data-theme");
|
||
|
} else {
|
||
|
document.documentElement.setAttribute("data-theme", theme);
|
||
|
}
|
||
|
|
||
|
if (saveToLocalStorage) {
|
||
|
localStorage.setItem("theme", theme);
|
||
|
} else {
|
||
|
localStorage.removeItem("theme");
|
||
|
}
|
||
|
|
||
|
// Update icon class based on the selected theme.
|
||
|
updateIconClass(theme);
|
||
|
|
||
|
// Update the active button based on the selected theme.
|
||
|
updateActiveButton(theme);
|
||
|
}
|
||
|
|
||
|
function resetTheme() {
|
||
|
// Reset the theme to the default or system preference if no default is set.
|
||
|
setTheme(window.defaultTheme || "system");
|
||
|
}
|
||
|
|
||
|
function switchTheme(theme) {
|
||
|
if (theme === "system") {
|
||
|
resetTheme();
|
||
|
} else {
|
||
|
setTheme(theme, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function updateIconClass(theme) {
|
||
|
const iconElement = document.querySelector("#theme-switcher summary .icon");
|
||
|
|
||
|
// Remove any existing theme classes
|
||
|
iconElement.classList.remove("light", "dark");
|
||
|
|
||
|
// Add the appropriate class based on the selected theme
|
||
|
if (theme === "light") {
|
||
|
iconElement.classList.add("light");
|
||
|
} else if (theme === "dark") {
|
||
|
iconElement.classList.add("dark");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function updateActiveButton(theme) {
|
||
|
// Remove .active class from all buttons
|
||
|
document.querySelectorAll('#theme-switcher button').forEach(button => {
|
||
|
button.classList.remove('active');
|
||
|
});
|
||
|
|
||
|
// Add .active class to the button corresponding to the current theme
|
||
|
const activeButton = document.querySelector(`#theme-${theme}`);
|
||
|
if (activeButton) {
|
||
|
activeButton.classList.add('active');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
document.getElementById("theme-light").addEventListener("click", function () {
|
||
|
switchTheme("light");
|
||
|
});
|
||
|
document.getElementById("theme-dark").addEventListener("click", function () {
|
||
|
switchTheme("dark");
|
||
|
});
|
||
|
document.getElementById("theme-system").addEventListener("click", function () {
|
||
|
switchTheme("system");
|
||
|
});
|
||
|
|
||
|
// Update icon class on page load based on current theme
|
||
|
const currentTheme = localStorage.getItem("theme") || window.defaultTheme || "system";
|
||
|
updateIconClass(currentTheme);
|
||
|
updateActiveButton(currentTheme);
|
||
|
|
||
|
// Make the switchTheme function accessible globally
|
||
|
window.switchTheme = switchTheme;
|