Linked Card Grid

About this block

Linked Card GridPRO

Six hairline cards in a three-column grid, each one a whole link carrying a ringed icon, a serif title, a line of context and an arrow that lifts on hover, under a serif heading that settles in word by word beside a sliding-marker pill.

Feature300: Linked Card Grid

Six hairline cards in a three-column grid, each one a whole link: a ringed icon, a serif title, a line of context and an arrow that lifts 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/feature300?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

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

Quick start

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

tsx
import { Feature300, feature300Demo } from "@/components/beste/block/feature300";

export default function Page() {
  return <Feature300 {...feature300Demo} />;
}

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

tsx
import { Feature300 } from "@/components/beste/block/feature300";

export default function Page() {
  return (
    <Feature300
      eyebrow="What we work on"
      heading="Six reasons people book a first hour."
      description="Each one has its own page."
      button={ label: "Ask about something else", href: "/contact", tone: "outline" }
      cards={[
        {
          icon: "compass",
          title: "Losing the thread",
          description: "Work that used to matter, and the quiet after it stops.",
          href: "/work",
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small-caps line above the heading
headingstring–Section heading, rendered as an h2 through Text1
descriptionstring–Intro paragraph under the heading
buttonActionButton–Pill action beside the heading
cardsCard[][]Linked cards, three across from lg
classNamestring–Extra classes for the outer <section>
ts
type CardIcon = "compass" | "users" | "moon" | "leaf" | "message" | "calendar";

type Card = {
  icon: CardIcon;
  title: string;
  description: string;
  href: string;
};

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

Behavior notes

  • The whole card is one Link, so the icon, the title and the arrow are a single hit target rather than three destinations.
  • icon is a key into a fixed map of six Lucide icons, and an unknown key falls back to Compass instead of rendering nothing.
  • The card border and the ring around the icon darken together on hover, so the affordance reads as one object moving.
  • Entry delay is index % 3, so each row of three arrives as a row instead of the stagger growing down a long grid.
  • The arrow lifts only under motion-safe:, so the hover flourish is dropped for reduced motion while the card stays clickable.
  • Cards stretch to the tallest in their row through h-full, and the arrow is pushed to the foot by the margin above it.

More Feature blocks

View all Feature
PRO

feature307

Linked Figure Cards

PRO

feature309

Linked Step Cards

PRO

feature311

Linked Photo Cards

Get Pro access