{"$schema":"https://ui.shadcn.com/schema/registry-item.json","name":"marketing-changelogs-minimalist-changelog","type":"registry:block","title":"Minimalist Changelog","files":[{"path":"components/blocks/marketing/changelogs/minimalist-changelog.tsx","content":"import * as React from \"react\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { cn } from \"@/lib/utils\";\n\ninterface Release {\n  version: string;\n  date: string;\n  isLatest: boolean;\n  changes: string[];\n}\n\nexport default function MinimalistChangelog() {\n  const releases: Release[] = [\n    {\n      version: \"2.0.0\",\n      date: \"April 15, 2023\",\n      isLatest: true,\n      changes: [\n        \"Completely redesigned dashboard interface\",\n        \"Added dark mode support across all pages\",\n        \"Improved performance by 40%\",\n        \"Fixed multiple accessibility issues\",\n        \"API endpoints restructured for v2\",\n      ],\n    },\n    {\n      version: \"1.9.0\",\n      date: \"March 2, 2023\",\n      isLatest: false,\n      changes: [\n        \"Added new analytics dashboard\",\n        \"Enhanced mobile responsiveness\",\n        \"Fixed bug with user authentication\",\n      ],\n    },\n    {\n      version: \"1.8.0\",\n      date: \"February 10, 2023\",\n      isLatest: false,\n      changes: [\n        \"Added team collaboration features\",\n        \"Improved form validation\",\n        \"Updated documentation\",\n      ],\n    },\n    {\n      version: \"1.7.0\",\n      date: \"January 15, 2023\",\n      isLatest: false,\n      changes: [\n        \"Added support for custom themes\",\n        \"Enhanced search functionality\",\n        \"Fixed account settings issues\",\n      ],\n    },\n  ];\n\n  // Format date\n  const formatDate = (dateString: string) => {\n    const options: Intl.DateTimeFormatOptions = {\n      year: \"numeric\",\n      month: \"short\",\n      day: \"numeric\",\n    };\n    return new Date(dateString).toLocaleDateString(\"en-US\", options);\n  };\n\n  return (\n    <div className=\"mx-auto max-w-2xl px-4 py-10\">\n      <div className=\"mb-10 text-center\">\n        <h2 className=\"text-3xl font-bold tracking-tight\">Changelog</h2>\n        <p className=\"text-muted-foreground mt-2\">\n          A record of all notable changes\n        </p>\n      </div>\n\n      <div className=\"space-y-10\">\n        {releases.map((release, releaseIndex) => (\n          <div\n            key={release.version}\n            className={cn(\n              \"animate-fadeIn\",\n              releaseIndex === 0\n                ? \"opacity-100\"\n                : `opacity-[0.${9 - releaseIndex}]`,\n            )}\n            style={{\n              animationDelay: `${releaseIndex * 100}ms`,\n              animationFillMode: \"both\",\n            }}\n          >\n            <div className=\"mb-4 flex flex-wrap items-center justify-between gap-2\">\n              <div className=\"flex items-center gap-2\">\n                <h3 className=\"text-xl font-semibold tracking-tight\">\n                  v{release.version}\n                </h3>\n                {release.isLatest && (\n                  <Badge className=\"font-medium\">Latest</Badge>\n                )}\n              </div>\n              <time className=\"text-muted-foreground text-sm font-medium\">\n                {formatDate(release.date)}\n              </time>\n            </div>\n\n            <ul className=\"space-y-3\">\n              {release.changes.map((change, changeIndex) => (\n                <li\n                  key={changeIndex}\n                  className={cn(\n                    \"animate-slideIn relative pl-5\",\n                    \"before:absolute before:top-[0.6em] before:left-0 before:h-1.5 before:w-1.5 before:rounded-full\",\n                    changeIndex === 0\n                      ? \"before:bg-primary\"\n                      : \"before:bg-muted-foreground/50\",\n                  )}\n                  style={{\n                    animationDelay: `${200 + changeIndex * 50 + releaseIndex * 100}ms`,\n                    animationFillMode: \"both\",\n                  }}\n                >\n                  {change}\n                </li>\n              ))}\n            </ul>\n\n            {releaseIndex < releases.length - 1 && (\n              <Separator className=\"mt-8\" />\n            )}\n          </div>\n        ))}\n      </div>\n    </div>\n  );\n}\n","type":"registry:component","target":"components/blocks/marketing/changelogs/minimalist-changelog.tsx"},{"path":"components/ui/badge.tsx","content":"import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { Slot } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground [a]:hover:bg-primary/80\",\n        secondary:\n          \"bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80\",\n        destructive:\n          \"bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20\",\n        outline:\n          \"border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground\",\n        ghost:\n          \"hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction Badge({\n  className,\n  variant = \"default\",\n  asChild = false,\n  ...props\n}: React.ComponentProps<\"span\"> &\n  VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n  const Comp = asChild ? Slot.Root : \"span\"\n\n  return (\n    <Comp\n      data-slot=\"badge\"\n      data-variant={variant}\n      className={cn(badgeVariants({ variant }), className)}\n      {...props}\n    />\n  )\n}\n\nexport { Badge, badgeVariants }\n","type":"registry:ui","target":"components/ui/badge.tsx"},{"path":"components/ui/separator.tsx","content":"\"use client\";\n\nimport * as React from \"react\";\nimport { Separator as SeparatorPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\nfunction Separator({\n  className,\n  orientation = \"horizontal\",\n  decorative = true,\n  ...props\n}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {\n  return (\n    <SeparatorPrimitive.Root\n      data-slot=\"separator\"\n      decorative={decorative}\n      orientation={orientation}\n      className={cn(\n        \"shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px \",\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\nexport { Separator };\n","type":"registry:ui","target":"components/ui/separator.tsx"}],"description":"A pared back changelog with just dates, versions, and one line per change. Use it when you want updates to feel quiet and stay out of the way.","dependencies":["class-variance-authority","radix-ui"]}