Components

Accordion

A set of collapsible panels that expand one at a time or independently.

Usage

<div id="mcr:accordion:faq" data-mode="single">
  <div>
    <h3>
      <button id="mct:accordion:q1" aria-expanded="false" aria-controls="mcc:accordion:q1">
        What is monochrome?
      </button>
    </h3>
    <div id="mcc:accordion:q1" role="region" aria-labelledby="mct:accordion:q1" aria-hidden="true" hidden="until-found">
      A minimal component library...
    </div>
  </div>
  <div>
    <h3>
      <button id="mct:accordion:q2" aria-expanded="false" aria-controls="mcc:accordion:q2">
        How does it work?
      </button>
    </h3>
    <div id="mcc:accordion:q2" role="region" aria-labelledby="mct:accordion:q2" aria-hidden="true" hidden="until-found">
      Components are server-rendered...
    </div>
  </div>
</div>

Examples

Default Open

Set an item as expanded by default.

This content is visible by default because the AccordionItem has the open prop.

<div id="mcr:accordion:demo" data-mode="single">
  <div>
    <h3>
      <button id="mct:accordion:open" aria-expanded="true" aria-controls="mcc:accordion:open">
        This item starts open
      </button>
    </h3>
    <div id="mcc:accordion:open" role="region" aria-labelledby="mct:accordion:open" aria-hidden="false">
      This content is visible by default.
    </div>
  </div>
</div>

Disabled Items

Disabled items cannot be toggled and are skipped during keyboard navigation.

<div id="mcr:accordion:settings" data-mode="single">
  <div>
    <h3>
      <button id="mct:accordion:s1" aria-expanded="false" aria-controls="mcc:accordion:s1">
        General Settings
      </button>
    </h3>
    <div id="mcc:accordion:s1" role="region" aria-labelledby="mct:accordion:s1" aria-hidden="true" hidden="until-found">
      Configure language and display preferences.
    </div>
  </div>
  <div>
    <h3>
      <button id="mct:accordion:s2" aria-expanded="false" aria-controls="mcc:accordion:s2" aria-disabled="true">
        Advanced Settings
      </button>
    </h3>
    <div id="mcc:accordion:s2" role="region" aria-labelledby="mct:accordion:s2" aria-hidden="true" hidden="until-found">
      This panel cannot be opened.
    </div>
  </div>
</div>

Multiple Open Items

Use type="multiple" to allow multiple items open simultaneously.

Multiple items can be open at the same time.

This item is also open by default.

<div id="mcr:accordion:sections" data-mode="multiple">
  <div>
    <h3>
      <button id="mct:accordion:m1" aria-expanded="true" aria-controls="mcc:accordion:m1">
        First Section
      </button>
    </h3>
    <div id="mcc:accordion:m1" role="region" aria-labelledby="mct:accordion:m1" aria-hidden="false">
      Content...
    </div>
  </div>
  <div>
    <h3>
      <button id="mct:accordion:m2" aria-expanded="true" aria-controls="mcc:accordion:m2">
        Second Section
      </button>
    </h3>
    <div id="mcc:accordion:m2" role="region" aria-labelledby="mct:accordion:m2" aria-hidden="false">
      Content...
    </div>
  </div>
</div>

Accessibility

Follows the WAI-ARIA Accordion Pattern.

Keyboard

KeyAction
Enter / SpaceToggle the focused item
Arrow DownMove focus to the next trigger
Arrow UpMove focus to the previous trigger
HomeMove focus to the first trigger
EndMove focus to the last trigger

Disabled items are skipped during keyboard navigation. Hidden content uses hidden="until-found" so it remains searchable via browser find-in-page (Ctrl+F).

API Reference

JavaScript

ElementAttributesDescription
Rootid="mcr:accordion:*"Root ID (required)
data-mode="single"Only one item open at a time
data-mode="multiple"Multiple items can be open
ItemWrapper <div> around each heading + content pair
Triggerid="mct:accordion:*"Trigger ID (required)
aria-expanded"true" or "false"
aria-controlsContent element ID
aria-disabled="true"For disabled items
Contentid="mcc:accordion:*"Content ID (required)
role="region"ARIA landmark role
aria-labelledbyTrigger element ID
aria-hidden"true" or "false"
hidden="until-found"Set when closed, removed when open

Frameworks

All components accept className (React) or standard attributes (Vue) for styling. The Vue API is identical - use kebab-case in templates for multi-word props (e.g., aria-disabled).

Accordion.Root

PropTypeDefaultDescription
type"single" | "multiple""single"Whether one or multiple items can be open

Accordion.Item

PropTypeDefaultDescription
openbooleanfalseWhether expanded by default
disabledbooleanfalseWhether the item is disabled (cannot be toggled)

Accordion.Header

Wraps the trigger in a heading element. Defaults to <h3>.

PropTypeDefaultDescription
as"h1" | "h2" | "h3" | "h4" | "h5" | "h6""h3"Heading level

Accordion.Trigger

The button that toggles the item.

Accordion.Panel

The content revealed when expanded. Uses hidden="until-found" for find-in-page support.

Frequently Asked Questions