Parent
#148
What to build
Final pass before cutover. Cross-cutting polish that doesn't belong to a single route.
- Skeleton loaders — 5 variants: SlotCard / snapshot row / journal line / NPU sub-row / model row. "Look like the real thing, not a generic block." Fired during initial load before stores hydrate.
- a11y:
- Skip-link top-left (jumps to view content for screen-reader users bypassing sidebar each route load)
- Persona dropdown as proper
<combobox> (not custom div)
- Tool-call blocks as
<details> with explicit collapse-arrow treatment
- Focus rings (2px outline distinct from browser default) on every interactive element
- axe-core clean per route
- TopBar overflow menu — "Open Chat Pro UI" →
hal0-chat.thinmint.dev external / Docs → hal0.dev/docs/v0.2-upgrade / GitHub → Hal0ai/hal0 / Discord
- Drift detector banner — "Catalog out of sync. registry.toml has been edited since the last sync. [Sync now] [Dismiss]"
- Catalog out-of-sync banner
Acceptance criteria
Blocked by
Parent
#148
What to build
Final pass before cutover. Cross-cutting polish that doesn't belong to a single route.
<combobox>(not custom div)<details>with explicit collapse-arrow treatmenthal0-chat.thinmint.devexternal / Docs →hal0.dev/docs/v0.2-upgrade/ GitHub →Hal0ai/hal0/ DiscordAcceptance criteria
<details>collapsed by default; expand on clickBlocked by