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:
1 parent
d86f9eceec
commit
c79f5e8042
2 files changed
+34
-6
No files matched your search
+21
-6
@@ -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()
|
||||
|
||||
Vendored
+13
@@ -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;
|
||||
|
||||
Reference in new issue
Block a user