Accordion
Displays collapsible content panels for presenting information in a limited amount of space.
First release: 1.0.0 Latest update: July 1, 2025 Current version: 1.0.0
Import
import { PlusAccordion } from '@plusui/react';import { PlusAccordionComponent } from '@plusui/angular';import { PlusAccordion } from '@plusui/vue';import PlusAccordion from '@plusui/svelte';<script src="https://cdn.jsdelivr.net/npm/@plusui/core"></script>Package
@plusui/react@plusui/angular@plusui/vue@plusui/svelte@plusui/coreDocs
Changelog
Accordion Changelog
Recent changes and updates for the accordion component
v1.0.0
Added Accordion component for collapsible content
- Individual accordion with expand/collapse
- Group support with single/multiple expansion
- Custom icons and animations
- Accessibility with ARIA attributes
The Accordion component allows users to toggle the visibility of content sections. It’s often used for FAQs, settings panels, or anywhere information needs to be organized concisely. Individual accordion items (<plus-accordion>) should typically be wrapped in an <plus-accordion-group> for proper styling and behavior, especially when multiple items are present.
Anatomy
Section titled “Anatomy”
Basic Example
Section titled “Basic Example”A single accordion item consists of a header and a panel. Clicking the header toggles the panel’s visibility.
import { PlusAccordion } from '@plusui/react';
export default () => { return ( <> <PlusAccordion> <div slot="header"> Accordion Title </div> <div slot="panel"> Accordion Content </div> </PlusAccordion> </> );};import { Component } from '@angular/core';
@Component({ selector: 'app-example', template: ` <plus-accordion> <div slot="header"> Accordion Title </div> <div slot="panel"> Accordion Content </div> </plus-accordion> `})export class ExampleComponent {}<template> <plus-accordion> <div slot="header"> Accordion Title </div> <div slot="panel"> Accordion Content </div> </plus-accordion></template><plus-accordion> <div slot="header"> Accordion Title </div> <div slot="panel"> Accordion Content </div></plus-accordion><plus-accordion> <div slot="header"> Accordion Title </div> <div slot="panel"> Accordion Content </div></plus-accordion>Grouping Accordions
Section titled “Grouping Accordions”Wrap multiple <plus-accordion> elements in <plus-accordion-group> for proper styling and interaction. By default, only one accordion within a group can be open at a time.
import { PlusAccordionGroup, PlusAccordion } from '@plusui/react';
export default () => { return ( <> <PlusAccordionGroup> <PlusAccordion> <div slot="header"> First Item </div> <div slot="panel"> Content for the first item. </div> </PlusAccordion> <PlusAccordion> <div slot="header"> Second Item </div> <div slot="panel"> Content for the second item. </div> </PlusAccordion> <PlusAccordion> <div slot="header"> Third Item </div> <div slot="panel"> Content for the third item. </div> </PlusAccordion> </PlusAccordionGroup> </> );};import { Component } from '@angular/core';
@Component({ selector: 'app-example', template: ` <plus-accordion-group> <plus-accordion> <div slot="header"> First Item </div> <div slot="panel"> Content for the first item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Second Item </div> <div slot="panel"> Content for the second item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Third Item </div> <div slot="panel"> Content for the third item. </div> </plus-accordion> </plus-accordion-group> `})export class ExampleComponent {}<template> <plus-accordion-group> <plus-accordion> <div slot="header"> First Item </div> <div slot="panel"> Content for the first item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Second Item </div> <div slot="panel"> Content for the second item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Third Item </div> <div slot="panel"> Content for the third item. </div> </plus-accordion> </plus-accordion-group></template><plus-accordion-group> <plus-accordion> <div slot="header"> First Item </div> <div slot="panel"> Content for the first item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Second Item </div> <div slot="panel"> Content for the second item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Third Item </div> <div slot="panel"> Content for the third item. </div> </plus-accordion></plus-accordion-group><plus-accordion-group> <plus-accordion> <div slot="header"> First Item </div> <div slot="panel"> Content for the first item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Second Item </div> <div slot="panel"> Content for the second item. </div> </plus-accordion> <plus-accordion> <div slot="header"> Third Item </div> <div slot="panel"> Content for the third item. </div> </plus-accordion></plus-accordion-group>Multiple Open Items
Section titled “Multiple Open Items”Set the multi attribute on <plus-accordion-group> to allow multiple accordion items within the group to be open simultaneously.
open attribute.import { PlusAccordionGroup, PlusAccordion } from '@plusui/react';
export default () => { return ( <> <PlusAccordionGroup multi="true"> <PlusAccordion open> <div slot="header"> Initially Open Item </div> <div slot="panel"> This item starts expanded because of the <code dir="auto"> open </code> attribute. </div> </PlusAccordion> <PlusAccordion> <div slot="header"> Another Item </div> <div slot="panel"> This can be opened independently. </div> </PlusAccordion> </PlusAccordionGroup> </> );};import { Component } from '@angular/core';
@Component({ selector: 'app-example', template: ` <plus-accordion-group multi="true"> <plus-accordion open> <div slot="header"> Initially Open Item </div> <div slot="panel"> This item starts expanded because of the <code dir="auto"> open </code> attribute. </div> </plus-accordion> <plus-accordion> <div slot="header"> Another Item </div> <div slot="panel"> This can be opened independently. </div> </plus-accordion> </plus-accordion-group> `})export class ExampleComponent {}<template> <plus-accordion-group multi="true"> <plus-accordion open> <div slot="header"> Initially Open Item </div> <div slot="panel"> This item starts expanded because of the <code dir="auto"> open </code> attribute. </div> </plus-accordion> <plus-accordion> <div slot="header"> Another Item </div> <div slot="panel"> This can be opened independently. </div> </plus-accordion> </plus-accordion-group></template><plus-accordion-group multi="true"> <plus-accordion open> <div slot="header"> Initially Open Item </div> <div slot="panel"> This item starts expanded because of the <code dir="auto"> open </code> attribute. </div> </plus-accordion> <plus-accordion> <div slot="header"> Another Item </div> <div slot="panel"> This can be opened independently. </div> </plus-accordion></plus-accordion-group><plus-accordion-group multi="true"> <plus-accordion open> <div slot="header"> Initially Open Item </div> <div slot="panel"> This item starts expanded because of the <code dir="auto"> open </code> attribute. </div> </plus-accordion> <plus-accordion> <div slot="header"> Another Item </div> <div slot="panel"> This can be opened independently. </div> </plus-accordion></plus-accordion-group>Use the size attribute on <plus-accordion-group> (or individual <plus-accordion> if not grouped) to control the overall size.
import { PlusAccordionGroup, PlusAccordion } from '@plusui/react';
export default () => { return ( <> <PlusAccordionGroup size="sm"> <PlusAccordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </PlusAccordion> </PlusAccordionGroup> <PlusAccordionGroup size="md"> <PlusAccordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </PlusAccordion> </PlusAccordionGroup> <PlusAccordionGroup size="lg"> <PlusAccordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </PlusAccordion> </PlusAccordionGroup> </> );};import { Component } from '@angular/core';
@Component({ selector: 'app-example', template: ` <plus-accordion-group size="sm"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group> <plus-accordion-group size="md"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group> <plus-accordion-group size="lg"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group> `})export class ExampleComponent {}<template> <plus-accordion-group size="sm"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group> <plus-accordion-group size="md"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group> <plus-accordion-group size="lg"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion> </plus-accordion-group></template><plus-accordion-group size="sm"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group><plus-accordion-group size="md"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group><plus-accordion-group size="lg"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group><plus-accordion-group size="sm"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group><plus-accordion-group size="md"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group><plus-accordion-group size="lg"> <plus-accordion> <div slot="header"> Accordion Item </div> <div slot="panel"> Accordion content with different sizes. </div> </plus-accordion></plus-accordion-group>Disabled
Section titled “Disabled”Set the disabled attribute on <plus-accordion> to prevent it from being opened or closed.
import { PlusAccordion } from '@plusui/react';
export default () => { return ( <> <PlusAccordion disabled> <div slot="header"> Disabled Item </div> <div slot="panel"> This content cannot be shown via UI interaction. </div> </PlusAccordion> </> );};import { Component } from '@angular/core';
@Component({ selector: 'app-example', template: ` <plus-accordion disabled> <div slot="header"> Disabled Item </div> <div slot="panel"> This content cannot be shown via UI interaction. </div> </plus-accordion> `})export class ExampleComponent {}<template> <plus-accordion disabled> <div slot="header"> Disabled Item </div> <div slot="panel"> This content cannot be shown via UI interaction. </div> </plus-accordion></template><plus-accordion disabled> <div slot="header"> Disabled Item </div> <div slot="panel"> This content cannot be shown via UI interaction. </div></plus-accordion><plus-accordion disabled> <div slot="header"> Disabled Item </div> <div slot="panel"> This content cannot be shown via UI interaction. </div></plus-accordion>Visual Sections
Section titled “Visual Sections”Layout & Spacing
Section titled “Layout & Spacing”
Light & Dark Mode
Section titled “Light & Dark Mode”
Accessibility (a11y)
Section titled “Accessibility (a11y)”- Keyboard Behavior:
- When the accordion header has focus,
EnterorSpacetoggles the accordion’s expansion state. - Accordion headers are included in the standard tab sequence.
- Disabled accordions are skipped in the tab sequence.
- When the accordion header has focus,
- Screen Reader:
- The component uses
role="button"for the header androle="region"for the panel. aria-expandedindicates the state (true/false) of the accordion panel.aria-controlslinks the header button to the panel it controls.aria-disabled="true"is set on disabled accordion headers.
- The component uses
- Required Developer Actions:
- Ensure the content placed within the
headerslot is descriptive and clearly indicates the topic of the panel content. - Use
<plus-accordion-group>when displaying multiple related accordion items for better structure and accessibility.
- Ensure the content placed within the
API Reference
Section titled “API Reference”<plus-accordion>
Section titled “<plus-accordion>”Properties
Section titled “Properties”| Name | Type | Default | Description | Required |
|---|---|---|---|---|
expand | boolean | false | Whether the accordion is expanded. | No |
size | `‘sm' | 'md' | 'lg’` | 'md' |
disabled | boolean | false | Disables the accordion. | No |
Events
Section titled “Events”| Name | Payload Type | Description |
|---|---|---|
plus-accordion-toggle | CustomEvent<{ expand: boolean }> | Fired when the accordion is toggled. |
| Name | Description |
|---|---|
header | The header content (clickable part). |
panel | The content displayed when the accordion is open. |
helper | Optional helper text displayed next to the header. |
CSS Shadow Parts
Section titled “CSS Shadow Parts”| Part | Description |
|---|---|
header | The header container element. |
panel | The panel container element. |
icon | The expand/collapse icon element. |
helper | The helper text container. |
<plus-accordion-group>
Section titled “<plus-accordion-group>”Properties
Section titled “Properties”| Name | Type | Default | Description | Required |
|---|---|---|---|---|
multi | boolean | false | Allows multiple accordions to be open at once. | No |
kind | `‘bordered' | 'divided' | 'separated’` | 'bordered' |
size | `‘sm' | 'md' | 'lg’` | 'md' |
| Name | Description |
|---|---|
| (default) | Place <plus-accordion> elements here. |
CSS Shadow Parts
Section titled “CSS Shadow Parts”| Part | Description |
|---|---|
container | The main container element for the group. |
Join the Community
Plus UI is built by the community. Join us on our platforms to contribute, get help, and stay up to date.