A subscription preference list where each list carries how often it sends, and the figure underneath recomputes the monthly email volume as boxes are ticked, down to a stated zero.
A subscription preference list where each list states how often it sends, and the figure underneath recomputes the monthly email volume as boxes are ticked, down to a stated zero.
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/settings67?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/settings67?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/settings67.tsx, the badge6 eyebrow and button1 save button it renders through, and the shadcn/ui checkbox primitive behind each row.
The installed file exports settings67Demo alongside the block: the exact props behind the preview above. Spread it to get a working preference panel in one line.
import { Settings67, settings67Demo } from "@/components/beste/block/settings67";
export default function PreferencesPage() {
return <Settings67 {...settings67Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Settings67 } from "@/components/beste/block/settings67";
export default function PreferencesPage() {
return (
<Settings67
eyebrow="Email preferences"
heading="Take only the parts you read"
description="Every list is separate, and turning one off never turns another on."
subscriptions={[
{
name: "The weekly letter",
description: "Tuesday mornings, around 700 words.",
perMonth: 4,
defaultOn: true,
},
{
name: "Live sessions",
description: "One notice a fortnight, plus the recording.",
perMonth: 2,
},
]}
countLabel="emails a month, roughly"
emptyLabel="Nothing selected. We will not email you at all."
saveLabel="Save preferences"
savedLabel="Saved"
note="Unsubscribing from everything removes your address the same day."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the hairline rule |
heading | string | – | Section heading under the rule |
description | string | – | Supporting paragraph |
subscriptions | Subscription[] | [] | One tickable row per list, in order |
countLabel | string | – | Words after the computed figure, e.g. "emails a month" |
emptyLabel | string | – | Replaces the figure when nothing is selected |
saveLabel | string | – | Label on the seal button before saving |
savedLabel | string | – | Label after saving, falls back to "Saved" |
note | string | – | Fine print under the save row |
className | string | – | Extra classes for the outer section |
type Subscription = {
name: string;
description: string;
perMonth: number;
defaultOn?: boolean;
};perMonth across the ticked rows on every render, so the number always matches the boxes above it.defaultOn through a lazy useState initialiser, which means the starting selection is read once rather than on every render.emptyLabel, so the empty case reads as a sentence instead of a metric.saveLabel and stops claiming the current selection is stored.Button1 with no href, so it renders a real button and its seal icon changes to a check once saved.label wrapping the checkbox and its text, so the whole row is a hit target rather than the small square alone.onCheckedChange or the button to your own endpoint when you connect it.settings59
Subscription management card displaying current plan details, pricing, included features, renewal date, and status badges with actions to change or cancel. Perfect for SaaS billing dashboards and account settings.
settings66
A settings panel with a section rail on the left and the chosen group on the right, laying out hairline preference rows with switches, a select for the group's default, and a save bar underneath.