accordion.tsx 2.0 KB

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