Closing section that offers two routes side by side, each a ruled column with a title, a short pitch, a dotted-rule list of what to expect and its own pill CTA, one solid and one outline.
Closing section for pages that have two audiences, usually clients and candidates. Each route is a ruled column with its own title, pitch, dotted-rule expectations list and pill CTA, one solid and one outline so the primary path still reads first.
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/cta80?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/cta80?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/cta80.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports cta80Demo alongside the block: the exact props behind the preview above. Spread it to get a working two-path CTA in one line.
import { Cta80, cta80Demo } from "@/components/beste/block/cta80";
export default function Page() {
return <Cta80 {...cta80Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Cta80 } from "@/components/beste/block/cta80";
export default function Page() {
return (
<Cta80
badge={{ label: "Two doors" }}
heading="Hire the studio, or come and work in it."
paths={[
{
title: "Bring us a project",
description: "Send the brief in whatever shape it exists.",
points: ["Reply within two working days", "Written estimate before anything starts"],
buttonLabel: "Send a brief",
href: "/contact",
tone: "dark",
},
{
title: "Join the studio",
description: "We hire slowly and rarely, but we read everything.",
points: ["Two roles open this year", "Four-day week"],
buttonLabel: "See open roles",
href: "/careers",
tone: "outline",
},
]}
labels={{ note: "Both routes land in the same inbox." }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Centered heading above the two columns |
paths | CtaPath[] | [] | One ruled column per route |
labels | Cta80Labels | {} | Fixed strings that are not content: the centered closing note |
className | string | – | Extra classes for the outer <section> |
type CtaPath = {
title: string;
description: string;
points: string[];
buttonLabel: string;
href: string;
tone?: "dark" | "outline";
};
type Cta80Labels = {
note?: string;
};tone is per path and defaults to "dark", so a two-path block with no tones set renders both pills solid; pass "outline" on the secondary route to keep one clear primary action.border-t border-dotted rules, a lighter tier than the solid rule opening each column, so the list reads as supporting detail rather than a second table.md:grid-cols-2: a third path wraps to a second row rather than shrinking the columns.cta83
A closing call to action offering two routes as side-by-side cards, each with an icon tile, a short kicker, a checked list on hairlines, and its own action, with the recommended route outlined in the accent.
cta74
A centered call to action with an eyebrow pill, a large light heading, a short paragraph, and two accent buttons on a clean surface.
cta78
Closing call to action splitting a tall photo against an oversized heading, a short pitch, a pill CTA beside a plain email link, and a ruled two-column row stating reply time and next availability.
cta23
Stacked two-tier call-to-action with primary offer on top and secondary alternative below, separated by a divider. Perfect for presenting main and fallback conversion paths.