Join thousands of teams already using our platform to ship faster.
Horizontal banner call-to-action with heading and action buttons side by side. Perfect for inline conversion sections between content blocks.
Horizontal banner CTA meant to sit inline between content blocks: a bordered, muted card holding a badge, heading, and description on one side and a cluster of buttons on the other, stacking vertically on mobile.
Free block
This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.
Radix flavor
npx shadcn add "https://ui.beste.co/r/cta11"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/cta11"This installs the block to components/beste/block/cta11.tsx and the Badge and Button shadcn/ui primitives it uses.
The installed file exports cta11Demo alongside the block: the exact props behind the preview above. Spread it to get a working banner in one line.
import { Cta11, cta11Demo } from "@/components/beste/block/cta11";
export default function Page() {
return <Cta11 {...cta11Demo} />;
}Then replace the demo with your own props. Written out, the same setup looks like this:
import { ArrowRight } from "lucide-react";
import { Cta11 } from "@/components/beste/block/cta11";
export default function Page() {
return (
<Cta11
badge={{ label: "New" }}
heading="Ship your first workflow today"
description="Set up automation in minutes, no code required."
buttons={[
{ label: "Get Started", href: "/signup", icon: <ArrowRight className="size-4" /> },
{ label: "Talk to Sales", href: "/contact", variant: "outline" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string; variant?: "default" | "secondary" | "outline" } | – | Optional pill badge above the heading |
heading | string | – | Headline HTML; wrap a phrase in <strong> to color-highlight it |
description | string | – | Supporting text under the heading |
buttons | ButtonItem[] | [] | CTA buttons rendered on the trailing side of the banner |
className | string | – | Extra classes for the outer <section> |
type ButtonItem = {
label: string;
href?: string;
variant?: "default" | "secondary" | "outline" | "ghost" | "link" | "destructive";
icon?: React.ReactNode;
};rounded-md border bg-muted p-6 md:p-10), not a bare full-bleed section; content and buttons sit in a flex-col on mobile and switch to a flex-row with items-center from md up.ButtonItem.icon renders after the label inside the link ({button.label}{button.icon}), the opposite order from CTA blocks that lead with the icon.variant="default" when omitted from the item (not "secondary", unlike cta8), and sits with mb-3 above the heading.shrink-0, so it keeps its intrinsic width even as the content column grows.