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            76x         76x     34203x 11401x   14076x   45604x   76x   76x                                                                                       76x       6489x 45423x     6489x     11839x   94x 94x 19467x         6489x 6489x 9543x   45423x     76x   76x     47472x 11868x         35604x 47472x   76x      
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 };