Two Path Closing CTA

(Two doors)

Hire the studio, or come and work in it.

Bring us a project

Commissions open twice a year. Send the brief in whatever shape it exists, even if that shape is a voice note.

  • Reply within two working days
  • First call is ninety minutes, unpaid
  • Written estimate before anything starts

Join the studio

We hire slowly and rarely, but we read everything. Show us the project you learned the most from, finished or not.

  • Two roles open this year
  • Portfolio matters more than the CV
  • Four-day week, no on-call design

Both routes land in the same inbox, read every morning before anything else gets opened.

About this block

Two Path Closing CTAPRO

Closing section that offers two routes side by side, each a ruled column with a title, a short pitch, a dotted-rule list of what to expect and its own pill CTA, one solid and one outline.

Cta80: Two Path Closing CTA

Closing section for pages that have two audiences, usually clients and candidates. Each route is a ruled column with its own title, pitch, dotted-rule expectations list and pill CTA, one solid and one outline so the primary path still reads first.

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/cta80?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

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

Quick start

The installed file exports cta80Demo alongside the block: the exact props behind the preview above. Spread it to get a working two-path CTA in one line.

tsx
import { Cta80, cta80Demo } from "@/components/beste/block/cta80";

export default function Page() {
  return <Cta80 {...cta80Demo} />;
}

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

tsx
import { Cta80 } from "@/components/beste/block/cta80";

export default function Page() {
  return (
    <Cta80
      badge={{ label: "Two doors" }}
      heading="Hire the studio, or come and work in it."
      paths={[
        {
          title: "Bring us a project",
          description: "Send the brief in whatever shape it exists.",
          points: ["Reply within two working days", "Written estimate before anything starts"],
          buttonLabel: "Send a brief",
          href: "/contact",
          tone: "dark",
        },
        {
          title: "Join the studio",
          description: "We hire slowly and rarely, but we read everything.",
          points: ["Two roles open this year", "Four-day week"],
          buttonLabel: "See open roles",
          href: "/careers",
          tone: "outline",
        },
      ]}
      labels={{ note: "Both routes land in the same inbox." }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7
headingstringCentered heading above the two columns
pathsCtaPath[][]One ruled column per route
labelsCta80Labels{}Fixed strings that are not content: the centered closing note
classNamestringExtra classes for the outer <section>
ts
type CtaPath = {
  title: string;
  description: string;
  points: string[];
  buttonLabel: string;
  href: string;
  tone?: "dark" | "outline";
};

type Cta80Labels = {
  note?: string;
};

Behavior notes

  • tone is per path and defaults to "dark", so a two-path block with no tones set renders both pills solid; pass "outline" on the secondary route to keep one clear primary action.
  • Expectation points sit on border-t border-dotted rules, a lighter tier than the solid rule opening each column, so the list reads as supporting detail rather than a second table.
  • The header is centered while the columns are left-aligned, which keeps the shared question central and the two answers visually parallel.
  • The block takes exactly as many paths as you pass, but the grid is md:grid-cols-2: a third path wraps to a second row rather than shrinking the columns.
  • The closing note is centered under both columns on its own rule, since it applies to both routes rather than to either one.

More CTA blocks

View all CTA
PRO

cta83

Two-Path Closing Cards

A closing call to action offering two routes as side-by-side cards, each with an icon tile, a short kicker, a checked list on hairlines, and its own action, with the recommended route outlined in the accent.

PRO

cta99

Two Paths CTA

A call to action that offers two doors: under a serif heading that settles in word by word, two soft muted cards each with a serif title, a description and a sliding-marker pill, the first topped by a photograph that drifts inside its frame as the page scrolls.

PRO

cta74

Centered Closing CTA

A centered call to action with an eyebrow pill, a large light heading, a short paragraph, and two accent buttons on a clean surface.

FREE

cta78

Studio Booking Split CTA

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.

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

cta73

Closing CTA Panel

A closing call to action on a soft panel, pairing an eyebrow, light heading, paragraph, and two accent buttons with an image tile that floats a live agenda micro-asset.