Staaarter

Zigzag CTA

Narrative-driven conversion section: three image-and-text rows alternate which side the photo sits on as they go down the page, progressively building the value case before ending in a single centered, bordered call-to-action box with a heading and button.

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, media-slot dependencies and any missing npm packages, and installs them straight into your project.

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

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

Usage

The file also exports cta41Demo, 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 { Cta41, cta41Demo } from "@/components/blocks/cta/cta41";

export default function Page() {
  return <Cta41 {...cta41Demo} />;
}

Props

PropTypeDefaultDescription
rowsZigzagRow[]noneThe alternating image-and-text rows, in order.
headingstringnoneHeading in the final call-to-action box.
descriptionstringnoneSupporting text in the final call-to-action box.
buttonLabelstring"Get started free"Label for the closing button.
buttonHrefstring"/signup"Link for the closing button.
classNamestringnoneExtra classes for the outer section element.

Types

interface ZigzagRow {
  eyebrow: string;
  title: string;
  description: string;
  image: MediaSlotImage;
}

Behavior notes

  • Fully static: each row alternates `lg:flex-row`/`lg:flex-row-reverse` by index and stacks to a single column on mobile; MediaSlot sits inside an aspect-ratio wrapper per this repo's Safari height-collapse convention.
  • The closing button is a real link to a placeholder route; nothing else in the block is interactive.