# Changelog Release Milestones

> 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.

A shadcn/ui block from the [@01orbital](https://01orbital.dev/?utm_source=shadcn.exchange) registry, listed on [shadcn.exchange](https://shadcn.exchange/r/01orbital/release-milestones-01).

- Page, with a live preview: https://shadcn.exchange/r/01orbital/release-milestones-01
- Screenshot: https://shadcn.exchange/shot/01orbital/release-milestones-01/light.png
- Registry item: https://01orbital.dev/r/release-milestones-01.json
- Categories: milestones
- Listed: 2026-11-01, source last changed 2026-11-01

## Install

```bash
npx shadcn@latest add https://shadcn.exchange/r/01orbital/release-milestones-01.json
```

Run it in a project that has shadcn/ui set up. It adds the files below and installs what they depend on.

## Dependencies

- Registry items: `@01orbital/eyebrow`, `@01orbital/heading`, `@01orbital/milestones`, `@01orbital/section`

## Files

### `blocks/milestones/release-milestones-01/index.tsx`

```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>
  )
}
```
