{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "changelog-release-notes-timeline",
  "title": "Changelog Release Notes Timeline",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/changelog-release-notes-timeline/ChangelogReleaseNotesTimeline.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport { Calendar, CheckCircle2, GitCommit, History, Layers, Wrench, Zap } from 'lucide-react'\nimport { Badge } from '@/components/ui/badge'\nimport { Card } from '@/components/ui/card'\nimport { cn } from '@/lib/utils'\n\ninterface ChangelogEntry {\n  version: string\n  date: string\n  title: string\n  description: string\n  commitHash: string\n  isLatest?: boolean\n  features: string[]\n  improvements: string[]\n  fixes: string[]\n}\n\nconst entries: ChangelogEntry[] = [\n  {\n    version: 'v2.4.0',\n    date: 'August 2026',\n    title: 'Marketing Blocks Expansion & Tailwind CSS v4 OKLCH Engine',\n    description:\n      'Massive expansion introducing 75+ unbundled marketing blocks with zero sub-12px microtext, dual-framework AST parity, and interactive functional workbenches.',\n    commitHash: '926c404',\n    isLatest: true,\n    features: [\n      'Interactive Hero Sandboxes with live framework and theme preview tabs.',\n      'Split Developer Workbenches for live AST code preview and schema compilation.',\n      'ROI & Usage Cost Calculators with reactive slider models and dynamic tier calculation.',\n      'Infinite CSS-driven Logo Tickers and Verified Engineer Endorsement Masonry.',\n    ],\n    improvements: [\n      'Strict adherence to Pioneer Craft standards (Linear, Raycast, Stripe typography scale).',\n      'Refactored token definitions into single canonical shared `@theme inline` stylesheet.',\n      'Optimized Astro SSG islands hydration for instant sub-20ms INP responsiveness.',\n    ],\n    fixes: [\n      'Resolved circular imports in CVA variant definitions by extracting dedicated variant files.',\n      'Fixed React JSX expression single curly braces syntax parity.',\n    ],\n  },\n  {\n    version: 'v2.3.0',\n    date: 'July 2026',\n    title: 'Dual-Framework Parity Engine & AST Synchronization',\n    description:\n      'Automated cross-framework parity check tool ensuring 100% token and CVA variant synchronization between Vue 3.5 and React 19.',\n    commitHash: 'a8b3f12',\n    features: [\n      'Cross-framework parity checking CLI (`npm run check:parity`).',\n      'Direct shadcn-vue and shadcn CLI HTTP unbundled distribution.',\n    ],\n    improvements: [\n      'Removed all monolithic npm package bindings in favor of pure unbundled distribution.',\n      'Enhanced Lucide icon alignment across polymorphic Reka UI primitives.',\n    ],\n    fixes: ['Fixed SSR hydration mismatch on theme color scheme initial render.'],\n  },\n  {\n    version: 'v2.2.0',\n    date: 'June 2026',\n    title: 'Ecosystem Reference Templates Launch',\n    description:\n      'Introduced reference architectures for Nuxt 3 HRMS, Hospital Clinical Intelligence, and Global Shipment Tracking.',\n    commitHash: 'e47c991',\n    features: [\n      'Shipment Tracking Template with live GPS telemetry cards.',\n      'HRMS Nuxt Template with interactive payroll matrices and attendance timecards.',\n    ],\n    improvements: ['Streamlined bootstrap items (`init`, `tailwind`, `utils`, `use-theme`).'],\n    fixes: ['Addressed upstream `shadcn-vue` resolver circular warning.'],\n  },\n]\n\nexport interface ChangelogReleaseNotesTimelineProps {\n  className?: string\n}\n\nexport function ChangelogReleaseNotesTimeline({ className }: ChangelogReleaseNotesTimelineProps) {\n  const [selectedVersion, setSelectedVersion] = React.useState<string>('all')\n\n  const filteredEntries = React.useMemo(() => {\n    if (selectedVersion === 'all') return entries\n    return entries.filter((e) => e.version === selectedVersion)\n  }, [selectedVersion])\n\n  return (\n    <section\n      data-slot=\"changelog-release-notes-timeline\"\n      className={cn('bg-background relative overflow-hidden px-4 py-16 sm:px-6 sm:py-24 lg:px-8', className)}\n    >\n      <div className=\"mx-auto max-w-4xl space-y-12\">\n        {/* Header */}\n        <div className=\"mx-auto max-w-2xl space-y-4 text-center\">\n          <Badge variant=\"secondary\" className=\"gap-1.5 px-3 py-1 font-mono text-xs shadow-xs\">\n            <History className=\"text-primary size-3.5\" />\n            Changelog &amp; Release History\n          </Badge>\n          <h2 className=\"text-foreground text-3xl font-bold tracking-tight sm:text-4xl\">Continuous craft updates.</h2>\n          <p className=\"text-muted-foreground text-base\">\n            Explore every version release, architectural improvement, and new block added to the registry.\n          </p>\n\n          {/* Version Filters */}\n          <div className=\"flex flex-wrap items-center justify-center gap-2 pt-2\">\n            <button\n              type=\"button\"\n              className={cn(\n                'rounded-lg border px-3 py-1 font-mono text-xs transition-colors',\n                selectedVersion === 'all'\n                  ? 'border-primary bg-primary text-primary-foreground font-semibold shadow-xs'\n                  : 'border-border bg-card text-muted-foreground hover:text-foreground',\n              )}\n              onClick={() => setSelectedVersion('all')}\n            >\n              All Releases\n            </button>\n            {entries.map((e) => (\n              <button\n                key={e.version}\n                type=\"button\"\n                className={cn(\n                  'rounded-lg border px-3 py-1 font-mono text-xs transition-colors',\n                  selectedVersion === e.version\n                    ? 'border-primary bg-primary text-primary-foreground font-semibold shadow-xs'\n                    : 'border-border bg-card text-muted-foreground hover:text-foreground',\n                )}\n                onClick={() => setSelectedVersion(e.version)}\n              >\n                {e.version}\n              </button>\n            ))}\n          </div>\n        </div>\n\n        {/* Timeline Feed */}\n        <div className=\"border-border/80 relative ml-2 space-y-12 border-l pl-6 text-left sm:ml-4 sm:pl-8\">\n          {filteredEntries.map((entry) => (\n            <div key={entry.version} className=\"group relative\">\n              {/* Timeline Node Circle */}\n              <div\n                className={cn(\n                  'bg-background absolute top-1.5 -left-[31px] flex size-4 items-center justify-center rounded-full border-2 transition-colors sm:-left-[39px]',\n                  entry.isLatest ? 'border-primary bg-primary/20' : 'border-muted-foreground/40',\n                )}\n              >\n                {entry.isLatest && <div className=\"bg-primary size-1.5 animate-pulse rounded-full\" />}\n              </div>\n\n              {/* Entry Card */}\n              <Card className=\"border-border bg-card/95 space-y-6 rounded-2xl p-6 shadow-xl sm:p-8\">\n                {/* Header Row: Version pill, Date, Commit Diff */}\n                <div className=\"border-border/60 flex flex-wrap items-center justify-between gap-4 border-b pb-4\">\n                  <div className=\"flex items-center gap-2.5\">\n                    <Badge\n                      variant={entry.isLatest ? 'default' : 'secondary'}\n                      className=\"px-2.5 py-0.5 font-mono text-xs\"\n                    >\n                      {entry.version}\n                    </Badge>\n                    {entry.isLatest && (\n                      <span className=\"text-success font-mono text-xs font-bold uppercase\">Latest Release</span>\n                    )}\n                  </div>\n\n                  <div className=\"text-muted-foreground flex items-center gap-4 font-mono text-xs\">\n                    <span className=\"flex items-center gap-1\">\n                      <Calendar className=\"size-3.5\" />\n                      {entry.date}\n                    </span>\n                    <span className=\"text-foreground/80 hover:text-foreground flex items-center gap-1\">\n                      <GitCommit className=\"text-primary size-3.5\" />\n                      <code>{entry.commitHash}</code>\n                    </span>\n                  </div>\n                </div>\n\n                {/* Title & Summary */}\n                <div className=\"space-y-2\">\n                  <h3 className=\"text-foreground font-mono text-xl font-bold tracking-tight\">{entry.title}</h3>\n                  <p className=\"text-muted-foreground text-xs leading-relaxed sm:text-sm\">{entry.description}</p>\n                </div>\n\n                {/* Category Section 1: Features */}\n                {entry.features.length > 0 && (\n                  <div className=\"space-y-2\">\n                    <h4 className=\"text-success flex items-center gap-1.5 font-mono text-xs font-bold\">\n                      <Layers className=\"size-3.5\" />\n                      New Capabilities &amp; Blocks\n                    </h4>\n                    <ul className=\"text-foreground/90 space-y-1.5 pl-1 font-mono text-xs\">\n                      {entry.features.map((f, fIdx) => (\n                        <li key={fIdx} className=\"flex items-start gap-2\">\n                          <CheckCircle2 className=\"text-success mt-0.5 size-3.5 shrink-0\" />\n                          <span>{f}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n                )}\n\n                {/* Category Section 2: Improvements */}\n                {entry.improvements.length > 0 && (\n                  <div className=\"space-y-2\">\n                    <h4 className=\"text-primary flex items-center gap-1.5 font-mono text-xs font-bold\">\n                      <Zap className=\"size-3.5\" />\n                      Craft &amp; Architecture Enhancements\n                    </h4>\n                    <ul className=\"text-foreground/90 space-y-1.5 pl-1 font-mono text-xs\">\n                      {entry.improvements.map((imp, iIdx) => (\n                        <li key={iIdx} className=\"flex items-start gap-2\">\n                          <span className=\"text-primary font-bold\">&bull;</span>\n                          <span>{imp}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n                )}\n\n                {/* Category Section 3: Fixes */}\n                {entry.fixes.length > 0 && (\n                  <div className=\"space-y-2\">\n                    <h4 className=\"text-warning flex items-center gap-1.5 font-mono text-xs font-bold\">\n                      <Wrench className=\"size-3.5\" />\n                      Fixes &amp; Parity Patches\n                    </h4>\n                    <ul className=\"text-muted-foreground space-y-1.5 pl-1 font-mono text-xs\">\n                      {entry.fixes.map((fix, fxIdx) => (\n                        <li key={fxIdx} className=\"flex items-start gap-2\">\n                          <span className=\"text-warning font-bold\">&bull;</span>\n                          <span>{fix}</span>\n                        </li>\n                      ))}\n                    </ul>\n                  </div>\n                )}\n              </Card>\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  )\n}\nexport default ChangelogReleaseNotesTimeline\n",
      "type": "registry:block",
      "target": "~/components/blocks/ChangelogReleaseNotesTimeline.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/card.json"
  ],
  "description": "Developer changelog timeline with interactive version filters, categorical changes (features, improvements, fixes), and commit hash links.",
  "categories": [
    "marketing"
  ]
}