Skip to content

ux(panel): party badge sizing + peer waiting indicator + location chip refresh + dedupe banners#170

Merged
slabgorb merged 1 commit intodevelopfrom
ux/s2-party-panel-banner-cluster
Apr 26, 2026
Merged

ux(panel): party badge sizing + peer waiting indicator + location chip refresh + dedupe banners#170
slabgorb merged 1 commit intodevelopfrom
ux/s2-party-panel-banner-cluster

Conversation

@slabgorb
Copy link
Copy Markdown
Owner

Summary

Party-panel + turn-banner cluster fix (S2-UX, screenshot 036). Four sub-items:

  • (a) ACTING badge undersized. text-[10px] -> text-[11px] pill with primary/15 bg + ring + a pulse dot. Easy to spot now; the pulse pulls the eye to the active player.
  • (b) Non-acting peers had no waiting indicator. Added a subtle Waiting badge on every non-acting party row when a turn is in flight. Per CLAUDE.md primary-audience rubric, this serves Alex (slow reader, freezes under time pressure) — he now has an explicit "the table is waiting on Lyra, not me" cue.
  • (c) Location chip stale ("BRIDGE — OUTER COYOTE REACH" while prose moved to Docking Crescent). useRunningHeader now prefers the local PC's current_location from PARTY_STATUS (which arrives every turn) and falls back to the most recent CHAPTER_MARKER. Recurring chrome cache-invalidation bug from the Mawdeep section finally lands.
  • (d) Triple/quadruple banner ambiguity. Removed the redundant [ Paul's turn ] / [ Your turn ] chip from the bottom turn-indicator strip. Kept: MultiplayerTurnBanner (above the InputBar — canonical "whose turn" signal, spatially adjacent to where the user is typing), the party-section ACTING badge (spatially-located on the actor's row), and the InputBar placeholder ("Waiting for X…", input-gating signal). Removed/demoted: the bottom [ Paul's turn ] / [ Your turn ] chip — pure duplicate. The structured TurnStatusPanel branch (chargen sealed-letter "Waiting on:" widget) is preserved because it's a richer per-player roster, not a "whose turn" duplicate.

Tests

  • src/components/__tests__/CharacterPanel.test.tsxS2-UX: turn-state badges are legible and unambiguous (6 cases: YOU, ACTING+pulse, animate-pulse class, text-[11px] regression guard, Waiting on non-acting peers, no badges when no active player).
  • src/hooks/__tests__/useRunningHeader.test.tsxS2-UX (c) location chip cache invalidation (7 cases: chapter-marker fallback, null state, PARTY_STATUS preference over stale marker, no-marker case, ignore non-local peers, fallback when local location empty, cross-turn refresh without remount).
  • src/components/GameBoard/__tests__/runningHeader-wiring.test.tsx — wiring test (drives the chip through the actual GameBoard and asserts it updates from PARTY_STATUS without remount), plus S2-UX (d) dedupe assertions.

Test plan

  • npx vitest run for touched files — 132/132 pass
  • npm run lint — only pre-existing App.tsx:1332:6 react-hooks/exhaustive-deps warning, unchanged
  • npx tsc --noEmit clean
  • Live verify in tonight's playtest: chip updates between locations within a session; peer ACTING pulse visible from across the room; no triple-banner stutter

Coordination

Sister fix/s2-hp-schema-leak-ui PR also touches CharacterPanel.tsx (HP fields per ADR-014). This PR deliberately avoids HP fields. If the HP PR ships first, this should rebase cleanly; if conflicts arise the merge is mechanical (different lines).

🤖 Generated with Claude Code

…p refresh + dedupe banners

Party-panel + turn-banner cluster (S2-UX, screenshot 036):

(a) ACTING badge: text-[10px] -> text-[11px], bumped to a pill with
    primary/15 bg + ring + a pulse dot. The previous badge was easy to
    miss; the pulse draws Alex's eye to whoever currently has the floor.
(b) Non-acting party rows now render a subtle "Waiting" badge so peers
    have an explicit "the table is waiting on X, not me" cue when a turn
    is in flight. (Per CLAUDE.md: serves Alex's slow-reader, freezes-
    under-time-pressure profile.)
(c) Running-header location chip now derives from the local PC's
    `current_location` in PARTY_STATUS (which arrives every turn) and
    falls back to the last CHAPTER_MARKER. Previously the chip was bound
    to CHAPTER_MARKER alone, so it stuck on a stale location ("BRIDGE -
    OUTER COYOTE REACH") whenever the prose moved without firing a
    chapter marker -- the recurring chrome cache-invalidation bug.
(d) Removed the redundant `[ Paul's turn ]` / `[ Your turn ]` chip from
    the bottom turn-indicator strip. The MultiplayerTurnBanner above the
    InputBar already announces whose turn it is, the party-section
    ACTING badge gives the spatially-located cue, and the InputBar
    placeholder covers input gating. The structured TurnStatusPanel
    branch is preserved (it's a richer per-player roster, not a duplicate
    of "whose turn it is").

Coordination: hp-schema-leak PR (oq-1) ships first and also touches
CharacterPanel; this commit avoids the HP fields entirely.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@slabgorb slabgorb merged commit 381b7a7 into develop Apr 26, 2026
1 check failed
@slabgorb slabgorb deleted the ux/s2-party-panel-banner-cluster branch April 26, 2026 12:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant