Skip to main content
Version: Next

Collapsible

Use Collapsible to create expandable panels with customizable headers, captions, meta information, and content areas. Perfect for grouping related information while keeping the interface clean.

import { Collapsible, Badge } from '@editora/ui-react';

function Example() {
return (
<Collapsible open>
<Collapsible.Header>Compliance Configuration</Collapsible.Header>
<Collapsible.Caption>Security, auditing, and release governance</Collapsible.Caption>
<Collapsible.Meta>
<Badge tone="brand">Enterprise</Badge>
</Collapsible.Meta>
<Collapsible.Content>
<div>1. Require reviewer approval for enterprise policy changes.</div>
<div>2. Enforce audit trail retention for 365 days.</div>
<div>3. Limit export scope for restricted patient records.</div>
</Collapsible.Content>
</Collapsible>
);
}

Props

Collapsible (Root)

PropTypeDefaultDescription
openbooleanfalseWhether the collapsible is initially expanded.
headlessbooleanfalseDisables the header and toggle button rendering.
disabledbooleanfalseDisables toggling the collapsible.
readOnlybooleanfalsePrevents state changes via user interaction.
state'idle' | 'loading' | 'error' | 'success''idle'Workflow state styling.
size'sm' | 'md' | 'lg''md'Size of the collapsible.
variant'default' | 'subtle' | 'outline' | 'ghost''default'Visual style variant.
tone'neutral' | 'info' | 'success' | 'warning' | 'danger''neutral'Accent tone.
radiusnumber | string | 'none' | 'sm' | 'md' | 'lg' | 'full''md'Corner radius. Numbers are treated as pixels and full creates a pill shape.
iconPosition'left' | 'right''right'Position of the toggle icon.
closeOnEscapebooleantrueClose the collapsible when Escape key is pressed.
onToggle(open: boolean) => void-Fired when toggled.
onChangeOpen(open: boolean) => void-Alias for onToggle.
onToggleDetail(detail) => void-Fired with detailed toggle information.
onChangeDetail(detail) => void-Alias for onToggleDetail.

Sub-components

Collapsible.Header

The header/title of the collapsible. Typically contains the main label.

<Collapsible.Header>
<Flex align="center" style={{ gap: 8 }}>
<ShieldIcon size={15} />
Compliance Configuration
</Flex>
</Collapsible.Header>

Collapsible.Caption

Optional descriptive text shown below the header.

<Collapsible.Caption>
Security, auditing, and release governance
</Collapsible.Caption>

Collapsible.Meta

Optional metadata, badges, or secondary information displayed in the header area.

<Collapsible.Meta>
<Badge tone="brand">Enterprise</Badge>
</Collapsible.Meta>

Collapsible.Content

The main content area that expands/collapses.

<Collapsible.Content>
<Grid style={{ display: 'grid', gap: 8 }}>
<Box>Item 1</Box>
<Box>Item 2</Box>
</Grid>
</Collapsible.Content>

Examples

Basic Collapsible

<Collapsible>
<Collapsible.Header>Section Title</Collapsible.Header>
<Collapsible.Content>
This is the expandable content.
</Collapsible.Content>
</Collapsible>

With Icons and Badges

<Collapsible tone="info" variant="subtle">
<Collapsible.Header>
<Flex align="center" style={{ gap: 8 }}>
<InfoIcon size={15} />
Important Information
</Flex>
</Collapsible.Header>
<Collapsible.Caption>Additional context about this section</Collapsible.Caption>
<Collapsible.Meta>
<Badge>New</Badge>
</Collapsible.Meta>
<Collapsible.Content>
Content goes here...
</Collapsible.Content>
</Collapsible>

With State Feedback

const [state, setState] = React.useState('idle');

<Collapsible
state={state}
tone={state === 'error' ? 'danger' : state === 'success' ? 'success' : 'neutral'}
onToggleDetail={(detail) => {
setState('loading');
// perform async operation...
}}
>
<Collapsible.Header>Process Status</Collapsible.Header>
<Collapsible.Caption>Monitor the current operation</Collapsible.Caption>
<Collapsible.Content>
Loading..., Error occurred, or Success message
</Collapsible.Content>
</Collapsible>

Variants

<Collapsible variant="default">...</Collapsible>
<Collapsible variant="subtle">...</Collapsible>
<Collapsible variant="outline">...</Collapsible>
<Collapsible variant="ghost">...</Collapsible>

Sizes

<Collapsible size="sm">...</Collapsible>
<Collapsible size="md">...</Collapsible>
<Collapsible size="lg">...</Collapsible>

Tones

<Collapsible tone="neutral">...</Collapsible>
<Collapsible tone="info">...</Collapsible>
<Collapsible tone="success">...</Collapsible>
<Collapsible tone="warning">...</Collapsible>
<Collapsible tone="danger">...</Collapsible>

Controlled State

function ControlledCollapsible() {
const [open, setOpen] = React.useState(false);

return (
<Collapsible open={open} onChangeOpen={setOpen}>
<Collapsible.Header>Expandable Section</Collapsible.Header>
<Collapsible.Content>
This content expands and collapses based on the open state.
</Collapsible.Content>
</Collapsible>
);
}