Skip to content

Move occasional actions to header menu, add guest to people strip - #332

Merged
timgent merged 2 commits into
mainfrom
claude/orange-button-design-ux-s7me8f
Aug 26, 2026
Merged

Move occasional actions to header menu, add guest to people strip#332
timgent merged 2 commits into
mainfrom
claude/orange-button-design-ux-s7me8f

Conversation

@timgent

@timgent timgent commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Summary

Reorganizes the packing list header to reduce visual weight on less-frequent actions. Moves "Share" and "Update from questions" behind a kebab menu, replaces the "Back to Lists" button with a subtle chevron, and relocates "Add Guest" from the header to the people filter strip where it's contextually relevant.

Key Changes

  • Header redesign: Replaced four filled buttons (Add Guest, Update from questions, Share, Back to Lists) with two controls:

    • A subtle chevron button for navigation back to lists
    • A kebab menu (ActionMenu) containing Share and Update from questions
  • New ActionMenu component: Created src/components/ActionMenu.tsx using Radix UI dropdown menu for consistent, accessible menu behavior with proper focus management and keyboard navigation

  • Guest addition moved to people strip: Integrated guest-adding UI into PeopleFilterBar via new onAddGuest callback, with inline name input that appears on demand rather than a header button

  • Button variant refinement: Added subtle variant to Button component for occasional actions (neutral box, no gradient), with comprehensive test coverage ensuring proper emphasis hierarchy

  • Accessibility improvements:

    • Back button uses aria-label only (no text content) to avoid redundancy with nav bar
    • Menu items use proper role="menuitem" with Radix's roving focus and typeahead
    • Minimum 44px touch targets maintained throughout
    • Motion-safe guards on scale animations for users with reduced motion preferences
  • Test updates: Updated 30+ test cases across view-packing-list.test.tsx, PeopleFilterBar.test.tsx, and e2e tests to reflect new menu structure and guest-adding location

Implementation Details

  • The people strip now shows a dashed "+" button when onAddGuest is provided, opening an inline text field on the next line for full-width input
  • Guest name is trimmed and validated before submission; empty names are rejected
  • The strip remains visible even with a single person (to enable adding a second), but shows that person as a label rather than a filter chip
  • All occasional actions now live behind the menu, keeping the header focused on the list itself
  • Button emphasis hierarchy is now enforced: primary/secondary for main actions, subtle for occasional ones, ghost for minimal UI

https://claude.ai/code/session_01Heb85VVme2oQbrv8UVifjZ

The list view opened with four filled orange buttons — Add Guest, Update
from questions, Share, Back to Lists — stacked two rows deep above the list
they were all less important than. Orange was doing two jobs at once, as the
action colour and as the attention colour of the hidden-items callout, so
the one thing on screen asking for a glance was camouflaged by four that
were not.

What the header carries now is a back chevron and a kebab: the same Radix
menu the list cards already use for their own actions. "Add guest" moved to
the people strip, where the people are — which also fixes a real disconnect,
since the button used to open a name field several hundred pixels below,
past the sticky bar and often off the bottom of a phone. The strip no longer
hides itself when there is only one person on the list, because that is
exactly the list a second person gets added to.

Alongside, in Button:

- A `subtle` variant. `ghost` is primary-tinted, so a row of quiet buttons
  still read teal; occasional actions should read as nothing in particular.
- The filled variants move to gradients dark enough to carry white text.
  White on secondary-500 was 2.80:1 and on primary-500 2.49:1, against the
  4.5:1 that 14px semibold needs. The decorative gradients stay bright —
  a progress bar answers to the 3:1 non-text rule. Same fix applied to the
  hand-rolled CTAs on the landing page and the wizard.
- 44px minimum height, the floor the people chips already hold.
- The scale bounce is behind `motion-safe:`.

Show Packed drops to `subtle` while there is nothing packed to reveal: with
the header quiet it had become the loudest thing on the page, for a toggle
over an empty set.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Heb85VVme2oQbrv8UVifjZ
@vercel

vercel Bot commented Aug 26, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
react-packing-app Ready Ready Preview Aug 26, 2026 7:35pm

Z1 reached Share as a top-level button. It moved into the header's actions
menu, so the suite has to open the menu first — and twice over: the second
click reopens Share after closing the modal, and picking an item closes the
menu the first locator points into.

CI's other e2e failure, F6, is a pre-existing flake — a route handler leaked
from F5 — and passed on retry in the same run.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Heb85VVme2oQbrv8UVifjZ
@timgent
timgent merged commit 295dbe7 into main Aug 26, 2026
4 checks passed
@timgent
timgent deleted the claude/orange-button-design-ux-s7me8f branch August 26, 2026 19:49
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.

2 participants