docs: make light/dark switching robust in embedded browsers

- Harden the doxygen-awesome dark-mode toggle against blocked localStorage
  (sandboxed webviews / file://): storage failures no longer break theme
  initialization or the toggle click.
- Add a CSS-only prefers-color-scheme fallback so dark mode still follows the
  OS/app scheme when scripting is unavailable.
This commit is contained in:
西风逍遥游 committed 2026-08-21 17:43:48 +08:00
1 parent d86f9eceec
commit c79f5e8042
2 files changed
+34 -6

No files matched your search

+21 -6
View File
@@ -74,27 +74,42 @@ class DoxygenAwesomeDarkModeToggle extends HTMLElement {
return window.matchMedia('(prefers-color-scheme: dark)').matches
}
// EVEngine hardening: embedded browsers (e.g. a docs panel inside an IDE)
// can deny localStorage on file:// URLs. Never let a storage exception
// break theme initialization or the light/dark toggle.
static safeGet(key) {
try { return localStorage.getItem(key) } catch (e) { return null }
}
static safeSet(key, value) {
try { localStorage.setItem(key, value) } catch (e) { /* noop */ }
}
static safeRemove(key) {
try { localStorage.removeItem(key) } catch (e) { /* noop */ }
}
/**
* @returns `true` for dark-mode, `false` for light-mode user preference
*/
static get userPreference() {
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
return (!DoxygenAwesomeDarkModeToggle.systemPreference && DoxygenAwesomeDarkModeToggle.safeGet(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
(DoxygenAwesomeDarkModeToggle.systemPreference && !DoxygenAwesomeDarkModeToggle.safeGet(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
}
static set userPreference(userPreference) {
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
if(!userPreference) {
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
DoxygenAwesomeDarkModeToggle.safeSet(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
DoxygenAwesomeDarkModeToggle.safeRemove(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
}
} else {
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
DoxygenAwesomeDarkModeToggle.safeSet(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
} else {
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
DoxygenAwesomeDarkModeToggle.safeRemove(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
}
}
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
+13
View File
@@ -1,5 +1,18 @@
/* EVEngine static docs layout: a plain-HTML sidebar that works without JS. */
/* Dark theme fallback: follow the OS/app color scheme even when the
* doxygen-awesome dark-mode toggle script cannot run (e.g. file:// with
* scripting disabled). The script adds html.dark-mode / html.light-mode and
* takes precedence when it does run. */
@media (prefers-color-scheme: dark) {
html:not(.light-mode) {
--page-background-color: #1C1D1F;
--page-foreground-color: #d2dbde;
--side-nav-background: #252628;
--side-nav-arrow-opacity: #3a3d42;
}
}
html, body {
margin: 0;
padding: 0;