Accordion
Collapsible sections for FAQs, settings groups, or long-form content. Keep only one item open at a time on marketing pages, allow multiple open on dashboards and settings screens.
Live preview
open in new tab ↗"use client"
import * as React from "react"
import { cn } from "@/lib/utils"
import { ChevronDownIcon } from "lucide-react"
import { Accordion as AccordionPrimitive } from "radix-ui"
function Accordion(props) {
return <AccordionPrimitive.Root data-slot="accordion" {...props} />
}
function AccordionItem({ className, ...props }) {
return <AccordionPrimitive.Item data-slot="accordion-item" className={cn("border-b last:border-b-0", className)} {...props} />
}
function AccordionTrigger({ className, children, ...props }) {
return (
<AccordionPrimitive.Header className="flex">
<AccordionPrimitive.Trigger
data-slot="accordion-trigger"
className={cn("flex flex-1 items-start justify-between gap-4 py-4 text-left text-sm font-medium hover:underline [&[data-state=open]>svg]:rotate-180", className)}
{...props}
>
{children}
<ChevronDownIcon className="size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform" />
</AccordionPrimitive.Trigger>
</AccordionPrimitive.Header>
)
}
function AccordionContent({ className, children, ...props }) {
return (
<AccordionPrimitive.Content data-slot="accordion-content" className="overflow-hidden text-sm" {...props}>
<div className={cn("pt-0 pb-4", className)}>{children}</div>
</AccordionPrimitive.Content>
)
}
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }Block id: shadcn-accordionreact-tailwind · drop-in
More faq blocks
Want the whole site, not just the block?
We ship real client sites in 3 weeks — with blocks like this one, wired to your brand.


