One practitioner, a borrowed chair and a waiting list that was mostly friends of friends.
Every session moved to video in a week. We learned that the quiet travels better than we feared.
Two colleagues joined, and the evening practice opened for people who only had the hour after work.
Walking sessions along the river, on foot. Some things are easier to say side by side than face to face.
Three practitioners, one address, and a decision not to grow faster than the listening can.
A history told down a single rule: a sticky column with a serif heading that settles in word by word, an intro and a pill action, beside a timeline whose ink line draws itself down as the page scrolls past serif years, titles and short descriptions.
A practice history told down a single rule: a sticky column holds the heading, intro and pill action while an ink line draws itself down the timeline beside it, past serif years, titles and short descriptions.
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/about76?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/about76?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/about76.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.
The installed file exports about76Demo alongside the block: the exact props behind the preview above. Spread it to get a working timeline in one line.
import { About76, about76Demo } from "@/components/beste/block/about76";
export default function Page() {
return <About76 {...about76Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { About76 } from "@/components/beste/block/about76";
export default function Page() {
return (
<About76
eyebrow="How we got here"
heading="Seven years, told slowly."
description="Nothing about the practice was planned. It grew the way the work does."
button={{ label: "Where we are going", href: "/next", tone: "outline" }}
milestones={[
{ year: "2019", title: "Two rooms above a bakery", description: "One practitioner, a borrowed chair and a waiting list of friends of friends." },
{ year: "2022", title: "A second and third chair", description: "Two colleagues joined, and the evening practice opened." },
{ year: "2026", title: "Still small on purpose", description: "Three practitioners, one address, and a decision not to grow faster than the listening can." },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small-caps line above the heading |
heading | string | – | Section heading, rendered as an h2 through Text1 |
description | string | – | Intro paragraph in the sticky column |
button | ActionButton | – | Pill action under the intro |
milestones | Milestone[] | [] | Timeline entries, rendered in the order given |
className | string | – | Extra classes for the outer <section> |
type Milestone = {
year: string;
title: string;
description: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};scaleY from a top origin, so it grows downward as a mask rather than being redrawn; the pale rule underneath stays visible as the track it fills.["start 75%", "end 55%"], which finishes the line while the last milestone is still on screen instead of only when the list has left the viewport.-20% viewport margin than the header, so an entry settles in once it is properly inside the reading area rather than the moment it clips the bottom edge.tabular-nums at text-foreground/40, so a column of four-digit years stays optically aligned and reads as a scale rather than as content competing with the titles.ol and the milestone titles are h3, so the chronology is a real ordered list for a screen reader; the dots and both rules are aria-hidden.md:sticky md:top-28, so the heading and action stay in view for the length of the timeline and collapse to normal flow below md, where a sticky column would cover the content.reduce, the line is drawn at full height from the start rather than animating, so the timeline never reads as unfinished.about62
About section with a header and a vertical timeline of milestones on a left rail, each marked by a year, title, and description.
about3
Two-column layout with company stats on the left and a vertical timeline of milestones on the right. Ideal for company history and growth stories.
about80
The classic about split: a serif heading that settles in word by word, two paragraphs, a sliding-marker pill and three ruled figures that count up on the left, and a portrait photograph drifting inside its frame on the right.