1+ {
2+ "$schema" : " https://ui.shadcn.com/schema/registry-item.json" ,
3+ "name" : " accordion" ,
4+ "type" : " registry:ui" ,
5+ "title" : " Accordion" ,
6+ "dependencies" : [],
7+ "files" : [
8+ {
9+ "path" : " src/components/accordion/Accordion.tsx" ,
10+ "content": "'use client';\n\nimport type { Root } from '@radix-ui/react-accordion';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport AccordionContent from './AccordionContent';\nimport AccordionHeader from './AccordionHeader';\nimport AccordionItem from './AccordionItem';\nimport AccordionRoot from './AccordionRoot';\nimport AccordionTrigger from './AccordionTrigger';\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionProps } from './types';\n\nconst Accordion = forwardRef<React.ElementRef<typeof Root>, AccordionProps>((props, ref) => {\n const { className, classNames, items, size, triggerIcon, triggerLeading, triggerTrailing, ...rest } = props;\n\n const { root } = accordionVariants({ size });\n\n const mergedCls = cn(root(), className);\n\n return (\n <AccordionRoot\n className={mergedCls}\n ref={ref}\n {...rest}\n >\n {items.map(item => (\n <AccordionItem\n className={classNames?.item}\n disabled={item.disabled}\n key={item.value}\n value={item.value}\n >\n <AccordionHeader className={classNames?.header}>\n <AccordionTrigger\n className={classNames?.trigger}\n classNames={classNames}\n icon={triggerIcon}\n leading={item.leading || triggerLeading}\n size={size}\n trailing={item.trailing || triggerTrailing}\n >\n {item.title}\n </AccordionTrigger>\n </AccordionHeader>\n\n <AccordionContent\n className={classNames?.content}\n size={size}\n >\n {item.children}\n </AccordionContent>\n </AccordionItem>\n ))}\n </AccordionRoot>\n );\n});\nAccordion.displayName = 'Accordion';\n\nexport default Accordion;\n",
11+ "type" : " registry:ui" ,
12+ "target" : " components/accordion/Accordion.tsx"
13+ },
14+ {
15+ "path" : " src/components/accordion/AccordionContent.tsx" ,
16+ "content" : " import { Content } from '@radix-ui/react-accordion';\n import type { ComponentRef } from 'react';\n import { forwardRef } from 'react';\n\n import { cn } from '@/lib/utils';\n\n import { accordionVariants } from './accordion-variants';\n import type { AccordionContentProps } from './types';\n\n const AccordionContent = forwardRef<ComponentRef<typeof Content>, AccordionContentProps>((props, ref) => {\n const { className, size, ...rest } = props;\n\n const { content } = accordionVariants({ size });\n\n const mergedCls = cn(content(), className);\n\n return (\n <Content\n className={mergedCls}\n ref={ref}\n {...rest}\n />\n );\n });\n AccordionContent.displayName = Content.displayName;\n\n export default AccordionContent;\n " ,
17+ "type" : " registry:ui" ,
18+ "target" : " components/accordion/AccordionContent.tsx"
19+ },
20+ {
21+ "path" : " src/components/accordion/AccordionHeader.tsx" ,
22+ "content" : " import { Header } from '@radix-ui/react-accordion';\n import { forwardRef } from 'react';\n\n import { cn } from '@/lib/utils';\n\n import { accordionVariants } from './accordion-variants';\n import type { AccordionHeaderProps } from './types';\n\n const AccordionHeader = forwardRef<React.ElementRef<typeof Header>, AccordionHeaderProps>((props, ref) => {\n const { className, ...rest } = props;\n\n const { header } = accordionVariants();\n\n const mergedCls = cn(header(), className);\n\n return (\n <Header\n className={mergedCls}\n ref={ref}\n {...rest}\n />\n );\n });\n AccordionHeader.displayName = Header.displayName;\n\n export default AccordionHeader;\n " ,
23+ "type" : " registry:ui" ,
24+ "target" : " components/accordion/AccordionHeader.tsx"
25+ },
26+ {
27+ "path" : " src/components/accordion/AccordionItem.tsx" ,
28+ "content" : " import { Item } from '@radix-ui/react-accordion';\n import { forwardRef } from 'react';\n\n import { cn } from '@/lib/utils';\n\n import { accordionVariants } from './accordion-variants';\n import type { AccordionItemProps } from './types';\n\n const AccordionItem = forwardRef<React.ElementRef<typeof Item>, AccordionItemProps>((props, ref) => {\n const { className, ...rest } = props;\n\n const { item } = accordionVariants();\n\n const mergedCls = cn(item(), className);\n\n return (\n <Item\n className={mergedCls}\n ref={ref}\n {...rest}\n />\n );\n });\n AccordionItem.displayName = Item.displayName;\n\n export default AccordionItem;\n " ,
29+ "type" : " registry:ui" ,
30+ "target" : " components/accordion/AccordionItem.tsx"
31+ },
32+ {
33+ "path" : " src/components/accordion/AccordionRoot.tsx" ,
34+ "content" : " import { Root } from '@radix-ui/react-accordion';\n import { forwardRef } from 'react';\n\n import { cn } from '@/lib/utils';\n\n import { accordionVariants } from './accordion-variants';\n import type { AccordionRootProps } from './types';\n\n const AccordionRoot = forwardRef<React.ElementRef<typeof Root>, AccordionRootProps>((props, ref) => {\n const { className, size, ...rest } = props;\n\n const { root } = accordionVariants({ size });\n\n const mergedCls = cn(root(), className);\n\n return (\n <Root\n className={mergedCls}\n ref={ref}\n {...rest}\n />\n );\n });\n AccordionRoot.displayName = Root.displayName;\n\n export default AccordionRoot;\n " ,
35+ "type" : " registry:ui" ,
36+ "target" : " components/accordion/AccordionRoot.tsx"
37+ },
38+ {
39+ "path" : " src/components/accordion/AccordionTrigger.tsx" ,
40+ "content": "import { Trigger } from '@radix-ui/react-accordion';\nimport { Slot } from '@radix-ui/react-slot';\nimport { ChevronDown } from 'lucide-react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionTriggerProps } from './types';\n\nconst AccordionTrigger = forwardRef<React.ElementRef<typeof Trigger>, AccordionTriggerProps>((props, ref) => {\n const { children, className, classNames, icon, leading, size, trailing, ...rest } = props;\n\n const { trigger, triggerIcon, triggerLeadingIcon } = accordionVariants({ size });\n\n const mergedCls = cn(trigger(), className);\n\n const leadingIcon = cn(triggerLeadingIcon(), classNames?.triggerLeadingIcon);\n\n const iconCls = cn(triggerIcon(), classNames?.triggerIcon);\n\n return (\n <Trigger\n className={mergedCls}\n ref={ref}\n {...rest}\n >\n <Slot className={leadingIcon}>{leading}</Slot>\n\n {children}\n\n {trailing}\n\n <Slot className={iconCls}>{icon || <ChevronDown />}</Slot>\n </Trigger>\n );\n});\nAccordionTrigger.displayName = Trigger.displayName;\n\nexport default AccordionTrigger;\n",
41+ "type" : " registry:ui" ,
42+ "target" : " components/accordion/AccordionTrigger.tsx"
43+ },
44+ {
45+ "path" : " src/components/accordion/accordion-variants.ts" ,
46+ "content": "import { tv } from 'tailwind-variants';\n\nexport const accordionVariants = tv({\n defaultVariants: {\n size: 'md'\n },\n slots: {\n content: [`overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up`],\n header: 'flex',\n item: 'border-b',\n root: '',\n trigger: [\n `flex-1 flex items-center justify-start font-medium transition-all duration-200 bg-transparent`,\n `focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-background focus-visible:ring-primary`,\n `hover:underline [&[data-state=open]>.trigger-icon]:rotate-180`\n ],\n triggerIcon: `trigger-icon ml-auto shrink-0 text-muted-foreground transition-transform duration-200`,\n triggerLeadingIcon: `shrink-0`\n },\n variants: {\n size: {\n '2xl': {\n content: 'data-[state=open]:pb-6',\n root: 'text-2xl',\n trigger: 'py-6 gap-6'\n },\n lg: {\n content: 'data-[state=open]:pb-4.5',\n root: 'text-base',\n trigger: 'py-4.5 gap-4.5'\n },\n md: {\n content: 'data-[state=open]:pb-4',\n root: 'text-sm',\n trigger: 'py-4 gap-4'\n },\n sm: {\n content: 'data-[state=open]:pb-3.5',\n root: 'text-xs',\n trigger: 'py-3.5 gap-3.5'\n },\n xl: {\n content: 'data-[state=open]:pb-5',\n root: 'text-lg',\n trigger: 'py-5 gap-5'\n },\n xs: {\n content: 'data-[state=open]:pb-3',\n root: 'text-2xs',\n trigger: 'py-3 gap-3'\n }\n }\n }\n});\n\nexport type AccordionSlots = keyof typeof accordionVariants.slots;\n",
47+ "type" : " registry:ui" ,
48+ "target" : " components/accordion/accordion-variants.ts"
49+ },
50+ {
51+ "path" : " src/components/accordion/index.ts" ,
52+ "content" : " export { default as Accordion } from './Accordion';\n export { default as AccordionContent } from './AccordionContent';\n export { default as AccordionHeader } from './AccordionHeader';\n export { default as AccordionItem } from './AccordionItem';\n export { default as AccordionRoot } from './AccordionRoot';\n export { default as AccordionTrigger } from './AccordionTrigger';\n\n export * from './types';\n " ,
53+ "type" : " registry:ui" ,
54+ "target" : " components/accordion/index.ts"
55+ },
56+ {
57+ "path" : " src/components/accordion/types.ts" ,
58+ "content": "import type {\n AccordionContentProps as _AccordionContentProps,\n AccordionHeaderProps as _AccordionHeaderProps,\n AccordionItemProps as _AccordionItemProps,\n // eslint-disable-next-line sort-imports\n AccordionMultipleProps,\n AccordionSingleProps,\n AccordionTriggerProps as _AccordionTriggerProps\n} from '@radix-ui/react-accordion';\n\nimport type { BaseNodeProps, ClassValue, PropsSlot, ThemeSize } from '@/types/other';\n\nimport type { AccordionSlots } from './accordion-variants';\n\n/** The ui of the accordion. */\nexport type AccordionUi = Partial<Record<AccordionSlots, ClassValue>>;\n\nexport type AccordionRootProps = BaseNodeProps<AccordionSingleProps> | BaseNodeProps<AccordionMultipleProps>;\n\nexport interface AccordionHeaderProps extends BaseNodeProps<_AccordionHeaderProps> {}\n\nexport interface AccordionContentProps extends BaseNodeProps<_AccordionContentProps> {}\n\nexport interface AccordionItemProps extends BaseNodeProps<_AccordionItemProps> {}\n\nexport interface AccordionTriggerProps extends BaseNodeProps<_AccordionTriggerProps>, PropsSlot {\n /** The ui of the accordion trigger. */\n classNames?: Pick<AccordionUi, 'triggerIcon' | 'triggerLeadingIcon'>;\n icon?: React.ReactNode;\n}\n\n// Accordion\nexport interface AccordionItemData extends Pick<AccordionItemProps, 'disabled' | 'value'> {\n children: React.ReactNode;\n leading?: React.ReactNode;\n title: React.ReactNode;\n trailing?: React.ReactNode;\n}\n\nexport type AccordionProps<T extends AccordionItemData = AccordionItemData> = AccordionRootProps & {\n classNames?: AccordionUi;\n items: T[];\n size?: ThemeSize;\n triggerIcon?: React.ReactNode;\n triggerLeading?: React.ReactNode;\n triggerTrailing?: React.ReactNode;\n};\n",
59+ "type" : " registry:ui" ,
60+ "target" : " components/accordion/types.ts"
61+ }
62+ ]
63+ }
0 commit comments