diff --git a/static/src/js/darkmode.js b/static/src/js/darkmode.js index 5a7fdb9..1b8a238 100644 --- a/static/src/js/darkmode.js +++ b/static/src/js/darkmode.js @@ -1,9 +1,13 @@ const DARK_MODE_CLASS = "dark-mode"; +const STORAGE_KEY = "dark-mode"; + const body = document.getElementsByTagName("body")[0]; +const darkModeToggle = document.getElementById("dark-mode-toggle"); const matchesDarkMode = window.matchMedia("(prefers-color-scheme: dark)"); function handleDarkMode(darkMode) { + window.localStorage.setItem(STORAGE_KEY, darkMode.toString()); if (darkMode) { body.classList.add(DARK_MODE_CLASS); } else { @@ -11,8 +15,19 @@ function handleDarkMode(darkMode) { } } -matchesDarkMode.addEventListener("change", (event) => - handleDarkMode(event.matches) -); +if (window.localStorage.getItem(STORAGE_KEY) === null) { + window.localStorage.setItem(STORAGE_KEY, matchesDarkMode.matches); + handleDarkMode(matchesDarkMode.matches); +} else { + handleDarkMode(window.localStorage.getItem(STORAGE_KEY) === "true"); +} -handleDarkMode(matchesDarkMode.matches); +window.addEventListener("load", () => { + matchesDarkMode.addEventListener("change", (event) => + handleDarkMode(event.matches) + ); + + darkModeToggle.addEventListener("click", () => { + handleDarkMode(window.localStorage.getItem(STORAGE_KEY) !== "true"); + }); +}); diff --git a/static/src/scss/_navbar.scss b/static/src/scss/_navbar.scss index e9c8052..51e7980 100644 --- a/static/src/scss/_navbar.scss +++ b/static/src/scss/_navbar.scss @@ -6,3 +6,11 @@ color: $white; } } + +#dark-mode-toggle i { + transition: transform 0.3s; + + @include dark-mode { + transform: rotate(180deg); + } +} diff --git a/website/common/templates/common/navbar.html b/website/common/templates/common/navbar.html index 7c3c7d6..dd3ebb2 100644 --- a/website/common/templates/common/navbar.html +++ b/website/common/templates/common/navbar.html @@ -22,14 +22,19 @@ {% endfor %} - {% if search_page %} -