Skip to content

v0.77.0 — the power row, the linked-token menu, and a player who can seat their own token

Three unrelated reports from the same playtest, and they share a theme: a control that says nothing about what it does. A power row's shape changed with how many actions it had, so "click the name" meant three different things down one list. The linked-token badge stated a count and then refused to tell you where those tokens were. And a player who arrived on a map with no token was told to go and ask the GM — a dead end offered to someone who has the character, the permission and the map already open.

Phase A — the power row

  • [x] A.1 — One row shape, whatever the action count. TraitSection renders three different rows today: a violet action button (one action), a dotted-underline link with a caret (several), and a plain link (none). They are the same thing — a power — and the only fact that varies is whether it has anything to expand. Every row becomes a plain label (not a link), an (i) that opens the trait's wiki text, and — when the trait has one or more actions — a caret. The label toggles the expando, with a cursor and a hover that say so; the expanded action buttons keep exactly the treatment they have. The one-action row's inline button moves inside the expando, which is what makes the count stop changing the shape rather than adding a fourth case to it.
  • [x] A.2 — The (i) stops wearing the validation marker's icon. IconInfoCircle is SEVERITY_ICON.info — the advisory marker SectionValidationIndicator puts in a section header. The same glyph one line below it, meaning "read the rules text", is two controls claiming one symbol. The trait and action description buttons take IconFileText; the validation marker keeps the icon it shares with ValidationIssueAlert, because that pair has to agree.
  • [x] A.3 — One hover for every light-violet button. ActionButtonRow colours itself violet.4 and Mantine derives its light hover from that shade at 20% alpha — against the same shade at 15% that is very nearly no change at all. "Add Action", two rows below it, is plain violet and hovers visibly. Both get the same, slightly stronger hover, declared once rather than left to two different color props to agree by accident.

Phase B — the linked-token control

  • [x] B.1 — The linkage badge becomes a link button. In the Character Context on a /play route, Linked · 3 tokens collapses to an IconLink action icon with the same tooltip. IconLinkOff is reserved for zero linked tokens — the unlinked token, and the character opened from C.2's View button — so the two icons answer one question rather than restating the badge's text.
  • [x] B.2 — And it lists them, with the map each is on. The button opens a menu of the character's linked tokens; picking one impersonates it and centres the camera. A token on another map confirms first, because following it means leaving the map the user is on. The map name comes from the server: GET /api/tokens?characterId= already resolves each token's map row to authorize the listing, so it can name it too.

Phase C — a player who can seat their own token

  • [x] C.1 — Stepping out of impersonation stays stepped out. UI.tsx re-impersonates the first available token the moment nothing is impersonated, so a player's X was undone before the frame painted. The store records the map the user stepped out of, and the auto-impersonate skips that map until they choose again. Nothing else changes: a map change clears it by construction, since the opt-out is recorded against the map the token was on.
  • [x] C.2 — "Ask the GM" becomes a list of your characters. The banner shown to a non-owner with no token on the map is replaced by the characters they may play or build, each with a button: Insert (create a linked token on this map, then impersonate it), or Impersonate when a linked token is already here, plus View, which opens the Character Context for a character with no token at all. The same panel is what C.1's opt-out reveals, minus the "you have no tokens" sentence. A GM permission to withhold this, and a deliberate second token for one character, are both deferred — this release assumes a player may seat the character they already hold.