AccordionUpdated
A collapsible content panel for organizing information in a compact space
Import
import { Accordion } from '@heroui/react';Usage
import {
ArrowsRotateLeft,
Box,
ChevronDown,
CreditCard,Anatomy
Import the Accordion component and access all parts using dot notation.
import { Accordion } from '@heroui/react';
export default () => (
<Accordion>
<Accordion.Item>
<Accordion.Heading>
<Accordion.Trigger>
<Accordion.Indicator />
</Accordion.Trigger>
</Accordion.Heading>
<Accordion.Panel>
<Accordion.Body/>
</Accordion.Panel>
</Accordion.Item>
</Accordion>
)Surface
import {
ArrowsRotateLeft,
Box,
ChevronDown,
CreditCard,Multiple Expanded
import {Accordion} from "@heroui/react";
export function Multiple() {
return (
<Accordion allowsMultipleExpanded className="w-full max-w-md">Custom Indicator
"use client";
import type {Key} from "@heroui/react";
import {ChevronsDown, CircleChevronDown, Minus, Plus} from "@gravity-ui/icons";Disabled State
Entire accordion disabled
Individual items disabled
import {Accordion} from "@heroui/react";
export function Disabled() {
return (
<div className="flex w-full flex-col items-center gap-8">FAQ Layout
Frequently Asked Questions
Everything you need to know about licensing and usage.
General
Licensing
Support
import {ChevronDown} from "@gravity-ui/icons";
import {Accordion} from "@heroui/react";
export function FAQ() {
const categories = [Custom Styles
import {ChevronDown} from "@gravity-ui/icons";
import {Accordion, cn} from "@heroui/react";
const items = [
{Without Separator
import {ChevronDown, CreditCard, Receipt, ShoppingBag} from "@gravity-ui/icons";
import {Accordion} from "@heroui/react";
const items = [
{Styling
Passing Tailwind CSS classes
"use client";
import { Accordion, cn } from "@heroui/react";
import {Icon} from "@iconify/react";
Customizing the component classes
To customize the Accordion component classes, you can use the @layer components directive.
Learn more.
@layer components {
.accordion {
@apply rounded-xl bg-gray-50;
}
.accordion__trigger {
@apply font-semibold text-lg;
}
.accordion--outline {
@apply shadow-lg border-2;
}
}HeroUI follows the BEM methodology to ensure component variants and states are reusable and easy to customize.
CSS Classes
The Accordion component uses these CSS classes (View source styles):
Base Classes
.accordion- Base accordion container.accordion__body- Content body container.accordion__heading- Heading wrapper.accordion__indicator- Expand/collapse indicator icon.accordion__item- Individual accordion item.accordion__panel- Collapsible panel container.accordion__trigger- Clickable trigger button
Variant Classes
.accordion--outline- Outline variant with border and background
State Classes
.accordion__trigger[aria-expanded="true"]- Expanded state.accordion__panel[aria-hidden="false"]- Panel visible state
Interactive States
The component supports both CSS pseudo-classes and data attributes for flexibility:
- Hover:
:hoveror[data-hovered="true"]on trigger - Focus:
:focus-visibleor[data-focus-visible="true"]on trigger - Disabled:
:disabledor[aria-disabled="true"]on trigger - Expanded:
[aria-expanded="true"]on trigger
API Reference
Accordion Props
| Prop | Type | Default | Description |
|---|---|---|---|
allowsMultipleExpanded | boolean | false | Whether multiple items can be expanded at once |
defaultExpandedKeys | Iterable<Key> | - | The initial expanded keys |
expandedKeys | Iterable<Key> | - | The controlled expanded keys |
onExpandedChange | (keys: Set<Key>) => void | - | Handler called when expanded keys change |
isDisabled | boolean | false | Whether the entire accordion is disabled |
variant | "default" | "surface" | "default" | The visual variant of the accordion |
hideSeparator | boolean | false | Hide separator lines between accordion items |
className | string | - | Additional CSS classes |
children | ReactNode | - | The accordion items |
Accordion.Item Props
| Prop | Type | Default | Description |
|---|---|---|---|
id | Key | - | Unique identifier for the item |
isDisabled | boolean | false | Whether this item is disabled |
defaultExpanded | boolean | false | Whether item is initially expanded |
isExpanded | boolean | - | Controlled expanded state |
onExpandedChange | (isExpanded: boolean) => void | - | Handler for expanded state changes |
className | string | - | Additional CSS classes |
children | ReactNode | - | The item content |
Accordion.Trigger Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | RenderFunction | - | Trigger content or render function |
onPress | () => void | - | Additional press handler |
isDisabled | boolean | - | Whether trigger is disabled |
Accordion.Panel Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Panel content |
Accordion.Indicator Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Custom indicator icon |
Accordion.Body Props
| Prop | Type | Default | Description |
|---|---|---|---|
className | string | - | Additional CSS classes |
children | ReactNode | - | Body content |



