{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "aurora-accordion",
  "title": "Aurora Accordion",
  "author": "jmagar <https://github.com/jmagar>",
  "description": "Tokenized disclosure list for compact details, command output, and configuration sections.",
  "dependencies": [
    "@radix-ui/react-accordion@^1.2.16",
    "lucide-react@^0.487.0"
  ],
  "registryDependencies": [
    "@aurora/aurora-tokens"
  ],
  "files": [
    {
      "path": "registry/aurora/ui/accordion.tsx",
      "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDown } from \"lucide-react\"\nimport { cn } from \"@/lib/utils\"\n\nexport interface AuroraAccordionProps\n  extends Omit<\n    React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>,\n    \"children\" | \"collapsible\" | \"defaultValue\" | \"onValueChange\" | \"type\" | \"value\"\n  > {\n  children: React.ReactNode\n  type?: \"single\" | \"multiple\"\n  collapsible?: boolean\n  defaultValue?: string | string[]\n  value?: string | string[]\n  onValueChange?: ((value: string) => void) | ((value: string[]) => void)\n  ref?: React.Ref<React.ComponentRef<typeof AccordionPrimitive.Root>>\n}\n\nexport interface AuroraAccordionItemProps\n  extends Omit<\n    React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>,\n    \"children\" | \"title\" | \"value\"\n  > {\n  title: React.ReactNode\n  meta?: React.ReactNode\n  defaultOpen?: boolean\n  value?: string\n  children: React.ReactNode\n  ref?: React.Ref<React.ComponentRef<typeof AccordionPrimitive.Item>>\n}\n\nexport type AccordionProps = AuroraAccordionProps\nexport type AccordionItemProps = AuroraAccordionItemProps\n\nfunction Accordion({\n  ref,\n  children,\n  className,\n  type = \"multiple\",\n  collapsible = true,\n  defaultValue,\n  value,\n  onValueChange,\n  style,\n  ...props\n}: AuroraAccordionProps) {\n  const items = React.Children.toArray(children)\n\n  const normalizedChildren = items.map((child, index) => {\n    if (!React.isValidElement<AuroraAccordionItemProps>(child)) {\n      return child\n    }\n\n    return React.cloneElement(child, {\n      value: child.props.value ?? `accordion-item-${index}`,\n    })\n  })\n\n  const derivedDefaultValue = React.useMemo(() => {\n    if (defaultValue !== undefined) {\n      return defaultValue\n    }\n\n    const openValues = items.flatMap((child, index) => {\n      if (!React.isValidElement<AuroraAccordionItemProps>(child) || !child.props.defaultOpen) {\n        return []\n      }\n\n      return [child.props.value ?? `accordion-item-${index}`]\n    })\n\n    return type === \"multiple\" ? openValues : openValues[0]\n  }, [defaultValue, items, type])\n\n  const rootClassName = cn(\"overflow-hidden rounded-[12px] border\", className)\n  const rootStyle = {\n    background: \"var(--aurora-panel-medium)\",\n    borderColor: \"var(--aurora-border-default)\",\n    ...style,\n  }\n\n  if (type === \"multiple\") {\n    return (\n      <AccordionPrimitive.Root\n        ref={ref}\n        data-slot=\"accordion\"\n        type=\"multiple\"\n        defaultValue={derivedDefaultValue as string[] | undefined}\n        value={value as string[] | undefined}\n        onValueChange={onValueChange as ((value: string[]) => void) | undefined}\n        className={rootClassName}\n        style={rootStyle}\n        {...props}\n      >\n        {normalizedChildren}\n      </AccordionPrimitive.Root>\n    )\n  }\n\n  return (\n    <AccordionPrimitive.Root\n      ref={ref}\n      data-slot=\"accordion\"\n      type=\"single\"\n      collapsible={collapsible}\n      defaultValue={derivedDefaultValue as string | undefined}\n      value={value as string | undefined}\n      onValueChange={onValueChange as ((value: string) => void) | undefined}\n      className={rootClassName}\n      style={rootStyle}\n      {...props}\n    >\n      {normalizedChildren}\n    </AccordionPrimitive.Root>\n  )\n}\n\nfunction AccordionItem({\n  ref,\n  className,\n  title,\n  meta,\n  children,\n  value,\n  style,\n  ...props\n}: AuroraAccordionItemProps) {\n  const itemValue = value ?? \"accordion-item\"\n\n  return (\n    <AccordionPrimitive.Item\n      ref={ref}\n      data-slot=\"accordion-item\"\n      value={itemValue}\n      className={cn(\"border-b last:border-b-0\", className)}\n      style={{ borderColor: \"var(--aurora-border-default)\", ...style }}\n      {...props}\n    >\n      <AccordionPrimitive.Header className=\"flex\">\n        <AccordionPrimitive.Trigger\n          data-slot=\"accordion-trigger\"\n          className={cn(\n            \"group flex flex-1 items-center justify-between gap-3 px-5 py-3.5 text-left outline-none transition-colors duration-150\",\n            \"hover:bg-[var(--aurora-hover-bg)] focus-visible:ring-2 focus-visible:ring-[var(--aurora-focus-ring)] focus-visible:ring-inset\"\n          )}\n          style={{\n            color: \"var(--aurora-text-primary)\",\n            fontFamily: \"var(--aurora-font-display)\",\n            fontSize: \"15px\",\n            fontWeight: \"var(--aurora-weight-heading)\",\n          }}\n        >\n          <span className=\"min-w-0 flex-1 truncate\">{title}</span>\n          {meta ? (\n            <span className=\"truncate aurora-text-meta\" style={{ maxWidth: 160 }}>\n              {meta}\n            </span>\n          ) : null}\n          <ChevronDown\n            className=\"size-4 shrink-0 text-[var(--aurora-text-muted)] transition-transform duration-200 group-data-[state=open]:rotate-180\"\n            strokeWidth={2}\n            aria-hidden\n          />\n        </AccordionPrimitive.Trigger>\n      </AccordionPrimitive.Header>\n      <AccordionPrimitive.Content\n        data-slot=\"accordion-content\"\n        className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n      >\n        <div\n          className=\"px-5 pb-4 pt-1\"\n          style={{\n            color: \"var(--aurora-text-muted)\",\n            fontFamily: \"var(--aurora-font-sans)\",\n            fontSize: \"var(--aurora-type-body)\",\n            lineHeight: 1.55,\n          }}\n        >\n          {children}\n        </div>\n      </AccordionPrimitive.Content>\n    </AccordionPrimitive.Item>\n  )\n}\n\nexport { Accordion, AccordionItem }\nexport default Accordion\n",
      "type": "registry:ui",
      "target": "@ui/aurora/accordion.tsx"
    }
  ],
  "meta": {
    "namespace": "@aurora",
    "style": "aurora",
    "family": "ui",
    "requiresTokens": true,
    "sourcePath": "registry/aurora/ui/accordion.tsx",
    "installTarget": "@ui/aurora/accordion.tsx"
  },
  "docs": "Aurora component that expects `aurora-tokens` to be installed first.\n\nDefault install target: `@ui/aurora/accordion.tsx`.\n\nRegistry dependencies: `aurora-tokens`.",
  "categories": [
    "aurora",
    "ui",
    "layout"
  ],
  "type": "registry:ui"
}