Photo Button CTA

Next step

Sayhello.Thatisthewholefirststep.

A short call, a first session if you want one, and a rhythm only if it suits you.

About this block

Photo Button CTAPRO

A call to action with the text above the picture: a centred serif heading that settles in word by word and an intro, then a wide rounded photograph drifting under a light scrim and film grain with a single large sliding-marker pill at its centre.

Cta104: Photo Button CTA

A centred invitation over a wide photographic band, where the only thing inside the picture is the button: the image drifts under an ink wash and film grain while a pale pill sits dead centre.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/cta104?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/cta104?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/cta104.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

The installed file exports cta104Demo alongside the block: the exact props behind the preview above. Spread it to get a working call to action in one line.

tsx
import { Cta104, cta104Demo } from "@/components/beste/block/cta104";

export default function Page() {
  return <Cta104 {...cta104Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Cta104 } from "@/components/beste/block/cta104";

export default function Page() {
  return (
    <Cta104
      eyebrow="Next step"
      heading="Say hello. That is the whole first step."
      description="A short call, a first session if you want one, and a rhythm only if it suits you."
      button={{ label: "Say hello", href: "/contact", tone: "light" }}
      image={{ src: "/photos/wildflowers.jpg", alt: "A field of wildflowers under a soft sky" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small-caps line above the heading
headingstring–Section heading, rendered as an h2 through Text1
descriptionstring–Paragraph under the heading
buttonActionButton–Pill centred inside the band, defaulting to the light tone
image{ src: string; alt: string }–The band itself; without it the band and its button are both dropped
classNamestring–Extra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • The button lives inside the band, so image is what carries it: with no image there is no band, and the section ends after the copy. Give the block an image whenever you want the action.
  • The band switches aspect ratio rather than height, 16/9 on a phone becoming 21/9 from md, so the crop stays cinematic on a wide screen without going letterbox-thin on a small one.
  • The pill takes the light tone by default and is given extra padding, because it sits alone in the middle of a photograph and needs to read as the one thing to press.
  • The wash over the photograph is only foreground/40, lighter than the full-bleed bands in the family, since a single centred pill needs less contrast behind it than a paragraph of copy would.
  • The photograph drifts -14% to 14% against a 1.3 scale and clears from blur(24px) on decode, with a complete check on mount so a cached image is not left blurred.
  • The grain filter's id comes from useId, so two grain surfaces on one page cannot collide on a global SVG id.
  • Layers sit on explicit negative z-indices inside an isolate context, which keeps them behind the button but never behind the section around them.

More CTA blocks

View all CTA
PRO

cta95

Parallax Panel CTA

PRO

cta84

Photo Band Story CTA

PRO

cta96

Half Photo CTA

Get Pro access