Four disciplines, photographed at the point where each one stops being a file and starts being an object.
Commissioned type and the licensing that keeps it usable.
Four typefaces drawn since 2019
Structure, artwork and the die lines a producer will accept.
Eleven ranges in production
Systems for buildings, drawn to survive a change of tenant.
Nine buildings, fourteen hundred signs
Pages and components your own team can extend without us.
Six systems handed over
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.
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.
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
npx shadcn add "https://ui.beste.co/r/feature249?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
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.
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.
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:
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" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the left header column |
description | string | – | Supporting paragraph in the right header column |
cards | FeatureCard[] | [] | Discipline cards, rendered in order |
button | ActionButton | – | Pill CTA under the row, rendered as Button12 |
className | string | – | Extra classes for the outer <section> |
type FeatureCard = {
src: string;
alt: string;
title: string;
description: string;
meta: string;
};
type ActionButton = {
label: string;
href: string;
};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.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.overflow-hidden rounded-md, so the picture inherits the card's top corners without a second radius.aspect-[4/3] at every width and carry no hover treatment, which is deliberate: the pictures are content here, not affordances.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.md:items-end, so the supporting paragraph sits on the heading's baseline rather than beside its first line.flex wrapper under the row, which keeps the pill at its natural width and left-aligned with the grid.feature311
Three bordered cards, each one a whole link with a photograph drifting across its top, a quiet category line, a serif title, an excerpt and an arrow pinned to the foot of the card.
feature251
Three soft cards, each floating its own media piece over a dotted field before an eyebrow, a title, an explanation and a ruled delivery note, laid out as a plain grid with no horizontal scrolling.
feature195
Four equal feature cards on a clean background, each with a large circular icon badge above a bold h3 title. Ideal for outlining the steps or pillars of a service offering.
feature307
Four hairline cards, each a whole link that leads with a large serif figure and an optional unit, then a title, a line of context and an arrow that lifts on hover.