51 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
{
 | 
						|
    function setTheme(mode) {
 | 
						|
        if (mode !== "light" && mode !== "dark" && mode !== "auto") {
 | 
						|
            console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
 | 
						|
            mode = "auto";
 | 
						|
        }
 | 
						|
        document.documentElement.dataset.theme = mode;
 | 
						|
        localStorage.setItem("theme", mode);
 | 
						|
    }
 | 
						|
 | 
						|
    function cycleTheme() {
 | 
						|
        const currentTheme = localStorage.getItem("theme") || "auto";
 | 
						|
        const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
 | 
						|
 | 
						|
        if (prefersDark) {
 | 
						|
            // Auto (dark) -> Light -> Dark
 | 
						|
            if (currentTheme === "auto") {
 | 
						|
                setTheme("light");
 | 
						|
            } else if (currentTheme === "light") {
 | 
						|
                setTheme("dark");
 | 
						|
            } else {
 | 
						|
                setTheme("auto");
 | 
						|
            }
 | 
						|
        } else {
 | 
						|
            // Auto (light) -> Dark -> Light
 | 
						|
            if (currentTheme === "auto") {
 | 
						|
                setTheme("dark");
 | 
						|
            } else if (currentTheme === "dark") {
 | 
						|
                setTheme("light");
 | 
						|
            } else {
 | 
						|
                setTheme("auto");
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    function initTheme() {
 | 
						|
        // set theme defined in localStorage if there is one, or fallback to auto mode
 | 
						|
        const currentTheme = localStorage.getItem("theme");
 | 
						|
        currentTheme ? setTheme(currentTheme) : setTheme("auto");
 | 
						|
    }
 | 
						|
 | 
						|
    window.addEventListener('load', function(_) {
 | 
						|
        const buttons = document.getElementsByClassName("theme-toggle");
 | 
						|
        Array.from(buttons).forEach((btn) => {
 | 
						|
            btn.addEventListener("click", cycleTheme);
 | 
						|
        });
 | 
						|
    });
 | 
						|
 | 
						|
    initTheme();
 | 
						|
}
 |