Staaarter

Split Milestone Changelog

Two-column release entries: one side gives milestone context (version, date, and a short blurb on why the release matters), the other lists highlights alongside a small metrics row and optional action buttons.

By Staaarter Team
Changelog
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its button, badge dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/split-milestone-changelog.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/changelog/changelog2.tsx instead.

Usage

The file also exports changelog2Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Changelog2, changelog2Demo } from "@/components/blocks/changelog/changelog2";

export default function Page() {
  return <Changelog2 {...changelog2Demo} />;
}

Props

PropTypeDefaultDescription
headingstring"Release milestones"Section heading.
descriptionstringnoneSection intro text.
releasesSplitRelease[]noneRelease entries, rendered newest first in array order.
classNamestringnoneExtra classes for the outer section element.

Types

type MetricItem = { value: string; label: string };

type ButtonItem = {
  label: string;
  href?: string;
  variant?: "default" | "secondary" | "outline" | "ghost" | "link" | "destructive";
};

type SplitRelease = {
  version: string;
  date: string;
  latest?: boolean;
  blurb: string;
  highlights: string[];
  metrics?: MetricItem[];
  buttons?: ButtonItem[];
};

Behavior notes

  • date is a plain display string supplied by the caller, never computed at render time, so server and client (and the static thumbnail) always agree.
  • The "Latest" badge only renders when a release explicitly sets latest: true; nothing infers it from array position or date.
  • metrics and buttons are both optional and independent: a release can show highlights with no metrics row, no buttons, or neither, without leaving gaps.
  • Every button is decorative: it renders through Button's render={<Link/>} prop when an href is supplied (or a plain, non-interactive button when it isn't) and never wires up a click handler, since there is no real release-notes backend behind this demo.