diff --git a/README.md b/README.md index 7075e8c..52d08de 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Little nodejs + mongodb app that I hack together with ChatGPT and Cursor to keep **Disclaimer:** This was a fun, experimental project built with “AI slop” (Cursor), so it may have security issues. For example, `python_video_server` uses the default token‑in‑URL approach to serve video files, which can leave user tokens in logs or browser history. There are ways to improve this, but at this point I’m blinder than Ray Charles. -![Oscars Pool 2026](img/preview.gif) +![Oscars Pool 2026](img/preview.png) ## Features diff --git a/img/preview.gif b/img/preview.gif deleted file mode 100644 index 8423739..0000000 Binary files a/img/preview.gif and /dev/null differ diff --git a/img/preview.png b/img/preview.png new file mode 100644 index 0000000..5d71ceb Binary files /dev/null and b/img/preview.png differ diff --git a/public/js/app_theme.js b/public/js/app_theme.js index 82a5df3..77b59ce 100644 --- a/public/js/app_theme.js +++ b/public/js/app_theme.js @@ -1,6 +1,7 @@ // Theme toggle with system preference fallback. (function () { const STORAGE_KEY = 'theme_preference'; + const LAST_KEY = 'theme_last_applied'; const THEME_ATTR = 'data-theme'; const SOURCE_ATTR = 'data-theme-source'; const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); @@ -17,6 +18,11 @@ function setTheme(theme, source) { document.documentElement.setAttribute(THEME_ATTR, theme); document.documentElement.setAttribute(SOURCE_ATTR, source); + try { + sessionStorage.setItem(LAST_KEY, theme); + } catch (_) { + // Ignore storage errors. + } updateToggleUi(theme, source); } @@ -56,12 +62,16 @@ if (!res.ok) return; const data = await res.json(); const pref = normalizeTheme(data?.themePreference); - if (pref) { - localStorage.setItem(STORAGE_KEY, pref); - } else { - localStorage.removeItem(STORAGE_KEY); + const currentPref = normalizeTheme(localStorage.getItem(STORAGE_KEY)); + const changed = pref !== currentPref; + if (changed) { + if (pref) { + localStorage.setItem(STORAGE_KEY, pref); + } else { + localStorage.removeItem(STORAGE_KEY); + } + applyStoredOrSystem(); } - applyStoredOrSystem(); } catch (_) { // Ignore fetch errors. } @@ -69,8 +79,14 @@ function applyStoredOrSystem() { const stored = normalizeTheme(localStorage.getItem(STORAGE_KEY)); - const theme = stored || getSystemTheme(); - const source = stored ? 'user' : 'system'; + let last = null; + try { + last = normalizeTheme(sessionStorage.getItem(LAST_KEY)); + } catch (_) { + last = null; + } + const theme = stored || last || getSystemTheme(); + const source = stored ? 'user' : (last ? 'session' : 'system'); setTheme(theme, source); }