Resource Rows CTA

About this block

Resource Rows CTAPRO

A closing call to action that offers three downloadable resources as full-width hairline rows, each a link with a short kicker, a format note, and an arrow that shifts on hover.

Cta87: Resource Rows CTA

A closing call to action that offers three downloadable resources as full-width hairline rows, each a link with a short kicker, a format note and an arrow that shifts on hover.

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

Base UI flavor

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

This installs the block to components/beste/block/cta87.tsx plus the badge23 and button21 components it uses for the eyebrow and the action.

Quick start

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

tsx
import { Cta87, cta87Demo } from "@/components/beste/block/cta87";

export default function Page() {
  return <Cta87 {...cta87Demo} />;
}

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

tsx
import { Cta87 } from "@/components/beste/block/cta87";

export default function Page() {
  return (
    <Cta87
      badge={{ label: "Before you decide" }}
      heading="Take the homework with you"
      description="Three things practices asked us for often enough that we wrote them down properly."
      resources={[
        {
          kicker: "Guide",
          title: "Migrating without closing for a week",
          description: "The export, mapping, and dry-run sequence in full.",
          meta: "14 pages · PDF",
          href: "/downloads/migration-guide.pdf",
        },
        {
          kicker: "Checklist",
          title: "What to have ready before day one",
          description: "Rooms, rotas, insurers, and access levels, in order.",
          meta: "One page",
          href: "/downloads/checklist.pdf",
        },
      ]}
      button={{ label: "Or just book a demo", href: "/demo" }}
      finePrint="Everything above downloads directly."
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the heading, rendered through Badge23
headingstringSection heading in the left column of the header
descriptionstringSupporting paragraph, right-aligned from md up
resourcesResource[][]Linked hairline rows, one per download
button{ label: string; href: string }Fallback action under the rows
finePrintstringSmall line under the action
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type Resource = {
  kicker: string;
  title: string;
  description: string;
  meta: string;
  href: string;
};

Behavior notes

  • Each row is a whole Link, not a card with a link inside it, so the entire row is one target. Everything inside is a span rather than a block element, which is what keeps that markup valid.
  • The hover arrow uses a named group, group/cta87, rather than the bare group class, so nesting this block inside another grouped component will not trigger both animations at once.
  • The arrow shift is wrapped in motion-safe:, so it is skipped for anyone who has asked their system to reduce motion.
  • Rows are flex-col on mobile and md:flex-row md:items-center, so the kicker, title and format note stack vertically on small screens and line up as columns from md.
  • Rows use border-t with last:border-b, closing the list at the bottom.
  • The closing group is items-start, so Button21 keeps its intrinsic width and the fine print sits under it at the same left edge.
  • meta is free text and holds whatever the format note should be, for example a page count and file type. Nothing is parsed or validated.

More CTA blocks

View all CTA
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

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

cta18

Fullwidth Image CTA

Full-width call-to-action with background image overlay, heading, and action buttons. Perfect for bold, visually striking conversion sections.

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.

PRO

cta90

Multi-Site Coverage CTA

A closing call to action on a soft section that sets an image tile floating a live coverage card against three labelled columns of places, with the action under a hairline.