Accordion
The Accordion component allows you to create collapsible content panels where users can show or hide sections of information. This is useful for organizing large amounts of content in a compact way.
import {Accordion} from '@gravity-ui/uikit';
§Controlling state of accordion
You can control the accordion state using the value and onUpdate properties of the root component, or per item.
Example controlling state from the root component:
import {useState} from 'react'; import {Accordion} from '@gravity-ui/uikit'; export default function () { const [value, setValue] = useState<string | null>('item1'); return ( <Accordion value={value} onUpdate={setValue}> <Accordion.Item summary="Settings" value="item1"> Configure your application settings </Accordion.Item> <Accordion.Item summary="Notifications" value="item2"> Manage notification preferences </Accordion.Item> </Accordion> ); }
Example controlling state per item by the expanded prop:
import {useState} from 'react'; import {Accordion} from '@gravity-ui/uikit'; export default function () { const [item1, setItem1] = useState(true); const [item2, setItem2] = useState(false); return ( <Accordion> <Accordion.Item summary="Settings" onUpdate={setItem1} value="item1" expanded={item1} > Configure your application settings </Accordion.Item> <Accordion.Item summary="Notifications" onUpdate={setItem2} value="item2" expanded={item2} > Manage notification preferences </Accordion.Item> </Accordion> ); }
§Size
Use the size property to control the Accordion size. The default size is m.
import {Accordion} from '@gravity-ui/uikit'; export default function () { return ( <> <Accordion size="m"> <Accordion.Item summary="Medium Size">Content for medium accordion</Accordion.Item> </Accordion> <Accordion size="l"> <Accordion.Item summary="Large Size">Content for large accordion</Accordion.Item> </Accordion> <Accordion size="xl"> <Accordion.Item summary="Extra Large Size"> Content for extra large accordion </Accordion.Item> </Accordion> </> ); }
§View
solid: Main view with background (used by default).
top-bottom: View with top and bottom borders.
import {Accordion} from '@gravity-ui/uikit'; export default function () { return ( <> <Accordion view="solid"> <Accordion.Item summary="Solid View">Content with solid background</Accordion.Item> <Accordion.Item summary="Another Item">More content</Accordion.Item> </Accordion> <Accordion view="top-bottom"> <Accordion.Item summary="Top-Bottom View"> Content with top-bottom borders </Accordion.Item> <Accordion.Item summary="Another Item">More content</Accordion.Item> </Accordion> </> ); }
§Arrow Position
end: Arrow is positioned at the end of the header (used by default).
start: Arrow is positioned at the start of the header.
import {Accordion} from '@gravity-ui/uikit'; export default function () { return ( <> <Accordion arrowPosition="end"> <Accordion.Item summary="Arrow at End">Content with arrow at the end</Accordion.Item> </Accordion> <Accordion arrowPosition="start"> <Accordion.Item summary="Arrow at Start"> Content with arrow at the start </Accordion.Item> </Accordion> </> ); }
§Multiple
The multiple property allows multiple accordion items to be expanded simultaneously.
import {Accordion} from '@gravity-ui/uikit'; export default function () { return ( <Accordion multiple> <Accordion.Item summary="First Item">Content of the first item</Accordion.Item> <Accordion.Item summary="Second Item">Content of the second item</Accordion.Item> <Accordion.Item summary="Third Item">Content of the third item</Accordion.Item> </Accordion> ); }
§Custom Summary
Use the Accordion.Summary component to create a custom header.
import {Accordion, Button} from '@gravity-ui/uikit'; export default function () { return ( <Accordion> <Accordion.Item value="custom"> <Accordion.Summary> {(props) => ( <Button {...props} view="flat" width="max"> Custom Summary Button </Button> )} </Accordion.Summary> Content with custom summary component </Accordion.Item> <Accordion.Item summary="Regular Summary"> Content with regular summary prop </Accordion.Item> </Accordion> ); }
§Disabled State
Individual accordion items can be disabled using the disabled property.
import {Accordion} from '@gravity-ui/uikit'; export default function () { return ( <Accordion> <Accordion.Item summary="Active Item"> This item is active and can be expanded </Accordion.Item> <Accordion.Item summary="Disabled Item" disabled> This item is disabled and cannot be expanded </Accordion.Item> </Accordion> ); }
§Properties
§Accordion
| Name | Description | Type | Default |
|---|---|---|---|
| size | Accordion size | "m" "l" "xl" | "m" |
| view | Accordion appearance | "solid" "top-bottom" | "solid" |
| multiple | Allow multiple items to be expanded simultaneously | boolean | false |
| arrowPosition | Arrow indicator position | "start" "end" | "end" |
| defaultValue | Default value for uncontrolled state | string string[] null | |
| value | Current value for controlled state | string string[] null | |
| onUpdate | Callback function called when state changes | Function | |
| ariaLevel | Heading level for accessibility | number | 3 |
| className | CSS class name | string | |
| qa | HTML data-qa attribute, used for testing | string |
§Accordion.Item
| Name | Description | Type | Default |
|---|---|---|---|
| value | Unique identifier for the item | string | |
| summary | Accordion item header | React.ReactNode | |
| expanded | Controlled expanded state | boolean | |
| defaultExpanded | Default expanded state | boolean | |
| disabled | Disables the accordion item | boolean | false |
| keepMounted | Keep content in DOM even when collapsed | boolean | |
| onUpdate | Callback function called when item state changes | Function | |
| className | CSS class name | string | |
| qa | HTML data-qa attribute, used for testing | string |
§Accordion.Summary
| Name | Description | Type | Default |
|---|---|---|---|
| children | Custom summary render function | (props, defaultSummary) => React.ReactElement | |
| qa | HTML data-qa attribute, used for testing. Works only if qa passed in Accordion.Item | string | ${accordion-item}-summary if qa passed in Accordion.Item, disclosure-summary if not |
§CSS API
| Name | Description |
|---|---|
--g-accordion-padding-inline | Inline (horizontal) padding for accordion |