Dark Contact Band

(Say it plainly)

Tell us the thing you would rather not put in a brief.

The budget that is smaller than it should be, the deadline someone else agreed to, the founder who keeps changing their mind. We would rather hear it now than discover it in week five.

Answered by a person, usually the one who would run your project.

About this block

Dark Contact BandPRO

Inverted closing panel on a solid dark surface: an oversized invitation on the left, a paragraph and outline pill CTA on the right, then a ruled row of linked email, phone and studio address.

Cta79: Dark Contact Band

Inverted closing panel on a solid dark surface: an oversized invitation on the left, a paragraph and an outline pill CTA on the right, then a ruled row of linked email, phone and studio address so the section works as the contact block too.

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

Base UI flavor

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

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

Quick start

The installed file exports cta79Demo alongside the block: the exact props behind the preview above. Spread it to get a working contact band in one line.

tsx
import { Cta79, cta79Demo } from "@/components/beste/block/cta79";

export default function Page() {
  return <Cta79 {...cta79Demo} />;
}

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

tsx
import { Cta79 } from "@/components/beste/block/cta79";

export default function Page() {
  return (
    <Cta79
      badge={{ label: "Say it plainly" }}
      heading="Tell us the thing you would rather not put in a brief."
      description="The budget that is smaller than it should be, the deadline someone else agreed to."
      button={{ label: "Write to the studio", href: "/contact" }}
      details={[
        { title: "Email", value: "studio@example.com", href: "mailto:studio@example.com" },
        { title: "Phone", value: "+31 10 555 0148", href: "tel:+31105550148" },
      ]}
      labels={{ note: "Answered by a person, usually the one who would run your project." }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow label rendered as a Badge7, tinted for the dark surface
headingstringOversized invitation on the left
descriptionstringSupporting paragraph above the CTA
buttonActionButtonOutline pill CTA, rendered as Button12
detailsContactDetail[][]Ruled row of linked contact facts
labelsCta79Labels{}Fixed strings that are not content: the closing note
classNamestringExtra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
};

type ContactDetail = {
  title: string;
  value: string;
  href: string;
};

type Cta79Labels = {
  note?: string;
};

Behavior notes

  • The panel is a fixed dark surface, so it keeps hardcoded text-background and text-background/70 tokens rather than adaptive ones: this block is meant to stay inverted in both light and dark themes.
  • Rules inside the panel use border-background/20 instead of the default border token, which is what keeps the hairlines visible against the dark fill without glowing.
  • Button12 is set to tone="outline", which on this surface renders a light pill with a dark seal, the highest-contrast option the component offers.
  • Contact values are real links, so mailto: and tel: hrefs work directly, and the underline is the only affordance since the panel has no room for a second button style.
  • The Badge7 eyebrow takes a className override to tint it for the dark surface, which is the supported way to recolour it rather than editing the component.
  • Details use dt/dd inside a dl, so label and value stay associated for assistive technology.

More CTA blocks

View all CTA
PRO

cta82

Inverted Closing Band

A full-width dark closing band with a light display heading, a paragraph, two actions, and three reassurances sitting under a hairline rule.

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

cta64

Statement CTA

Bold full-width call to action on a dark panel with dual buttons.

PRO

cta103

Ink Band CTA

A dark ink band with film grain and no photograph: an eyebrow and a wide serif heading that settles in word by word on the left, an intro, a light sliding-marker pill and an underlined text link on the right.

PRO

cta95

Parallax Panel CTA

A closing call to action on a rounded photographic panel: the photo drifts under the panel as the page scrolls, soft light and film grain sit over it, and a centred serif heading settles in word by word above the intro, a pill button, an email link and a star rating line.

PRO

cta72

Newsletter Letter Band

A monochrome newsletter CTA band pairing an oversized statement with an inline email-capture form and a reassurance note.