Staaarter

Dual CTA

Two equal side-by-side call-to-action cards offering different paths, such as developers vs. designers or free vs. paid, each with its own icon, heading, description, and button. Unlike a comparison layout, neither card is visually secondary. Perfect for segmenting audiences.

By Staaarter Team
CTA
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/dual-cta.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/cta/cta29.tsx instead.

Usage

The file also exports cta29Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Cta29, cta29Demo } from "@/components/blocks/cta/cta29";

export default function Page() {
  return <Cta29 {...cta29Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Built for how you work"Heading above the two cards.
descriptionstring"Two paths in, same great product on the other side."Short supporting copy under the heading.
options[CtaOption, CtaOption]noneExactly two equal-weight option cards, each with its own icon, copy, and button.
classNamestringnoneExtra classes for the outer section element.

Types

interface CtaOption {
  icon: LucideIcon;
  title: string;
  description: string;
  buttonLabel: string;
  buttonHref: string;
}

Behavior notes

  • Layout only: a centered heading above a 2-column grid (stacks to 1 column on mobile); both cards share identical styling (same border, padding, and button variant) so neither reads as primary or secondary.
  • Both buttons are inert links (`render={<Link/>}`) pointing at their own `buttonHref`, defaulting to `#`; there is no real audience-routing logic wired up.
  • Icons are passed as `LucideIcon` component references in the `options` prop since this is a server component; a client version could not accept a function prop this way.