Skip to content

Commit 7f210d8

Browse files
committed
feat: add registry json
1 parent 1c0446a commit 7f210d8

20 files changed

+1709
-0
lines changed

packages/ui/registry.json

Lines changed: 789 additions & 0 deletions
Large diffs are not rendered by default.

playground/public/r/accordion.json

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
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';\nimport type { ComponentRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionContentProps } from './types';\n\nconst 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});\nAccordionContent.displayName = Content.displayName;\n\nexport 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';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionHeaderProps } from './types';\n\nconst 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});\nAccordionHeader.displayName = Header.displayName;\n\nexport 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';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionItemProps } from './types';\n\nconst 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});\nAccordionItem.displayName = Item.displayName;\n\nexport 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';\nimport { forwardRef } from 'react';\n\nimport { cn } from '@/lib/utils';\n\nimport { accordionVariants } from './accordion-variants';\nimport type { AccordionRootProps } from './types';\n\nconst 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});\nAccordionRoot.displayName = Root.displayName;\n\nexport 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';\nexport { default as AccordionContent } from './AccordionContent';\nexport { default as AccordionHeader } from './AccordionHeader';\nexport { default as AccordionItem } from './AccordionItem';\nexport { default as AccordionRoot } from './AccordionRoot';\nexport { default as AccordionTrigger } from './AccordionTrigger';\n\nexport * 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

Comments
 (0)