accordion.tsx 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. "use client"
  2. import * as React from "react"
  3. import * as AccordionPrimitive from "@radix-ui/react-accordion"
  4. import { ChevronDownIcon } from "lucide-react"
  5. import { cn } from "@/lib/utils"
  6. function Accordion({
  7. ...props
  8. }: React.ComponentProps<typeof AccordionPrimitive.Root>) {
  9. return <AccordionPrimitive.Root data-slot="accordion" {...props} />
  10. }
  11. function AccordionItem({
  12. className,
  13. ...props
  14. }: React.ComponentProps<typeof AccordionPrimitive.Item>) {
  15. return (
  16. <AccordionPrimitive.Item
  17. data-slot="accordion-item"
  18. className={cn("border-b last:border-b-0", className)}
  19. {...props}
  20. />
  21. )
  22. }
  23. function AccordionTrigger({
  24. className,
  25. children,
  26. ...props
  27. }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {
  28. return (
  29. <AccordionPrimitive.Header className="flex">
  30. <AccordionPrimitive.Trigger
  31. data-slot="accordion-trigger"
  32. className={cn(
  33. "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
  34. className
  35. )}
  36. {...props}
  37. >
  38. {children}
  39. <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
  40. </AccordionPrimitive.Trigger>
  41. </AccordionPrimitive.Header>
  42. )
  43. }
  44. function AccordionContent({
  45. className,
  46. children,
  47. ...props
  48. }: React.ComponentProps<typeof AccordionPrimitive.Content>) {
  49. return (
  50. <AccordionPrimitive.Content
  51. data-slot="accordion-content"
  52. className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
  53. {...props}
  54. >
  55. <div className={cn("pt-0 pb-4", className)}>{children}</div>
  56. </AccordionPrimitive.Content>
  57. )
  58. }
  59. export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }