{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "accordion", "type": "registry:ui", "title": "Accordion", "description": "Vertically collapsing sections.", "registryDependencies": [ "https://raw.githubusercontent.com/truongnat/rnui/main/registry/dist/nativewind/utils.json", "https://raw.githubusercontent.com/truongnat/rnui/main/registry/dist/nativewind/text.json", "https://raw.githubusercontent.com/truongnat/rnui/main/registry/dist/nativewind/theme.json" ], "dependencies": [ "lucide-react-native" ], "files": [ { "path": "registry/shared/ui/accordion.tsx", "type": "registry:ui", "target": "components/ui/accordion.tsx", "content": "import { ChevronDown } from 'lucide-react-native';\nimport { createContext, useContext, useState } from 'react';\nimport {\n Animated,\n Pressable,\n View,\n type PressableProps,\n type ViewProps,\n} from 'react-native';\nimport { Text, type TextProps } from '@/components/ui/text';\nimport { cn, useIconColor } from '@/lib/utils';\n\ninterface AccordionContextValue {\n open: Set;\n toggle: (value: string) => void;\n multiple: boolean;\n}\n\nconst AccordionContext = createContext({\n open: new Set(),\n toggle: () => {},\n multiple: false,\n});\n\nexport interface AccordionProps extends ViewProps {\n /** Open item values. Uncontrolled by default. */\n defaultValue?: string | string[];\n multiple?: boolean;\n className?: string;\n}\n\nexport function Accordion({\n defaultValue,\n multiple = false,\n className,\n ...props\n}: AccordionProps) {\n const [open, setOpen] = useState>(\n () =>\n new Set(\n Array.isArray(defaultValue)\n ? defaultValue\n : defaultValue\n ? [defaultValue]\n : []\n )\n );\n const toggle = (value: string) =>\n setOpen((prev) => {\n const next = new Set(multiple ? prev : []);\n if (prev.has(value)) next.delete(value);\n else next.add(value);\n return next;\n });\n\n return (\n \n \n \n );\n}\n\ninterface ItemContextValue {\n value: string;\n open: boolean;\n}\nconst ItemContext = createContext({ value: '', open: false });\n\nexport interface AccordionItemProps extends ViewProps {\n value: string;\n className?: string;\n}\n\nexport function AccordionItem({\n value,\n className,\n children,\n ...props\n}: AccordionItemProps) {\n const { open } = useContext(AccordionContext);\n return (\n \n \n {children}\n \n \n );\n}\n\nexport interface AccordionTriggerProps\n extends Omit {\n className?: string;\n children?: TextProps['children'];\n}\n\nexport function AccordionTrigger({\n className,\n children,\n ...props\n}: AccordionTriggerProps) {\n const { toggle } = useContext(AccordionContext);\n const { value, open } = useContext(ItemContext);\n const iconColor = useIconColor();\n\n return (\n toggle(value)}\n className={cn('flex-row items-center justify-between py-4', className)}\n {...props}\n >\n {children}\n \n \n \n \n );\n}\n\nexport interface AccordionContentProps extends ViewProps {\n className?: string;\n}\n\nexport function AccordionContent({\n className,\n children,\n ...props\n}: AccordionContentProps) {\n const { open } = useContext(ItemContext);\n if (!open) return null;\n return (\n \n {typeof children === 'string' ? (\n {children}\n ) : (\n children\n )}\n \n );\n}\n" } ] }