Three columns keyed to how long the reader has rather than what they want, each opening with the time span, a promise for it, and the two or three pieces that fit inside it.
Three columns keyed to how long the reader has rather than what they want, each opening with the time span, a promise for it, and the two or three pieces that fit inside it.
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/feature270?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/feature270?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/feature270.tsx and the badge6 component it uses for the eyebrow (installed to components/beste/component/badge6.tsx).
The installed file exports feature270Demo alongside the block: the exact props behind the preview above. Spread it to get a working reading path in one line.
import { Feature270, feature270Demo } from "@/components/beste/block/feature270";
export default function StartHerePage() {
return <Feature270 {...feature270Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Feature270 } from "@/components/beste/block/feature270";
export default function StartHerePage() {
return (
<Feature270
eyebrow="Where to begin"
heading="Pick by the time you have, not the topic"
description="Most reading lists assume you have a free afternoon."
slots={[
{
duration: "Five minutes",
title: "One idea, argued once",
description: "Short pieces that stop as soon as the point is made.",
links: [
{ label: "Why we stopped sending ranges", href: "/essays/ranges" },
{ label: "Saying no in one paragraph", href: "/essays/no" },
],
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Badge6 label above the hairline rule |
heading | string | – | Section heading under the rule |
description | string | – | Supporting paragraph |
slots | TimeSlot[] | [] | One column per span of time |
className | string | – | Extra classes for the outer section |
type TimeSlot = {
duration: string;
title: string;
description: string;
links: ReadingLink[];
};
type ReadingLink = {
label: string;
href: string;
};duration is the accent line at the top of each column, which is what makes the section sort by time rather than by subject.md up, stacking in order below that.feature162
3-column grid of numbered steps with titles and descriptions. Ideal for onboarding flows, process overviews, and how-it-works sections.
feature274
One column per year on a hairline, each stating the year as a figure with its published count beside it, a sentence on what that year was about, and the pieces that defined it.
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.
feature230
Three tall portrait images in a row, each paired with a padded numeral, title, and description — a monochrome statement of guiding principles.