Team pricing
Everyone on the plan gets the whole library. Add and remove people whenever the team changes.
Seats
$10 per seat, per month
Your total
$480/ year
Your total $480 / yearA per-seat pricing panel in ink under a centred serif headline that settles in word by word: a monthly or yearly pill switch, a seat count with round plus and minus steppers, the per-seat rate, and a large serif total that blurs to each new value; on the right the included features and a full-width light sliding-marker pill.
A per-seat panel in ink: step the team size up or down, switch between monthly and yearly, and watch the total blur to its new figure.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/pricing81?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/pricing81?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/pricing81.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports pricing81Demo alongside the block: the exact props behind the preview above. Spread it to get a working pricing section in one line.
import { Pricing81, pricing81Demo } from "@/components/beste/block/pricing81";
export default function Page() {
return <Pricing81 {...pricing81Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Pricing81 } from "@/components/beste/block/pricing81";
export default function Page() {
return (
<Pricing81
eyebrow="Team pricing"
heading="One price per seat. Count your team."
description="Everyone on the plan gets the whole library."
labels={{
monthly: "Monthly",
yearly: "Yearly",
seats: "Seats",
perSeat: "per seat, per month",
perMonth: "/ month",
perYear: "/ year",
total: "Your total",
saving: "Two months free on yearly",
fewer: "Fewer seats",
more: "More seats",
}}
pricePerSeat={{ monthly: 12, yearly: 10 }}
currency="$"
minSeats={1}
maxSeats={50}
defaultSeats={4}
yearlyDefault
features={["Every section and component", "Shared themes across projects"]}
button={{ label: "Start the team plan", href: "/signup" }}
note="Seats can be added mid-cycle."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, through Text1 |
description | string | – | Paragraph under the heading |
labels | Labels | { monthly: "Monthly", seats: "Seats", total: "Your total", ... } | Wording of the switch, the steppers and the figures |
pricePerSeat | { monthly: number; yearly: number } | { monthly: 12, yearly: 10 } | Monthly rate per seat on each cycle |
currency | string | "$" | Symbol prefixed to every figure |
minSeats | number | 1 | Lower bound of the stepper |
maxSeats | number | 50 | Upper bound of the stepper |
defaultSeats | number | 1 | Seat count on load |
yearlyDefault | boolean | false | Opens on the yearly cycle |
features | string[] | [] | What the plan includes, listed on the right |
button | { label: string; href: string } | – | Full-width pill under the features |
note | string | – | Small print under the pill |
className | string | – | Extra classes for the outer <section> |
type Labels = {
monthly: string;
yearly: string;
seats: string;
perSeat: string;
perMonth: string;
perYear: string;
total: string;
saving?: string;
fewer: string;
more: string;
};radiogroup of two buttons with an ink marker that slides between them through a shared layoutId, so the movement comes from the layout engine rather than a hand-written transform.inline-grid where both values share one cell, which lets the number keep its natural width so the unit label always sits right beside it.toLocaleString("en-US") at render, which is what puts the separator in a four-figure total.minSeats and maxSeats on every press rather than disabling the buttons, so holding one down at the boundary does nothing instead of jumping.text-current rather than the accent, because an accent-coloured icon disappears against the ink panel.pricing68
A per-seat pricing calculator with a full-height photo panel on the left, a monthly and yearly toggle, a seat slider driving an oversized live count, an included-features list, and a soft summary column with a cost breakdown and total.
pricing13
Per-seat pricing calculator with slider control and automatic volume discount display. Perfect for team collaboration tools with user-based pricing.
pricing80
Plans as ruled rows rather than cards: name and one line on the left, a serif price that blurs to its monthly or yearly value, and a sliding-marker pill at the row's end. The pill switch and its saving note sit at the right end of the header beside a serif headline that settles in word by word.
pricing11
Usage-based pricing calculator with interactive slider showing tiered breakpoints. Perfect for API services and consumption-based products.
pricing78
Three pricing cards under a centred serif heading that settles in word by word, with a pill toggle between paying per session and committing to a season: the serif prices blur out and in as it switches, and each card ends in a sliding-marker pill.
pricing83
A dark comparison table: a serif headline that settles in word by word with a monthly or yearly pill switch at the right end of the header, plan columns with serif prices that blur to their new value and sliding-marker pills, then grouped feature rows with checks, dashes and short values, scrolling sideways on narrow screens.