

<InteractiveDemo name="collapsible" controls="[&#x22;isDisabled&#x22;]" />

## Installation [#installation]

<CodeBlockTabs defaultValue="npm" groupId="package-manager">
  <CodeBlockTabsList>
    <CodeBlockTabsTrigger value="npm">
      npm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="pnpm">
      pnpm
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="yarn">
      yarn
    </CodeBlockTabsTrigger>

    <CodeBlockTabsTrigger value="bun">
      bun
    </CodeBlockTabsTrigger>
  </CodeBlockTabsList>

  <CodeBlockTab value="npm">
    ```bash
    npx shadcn@latest add @dotui/collapsible
    ```
  </CodeBlockTab>

  <CodeBlockTab value="pnpm">
    ```bash
    pnpm dlx shadcn@latest add @dotui/collapsible
    ```
  </CodeBlockTab>

  <CodeBlockTab value="yarn">
    ```bash
    yarn dlx shadcn@latest add @dotui/collapsible
    ```
  </CodeBlockTab>

  <CodeBlockTab value="bun">
    ```bash
    bun x shadcn@latest add @dotui/collapsible
    ```
  </CodeBlockTab>
</CodeBlockTabs>

## Anatomy [#anatomy]

```tsx
import {
  Collapsible,
  CollapsiblePanel,
  CollapsibleTrigger,
} from "@/components/ui/collapsible"
```

```tsx
<Collapsible>
  <CollapsibleTrigger>Show details</CollapsibleTrigger>
  <CollapsiblePanel>Content</CollapsiblePanel>
</Collapsible>
```

A collapsible carries no look of its own: `CollapsibleTrigger` is a bare button for custom layouts, and any `Button` with `slot="trigger"` works in its place. Style the open state from the root's `group-expanded/collapsible` variant. For a stack of headed sections, use [Accordion](/docs/components/accordion).

```tsx
import { Button } from "@/components/ui/button"
import { ChevronDownIcon } from "your-icon-library"
```

```tsx
<Collapsible>
  <Button slot="trigger" variant="quiet">
    Show details
    <ChevronDownIcon className="transition-transform group-expanded/collapsible:rotate-180" />
  </Button>
  <CollapsiblePanel>Content</CollapsiblePanel>
</Collapsible>
```

## Open state [#open-state]

Use `defaultExpanded` for uncontrolled state, or `isExpanded` with `onExpandedChange` to control it.

```tsx
const [isExpanded, setExpanded] = React.useState(false)

<Collapsible isExpanded={isExpanded} onExpandedChange={setExpanded}>
  <CollapsibleTrigger>Show details</CollapsibleTrigger>
  <CollapsiblePanel>…</CollapsiblePanel>
</Collapsible>
```

## Examples [#examples]

<Examples className="sm:grid-cols-2">
  <Example name="collapsible/demos/basic" title="Basic" />

  <Example name="collapsible/demos/custom-trigger" title="Custom trigger" />

  <Example name="collapsible/demos/controlled" title="Controlled" />

  <Example name="collapsible/demos/default-expanded" title="Default expanded" />
</Examples>

## API Reference [#api-reference]

### Collapsible [#collapsible]

<Reference name="collapsible" />

### CollapsibleTrigger [#collapsibletrigger]

<Reference name="collapsible-trigger" />

### CollapsiblePanel [#collapsiblepanel]

<Reference name="collapsible-panel" />
