Timeline where every ruled row lines up a year, a photograph from that moment and the explanation of what forced the change, headed by a pill CTA on the heading line and stacking to a readable block on mobile.
A timeline set as a ruled ledger: year, photograph and story on one row, repeated down the page. The CTA sits in the header beside the heading, so the sequence ends on the last entry.
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/feature254?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature254?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature254.tsx plus the badge7 eyebrow and button12 pill button it uses.
The installed file exports feature254Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Feature254, feature254Demo } from "@/components/beste/block/feature254";
export default function Page() {
return <Feature254 {...feature254Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature254 } from "@/components/beste/block/feature254";
export default function Page() {
return (
<Feature254
badge={{ label: "How it grew" }}
heading="The same system, photographed every two years."
description="A brand is not finished when it launches."
entries={[
{
year: "2018",
title: "One shop, one sign",
description: "The first identity fitted on a single fascia and a paper bag.",
src: "/history/2018.jpg",
alt: "Coffee bag against a plain wall",
},
{
year: "2020",
title: "Packaging that had to travel",
description: "Wholesale meant the bag had to work on someone else's shelf.",
src: "/history/2020.jpg",
alt: "Coffee packaging on concrete",
},
]}
button={{ label: "See where it goes next", href: "/studio" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow label rendered as a Badge7 |
heading | string | – | Section heading in the header row |
description | string | – | Supporting paragraph under the header |
entries | TimelineEntry[] | [] | Ledger rows, rendered top to bottom |
button | ActionButton | – | Pill Button12 in the header, opposite the heading |
className | string | – | Extra classes for the outer <section> |
type TimelineEntry = {
year: string;
title: string;
description: string;
src: string;
alt: string;
};
type ActionButton = {
label: string;
href: string;
};md:grid-cols-[minmax(0,8rem)_minmax(0,20rem)_1fr], so the year column stays narrow, the photograph keeps a fixed maximum width and the story takes whatever is left. The ledger reads as columns, not as three equal thirds.tabular-nums, which keeps every date the same width and the column optically straight.border-t py-8, so the sequence is ruled rather than boxed, and adding an entry never changes the rhythm.md:items-start, so a short story sits level with the top of its photograph instead of floating in the middle of a tall row.md the three parts stack in source order (year, picture, story), which is the reading order the ledger implies.aspect-[4/3] at every width and carry no hover treatment, keeping the ledger a record rather than a gallery of links.feature246
Capability section with a row of pill filters that swap the list below: each entry becomes a ruled three-column row holding the title, an explanation and the typical duration pinned right.
feature263
A feature that walks through one working day as hairline rows stamped with the time of day, with a live approval asset dropped inline on the entry that needs showing rather than telling.
feature267
A feature that runs a hairline down the middle of the section and alternates its stages either side of it, dropping an image tile with a live phone frame onto the step worth showing.
feature219
Eyebrow and heading with a CTA on one row, above stacked service cards that each line up an index and growth stat, a thumbnail image, and a title with description and tag chips.