Ark Logo

Collapsible

An interactive component that can be expanded or collapsed.

Content

Animation

You can use CSS animations to create smooth transitions for opening and closing the Collapsible content. Utilize the data-state attribute in combination with the --height CSS variable to animate the open and closed states.

@keyframes slideDown {
  from { height: 0; }
  to { height: var(--height); }
}

@keyframes slideUp {
  from { height: var(--height); }
  to { height: 0; }
}

[data-scope='accordion'][data-part='item-content'][data-state='open'] {
  animation: slideDown 250ms;
}

[data-scope='accordion'][data-part='item-content'][data-state='closed'] {
  animation: slideUp 200ms;
}

Examples

Learn how to use the Collapsible component in your project. Let's examine the most basic example:

import { Collapsible } from '@ark-ui/react'

export const Basic = () => (
  <Collapsible.Root>
    <Collapsible.Trigger>Toggle</Collapsible.Trigger>
    <Collapsible.Content>Content</Collapsible.Content>
  </Collapsible.Root>
)

Events

You can listen for the onExitComplete event to know when the Collapsible.Content is no longer visible:

import { Collapsible } from '@ark-ui/react'

export const OnExitComplete = () => (
  <Collapsible.Root onExitComplete={() => alert('on exit')}>
    <Collapsible.Trigger>Toggle</Collapsible.Trigger>
    <Collapsible.Content>Content</Collapsible.Content>
  </Collapsible.Root>
)

Lazy Mount

To delay the mounting of the Collapsible.Content, use the lazyMount prop:

import { Collapsible } from '@ark-ui/react'

export const LazyMount = () => (
  <Collapsible.Root lazyMount>
    <Collapsible.Trigger>Toggle</Collapsible.Trigger>
    <Collapsible.Content>Content</Collapsible.Content>
  </Collapsible.Root>
)

Unmount on Exit

To remove the Collapsible.Content from the DOM when it is not visible, use the unmountOnExit prop:

import { Collapsible } from '@ark-ui/react'

export const UnmountOnExit = () => (
  <Collapsible.Root unmountOnExit>
    <Collapsible.Trigger>Toggle</Collapsible.Trigger>
    <Collapsible.Content>Content</Collapsible.Content>
  </Collapsible.Root>
)

Combining Lazy Mount and Unmount on Exit

Both lazyMount and unmountOnExit can be combined to ensure that the component is mounted only when the Collapsible is expanded and unmounted when it is collapsed:

import { Collapsible } from '@ark-ui/react'

export const LazyMountAndUnmountOnExit = () => (
  <Collapsible.Root lazyMount unmountOnExit>
    <Collapsible.Trigger>Toggle</Collapsible.Trigger>
    <Collapsible.Content>Content</Collapsible.Content>
  </Collapsible.Root>
)

API Reference

Root

PropDefaultType
asChild
boolean

Render as a different element type.

defaultOpen
boolean

The initial open state of the collapsible when it is first rendered. Use when you do not need to control its open state.

disabled
boolean

Whether the collapsible is disabled

id
string

The unique identifier of the machine.

ids
Partial<{ root: string; content: string; trigger: string }>

The ids of the elements in the collapsible. Useful for composition.

lazyMountfalse
boolean

Whether to enable lazy mounting

onExitComplete
() => void

Function called when the animation ends in the closed state.

onOpenChange
(details: OpenChangeDetails) => void

Function called when the popup is opened

open
boolean

Whether the collapsible is open

unmountOnExitfalse
boolean

Whether to unmount on exit.

Data AttributeValue
[data-scope]collapsible
[data-part]root
[data-state]"open" | "closed"

Content

PropDefaultType
asChild
boolean

Render as a different element type.

Data AttributeValue
[data-scope]collapsible
[data-part]content
[data-state]"open" | "closed"
[data-disabled]Present when disabled

Trigger

PropDefaultType
asChild
boolean

Render as a different element type.

Data AttributeValue
[data-scope]collapsible
[data-part]trigger
[data-state]"open" | "closed"
[data-disabled]Present when disabled

Accessibility

Keyboard Support

KeyDescription
Space
Opens/closes the collapsible.
Enter
Opens/closes the collapsible.