import * as params from '@params'; const PERSISTENCE_KEY = 'theme-scheme' const themeOptions = params.theme || {} const THEME_DARK = typeof themeOptions.dark === 'undefined' ? true : themeOptions.dark; const THEME_LIGHT = typeof themeOptions.light === 'undefined' ? true : themeOptions.light; const THEME_DEFAULT = typeof themeOptions.default === 'undefined' ? "system" : themeOptions.default; window.addEventListener('load', async () => { const menu = document.getElementById('themeMenu') const $icon = document.getElementById('navbar-theme-icon-svg') if (menu == null || $icon == null) return const btns = menu.getElementsByTagName('a') const iconMap = Array.from(btns).reduce((map, btn) => { const $img = btn.getElementsByTagName('img')[0] map[btn.dataset.scheme] = $img.src return map }, {}) function checkScheme(scheme) { if (THEME_LIGHT === false) return "dark" if (THEME_DARK === false) return "light" return scheme } function loadScheme() { return localStorage.getItem(PERSISTENCE_KEY) || loadDefaultScheme() } function loadDefaultScheme() { return THEME_DEFAULT || "system" } function saveScheme(scheme) { localStorage.setItem(PERSISTENCE_KEY, scheme) } function getPreferredColorScheme() { const isDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches; return isDarkMode ? "dark" : "light"; } function setScheme(newScheme) { let theme = newScheme if (newScheme === 'system') { theme = getPreferredColorScheme() } // set data-theme attribute on html tag document.querySelector("html").dataset.theme = theme; // update icon $icon.src = iconMap[newScheme] // save preference to local storage saveScheme(newScheme) setImages(theme) } const checkedScheme = checkScheme(loadScheme()) setScheme(checkedScheme) Array.from(menu.getElementsByTagName('a')).forEach((btn) => { btn.addEventListener('click', () => { const { scheme } = btn.dataset setScheme(scheme) }) }) }) function setImages(newScheme) { const els = Array.from(document.getElementsByClassName('logo-holder')); for (const el of els) { const light = el.querySelector('.light-logo'); const dark = el.querySelector('.dark-logo'); if (newScheme === "dark" && dark !== null) { if (light !== null) light.style.display = 'none' dark.style.display = 'inline' } else { if (light !== null) light.style.display = 'inline' if (dark !== null) dark.style.display = 'none' } } }