Image Topped Discipline Cards

(The four rooms)

Everything we make falls into one of these.

Four disciplines, photographed at the point where each one stops being a file and starts being an object.

Large printed letterforms laid out as a type specimen

Letterforms

Commissioned type and the licensing that keeps it usable.

Four typefaces drawn since 2019

Unbranded paper packaging in soft daylight

Packaging

Structure, artwork and the die lines a producer will accept.

Eleven ranges in production

Architectural wayfinding signage in a public building

Signage

Systems for buildings, drawn to survive a change of tenant.

Nine buildings, fourteen hundred signs

Studio monitor showing a website layout in progress

Screens

Pages and components your own team can extend without us.

Six systems handed over

About this block

Image Topped Discipline CardsPRO

Four soft cards each opening with a full-bleed photograph, then a display title, one explanatory sentence and a ruled tally line pinned to the bottom of the card.

Feature249: Image Topped Discipline Cards

Four soft cards, each opening with a photograph and closing on a ruled fact line, under a two-column header. The pill CTA sits under the row, so the whole section reads as one catalogue page.

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

Base UI flavor

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

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

Quick start

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

tsx
import { Feature249, feature249Demo } from "@/components/beste/block/feature249";

export default function Page() {
  return <Feature249 {...feature249Demo} />;
}

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

tsx
import { Feature249 } from "@/components/beste/block/feature249";

export default function Page() {
  return (
    <Feature249
      badge={{ label: "The four rooms" }}
      heading="Everything we make falls into one of these."
      description="Four disciplines, photographed where each stops being a file."
      cards={[
        {
          src: "/disciplines/type.jpg",
          alt: "Printed letterforms",
          title: "Letterforms",
          description: "Commissioned type and the licensing that keeps it usable.",
          meta: "Four typefaces drawn since 2019",
        },
        {
          src: "/disciplines/packaging.jpg",
          alt: "Unbranded paper packaging",
          title: "Packaging",
          description: "Structure, artwork and die lines a producer will accept.",
          meta: "Eleven ranges in production",
        },
      ]}
      button={{ label: "Commission one of these", href: "/contact" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }–Eyebrow label rendered as a Badge7
headingstring–Section heading in the left header column
descriptionstring–Supporting paragraph in the right header column
cardsFeatureCard[][]Discipline cards, rendered in order
buttonActionButton–Pill CTA under the row, rendered as Button12
classNamestring–Extra classes for the outer <section>
ts
type FeatureCard = {
  src: string;
  alt: string;
  title: string;
  description: string;
  meta: string;
};

type ActionButton = {
  label: string;
  href: string;
};

Behavior notes

  • Cards are flex flex-col with the meta line on mt-auto, so the ruled fact stays flush with the bottom of every card even when one description runs two lines longer than the rest.
  • That closing rule is border-current/10 rather than the default border token, which keeps it a shade of the card's own surface instead of a hard line across it.
  • The image sits inside the card's overflow-hidden rounded-md, so the picture inherits the card's top corners without a second radius.
  • Photographs hold aspect-[4/3] at every width and carry no hover treatment, which is deliberate: the pictures are content here, not affordances.
  • The grid steps from one column to sm:grid-cols-2 and then lg:grid-cols-4, so a four-card set stays a two-by-two block on a tablet instead of squeezing into four narrow columns.
  • The header is md:items-end, so the supporting paragraph sits on the heading's baseline rather than beside its first line.
  • The CTA is in a flex wrapper under the row, which keeps the pill at its natural width and left-aligned with the grid.

More Feature blocks

View all Feature
PRO

feature311

Linked Photo Cards

PRO

feature251

Deliverable Cards With Media

PRO

feature193

Asymmetric Tall + Compact Cards over Media

Get Pro access