Team

MembersTable, PendingInvitesTable and InviteMemberDialog from packages/ui, against a 30-person roster with real paging, permission-shaped rows, and switchable failure.

Roster

An Admin actor: two Owners above their reach, one disabled member, mixed 2FA, their own row unmanageable. 30 rows at 25 per page, so page 2 is a real 5-row remainder.

30 members, Admin actor
MemberActions
Ada Hopper (you)ada.hopper@acme.coAdmin
Grace Dijkstragrace.dijkstra@acme.coOwner
Alan Liskovalan.liskov@acme.coOwner
Katherine Lovelacekatherine.lovelace@acme.coMember
Edsger Johnsonedsger.johnson@acme.coAdmin
Margaret Shannonmargaret.shannon@acme.coMember · Disabled
Claude Perlmanclaude.perlman@acme.coMember
Barbara Turingbarbara.turing@acme.coMember
Donald Hamiltondonald.hamilton@acme.coAdmin
Radia Knuthradia.knuth@acme.coMember
Ada Hopperada.hopper@acme.coMember
Grace Dijkstragrace.dijkstra@acme.coMember
Alan Liskovalan.liskov@acme.coAdmin
Katherine Lovelacekatherine.lovelace@acme.coMember
Edsger Johnsonedsger.johnson@acme.coMember
Margaret Shannonmargaret.shannon@acme.coMember
Claude Perlmanclaude.perlman@acme.coAdmin
Barbara Turingbarbara.turing@acme.coMember
Donald Hamiltondonald.hamilton@acme.coMember
Radia Knuthradia.knuth@acme.coMember
Ada Hopperada.hopper@acme.coAdmin
Grace Dijkstragrace.dijkstra@acme.coMember
Alan Liskovalan.liskov@acme.coMember
Katherine Lovelacekatherine.lovelace@acme.coMember
Edsger Johnsonedsger.johnson@acme.coAdmin
1–25 of 30

Permission shapes

The actions column is driven entirely by each row's own assignableRoles / canRemove — a viewer without team/role:w or team/remove:w never receives a row that allows either.

Read-only viewer
MemberActions
Ada Hopper (you)ada.hopper@acme.coAdmin
Grace Dijkstragrace.dijkstra@acme.coOwner
Alan Liskovalan.liskov@acme.coOwner
Katherine Lovelacekatherine.lovelace@acme.coMember
Edsger Johnsonedsger.johnson@acme.coAdmin
Margaret Shannonmargaret.shannon@acme.coMember · Disabled
Claude Perlmanclaude.perlman@acme.coMember
Barbara Turingbarbara.turing@acme.coMember
1–8 of 8

team:r only — no row has an assignable role or canRemove, so no row renders a menu.

Single member (just you)
MemberActions
Ada Hopper (you)ada.hopper@acme.coAdmin
1–1 of 1

You can't reassign or remove yourself, so the actions column is empty even though you're an Admin.

Pending invites

No pending invites

PendingInvitesTable renders null — no heading, no empty-state row.

Three pending invites
EmailActions
sam.rivera@acme.coMember · Expired
priya.desai@acme.coAdmin ·
morgan.lee@acme.coOwner ·

The invite to Owner is above the Admin actor's reach, so it has no Revoke action.

Invite a member

InviteMemberDialog

Try "taken@acme.co" — the fixture rejects it with "That user is already a member."

Failure state

Role change always fails
MemberActions
Ada Hopper (you)ada.hopper@acme.coAdmin
Claude Perlmanclaude.perlman@acme.coMember
1–2 of 2

Row menu → Change role → Change role — every attempt fails with "Something went wrong — try again."

320px width

MembersTable in a 320px column
MemberActions
Ada Hopper (you)ada.hopper@acme.coAdmin
Grace Dijkstragrace.dijkstra@acme.coOwner
Alan Liskovalan.liskov@acme.coOwner
Katherine Lovelacekatherine.lovelace@acme.coMember
Edsger Johnsonedsger.johnson@acme.coAdmin
1–5 of 5

Last active drops first, then 2FA; role and status fold into the member's line last. The actions menu never scrolls off.