Skip to content

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-saddleBrown hardcodes, remove retro text-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 onto Z_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 custom SectionHeader with <Accordion>.
  • [ ] Saving data / async fields — adopt the AsyncField wrappers 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.