Linked Programme Cards

About this block

Linked Programme CardsPRO

Four cards on a muted fill, each one a whole link that inverts to ink on hover: a photograph drifting across the top, a serif name facing its arrow, the shape it takes, a paragraph and a detail line at the foot.

Showcase52: Linked Programme Cards

Four cards on a muted fill, each a whole link that inverts to ink on hover, with a photograph across the top.

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

Base UI flavor

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

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

Quick start

The installed file exports showcase52Demo alongside the block: the exact props behind the preview above. Spread it to get a working linked Programme Cards in one line.

tsx
import { Showcase52, showcase52Demo } from "@/components/beste/block/showcase52";

export default function Page() {
  return <Showcase52 {...showcase52Demo} />;
}

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

tsx
import { Showcase52 } from "@/components/beste/block/showcase52";

export default function Page() {
  return (
    <Showcase52
      eyebrow="Programmes"
      heading="Four shapes the work can take."
      button={ label: "Compare them properly", href: "/programmes", tone: "outline" }
      programmes={[
        {
          name: "A season",
          shape: "Twelve weekly hours",
          description: "Long enough to get past the first version of the story.",
          detail: "690 for the season",
          href: "/programmes/season",
          image: { src: "/programmes/season.jpg", alt: "A row of chairs against a bright wall" },
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small-caps line above the heading
headingstring–Section heading, rendered as an h2 through Text1
buttonActionButton–Pill action beside the heading
programmesProgramme[][]Linked cards, two across from sm
classNamestring–Extra classes for the outer <section>
ts
type Programme = {
  name: string;
  shape: string;
  description: string;
  detail?: string;
  href: string;
  image: Image;
};

type Image = { src: string; alt: string };

type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • The card inverts from bg-muted to bg-foreground text-background on hover; the shape line and description follow through their own colour transitions so the whole card changes at once.
  • The arrow sits on the title's baseline rather than at the foot, so a long name and its destination stay on the same line.
  • detail is pushed to the foot by mt-auto, which lines up the prices across cards of different copy length.
  • The photograph is inside the card's rounded clip, so the inversion on hover reaches the image edge without a seam.
  • Each card owns its own scroll listener and drifts -8% to 8% against a 1.18 scale.
  • Photos clear from blur(24px) on decode, with a complete check for cached files.

More Showcase blocks

View all Showcase
PRO

showcase53

Linked Alternating Slabs

PRO

showcase50

Downloadable Resource Cards

PRO

showcase38

Sticky Showcase

Get Pro access