ExpansionPanel
A component for creating accordion-style expansion panels with proper ARIA support.
Usage
Group a set of panels into an accordion where opening one can collapse the others. Bind v-model to track which panel is open — or, in multiple mode, which panels.
Expanded:
Anatomy
<script setup lang="ts">
import { ExpansionPanel } from '@vuetify/v0'
</script>
<template>
<ExpansionPanel.Group>
<ExpansionPanel.Root>
<ExpansionPanel.Header>
<ExpansionPanel.Activator>
<ExpansionPanel.Cue />
</ExpansionPanel.Activator>
</ExpansionPanel.Header>
<ExpansionPanel.Content />
</ExpansionPanel.Root>
</ExpansionPanel.Group>
</template>Examples
Reading: How long does shipping take?
One question opens at a time. Pass multiple to ExpansionPanel.Group to let several answers stay open together.
Accessibility
ExpansionPanel follows the WAI-ARIA Accordion pattern↗︎. ExpansionPanel.Header renders a heading (<h3> by default) that wraps the ExpansionPanel.Activator button, so screen-reader users can move between panels by heading.
ARIA Attributes
| Attribute | Value | Element |
|---|---|---|
role | button (only when Activator is not a native <button>) | Activator |
aria-expanded | true / false | Activator |
aria-controls | Content region ID | Activator |
aria-disabled | true / false | Activator |
role | region | Content |
aria-labelledby | Activator ID | Content |
hidden | Present when collapsed | Content |
aria-hidden | true | Cue |
The Activator and Content IDs are paired: aria-controls on the Activator points at the Content, and aria-labelledby on the Content points back at the Activator. The Cue chevron is decorative and hidden from assistive technology.
Keyboard Navigation
| Key | Action |
|---|---|
Enter | Toggles the focused panel |
Space | Toggles the focused panel |
FAQ
By default the Group is single-open. Add multiple to ExpansionPanel.Group and bind its v-model to an array — it’s built on createSelection, so the same mandatory and enroll options apply.
ExpansionPanel coordinates a set of sibling panels — opening one can collapse the others. For a single standalone disclosure with no sibling coordination, reach for Collapsible instead.
ExpansionPanel.Cue emits data-state="open" / data-state="closed" on its element. Style it with a data-attribute utility like data-[state=open]:rotate-180 — no JavaScript class toggling needed.