diff --git a/static/js/base.js b/static/js/base.js index d3ce09e..7bedc2e 100644 --- a/static/js/base.js +++ b/static/js/base.js @@ -13,18 +13,27 @@ const $$ = selector => Array.from(document.querySelector(selector)); function initThemeToggle() { const themeToggleButton = document.getElementById("theme-toggle-btn"); if (!themeToggleButton) return; + themeToggleButton.classList.toggle("btn-ghost", !("theme" in localStorage)); themeToggleButton.addEventListener("click", () => { const documentRoot = document.documentElement; + const isSystemTheme = themeToggleButton.classList.contains("btn-ghost"); const isDarkTheme = documentRoot.classList.contains("dark"); - const newTheme = isDarkTheme ? "light" : "dark"; + const newTheme = isSystemTheme ? "dark" : (isDarkTheme ? "light" : "system"); - if (newTheme === "light") { - documentRoot.classList.remove("dark"); + if (newTheme === "system") { + documentRoot.classList.toggle("dark", window.matchMedia("(prefers-color-scheme: dark)").matches); + documentRoot.setAttribute("data-theme", window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"); + localStorage.removeItem("theme"); } else { - documentRoot.classList.add("dark"); + if (newTheme === "light") { + documentRoot.classList.remove("dark"); + } else if (newTheme === "dark") { + documentRoot.classList.add("dark"); + } + documentRoot.setAttribute("data-theme", newTheme); + localStorage.setItem("theme", newTheme); } - documentRoot.setAttribute("data-theme", newTheme); - localStorage.setItem("theme", newTheme); + themeToggleButton.classList.toggle("btn-ghost", newTheme === "system"); }); } diff --git a/theme/templates/base.html b/theme/templates/base.html index 1dcca97..59ddeea 100644 --- a/theme/templates/base.html +++ b/theme/templates/base.html @@ -5,7 +5,7 @@ {% url 'settings' as settings_url %} - + @@ -14,13 +14,16 @@