A closing call to action that offers three downloadable resources as full-width hairline rows, each a link with a short kicker, a format note, and an arrow that shifts on hover.
A closing call to action that offers three downloadable resources as full-width hairline rows, each a link with a short kicker, a format note and an arrow that shifts on hover.
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/cta87?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/cta87?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/cta87.tsx plus the badge23 and button21 components it uses for the eyebrow and the action.
The installed file exports cta87Demo alongside the block: the exact props behind the preview above. Spread it to get a working call to action in one line.
import { Cta87, cta87Demo } from "@/components/beste/block/cta87";
export default function Page() {
return <Cta87 {...cta87Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Cta87 } from "@/components/beste/block/cta87";
export default function Page() {
return (
<Cta87
badge={{ label: "Before you decide" }}
heading="Take the homework with you"
description="Three things practices asked us for often enough that we wrote them down properly."
resources={[
{
kicker: "Guide",
title: "Migrating without closing for a week",
description: "The export, mapping, and dry-run sequence in full.",
meta: "14 pages · PDF",
href: "/downloads/migration-guide.pdf",
},
{
kicker: "Checklist",
title: "What to have ready before day one",
description: "Rooms, rotas, insurers, and access levels, in order.",
meta: "One page",
href: "/downloads/checklist.pdf",
},
]}
button={{ label: "Or just book a demo", href: "/demo" }}
finePrint="Everything above downloads directly."
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the heading, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
resources | Resource[] | [] | Linked hairline rows, one per download |
button | { label: string; href: string } | – | Fallback action under the rows |
finePrint | string | – | Small line under the action |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Resource = {
kicker: string;
title: string;
description: string;
meta: string;
href: string;
};Link, not a card with a link inside it, so the entire row is one target. Everything inside is a span rather than a block element, which is what keeps that markup valid.group/cta87, rather than the bare group class, so nesting this block inside another grouped component will not trigger both animations at once.motion-safe:, so it is skipped for anyone who has asked their system to reduce motion.flex-col on mobile and md:flex-row md:items-center, so the kicker, title and format note stack vertically on small screens and line up as columns from md.border-t with last:border-b, closing the list at the bottom.items-start, so Button21 keeps its intrinsic width and the fine print sits under it at the same left edge.meta is free text and holds whatever the format note should be, for example a page count and file type. Nothing is parsed or validated.cta86
A closing call to action splitting a bordered container between a hairline contact table and an inverted dark column that floats a live card naming the person you will meet above the booking action.
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.
cta18
Full-width call-to-action with background image overlay, heading, and action buttons. Perfect for bold, visually striking conversion sections.
cta90
A closing call to action on a soft section that sets an image tile floating a live coverage card against three labelled columns of places, with the action under a hairline.