Studio Booking Split CTA

Empty studio meeting room lit by a tall window
(Open commissions)

Bring the brief you keep rewriting.

One hour, one room, and the version of the problem you have not managed to write down yet. We will tell you plainly whether we are the right studio for it.

First reply
Within two days
Next opening
September

No deck, no paid discovery phase. If it is not a fit we say so and point you somewhere better.

About this block

Studio Booking Split CTAFREE

Closing call to action splitting a tall photo against an oversized heading, a short pitch, a pill CTA beside a plain email link, and a ruled two-column row stating reply time and next availability.

Cta78: Studio Booking Split CTA

Closing call to action that puts a tall photo against the pitch: a parenthetical eyebrow, an oversized heading, a short paragraph, a pill CTA beside a plain email link, then a ruled two-column row stating reply time and next availability so the ask carries its own terms.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/cta78"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/cta78"

This installs the block to components/beste/block/cta78.tsx plus the badge7 eyebrow and button12 pill button it uses.

Quick start

The installed file exports cta78Demo alongside the block: the exact props behind the preview above. Spread it to get a working closing section in one line.

tsx
import { Cta78, cta78Demo } from "@/components/beste/block/cta78";

export default function Page() {
  return <Cta78 {...cta78Demo} />;
}

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

tsx
import { Cta78 } from "@/components/beste/block/cta78";

export default function Page() {
  return (
    <Cta78
      badge={{ label: "Open commissions" }}
      heading="Bring the brief you keep rewriting."
      description="One hour, one room, and the version of the problem you have not written down yet."
      image={{ src: "/studio/meeting-room.jpg", alt: "Studio meeting room lit by a tall window" }}
      button={{ label: "Book a studio hour", href: "/contact" }}
      link={{ label: "Or send the brief by email", href: "mailto:studio@example.com" }}
      details={[
        { title: "First reply", value: "Within two days" },
        { title: "Next opening", value: "September" },
      ]}
      labels={{ note: "No deck, no paid discovery phase." }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7
headingstringPlain-text heading above the pitch
descriptionstringSupporting paragraph under the heading
image{ src: string; alt: string }Tall photo filling the left half
buttonActionButtonPrimary pill CTA, rendered as Button12
linkActionButtonSecondary underlined text link beside the pill
detailsDetailRow[][]Ruled key and value pairs under the actions
labelsCta78Labels{}Fixed strings that are not content: the closing note
classNamestringExtra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
};

type DetailRow = {
  title: string;
  value: string;
};

type Cta78Labels = {
  note?: string;
};

Behavior notes

  • heading renders as plain text, not an HTML string: there is no inline highlight markup to escape, and emphasis comes from the size jump to md:text-5xl lg:text-6xl on a tight leading-[0.95] instead of a recoloured phrase.
  • The image sits in a fixed aspect-[4/5] box (md:aspect-[3/4]) with object-cover, so a landscape or square source still fills the column without stretching, and the two halves stay balanced on md:items-center.
  • Photos in this set stay full colour and take no hover treatment: no zoom, no grayscale, no border change.
  • details render as ruled border-t pairs rather than a boxed grid, which is the set's pattern for facts and specs and keeps the row from reading as a second card.
  • Both actions are optional and share one flex-wrap row, so a pill on its own, a text link on its own, or both side by side all lay out correctly.
  • The block stacks to a single column below md with the photo on top, so the ask still lands above the fold on a phone.

More CTA blocks

View all CTA
PRO

cta9

Split Layout Newsletter CTA

Two-column call-to-action with decorative image on one side and feature list with action buttons on the other. Perfect for visually rich conversion sections.

PRO

cta86

Contact And Availability CTA

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.

PRO

cta75

Split CTA With Thread

A split call to action pairing an eyebrow, light heading, paragraph, and two accent buttons with an image tile that floats a live team message thread.

PRO

cta24

Split Text CTA

Asymmetric two-column layout with large heading on the left and description with buttons on the right. Perfect for editorial-style conversion sections.

PRO

cta84

Photo Band Story CTA

A closing call to action set on a photographic panel with a directional gradient, pairing an eyebrow badge, light heading, and two actions with a live customer quote card.

PRO

cta65

Newsletter CTA

Split card with a subscribe form beside an image.