Skip to Content
ComponentsAccordion

Accordion

The Accordion component provides collapsible content sections with smooth animations and flexible configuration.

Anatomy

Import all parts and piece them together.

import { Accordion } from '@xsolla-zk/react' export default () => ( <Accordion> <Accordion.Item> <Accordion.Header> <Accordion.Trigger /> </Accordion.Header> <Accordion.HeightAnimator> <Accordion.Content /> </Accordion.HeightAnimator> </Accordion.Item> </Accordion> )

Examples

Basic example

import { Accordion, Typography, RichIcon } from '@xsolla-zk/react' import { ChevronDown } from '@xsolla-zk/icons' function App() { return ( <Accordion type="single"> <Accordion.Item value="item-1"> <Accordion.Header asChild> <Accordion.Trigger> {({ open }) => ( <> <Typography preset="compact.300.default">Header</Typography> <RichIcon size="$200" animation="bounceReturn" rotate={open ? '180deg' : '0deg'} > <RichIcon.Icon icon={ChevronDown} /> </RichIcon> </> )} </Accordion.Trigger> </Accordion.Header> <Accordion.HeightAnimator animation="bounceReturn"> <Accordion.Content animation="bounceReturn" exitStyle={{ opacity: 0 }}> <Typography>Content goes here</Typography> </Accordion.Content> </Accordion.HeightAnimator> </Accordion.Item> </Accordion> ) }

Multiple sections

import { Accordion, Typography, RichIcon } from '@xsolla-zk/react' import { ChevronDown } from '@xsolla-zk/icons' function App() { return ( <Accordion type="single" gap="$200"> <Accordion.Item value="item-1" backgroundColor="$overlay.neutral"> <Accordion.Header asChild> <Accordion.Trigger> {({ open }) => ( <> <Typography preset="compact.300.default">Header 1</Typography> <RichIcon size="$200" animation="bounceReturn" rotate={open ? '180deg' : '0deg'} > <RichIcon.Icon icon={ChevronDown} /> </RichIcon> </> )} </Accordion.Trigger> </Accordion.Header> <Accordion.HeightAnimator animation="bounceReturn"> <Accordion.Content animation="bounceReturn" exitStyle={{ opacity: 0 }}> <Typography>First section content</Typography> </Accordion.Content> </Accordion.HeightAnimator> </Accordion.Item> <Accordion.Item value="item-2" backgroundColor="$overlay.neutral"> <Accordion.Header asChild> <Accordion.Trigger> {({ open }) => ( <> <Typography preset="compact.300.default">Header 2</Typography> <RichIcon size="$200" animation="bounceReturn" rotate={open ? '180deg' : '0deg'} > <RichIcon.Icon icon={ChevronDown} /> </RichIcon> </> )} </Accordion.Trigger> </Accordion.Header> <Accordion.HeightAnimator animation="bounceReturn"> <Accordion.Content animation="bounceReturn" exitStyle={{ opacity: 0 }}> <Typography>Second section content</Typography> </Accordion.Content> </Accordion.HeightAnimator> </Accordion.Item> </Accordion> ) }

All Types

Single (only one item can be open)

<Accordion type="single"> {/* Items */} </Accordion>

Multiple (multiple items can be open)

<Accordion type="multiple"> {/* Items */} </Accordion>

Single with toggle (can close all items)

<Accordion type="single" toggleable> {/* Items */} </Accordion>

With default value

<Accordion type="single" defaultValue="item-2"> {/* Items */} </Accordion>

Custom trigger layout

import { Accordion, Typography, RichIcon } from '@xsolla-zk/react' import { ChevronDown } from '@xsolla-zk/icons' function App() { return ( <Accordion type="single"> <Accordion.Item value="item-1"> <Accordion.Header> <Typography preset="compact.300.default">Header</Typography> <Accordion.Trigger> {({ open }) => ( <RichIcon size="$200" animation="bounceReturn" rotate={open ? '180deg' : '0deg'} > <RichIcon.Icon icon={ChevronDown} /> </RichIcon> )} </Accordion.Trigger> </Accordion.Header> <Accordion.HeightAnimator animation="bounceReturn"> <Accordion.Content animation="bounceReturn" exitStyle={{ opacity: 0 }}> <Typography>Content with separate trigger</Typography> </Accordion.Content> </Accordion.HeightAnimator> </Accordion.Item> </Accordion> ) }

API

Accordion Props

Accordion extends Tamagui stack views inheriting all standard props, plus:

PropTypeDefaultDescription
type'single' | 'multiple'-Accordion behavior type
defaultValuestring-Default open item (single type)
valuestring-Controlled open item (single type)
onValueChange(value: string) => void-Value change handler (single type)
toggleablebooleanfalseAllow closing all items (single type)
gapSizeTokens-Gap between items

Accordion.Item Props

PropTypeDefaultDescription
valuestring-Unique item identifier
disabledbooleanfalseDisables the item

Accordion.Header Props

Container for the accordion header content.

Accordion.Trigger Props

Trigger component that receives open state via render prop.

PropTypeDefaultDescription
children({ open: boolean }) => ReactNode-Render function with open state

Accordion.HeightAnimator Props

Wrapper for content animation.

Accordion.Content Props

Container for accordion content.

Accessibility

  • Implements WAI-ARIA accordion pattern
  • Supports keyboard navigation (Enter, Space, Arrow keys)
  • Proper focus management
  • Screen reader compatible
  • Automatic ARIA attributes management