Per-Seat Calculator
A single plan card centers on an interactive seat-count stepper: clicking + or - (or typing directly into the count field) adjusts the number of seats, clamped to a sensible range, and the estimated monthly total recalculates immediately as price-per-seat times seat count.
Docs
Installation
A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button dependencies and any missing npm packages, and installs them straight into your project.
npx shadcn add https://staaarter.com/r/per-seat-calculator.jsonPrefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/pricing/pricing11.tsx instead.
Usage
The file also exports pricing11Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.
import { Pricing11, pricing11Demo } from "@/components/blocks/pricing/pricing11"; export default function Page() { return <Pricing11 {...pricing11Demo} />; }
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| heading | ReactNode | undefined | Centered headline above the calculator card. |
| description | string | undefined | Supporting subtext below the heading. |
| planName | string | none | Name of the plan being priced per seat. Required. |
| pricePerSeat | number | none | Price for a single seat, used in the live total calculation. Required. |
| period | string | "/seat/month" | Unit label shown next to the per-seat price. |
| minSeats | number | 1 | Minimum seat count the stepper allows. |
| maxSeats | number | 50 | Maximum seat count the stepper allows. |
| defaultSeats | number | 5 | Initial seat count on load, clamped into [minSeats, maxSeats]. |
| features | string[] | none | Feature list shown below the calculator. Required. |
| ctaLabel | string | none | Label for the CTA button. Required. |
| ctaHref | string | undefined | Link target for the CTA button. |
| className | string | none | Extra classes for the outer section element. |
Behavior notes
- The stepper is real local state: the +/- buttons (each with a real aria-label, and disabled at the min/max bound) and the number input all update the same seats state via a shared clamp(value, minSeats, maxSeats) helper.
- The estimated total (seats * pricePerSeat) is computed inline from that state on every render, so it updates the instant the seat count changes, whether from a button click or typing into the field.
- The seat count field is a real labeled <input type="number">, with an sr-only <Label> for screen readers since the visible 'Number of seats' text next to it is a plain span.
- The CTA button is an inert placeholder (href defaults to "#" in the demo) with no real checkout wired up.
More Pricing Blocks
View all →Three Tier Cards
Classic three-column pricing cards with one plan visually highlighted as the recommended choice.
Monthly/Yearly Toggle
Three-tier pricing cards with a real billing-period toggle that switches every displayed price.
Single Plan Highlight
One centered, larger card for a single plan with a big price, full feature list, and a primary CTA.
Comparison Table
A full feature-matrix table comparing 3-4 plan tiers row by row, with a horizontal scroll fallback on mobile.
Enterprise Contact Card
A standard self-serve plan card next to a distinctly-styled Enterprise card with custom-quote messaging.
Pricing With Testimonial
Pricing cards paired with a single customer quote block for social proof, side by side on large screens.