{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "timeline",
  "title": "Timeline",
  "description": "Activity feeds and changelogs with status indicators.",
  "dependencies": [
    "class-variance-authority"
  ],
  "registryDependencies": [
    "utils"
  ],
  "files": [
    {
      "path": "registry/default/ui/timeline.tsx",
      "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/registry/default/lib/utils\"\n\nfunction Timeline({ className, ...props }: React.ComponentProps<\"ol\">) {\n  return (\n    <ol\n      data-slot=\"timeline\"\n      className={cn(\"flex flex-col\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TimelineItem({ className, ...props }: React.ComponentProps<\"li\">) {\n  return (\n    <li\n      data-slot=\"timeline-item\"\n      className={cn(\n        \"group/timeline-item relative grid grid-cols-[auto_1fr] gap-x-3 pb-6 last:pb-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nconst timelineIndicatorVariants = cva(\n  \"relative z-10 mt-1.5 size-2.5 shrink-0 rounded-full border-2 border-background ring-1 ring-border\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-muted-foreground\",\n        current: \"bg-primary ring-4 ring-primary/40\",\n        success: \"bg-emerald-500 ring-emerald-500/30\",\n        destructive: \"bg-destructive ring-destructive/30\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nfunction TimelineIndicator({\n  className,\n  variant,\n  ...props\n}: React.ComponentProps<\"span\"> &\n  VariantProps<typeof timelineIndicatorVariants>) {\n  return (\n    <span\n      data-slot=\"timeline-indicator\"\n      aria-hidden\n      className={cn(\n        \"col-start-1 row-span-full flex flex-col items-center\",\n        \"after:absolute after:top-4 after:bottom-0 after:left-[4.5px] after:w-px after:bg-border group-last/timeline-item:after:hidden\",\n        className\n      )}\n      {...props}\n    >\n      <span className={cn(timelineIndicatorVariants({ variant }))} />\n    </span>\n  )\n}\n\nfunction TimelineContent({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"timeline-content\"\n      className={cn(\"col-start-2 flex min-w-0 flex-col gap-1\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TimelineHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n  return (\n    <div\n      data-slot=\"timeline-header\"\n      className={cn(\n        \"flex flex-wrap items-baseline justify-between gap-x-3 gap-y-0.5\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TimelineTitle({ className, ...props }: React.ComponentProps<\"p\">) {\n  return (\n    <p\n      data-slot=\"timeline-title\"\n      className={cn(\"text-sm leading-snug font-medium\", className)}\n      {...props}\n    />\n  )\n}\n\nfunction TimelineTime({ className, ...props }: React.ComponentProps<\"time\">) {\n  return (\n    <time\n      data-slot=\"timeline-time\"\n      className={cn(\n        \"font-mono text-xs text-muted-foreground tabular-nums\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction TimelineDescription({\n  className,\n  ...props\n}: React.ComponentProps<\"p\">) {\n  return (\n    <p\n      data-slot=\"timeline-description\"\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n}\n\nexport {\n  Timeline,\n  TimelineItem,\n  TimelineIndicator,\n  TimelineContent,\n  TimelineHeader,\n  TimelineTitle,\n  TimelineTime,\n  TimelineDescription,\n  timelineIndicatorVariants,\n}\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}