{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "accordion",
  "title": "Accordion",
  "author": "AniBT <https://anibt.net>",
  "description": "AniBT folding sections: stitched rows or separate wells, 14/700 triggers that turn pink, a chevron that flips pink when open; single and collapsible by default.",
  "dependencies": [
    "lucide-react",
    "radix-ui"
  ],
  "registryDependencies": [
    "@anibt/theme"
  ],
  "files": [
    {
      "path": "registry/anibt/ui/accordion.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { ChevronDownIcon } from \"lucide-react\"\nimport { Accordion as AccordionPrimitive } from \"radix-ui\"\n\nimport { cn } from \"@/lib/utils\"\n\n/**\n * Accordion — AniBT 「贴纸手账」 folding sections.\n *\n * `variant=\"default\"`: rows parted by the dashed stitch, straight on the\n * surface they sit on. `variant=\"cards\"`: every section is its own well\n * (1px edge, radius 10) with 8px between them; the open one takes the pink\n * edge. Triggers are 14/700 and turn pink under the pointer; the chevron\n * turns pink and flips when its section is open.\n *\n * Radix underneath (keyboard, `aria-expanded`, the height animation from\n * `tw-animate-css`). It is one section at a time and collapsible unless you\n * say otherwise: `type=\"multiple\"` (or Base UI's `multiple`) keeps several\n * open, `collapsible={false}` keeps one always open.\n */\ntype AccordionVariant = \"default\" | \"cards\"\n\ntype AccordionProps = (\n  | Omit<AccordionPrimitive.AccordionSingleProps, \"type\">\n  | Omit<AccordionPrimitive.AccordionMultipleProps, \"type\">\n) & {\n  type?: \"single\" | \"multiple\"\n  /** Base UI's spelling of `type=\"multiple\"`. */\n  multiple?: boolean\n  variant?: AccordionVariant\n}\n\nfunction Accordion({ className, type, multiple, variant = \"default\", ...props }: AccordionProps) {\n  const shared = {\n    \"data-slot\": \"accordion\",\n    \"data-variant\": variant,\n    className: cn(\"group/accordion flex w-full flex-col\", variant === \"cards\" && \"gap-2\", className),\n  }\n  if (type === \"multiple\" || multiple) {\n    return <AccordionPrimitive.Root type=\"multiple\" {...shared} {...(props as Omit<AccordionPrimitive.AccordionMultipleProps, \"type\">)} />\n  }\n  const single = props as Omit<AccordionPrimitive.AccordionSingleProps, \"type\">\n  return <AccordionPrimitive.Root type=\"single\" {...shared} {...single} collapsible={single.collapsible ?? true} />\n}\n\nfunction AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n  return (\n    <AccordionPrimitive.Item\n      data-slot=\"accordion-item\"\n      className={cn(\n        \"group-data-[variant=default]/accordion:anibt-stitch-under group-data-[variant=default]/accordion:last:bg-none\",\n        \"group-data-[variant=cards]/accordion:anibt-well group-data-[variant=cards]/accordion:px-4 group-data-[variant=cards]/accordion:transition-shadow group-data-[variant=cards]/accordion:data-[state=open]:shadow-[0_0_0_1px_var(--anibt-wash-line)]\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction AccordionTrigger({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n  return (\n    <AccordionPrimitive.Header className=\"flex\">\n      <AccordionPrimitive.Trigger\n        data-slot=\"accordion-trigger\"\n        className={cn(\n          \"group/accordion-trigger flex min-h-11 flex-1 items-center gap-2.5 rounded-[10px] py-2.5 text-left text-[14px] leading-[1.45] font-bold text-foreground outline-hidden transition-colors duration-150 hover:text-accent-foreground focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring focus-visible:outline-solid disabled:pointer-events-none disabled:text-muted-foreground [&>svg:not([data-slot=accordion-chevron])]:size-4 [&>svg:not([data-slot=accordion-chevron])]:shrink-0 [&>svg:not([data-slot=accordion-chevron])]:text-muted-foreground\",\n          className\n        )}\n        {...props}\n      >\n        {children}\n        <ChevronDownIcon\n          data-slot=\"accordion-chevron\"\n          aria-hidden=\"true\"\n          className=\"pointer-events-none ml-auto size-4 shrink-0 text-muted-foreground transition-transform duration-300 ease-anibt-spring group-hover/accordion-trigger:text-accent-foreground group-data-[state=open]/accordion-trigger:rotate-180 group-data-[state=open]/accordion-trigger:text-anibt-mark\"\n        />\n      </AccordionPrimitive.Trigger>\n    </AccordionPrimitive.Header>\n  )\n}\n\nfunction AccordionContent({\n  className,\n  children,\n  ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n  return (\n    <AccordionPrimitive.Content\n      data-slot=\"accordion-content\"\n      className=\"overflow-hidden text-[13px] text-anibt-ink2 data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down motion-reduce:animate-none\"\n      {...props}\n    >\n      <div\n        className={cn(\n          \"pb-3.5 leading-relaxed [&_a]:font-semibold [&_a]:text-accent-foreground [&_a]:underline-offset-4 [&_a:hover]:underline [&_p:not(:last-child)]:mb-3\",\n          className\n        )}\n      >\n        {children}\n      </div>\n    </AccordionPrimitive.Content>\n  )\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\nexport type { AccordionProps }\n",
      "type": "registry:ui"
    }
  ],
  "categories": [
    "display"
  ],
  "type": "registry:ui"
}