{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "changelog28",
  "title": "Full Release Notes By Month",
  "description": "A complete changelog grouped by month, each version on a hairline row beside its entries, every line tagged added, changed, fixed, or removed with its own tone.",
  "dependencies": [
    "clsx",
    "tailwind-merge",
    "lucide-react"
  ],
  "registryDependencies": [],
  "files": [
    {
      "path": "registry/changelog28/changelog28.tsx",
      "content": "\"use client\";\n\nimport { Badge23 } from \"@/components/beste/component/badge23\";\nimport { cn } from \"@/lib/utils\";\nimport Link from \"next/link\";\n\ntype Kind = \"added\" | \"changed\" | \"fixed\" | \"removed\";\n\ninterface Badge {\n  label: string;\n}\n\ninterface Entry {\n  kind: Kind;\n  text: string;\n}\n\ninterface Release {\n  version: string;\n  date: string;\n  entries: Entry[];\n  href: string;\n}\n\ninterface Month {\n  label: string;\n  releases: Release[];\n}\n\ninterface Changelog28Props {\n  badge?: Badge;\n  heading?: string;\n  description?: string;\n  kindLabels?: Record<Kind, string>;\n  months?: Month[];\n  footnote?: string;\n  className?: string;\n}\n\nconst kindStyles: Record<Kind, string> = {\n  added: \"bg-primary/10 text-primary\",\n  changed: \"bg-amber-500/10 text-amber-600\",\n  fixed: \"bg-emerald-500/10 text-emerald-600\",\n  removed: \"bg-muted text-muted-foreground\",\n};\n\nexport const changelog28Demo: Changelog28Props = {\n  badge: { label: \"Release notes\" },\n  heading: \"Everything that changed, line by line\",\n  description:\n    \"The full log rather than the highlights. Removals are in here too, which is usually the part that matters most.\",\n  kindLabels: { added: \"Added\", changed: \"Changed\", fixed: \"Fixed\", removed: \"Removed\" },\n  months: [\n    {\n      label: \"May 2026\",\n      releases: [\n        {\n          version: \"3.4.0\",\n          date: \"14 May\",\n          href: \"https://beste.co\",\n          entries: [\n            { kind: \"added\", text: \"Shared waiting list and capacity across every site in a group\" },\n            { kind: \"added\", text: \"Member site preference, respected before distance\" },\n            { kind: \"changed\", text: \"Group reporting now rolls up without an export step\" },\n            { kind: \"removed\", text: \"Per-site waiting list settings, replaced by the group model\" },\n          ],\n        },\n        {\n          version: \"3.3.2\",\n          date: \"02 May\",\n          href: \"https://beste.co\",\n          entries: [\n            { kind: \"changed\", text: \"Invoice export moved to a background job with progress\" },\n            { kind: \"fixed\", text: \"Month-end export timing out for groups over eight sites\" },\n          ],\n        },\n      ],\n    },\n    {\n      label: \"April 2026\",\n      releases: [\n        {\n          version: \"3.3.0\",\n          date: \"11 April\",\n          href: \"https://beste.co\",\n          entries: [\n            { kind: \"added\", text: \"Insurer and self-pay settlement on a single ledger\" },\n            { kind: \"added\", text: \"Credit notes against a specific appointment\" },\n            { kind: \"changed\", text: \"Invoice references now include the site code\" },\n            { kind: \"fixed\", text: \"Partial insurer payments leaving a balance of a rounding error\" },\n          ],\n        },\n        {\n          version: \"3.2.6\",\n          date: \"24 April\",\n          href: \"https://beste.co\",\n          entries: [\n            { kind: \"fixed\", text: \"Booking pages slow in the UK region for 41 minutes\" },\n            { kind: \"changed\", text: \"Added a query budget to the booking path\" },\n          ],\n        },\n      ],\n    },\n  ],\n  footnote:\n    \"Nothing is ever quietly edited after publication. If a note turns out to be wrong we add a correction underneath it with the date.\",\n};\n\nexport function Changelog28({\n  badge,\n  heading,\n  description,\n  kindLabels,\n  months = [],\n  footnote,\n  className,\n}: Changelog28Props) {\n  return (\n    <section className={cn(\"bg-background py-16 md:py-24 w-full\", className)}>\n      <div className=\"mx-auto max-w-7xl px-4 md:px-6\">\n        {badge && <Badge23 label={badge.label} />}\n\n        <div className=\"mt-6 border-t border-border pt-8 md:pt-10\">\n          <div className=\"grid gap-6 md:grid-cols-2 md:gap-12\">\n            {heading && (\n              <h2 className=\"text-3xl font-light leading-[1.1] tracking-tight text-foreground md:text-5xl\">\n                {heading}\n              </h2>\n            )}\n            {description && (\n              <div className=\"flex md:justify-end\">\n                <p className=\"max-w-md text-base leading-relaxed text-muted-foreground\">\n                  {description}\n                </p>\n              </div>\n            )}\n          </div>\n        </div>\n\n        <div className=\"mt-12 md:mt-16\">\n          {months.map((month, monthIndex) => (\n            <div key={monthIndex} className=\"mb-10 last:mb-0\">\n              <h3 className=\"text-2xl font-light tracking-tight text-foreground\">{month.label}</h3>\n\n              <div className=\"mt-4\">\n                {month.releases.map((release, releaseIndex) => (\n                  <div\n                    key={releaseIndex}\n                    className=\"grid gap-4 border-t border-border py-6 md:grid-cols-[10rem_minmax(0,1fr)] md:gap-10\"\n                  >\n                    <div>\n                      <Link\n                        href={release.href}\n                        className=\"text-lg tabular-nums text-foreground transition-colors hover:text-primary\"\n                      >\n                        {release.version}\n                      </Link>\n                      <p className=\"mt-1 text-sm text-muted-foreground\">{release.date}</p>\n                    </div>\n\n                    <ul className=\"flex flex-col gap-3\">\n                      {release.entries.map((entry, entryIndex) => (\n                        <li key={entryIndex} className=\"flex flex-wrap items-baseline gap-3\">\n                          <span\n                            className={cn(\n                              \"shrink-0 rounded-full px-2.5 py-0.5 text-sm font-medium\",\n                              kindStyles[entry.kind]\n                            )}\n                          >\n                            {kindLabels?.[entry.kind] ?? entry.kind}\n                          </span>\n                          <span className=\"flex-1 text-base leading-relaxed text-foreground\">\n                            {entry.text}\n                          </span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n                ))}\n              </div>\n            </div>\n          ))}\n        </div>\n\n        {footnote && (\n          <p className=\"mt-8 max-w-2xl border-t border-border pt-6 text-base leading-relaxed text-muted-foreground\">\n            {footnote}\n          </p>\n        )}\n      </div>\n    </section>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/beste/block/changelog28.tsx"
    },
    {
      "path": "registry-components/badge23/badge23.tsx",
      "content": "\"use client\";\n\nimport { cn } from \"@/lib/utils\";\n\ntype Tone = \"muted\" | \"foreground\" | \"primary\";\n\ninterface Badge23Props {\n  /** Eyebrow label (rendered uppercase) */\n  label: string;\n  /** Text/border tone */\n  tone?: Tone;\n  /** Additional classes merged onto the root */\n  className?: string;\n}\n\nconst toneStyles: Record<Tone, string> = {\n  muted: \"border-border text-muted-foreground\",\n  foreground: \"border-foreground/30 text-foreground\",\n  primary: \"border-primary/40 text-primary\",\n};\n\nexport const badge23Demo: Badge23Props = {\n  label: \"Product\",\n};\n\nexport function Badge23({ label, tone = \"muted\", className }: Badge23Props) {\n  return (\n    <span\n      className={cn(\n        \"inline-flex items-center rounded-md border bg-transparent px-2.5 py-1 font-mono text-sm uppercase leading-none tracking-widest\",\n        toneStyles[tone],\n        className\n      )}\n    >\n      {label}\n    </span>\n  );\n}\n",
      "type": "registry:component",
      "target": "components/beste/component/badge23.tsx"
    }
  ],
  "type": "registry:block"
}