Theme precedence: URL param, then localStorage, then browser default

The restricted page's early script now honors the URL theme parameter
before the cached profile theme, so a fresh server-provided override
wins and the host color scheme applies without a flash. After session
load, an empty profile theme clears the cache but keeps the URL
parameter in effect instead of reverting to the system default.
This commit is contained in:
2026-09-17 19:17:00 +00:00
parent 42240dd2c7
commit baa993e586
2 changed files with 13 additions and 2 deletions
+12 -1
View File
@@ -38,9 +38,20 @@ export function initThemeFromCache() {
applyTheme(getCachedTheme())
}
/** Theme default from the URL hash (restricted iframe/forward pages only) */
function getHashTheme() {
const theme = new URLSearchParams(window.location.hash.slice(1)).get('theme')
return theme === 'light' || theme === 'dark' ? theme : ''
}
/** Update theme from session context (call after login/session load) */
export function updateThemeFromSession(ctx, animate = false) {
const theme = ctx?.user?.theme || ''
// Always keep the cache in sync with the profile: empty override clears it
// so stale values never mask future server-provided themes.
setCachedTheme(theme)
applyTheme(theme, document.documentElement, animate)
// Without a profile override, stay consistent with the initial paint: a
// theme parameter on the URL (e.g. host page color scheme injected by
// paskia-js) remains in effect before the browser/desktop default.
applyTheme(theme || getHashTheme(), document.documentElement, animate)
}