Tally UI
UI

Collapsible

A single section that can be expanded or collapsed by a trigger.

Import

import {
  Collapsible,
  CollapsibleTrigger,
  CollapsibleContent,
  Text,
} from '@tallyui/components';

Usage

<Collapsible>
  <CollapsibleTrigger>
    <Text>Toggle details</Text>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Text>Hidden content revealed on press.</Text>
  </CollapsibleContent>
</Collapsible>

Collapsible wraps the Collapsible primitive from @tallyui/primitives. It provides a straightforward show/hide pattern for a single section. For multiple collapsible sections, consider using Accordion instead.

Components

Collapsible

The root component. Manages the open/closed state.

PropTypeDefaultDescription
openboolean-Controlled open state
defaultOpenbooleanfalseUncontrolled initial open state
onOpenChange(open: boolean) => void-Called when the open state changes
disabledbooleanfalsePrevents the trigger from toggling
classNamestring-Additional NativeWind classes merged via cn()

Plus all React Native ViewProps.

CollapsibleTrigger

A pressable element that toggles the collapsible open and closed. This is a direct passthrough of the primitive trigger with no additional styling.

PropTypeDefaultDescription
asChildbooleanfalseMerges props onto the child element instead of rendering a default Pressable
classNamestring-Additional NativeWind classes merged via cn()

Plus all React Native PressableProps.

CollapsibleContent

The collapsible body. Uses TextClassContext to apply text-sm to descendant text. On web, content transitions smoothly with CSS.

Default classes: overflow-hidden

PropTypeDefaultDescription
forceMountbooleanfalseWhen true, content stays in the DOM even when closed
classNamestring-Additional NativeWind classes merged via cn()

Plus all React Native ViewProps.

Examples

Uncontrolled

<Collapsible>
  <CollapsibleTrigger>
    <Text>Show more</Text>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Text>This content is hidden by default and revealed on press.</Text>
  </CollapsibleContent>
</Collapsible>

Controlled

const [isOpen, setIsOpen] = useState(false);

<Collapsible open={isOpen} onOpenChange={setIsOpen}>
  <CollapsibleTrigger>
    <Text>{isOpen ? 'Hide' : 'Show'} details</Text>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Text>Controlled content. Open state: {String(isOpen)}</Text>
  </CollapsibleContent>
</Collapsible>

Default open

<Collapsible defaultOpen>
  <CollapsibleTrigger>
    <Text>Collapse this section</Text>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Text>This section starts expanded and can be collapsed.</Text>
  </CollapsibleContent>
</Collapsible>

With a styled trigger

<Collapsible>
  <CollapsibleTrigger asChild>
    <Button variant="outline">
      <Text>Toggle Section</Text>
    </Button>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Card className="mt-2">
      <CardContent className="pt-6">
        <Text>Content inside a card, toggled by a button.</Text>
      </CardContent>
    </Card>
  </CollapsibleContent>
</Collapsible>

Disabled

<Collapsible disabled>
  <CollapsibleTrigger>
    <Text className="text-muted-foreground">Cannot toggle (disabled)</Text>
  </CollapsibleTrigger>
  <CollapsibleContent>
    <Text>This content won't be shown.</Text>
  </CollapsibleContent>
</Collapsible>

On this page