A narrow signup where the reader first picks how often they want to hear from you, the paragraph underneath rewriting itself for the choice, before the single email row is filled in.
A narrow signup where the reader first picks how often they want to hear from you, the paragraph underneath rewriting itself for the choice, before the single email row is filled in.
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/cta94?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/cta94?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/cta94.tsx, the badge6 component used for the eyebrow, and the shadcn/ui input and button primitives behind the signup row.
The installed file exports cta94Demo alongside the block: the exact props behind the preview above. Spread it to get a working signup in one line.
import { Cta94, cta94Demo } from "@/components/beste/block/cta94";
export default function SubscribePage() {
return <Cta94 {...cta94Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Cta94 } from "@/components/beste/block/cta94";
export default function SubscribePage() {
return (
<Cta94
eyebrow="Your inbox, your rules"
heading="Choose how often you hear from us"
cadences={[
{ label: "Every week", detail: "One letter on Tuesday morning, around 700 words." },
{ label: "Once a month", detail: "The three pieces worth keeping, on the first Tuesday." },
]}
placeholder="you@studio.com"
submitLabel="Set it up"
note="You can change the rhythm from any issue."
confirmation="Saved. The first one arrives on the schedule you picked."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the heading |
heading | string | – | Section heading |
cadences | Cadence[] | [] | Options, rendered as a row of buttons |
placeholder | string | – | Placeholder in the email field |
submitLabel | string | – | Label on the submit button |
note | string | – | Fine print under the row |
confirmation | string | – | Line that replaces the row after submitting |
className | string | – | Extra classes for the outer section |
type Cadence = {
label: string;
detail: string;
};detail, so the choice explains itself instead of needing a description beside every option.bg-foreground text-background. They wrap onto a second line on a narrow screen instead of scrolling.cta92
A newsletter CTA that asks before it asks for an address: subjects, then cadence, then the email, and the column swaps itself for a confirmation that reads back exactly what was chosen.
cta26
Urgency-driven call-to-action with countdown numbers and limited-time offer messaging. Perfect for launches and time-sensitive promotions.
cta42
Rotating testimonial quotes with author info and persistent call-to-action buttons. Perfect for social proof that stays fresh.
cta22
Card-style call-to-action with value-driven highlight metrics in a bordered grid. Perfect for data-backed conversion sections.