feat(quick-261016-0fm): manual theme switch on the rail
- the rail's top button cycles system, light and dark and names the current choice; light and dark ignore prefers-color-scheme - usePreferences applies the cached theme before the first await of boot, saves the choice through PUT /account/preferences and reverts with a toast when the save fails; me() applies the stored preference
This commit is contained in:
@@ -4,15 +4,17 @@ import { createAdminRouter } from './app/router'
|
||||
import { onUnauthorized } from './api/client'
|
||||
import { loadFieldTypes } from './app/fieldTypes'
|
||||
import { loadStrings } from './app/i18n'
|
||||
import { applyColorScheme } from './app/theme'
|
||||
import { expireSession, me } from './state/useAuth'
|
||||
import { loadNavigation } from './state/useNavigation'
|
||||
import { applyTheme, cachedTheme } from './state/usePreferences'
|
||||
import { loadSettings } from './state/useSettings'
|
||||
import './styles/main.css'
|
||||
|
||||
async function boot(): Promise<void> {
|
||||
// Dark mode follows the system preference before anything renders (A6).
|
||||
applyColorScheme()
|
||||
// The last theme choice (system unless the admin picked light or dark) is
|
||||
// applied before the first await, so nothing renders in the wrong theme;
|
||||
// me() then applies the admin's stored preference.
|
||||
applyTheme(cachedTheme())
|
||||
// Boot order (research Pattern 7): the public strings bundle first, so the
|
||||
// login screen is translated, then the session, then navigation and the
|
||||
// plugin field types.
|
||||
|
||||
Reference in New Issue
Block a user