accordion.tsx 2.0 KB

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