evcc-io/assets/js/theme.js
2022-12-18 21:59:01 +01:00

52 lines
1.4 KiB
JavaScript

import settings from "./settings";
const darkModeMatcher = window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)");
const THEME_AUTO = "auto";
const THEME_LIGHT = "light";
const THEME_DARK = "dark";
export const THEMES = [THEME_AUTO, THEME_LIGHT, THEME_DARK];
export function getThemePreference() {
const theme = settings.theme;
if (THEMES.includes(theme)) {
return theme;
}
return THEME_AUTO;
}
export function setThemePreference(theme) {
if (!THEMES.includes(theme)) {
return;
}
settings.theme = theme;
updateTheme();
}
function updateTheme() {
let theme = getThemePreference();
if (theme === THEME_AUTO) {
theme = darkModeMatcher?.matches ? THEME_DARK : THEME_LIGHT;
}
// update iOS title bar color
const themeColors = { light: "#f3f3f7", dark: "#020318" };
const $metaThemeColor = document.querySelector("meta[name=theme-color]");
if ($metaThemeColor) {
$metaThemeColor.setAttribute("content", themeColors[theme]);
}
// toggle the class on html root
const $html = document.querySelector("html");
$html.classList.add("no-transitions");
$html.classList.toggle("dark", theme === THEME_DARK);
window.setTimeout(function () {
$html.classList.remove("no-transitions");
}, 100);
}
export function watchThemeChanges() {
darkModeMatcher?.addEventListener("change", updateTheme);
updateTheme();
}