summaryrefslogtreecommitdiff
path: root/assets/js/theme.js
blob: f22afe5568a54782ddf50bb2fe003ddbcf0df292 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/* Toggle Dark/Light Mode */
function initThemeToggle() {
    const rootHtml = document.documentElement;
    const toggleThemeBtn = document.getElementById("theme-toggle");

    // If no saved theme, determine user preference, otherwise default to light
    const savedTheme = localStorage.getItem("theme");
    const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
    const initialTheme = savedTheme ?? (prefersDark ? "dark" : "light");

    function setTheme(theme) {
        const isDarkMode = theme === "dark";
        // toggleThemeBtn dataset comes with translated labels & title for site's language
        const label = isDarkMode ? toggleThemeBtn.dataset.labelLight : toggleThemeBtn.dataset.labelDark;
        const title = isDarkMode ? toggleThemeBtn.dataset.titleLight : toggleThemeBtn.dataset.titleDark;

        rootHtml.setAttribute("data-theme", theme); // display handled by CSS
        toggleThemeBtn.setAttribute("aria-label", label);
        toggleThemeBtn.setAttribute("title", title);
    }

    // Apply initial theme
    setTheme(initialTheme);

    // Change theme on click and save user's choice
    toggleThemeBtn.addEventListener("click", () => {
        const newTheme = rootHtml.getAttribute("data-theme") === "dark" ? "light" : "dark";
        setTheme(newTheme);
        localStorage.setItem("theme", newTheme);
     });
}

export default initThemeToggle;