Tally UI
Primitives

Accordion

A vertically stacked set of collapsible sections, allowing one or multiple to be expanded.

Import

import { Accordion } from '@tallyui/primitives';

Usage

<Accordion.Root type="single" collapsible>
  <Accordion.Item value="faq-1">
    <Accordion.Header>
      <Accordion.Trigger>
        <Text>What are primitives?</Text>
      </Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Content>
      <Text>Headless, accessible UI building blocks.</Text>
    </Accordion.Content>
  </Accordion.Item>
</Accordion.Root>

Components

Accordion.Root

Container that manages which items are expanded. The type prop determines single or multiple expansion.

Single mode:

PropTypeDefaultDescription
type'single'requiredOnly one item open at a time
valuestringControlled expanded value
defaultValuestringInitial value (uncontrolled)
onValueChange(value: string) => voidCalled when value changes
collapsiblebooleanfalseAllow closing all items
disabledbooleanfalseDisables all items
asChildbooleanfalseMerge props onto child instead of rendering

Multiple mode:

PropTypeDefaultDescription
type'multiple'requiredMultiple items can be open
valuestring[]Controlled expanded values
defaultValuestring[]Initial values (uncontrolled)
onValueChange(value: string[]) => voidCalled when values change
disabledbooleanfalseDisables all items
asChildbooleanfalseMerge props onto child instead of rendering

Plus all React Native ViewProps.

Accordion.Item

A single collapsible section.

PropTypeDefaultDescription
valuestringrequiredUnique identifier for this item
disabledbooleanfalseDisables this item
asChildbooleanfalseMerge props onto child instead of rendering

Plus all React Native ViewProps.

Accordion.Header

Wraps the trigger, providing heading semantics.

PropTypeDefaultDescription
asChildbooleanfalseMerge props onto child instead of rendering

Plus all React Native ViewProps.

Accordion.Trigger

A pressable that toggles the parent Item.

PropTypeDefaultDescription
asChildbooleanfalseMerge props onto child instead of rendering

Plus all React Native PressableProps.

Accordion.Content

The collapsible content area. Hidden when the parent Item is collapsed.

PropTypeDefaultDescription
forceMounttrueAlways render regardless of expanded state
asChildbooleanfalseMerge props onto child instead of rendering

Plus all React Native ViewProps.

Accessibility

  • ARIA: aria-expanded on Trigger, aria-controls linking Trigger to Content
  • Keyboard: Space/Enter to toggle, arrow keys to navigate between items on web

Examples

Multiple expansion

function FAQ() {
  const [expanded, setExpanded] = React.useState<string[]>([]);

  return (
    <Accordion.Root type="multiple" value={expanded} onValueChange={setExpanded}>
      <Accordion.Item value="q1">
        <Accordion.Header>
          <Accordion.Trigger><Text>Question 1</Text></Accordion.Trigger>
        </Accordion.Header>
        <Accordion.Content><Text>Answer 1</Text></Accordion.Content>
      </Accordion.Item>
      <Accordion.Item value="q2">
        <Accordion.Header>
          <Accordion.Trigger><Text>Question 2</Text></Accordion.Trigger>
        </Accordion.Header>
        <Accordion.Content><Text>Answer 2</Text></Accordion.Content>
      </Accordion.Item>
    </Accordion.Root>
  );
}

On this page