Collapsible
Features
- Full keyboard navigation.
 - Can be controlled or uncontrolled.
 
Installation
Install the component from your command line.
$ npm add reka-uiAnatomy
Import the components and piece the parts together.
<script setup>
import { CollapsibleContent, CollapsibleRoot, CollapsibleTrigger } from 'reka-ui'
</script>
<template>
  <CollapsibleRoot>
    <CollapsibleTrigger />
    <CollapsibleContent />
  </CollapsibleRoot>
</template>API Reference
Root
Contains all the parts of a collapsible
| Prop | Default | Type | 
|---|---|---|
as | 'div' | AsTag | ComponentThe element or component this component should render as. Can be overwrite by   | 
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details.  | |
defaultOpen | false | booleanThe open state of the collapsible when it is initially rendered.   | 
disabled | booleanWhen   | |
open | booleanThe controlled open state of the collapsible. Can be binded with   | |
unmountOnHide | true | booleanWhen   | 
| Emit | Payload | 
|---|---|
update:open | [value: boolean]Event handler called when the open state of the collapsible changes.  | 
| Slots (default) | Payload | 
|---|---|
open | booleanCurrent open state  | 
| Data Attribute | Value | 
|---|---|
[data-state] | "open" | "closed" | 
[data-disabled] | Present when disabled | 
Trigger
The button that toggles the collapsible
| Prop | Default | Type | 
|---|---|---|
as | 'button' | AsTag | ComponentThe element or component this component should render as. Can be overwrite by   | 
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details.  | 
| Data Attribute | Value | 
|---|---|
[data-state] | "open" | "closed" | 
[data-disabled] | Present when disabled | 
Content
The component that contains the collapsible content.
| Prop | Default | Type | 
|---|---|---|
as | 'div' | AsTag | ComponentThe element or component this component should render as. Can be overwrite by   | 
asChild | booleanChange the default rendered element for the one passed as a child, merging their props and behavior. Read our Composition guide for more details.  | |
forceMount | booleanUsed to force mounting when more control is needed. Useful when controlling animation with Vue animation libraries.  | 
| Data Attribute | Value | 
|---|---|
[data-state] | "open" | "closed" | 
[data-disabled] | Present when disabled | 
| CSS Variable | Description | 
|---|---|
--reka-collapsible-content-width | The width of the content when it opens/closes  | 
--reka-collapsible-content-height | The height of the content when it opens/closes  | 
Examples
Animating content size
Use the --reka-collapsible-content-width and/or --reka-collapsible-content-height CSS variables to animate the size of the content when it opens/closes. Here's a demo:
// index.vue
<script setup>
import { CollapsibleContent, CollapsibleRoot, CollapsibleTrigger } from 'reka-ui'
import './styles.css'
</script>
<template>
  <CollapsibleRoot>
    <CollapsibleTrigger>…</CollapsibleTrigger>
    <CollapsibleContent class="CollapsibleContent">
      …
    </CollapsibleContent>
  </CollapsibleRoot>
</template>/* styles.css */
.CollapsibleContent {
  overflow: hidden;
}
.CollapsibleContent[data-state="open"] {
  animation: slideDown 300ms ease-out;
}
.CollapsibleContent[data-state="closed"] {
  animation: slideUp 300ms ease-out;
}
@keyframes slideDown {
  from {
    height: 0;
  }
  to {
    height: var(--reka-collapsible-content-height);
  }
}
@keyframes slideUp {
  from {
    height: var(--reka-collapsible-content-height);
  }
  to {
    height: 0;
  }
}Accessibility
Adheres to the Disclosure WAI-ARIA design pattern.
Keyboard Interactions
| Key | Description | 
|---|---|
Space  | Opens/closes the collapsible  | 
Enter  | Opens/closes the collapsible  | 
