104 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			104 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;
 |