shadcn.io is not affiliated with official shadcn/ui
Invitation Status Sheet Success Block for React
A crew page with the sheet that says where each of twelve invitations stands, shown open: filter chips with counts, a status word and time per person, a Resend button on every row and a Resend all pending.
Installation
Overview
Show who has read an invitation, not only that it went out, with this confirmation sheet for React with Base UI. It opens from the Autumn Cider Fair crew page of Shiftholm, an event-staffing app: the page's header holds an outline View invitations Button, and the page itself is drawn under a soft scrim inside a hairline frame with a plus mark on each corner, a crew list with a mark for how far each invitation got. The Sheet reads "12 invitations sent" over a row of filter chips, a Toggle Group with a count on each (All, Opened, Delivered, Pending), and the people they match, each with a status word, a time and a Resend button, then a Shine Button Done and an outline Resend all pending. For team invitations, event crews and any send where the answer is a status per person.
FAQ
Why is the sheet already open, and what do I keep?
So you can see it without a click. On load the sheet is a copy drawn in place over the page: a native dialog element that isn't modal, so nothing is trapped, hidden or focused and the page around the preview keeps working. View invitations opens the real Sheet, modal, with its focus trap, Escape and focus return, and the copy stays closed until a reload. Both show the same SheetInvites component and share the block's state, so a Resend pressed in place is there in the real sheet. In your app keep the Sheet and drop the copy: the "in-place" state, the scrim and the dialog element inside the frame.
What stays in the page, and how do I wire it for real?
Nothing was sent. The twelve people, their statuses and their times are typed in INVITEES, and Resend and Resend all pending only change this page: the row says "resent 10:05 UTC", its button reads Resent and a polite status line says "Resent to Eero Salo in this demo. Nothing was sent." To wire it, build INVITEES from your invitation records and call your resend endpoint from resend and resendPending.
How does the filter work?
It's a single-choice Toggle Group, so one chip is always pressed, and each chip names its count ("Opened, 5") from the same list the rows come from. Choosing a chip lists only the people with that status and a line says "Showing 5 of 12"; the sheet is a fixed height with a scrolling list, so nothing around it moves. Arrow keys move between the chips and Space or Enter presses one.
Which side does the sheet come from?
From the end of the layout. The catalog's sheet sides are physical, so the block reads the page's direction when you open it and passes left in a right-to-left layout and right otherwise. The trigger is passed to SheetTrigger through render, and the sheet is controlled with open and onOpenChange.
Is it accessible from the keyboard?
Yes. The real sheet is named by its title and described by its sentence, and focus stays inside until it closes; Escape, Done and the close button return focus to View invitations. The copy shown on load moves no focus; Escape inside it, Done and its close button close it and put focus on View invitations. A status is a word and a glyph (a check, an open envelope, a clock), never only a color, and each Resend button is named for its person.
How does it look on a phone?
The copy shown on load docks to the foot of the page as a bottom sheet with Done and Resend all pending pinned under the list, and its sentence is read out but not shown to leave room for the people. The real sheet keeps the Sheet's own phone layout. The chips wrap to two rows.
Related
- Pro
Invite Members Dialog
Share and inviteA household calendar's Members page with its invite dialog shown open: one email field that knows the household's domain, so an outside address joins as a guest, the people who already have access, and a Send invite button that adds a pending row.
- Pro
Invite Team Dialog
Share and inviteA crew page with its bulk invite dialog shown open: a pasted list becomes one chip per address with bad ones flagged, one role for the batch, a seat meter that refuses a batch that does not fit, and a Pending tab with Resend, Revoke and Undo.
- @@Pro
Workspace Invites Settings
Team and rolesJoin rules for a workspace: a domain rules table with a role menu and approval switch, a form that checks a domain before adding it, a field that tries an email address against the rules, and a queue of join requests to approve or decline.
- Pro
Invite Accepted Roster Success
People and approvalsA confirmation page for a teammate joining: who invited them and when, how many seats are used, and a roster where the new member's row is marked Joined and holds a role select that changes the role sentence below.
- Pro
Two pending workspace invitations with who invited you, the role as a glyph and a word and the time, each answered in place without moving: Accept leaves a receipt with Undo and Switch workspace, Decline asks first, and the count follows.
- Pro
Benefits Enrollment Cost Success
People and approvalsA confirmation page for chosen benefits: a ledger of three plans with who each covers, what the employer pays and what you pay each pay period, and a twelve-week strip from today to the day cover starts with the enrolment deadline marked.