shadcn.io is not affiliated with official shadcn/ui
Centered Seat-Capped Invite CTA Block for React
A centred card-in-card CTA with a tags input of teammate emails that stops at the seats a plan has left, ten seat dots that fill as you add chips and a Shine Button that counts the invites.
Installation
Overview
A centred call to action that closes a page with an invite form that knows the plan's limits, for React with Base UI. A muted shell with + marks on its corners, between solid rails, wraps a raised panel that follows the theme; in it, a headline, a sentence about Quillboard (a fictional team whiteboard) and the form. Teammates' addresses become chips as you type, paste or press Enter; each one is checked for a valid format and for duplicates, and the field stops accepting new ones when the seats run out. Ten seat dots fill as chips are added, the Shine Button's label counts the invites ("Send 3 invites"), and a confirmation replaces the form once the simulated request finishes. It's built from Guides, Tags Input, Status, Shine Button and Button, with Lucide icons, Tailwind CSS and CSS entrances that stay still under reduced motion. Made for workspace and team-plan pages where the number of seats is a real limit.
FAQ
How does the block stop at the seats that remain?
The plan allows ten seats and four are already taken, so the field accepts six chips in total (TOTAL_SEATS and TAKEN_SEATS at the top of the file, ready to be fed from your billing data). At that point the input becomes read-only, its placeholder reads "Seats are full" and the line under it explains the limit. Removing a chip, with its delete button or Backspace, frees a seat at once and the field takes addresses again.
How are the addresses checked?
An address is added only if it looks like an email (something, an at sign, a domain with a dot) and isn't on the list already, ignoring case. When one is turned down, the line under the field says why in a polite live region and the field is marked invalid until you type again. It is a format check only: a real invite flow still verifies the address on your server and refuses people who already belong to the workspace.
Can people paste a list of addresses?
Yes. Pasting a comma-separated list adds every valid address up to the seat limit and ignores the rest. A comma or Enter adds the address being typed, and leaving the field adds it too.
Is the send button real, and how do I wire it?
No: the request is simulated in send. After the list passes the check, the button shows its spinner for LATENCY (0.8 seconds) and a timer swaps the form for the confirmation, and the seats it used stay taken until the page reloads. Replace the timer with a request to your invite endpoint, keep the loading state while it runs, and on success keep the rest: the confirmation that takes focus and the seat count that follows the result. If it fails, set the phase back to "idle" and put the message in note. The timer is cleared when the block unmounts, so cancel a real request there too.
Is it accessible for keyboard and screen reader users?
The input is named "Teammate email addresses" and described by the line under it; each chip's delete button is named after its address; the arrow keys move between chips. The seat dots are decorative and the same numbers are written out ("3 of 10 seats open"). When the form is replaced, the confirmation's heading takes focus; "Invite more teammates" brings focus back to the field. The form is inert while hidden, so its fields leave the tab order.
Does it work in right-to-left layouts and with reduced motion?
The layout uses logical properties, so the chips, the dots and the note under the field follow the page's direction, while addresses and numbers are isolated so they keep their order. The only motion is the entrance fade and the dots' colour change, and both stop when reduced motion is requested.
Related
- Pro
Split Panel Gated Document CTA
Forms and captureA split CTA that gates a PDF: an email form and Shine Button beside a stack of paper pages in a hairline frame, the cover blurred and locked, with a closing band of chapters. Submitting unlocks the cover and offers a download with progress.
- Pro
Split Panel Team Picker CTA
Pickers and togglesA split CTA where visitors pick the engineer they want to talk to from four choice cards with initials, role and availability, a Shine Button that names their choice, and a closing band of assurances.
- Pro
Centered Store Buttons CTA
Forms and captureA centered card-in-card CTA for a mobile app with iOS and Android download links, and a text-me-the-app form in a ruled band that has a country-code select and turns into a confirmation.
- Pro
Centered Inline Email Signup Hero
Signup and waitlistA short centered waitlist hero with an email field and a Shine Button on one row inside a framed box, a confirmation in place, an avatar row and two trust points.
- Pro
Waitlist Signup Hero
Signup and waitlistA compact waitlist hero: the copy beside a card-in-card email form that turns into a confirmation in place, with a closing band of three features coming at launch.
- Pro
Team Size Slider With Volume Discounts
Seats and teamsA seat calculator: a slider sets the team size with its count riding the thumb, ticks at the 10, 25 and 50 seat discounts, shortcuts to them, and a panel that rolls the seat price and monthly total.