Accordion
Accordion splits content into collapsible panels. Three variants and three sizes cover FAQ sections, help pages, and a wide range of other use cases.
Playground
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>What is a design system?</Accordion.Trigger>
<Accordion.Content>A design system is a collection of reusable components and guidelines for building consistent user interfaces.</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>How to install?</Accordion.Trigger>
<Accordion.Content>Install the package using npm or yarn, then import components as needed.</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-3">
<Accordion.Trigger>Is it accessible?</Accordion.Trigger>
<Accordion.Content>Yes, all components follow WAI-ARIA guidelines with full keyboard navigation support.</Accordion.Content>
</Accordion.Item>
</Accordion>Variants
default
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Item 1</Accordion.Trigger>
<Accordion.Content>Content for item 1</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Item 2</Accordion.Trigger>
<Accordion.Content>Content for item 2</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-3">
<Accordion.Trigger>Item 3</Accordion.Trigger>
<Accordion.Content>Content for item 3</Accordion.Content>
</Accordion.Item>
</Accordion>bordered
<Accordion variant="bordered" defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Item 1</Accordion.Trigger>
<Accordion.Content>Content for item 1</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Item 2</Accordion.Trigger>
<Accordion.Content>Content for item 2</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-3">
<Accordion.Trigger>Item 3</Accordion.Trigger>
<Accordion.Content>Content for item 3</Accordion.Content>
</Accordion.Item>
</Accordion>splitted
<Accordion variant="splitted" defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Item 1</Accordion.Trigger>
<Accordion.Content>Content for item 1</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Item 2</Accordion.Trigger>
<Accordion.Content>Content for item 2</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-3">
<Accordion.Trigger>Item 3</Accordion.Trigger>
<Accordion.Content>Content for item 3</Accordion.Content>
</Accordion.Item>
</Accordion>Sizes
smdefaultlg| Size | Padding (trigger) | Font | Preview |
|---|---|---|---|
sm | 12px 16px | 13px (text-sm) | Content A |
default | 16px 16px | 14px (text-md) | Content A |
lg | 20px 24px | 16px (text-base) | Content A |
Features
Expand Mode
single allows one item open at a time. multiple allows several items open simultaneously.
Single (default)
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Single 1</Accordion.Trigger>
<Accordion.Content>Only one open at a time</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Single 2</Accordion.Trigger>
<Accordion.Content>Previous item closes automatically</Accordion.Content>
</Accordion.Item>
</Accordion>Multiple
<Accordion type="multiple" defaultValue={["item-1", "item-2"]}>
<Accordion.Item value="item-1">
<Accordion.Trigger>Multiple 1</Accordion.Trigger>
<Accordion.Content>Multiple items can be open</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Multiple 2</Accordion.Trigger>
<Accordion.Content>All items open independently</Accordion.Content>
</Accordion.Item>
</Accordion>Collapsible
When collapsible is true (default), clicking an open item closes it. Set to false to always keep one item expanded.
<Accordion collapsible={false} defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Always one open</Accordion.Trigger>
<Accordion.Content>This accordion always keeps one item open.</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2">
<Accordion.Trigger>Try closing me</Accordion.Trigger>
<Accordion.Content>You cannot close all items.</Accordion.Content>
</Accordion.Item>
</Accordion>Icon Position
Right (default)
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Right icon (default)</Accordion.Trigger>
<Accordion.Content>Icon on the right side</Accordion.Content>
</Accordion.Item>
</Accordion>Left
<Accordion iconPosition="left" defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Left icon</Accordion.Trigger>
<Accordion.Content>Icon on the left side</Accordion.Content>
</Accordion.Item>
</Accordion>Disabled
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Trigger>Active item</Accordion.Trigger>
<Accordion.Content>This item is active</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-2" disabled>
<Accordion.Trigger>Disabled item</Accordion.Trigger>
<Accordion.Content>This item is disabled</Accordion.Content>
</Accordion.Item>
<Accordion.Item value="item-3">
<Accordion.Trigger>Active item</Accordion.Trigger>
<Accordion.Content>This item is also active</Accordion.Content>
</Accordion.Item>
</Accordion>API
Component Structure
Accordion— Radix Accordion.ItemPropsAccordion item.TriggerPropsTrigger — supports icon prop.ContentContent area — with animationProps
Accordion (Root)
type"single""single" | "multiple"Expand mode — single allows one open, multiple allows several
collapsibletruebooleanAllow all items to be closed (single mode only)
variant"default""default" | "bordered" | "splitted"Visual style
size"default""sm" | "default" | "lg"Size of trigger and content
iconPosition"right""left" | "right"Position of the indicator icon
defaultValueundefinedstring | string[]Default expanded item (uncontrolled)
valueundefinedstring | string[]Expanded item (controlled)
onValueChangeundefined(value: string | string[]) => voidCallback fired on expand state change
disabledundefinedbooleanDisable all items
| Name | Type | Default | Description |
|---|---|---|---|
type | "single" | "multiple" | "single" | Expand mode — single allows one open, multiple allows several |
collapsible | boolean | true | Allow all items to be closed (single mode only) |
variant | "default" | "bordered" | "splitted" | "default" | Visual style |
size | "sm" | "default" | "lg" | "default" | Size of trigger and content |
iconPosition | "left" | "right" | "right" | Position of the indicator icon |
defaultValue | string | string[] | undefined | Default expanded item (uncontrolled) |
value | string | string[] | undefined | Expanded item (controlled) |
onValueChange | (value: string | string[]) => void | undefined | Callback fired on expand state change |
disabled | boolean | undefined | Disable all items |
Accordion.Item
value—stringUnique identifier for the item (required)
disabledundefinedbooleanDisable this item
| Name | Type | Default | Description |
|---|---|---|---|
value | string | — | Unique identifier for the item (required) |
disabled | boolean | undefined | Disable this item |
Accordion.Trigger
iconbuilt-in SVG (ChevronDown)ReactNodeCustom indicator icon
| Name | Type | Default | Description |
|---|---|---|---|
icon | ReactNode | built-in SVG (ChevronDown) | Custom indicator icon |
Customization
The icon prop on Accordion.Trigger lets you replace the indicator icon freely.
Plus / Minus Icons
import { Plus, Minus } from 'lucide-react'
<Accordion.Trigger
icon={
<>
<Plus className="icon-sm shrink-0 text-text-muted
group-data-[state=open]:hidden" />
<Minus className="icon-sm shrink-0 text-text-muted
hidden group-data-[state=open]:block" />
</>
}
>
Question text
</Accordion.Trigger>ChevronRight (90° rotation)
import { ChevronRight } from 'lucide-react'
<Accordion.Trigger
icon={
<ChevronRight className="icon-sm shrink-0 text-text-muted
transition-transform duration-normal accordion-chevron" />
}
>
Item text
</Accordion.Trigger>Tip: Add the accordion-chevron class to a custom icon to apply the same 180° rotation animation as the built-in icon.
Anatomy
16px0 16px 16pxicon-smBest Practices
Recommended
- ✓Use for FAQ and help sections
- ✓Group related content together
- ✓Pre-expand the most important item by default
- ✓Keep labels concise and predictive of content
Don't
- ✗Don't nest accordions inside accordions
- ✗Don't hide critical information that must always be visible
- ✗Don't use too many items — seven or fewer is recommended
- ✗Don't add unnecessary collapsing for short content
Accessibility
Keyboard
ARIA / WCAG
- role="region" on content with aria-labelledby
- aria-expanded reflects trigger state automatically
- aria-controls links trigger to content
- Disabled items are skipped in keyboard navigation