0.36.0 - UI Overhaul part 1 (modals -> contexts, theming)
The UI Overhaul aims to bring the whole app into compliance with Style Guide 2.0.0 (ignoring the Character Sheet — that's Roadmap Version +1/Character Sheet Overhaul).
Prereq met: the Style Guide is finalized at 2.0.0 (2026-06-24).
The broad TODOs below are version-level summaries; full per-task detail (one commit each) lives in docs/committed/todo/1-ui-overhaul.md. Character Sheet, server-side Undo/Redo, and the non-standard-button / 2nd-level-nav decisions are deferred (see that file's Deferred sections).
- [x] Theming, tokens & semantic colors — register semantic Mantine colors, point the primary button
at
--vtt-color-primary, purge--mantine-color-saddleBrownhardcodes, remove retrotext-transform: uppercase, and sweep raw color names → tokens. (Style guide already updated to specify no-uppercase; this is the implementation.) - [ ] Layers / z-index — delete the legacy
--vtt-z-*scale, add the in-modal tooltip layer, and move any hardcoded z-indexes ontoZ_INDEX. - [ ] Pages & navigation — extract
<PageHeader>and<ListConfig>and adopt them across the list/detail/edit routes. - [x] Sidebars — add named width constants (small/medium/large) + a
sidebarWidth(size)setter and adopt them. - [ ] Modals — move Edit Campaign to a page, fold Edit Token into the context sidebars, remove both
modals, and standardize destructive confirms on
<ConfirmDestructive>. - [ ] Calls to action — bring /campaigns/:id and /characters/:id into placement compliance; autosave Edit Campaign and Edit Map (remove Save/Cancel; Map rolls into the existing map Undo/Redo).
- [ ] Buttons & collapsing sections — semantic-color + async-button adoption; replace
<Collapse>one-offs and the customSectionHeaderwith<Accordion>. - [ ] Saving data / async fields — adopt the
AsyncFieldwrappers on autosave surfaces and retire the ad-hoc autosave copies. - [x] Notifications — build the
notify()helper (intent + criticality + domain) per the new spec and migrate the ~17 call sites.
Misc
- [ ] Add a sitewide search, invoked by pressing ctrl-P or cmd-P, which spawns a search modal (input pre-focused) allowing the user to type the name of any character, campaign, or map within their account. For now, use a REST API endpoint that searches on demand (debounce key inputs), and caches known results for a reasonable time (let's say 12 hours), busting said cache when characters, campaigns, or maps in the cached query are updated, deleted, or added. In a future release, we'll add Redis and an indexing background job.
- [ ] Add a translucent black background behind the on-hover token portrait art. Some portraits with transparent backgrounds look odd without it.
- [ ] If user receives an invitation to switch to map X, and they're already looking at map X, don't bother showing the notification.
- [ ] When user A requests edit permission of character 1 from user B, user B sees a notification about the request. User B accepts the request, and User A sees that their request has been approved. However, in order to actually access edit mode, User A has to hard refresh the app.
Bugs
- [ ] Add a piece of artwork to a character. Then, add a 2nd. Expected: the 2nd artwork looks like what was uploaded. Observed: the 2nd becomes a duplicate of the 1st.
- [ ] Using genAI to generate an image with user-specified models (gemini in this case) throws error "No API key available for provider "gemini". Provide one via x-ai-key header or configure it on the server."
- [ ] Create a token with artwork, then add more artwork. Set the new artwork as portrait art. Expected: the new portrait art shows in the Character Context. Observed: the original artwork shows in Character Context.
- [ ] When importing a Character as a Token, the AC property does not transfer to the Token. Going to the full Character Sheet shows the real AC, but the Play Mode in Character Context shows no AC
- [ ] Pressing shift + a number while hovering over an action in Character or Token Context is supposed to bind that number as a shortcut for that action, but it's doing nothing.
- [ ] cmd-C, cmd-P on a token should copy paste, but does nothing. Duplicate still works.