welpo 9a1f5db45c
feat: listen for changes on OS theme to switch accordingly
As long as the visitor has not changed the default theme, the site will
change between dark and light themes matching the OS setting.
2023-02-16 21:23:48 +01:00

32 lines
948 B
JavaScript

const themeSwitcher = document.querySelector('.theme-switcher input');
let currentTheme = localStorage.getItem('theme');
let userHasManuallyChangedTheme = currentTheme !== null;
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
themeSwitcher.checked = theme === 'dark';
localStorage.setItem('theme', theme);
currentTheme = theme;
}
if (currentTheme) {
setTheme(currentTheme);
} else {
const isSystemDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
setTheme(isSystemDark ? 'dark' : 'light');
}
function switchTheme(e) {
const newTheme = e.target.checked ? 'dark' : 'light';
setTheme(newTheme);
userHasManuallyChangedTheme = true;
}
themeSwitcher.addEventListener('change', switchTheme, false);
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
if (!userHasManuallyChangedTheme) {
setTheme(e.matches ? 'dark' : 'light');
}
});