avertra-ui
uiaccordionsource: ok · hit
Accordion
A collapsible accordion component.
npx shadcn add "https://micomponents.micustomer.io/r/accordion.json"free
Interaction
accordion
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Files1 · source cached 10/9/2026, 6:04:52 PM
src/components/ui/accordion.tsx
"use client";
import * as React from "react";
// import * as AccordionPrimitive from "@radix-ui/react-accordion"
import * as AccordionPrimitive from "@radix-ui/react-accordion";
import { ChevronDown } from "lucide-react";
import { cn } from "@/stories/lib/utils";
import { createContext, useContext } from "react";
type AccordionVariant = "white" | "inset" | undefined;
const AccordionVariantContext = createContext<AccordionVariant>(undefined);
const useAccordionVariant = () => useContext(AccordionVariantContext);
type AccordionProps = React.ComponentPropsWithoutRef<
typeof AccordionPrimitive.Root
> & {
variant?: AccordionVariant;
};
const Accordion = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Root>,
AccordionProps
>(({ className, variant, ...props }, ref) => {
return (
<AccordionVariantContext.Provider value={variant}>
<AccordionPrimitive.Root
ref={ref}
className={cn("rounded-lg", className)}
{...props}
/>
</AccordionVariantContext.Provider>
);
});
Accordion.displayName = "Accordion";
const AccordionItem = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Item>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
>(({ className, ...props }, ref) => {
const variant = useAccordionVariant();
return (
<AccordionPrimitive.Item
ref={ref}
className={cn(
"rounded-lg",
variant === "white" ? "bg-white border" : "bg-gray-100",
className,
)}
{...props}
/>
);
});
AccordionItem.displayName = "AccordionItem";
const AccordionTrigger = React.forwardRef<
React.ElementRef<typeof AccordionPrimitive.Trigger>,
React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
>(({ className, children, ...props }, ref) => (
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger
ref={ref}
className={cn(
" text-base flex flex-1 items-center justify-between p-4 font-medium transition-all hover:underline text-left [&[data-state=open]>svg]:rotate-180",
className,
)}
{...props}
>
{children}
<ChevronDown className="h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-200" />
</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="py-4 mx-4 border-t border-t-[#B7C2E1] overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
{...props}
>
<div className={cn("pb-4 pt-0", className)}>{children}</div>
</AccordionPrimitive.Content>
));
AccordionContent.displayName = AccordionPrimitive.Content.displayName;
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };