All files / src/ahuora-design-system/ui accordion.tsx

93.18% Statements 41/44
50% Branches 14/28
50% Functions 3/6
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112            103x         103x     36528x 12176x   15181x   48704x   103x   103x                                                                                       103x       6049x 42343x     6049x     12059x   103x 103x 18147x         6049x 6049x 9363x   42343x     103x   103x     50612x 12653x         37959x 50612x   103x      
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { ChevronDownIcon } from "@radix-ui/react-icons";
import { cva, type VariantProps } from "class-variance-authority";
import * as React from "react";
import { cn } from "@/lib/utils";
 
const Accordion = AccordionPrimitive.Root;
 
interface CustomAccordionItemProps
  extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item> {}
 
const AccordionItem = React.forwardRef<
  React.ElementRef<typeof AccordionPrimitive.Item>,
  CustomAccordionItemProps
>(({ className, ...props }, ref) => (
  <AccordionPrimitive.Item
    ref={ref}
    className={cn("text-xl", className)}
    {...props}
  />
));
AccordionItem.displayName = "AccordionItem";
 
const accordTriggerVars = cva(
  "flex flex-1 items-center justify-between transition-all text-[15px] font-medium",
  {
    variants: {
      variant: {
        default: [
          "px-4 py-2",
          "hover:bg-accent",
          "text-muted-foreground",
          "transition-colors duration-200",
          "[&[data-state=open]>svg]:rotate-180",
          "[&[data-state=open]]:bg-accent",
        ],
        underlined: [
          "hover:underline",
          "[&[data-state=open]>svg]:rotate-180",
          "underline-offset-4",
          "[&[data-state=open]]:underline",
        ],
        objectPanel: [
          "px-4 py-2",
          "hover:bg-accent",
          "text-muted-foreground",
          "transition-colors duration-200",
          "[&[data-state=open]>svg]:rotate-180",
          "[&[data-state=open]]:bg-accent",
          "text-sm",
          "gap-2",
        ],
      },
      defaultVariants: {
        variant: "default",
      },
    },
  },
);
 
interface CustomAccordionTriggerProps
  extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>,
    VariantProps<typeof accordTriggerVars> {
  statusIcon?: React.ReactNode;
  onHeaderClick?: () => void;
}
 
const AccordionTrigger = React.forwardRef<
  React.ElementRef<typeof AccordionPrimitive.Trigger>,
  CustomAccordionTriggerProps
>(
  (
    { className, variant, statusIcon, onHeaderClick, children, ...props },
    ref,
  ) => (
    <AccordionPrimitive.Header className="flex">
      <AccordionPrimitive.Trigger
        ref={ref}
        className={cn(accordTriggerVars({ variant }), className)}
        onClick={(e) => {
          onHeaderClick?.();
          props.onClick?.(e);
        }}
        {...props}
      >
        {children}
        <div className="flex items-center gap-2">
          {statusIcon && statusIcon}
          <ChevronDownIcon className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
        </div>
      </AccordionPrimitive.Trigger>
    </AccordionPrimitive.Header>
  ),
);
AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;
 
const AccordionContent = React.forwardRef<
  React.ElementRef<typeof AccordionPrimitive.Content>,
  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
>(({ className, children, ...props }, ref) => (
  <AccordionPrimitive.Content
    ref={ref}
    className="text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
    {...props}
  >
    <div className={cn("pb-4 pt-0 px-4 mt-2.5", className)}>{children}</div>
  </AccordionPrimitive.Content>
));
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
 
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger };