Skip to content

Commit 521349f

Browse files
committed
feat: add and customize Accordion component from shadcn
1 parent 776f66d commit 521349f

File tree

4 files changed

+326
-1
lines changed

4 files changed

+326
-1
lines changed

package-lock.json

Lines changed: 257 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"@mdx-js/loader": "^3.1.0",
1616
"@mdx-js/react": "^3.1.0",
1717
"@next/mdx": "^15.1.6",
18+
"@radix-ui/react-accordion": "^1.2.4",
1819
"class-variance-authority": "^0.7.0",
1920
"clsx": "^2.1.1",
2021
"copy-to-clipboard": "^3.3.3",

src/components/ui/Accordion.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use client';
2+
3+
import * as AccordionPrimitive from '@radix-ui/react-accordion';
4+
import * as React from 'react';
5+
6+
import { cn } from '@/lib/utils';
7+
8+
const Accordion = AccordionPrimitive.Root;
9+
10+
const AccordionItem = React.forwardRef<
11+
React.ElementRef<typeof AccordionPrimitive.Item>,
12+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
13+
>(({ className, ...props }, ref) => (
14+
<AccordionPrimitive.Item ref={ref} className={cn('', className)} {...props} />
15+
));
16+
AccordionItem.displayName = 'AccordionItem';
17+
18+
const AccordionTrigger = React.forwardRef<
19+
React.ElementRef<typeof AccordionPrimitive.Trigger>,
20+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
21+
>(({ className, children, ...props }, ref) => (
22+
<AccordionPrimitive.Header className="flex">
23+
<AccordionPrimitive.Trigger
24+
ref={ref}
25+
className={cn(
26+
'flex flex-1 items-center justify-between py-2 transition-all hover:underline hover:underline-offset-2',
27+
// "[&[data-state=open]>svg]:rotate-180",
28+
className,
29+
)}
30+
{...props}
31+
>
32+
{children}
33+
{/* <ChevronDown className="h-4 w-4 shrink-0 transition-transform duration-200" /> */}
34+
</AccordionPrimitive.Trigger>
35+
</AccordionPrimitive.Header>
36+
));
37+
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
38+
39+
const AccordionContent = React.forwardRef<
40+
React.ElementRef<typeof AccordionPrimitive.Content>,
41+
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
42+
>(({ className, children, ...props }, ref) => (
43+
<AccordionPrimitive.Content
44+
ref={ref}
45+
className="overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
46+
{...props}
47+
>
48+
<div className={cn('pb-4 pt-0', className)}>{children}</div>
49+
</AccordionPrimitive.Content>
50+
));
51+
52+
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
53+
54+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };

tailwind.config.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,20 @@ const config: Config = {
160160
'950': '#013219',
161161
},
162162
},
163+
keyframes: {
164+
'accordion-down': {
165+
from: { height: '0' },
166+
to: { height: 'var(--radix-accordion-content-height)' },
167+
},
168+
'accordion-up': {
169+
from: { height: 'var(--radix-accordion-content-height)' },
170+
to: { height: '0' },
171+
},
172+
},
173+
animation: {
174+
'accordion-down': 'accordion-down 0.2s ease-out',
175+
'accordion-up': 'accordion-up 0.2s ease-out',
176+
},
163177
},
164178
},
165179
plugins: [],

0 commit comments

Comments
 (0)