
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.
blocks/milestones/release-milestones-01/index.tsx
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>
)
}