DES-384 Design Interactive prototype

Invite Member — bulk WABA & role assignment

Today, inviting a teammate to 1,247 WABAs takes 2,000+ clicks: one selection per channel, one role dropdown per channel. This redesign splits the flow into three focused steps in a 720-wide modal — with a left rail that tracks where you are and reveals a live member preview the moment you start typing.

Ticket: DES-384 → blocks DEV1-15931 Touches: team-management/v1/components/team-member-invite-modal.tsx Backend: No changes

Try the redesigned invite flow

Fully clickable prototype with 1,247 mock WABA channels. Type into the form and watch the left-rail member card fill in live. Then search, bulk-select, override roles, and send.

Esc to close Tab to navigate / in step 2 to focus search
1

The three-step flow

Every step shares the same 720 × 640 shell, split into a sage-tinted left rail (vertical step nav + live member-preview card) and a focused right pane. The member preview only appears once the user starts filling in details.

1

Member details

Identity + organization role. Each field you type writes into the rail's member card on the left, so the modal always shows who you're inviting.

2

Channel access

Virtualised list of every WABA. Filter (search · channel type · status) → Select all matching. Default role applies to each new selection; override any row inline.

3

Review & send

Summary card with member + org role + channel breakdown. Click any step in the rail to jump back. One green button to send.

2

Mobile preview

On viewports below 720px the modal becomes a full-screen sheet. The vertical rail collapses into a horizontal step bar across the top; the member preview becomes a single-line chip with avatar, name and role. Tap targets bump to 40–44px throughout.

Step 1 · Member details
Step 2 · Channel access
Step 3 · Review & send

Or open the prototype on your phone (or resize your browser below 720px) to drive it directly.

3

Build spec

Implementation lives in team-member-invite-modal.tsx + team-member-wabas-list.tsx. No new API contracts; multi-step + rail state are local component state.

Two-column shell

  • Modal: 720 × 640, never resizes.
  • Left rail (208px): vertical step nav + live member-preview card (centered avatar).
  • Right stage (512px): step content + footer.
  • Rail background is a faint cool-green tint to read as "context."

Live member card

  • Empty state: dashed border, faded avatar, placeholder name.
  • Each field (name → phone → email → role) appears as it's filled.
  • Initials in avatar update in real-time from the name field.
  • Same card persists across all three steps as identity context.

Bulk & role assignment

  • Filters drive WabaIntegrationPaginationParams (search, type, status).
  • Select all/matching use existing includeAllIntegrations.
  • Default role applies on selection; per-row chip overrides.
  • Mixed = distinct role count > 1 across selections.
Reuse: QSModal, QSButton, DropdownComponent, react-virtuoso New atoms: RailStepper, MemberCard, FilterChip, BulkBar, DefaultRoleBar, RowRoleChip No backend changes