Changelog layout with an eyebrow, heading and description beside rows of releases. Each row shows a version label and date, then a title and a note.
import { Eyebrow } from "@/components/editorial/eyebrow"
import { Heading } from "@/components/editorial/heading"
import {
Milestone,
MilestoneContent,
MilestoneDate,
MilestoneDescription,
MilestoneLabel,
MilestoneMeta,
Milestones,
MilestoneTitle,
} from "@/components/editorial/milestones"
import {
Section,
SectionColumns,
SectionContent,
SectionDescription,
SectionHeader,
SectionTitleGroup,
} from "@/components/editorial/section"
// The copy: change text here, not in the markup.
const COPY = {
eyebrow: "Changelog",
title: "What changed",
body: "Every release, newest first. Breaking changes carry a note on how to move.",
} as const
const ENTRIES = [
{
version: "v2.4",
datetime: "2026-10-02",
date: "Oct 2, 2026",
name: "Section owns its column",
description:
"Section, SectionContent and SectionHeader carry their own widths. Container is gone.",
},
{
version: "v2.3",
datetime: "2026-09-18",
date: "Sep 18, 2026",
name: "Base UI primitives",
description:
"Every interactive part moved from Radix to Base UI. Imports change; markup does not.",
},
{
version: "v2.2",
datetime: "2026-09-04",
date: "Sep 4, 2026",
name: "Phosphor icons",
description:
"One icon set across the kit. Icons inside buttons take data-icon and size themselves.",
},
{
version: "v2.1",
datetime: "2026-08-21",
date: "Aug 21, 2026",
name: "Dark by token",
description:
"Anything always dark puts dark on its root and lets the tokens resolve.",
},
] as const
export default function ReleaseMilestones01() {
return (
<Section aria-labelledby="changelog-title">
<SectionContent>
<SectionColumns>
<SectionHeader size="sm">
<SectionTitleGroup>
<Eyebrow>{COPY.eyebrow}</Eyebrow>
<Heading id="changelog-title">{COPY.title}</Heading>
</SectionTitleGroup>
<SectionDescription>{COPY.body}</SectionDescription>
</SectionHeader>
<Milestones variant="rows" rule="top">
{ENTRIES.map((entry) => (
<Milestone key={entry.version}>
<MilestoneMeta>
<MilestoneLabel>{entry.version}</MilestoneLabel>
<MilestoneDate dateTime={entry.datetime}>
{entry.date}
</MilestoneDate>
</MilestoneMeta>
<MilestoneContent>
<MilestoneTitle>{entry.name}</MilestoneTitle>
<MilestoneDescription>
{entry.description}
</MilestoneDescription>
</MilestoneContent>
</Milestone>
))}
</Milestones>
</SectionColumns>
</SectionContent>
</Section>
)
}
pnpm dlx shadcn add @01orbital/release-milestones-01npx shadcn add @01orbital/release-milestones-01yarn shadcn add @01orbital/release-milestones-01bunx --bun shadcn add @01orbital/release-milestones-01Free under the MIT license. Add the @01orbital registry to components.json once (install guide), then run the command.
It lands at components/blocks/milestones/release-milestones-01/index.tsx, as source you own and edit.
import ReleaseMilestones01 from "@/components/blocks/milestones/release-milestones-01"
export default function Example() {
return <ReleaseMilestones01 />
}Registry pieces it installs with it:
Compare
Every Milestones block side by side: whether it follows the theme or stays dark, the stock parts it is built on, and whether it is free. Open one for its preview, props and install.
Company History Milestones
Company history in three columns under a top rule, one per year, each with a date, title and paragraph. No markers; a header and description sit above.