12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- const PERSISTENCE_KEY = 'darkmode:color-scheme'
- 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 loadScheme() {
- return localStorage.getItem(PERSISTENCE_KEY) || "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)
- }
- setScheme(loadScheme())
- Array.from(menu.getElementsByTagName('a')).forEach((btn) => {
- btn.addEventListener('click', () => {
- const { scheme } = btn.dataset
- setScheme(scheme)
- })
- })
- })
|