Components

Accordion

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

Usage

import { Accordion } from "monochrome/react"

<Accordion.Root>
  <Accordion.Item>
    <Accordion.Header>
      <Accordion.Trigger>What is monochrome?</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>A minimal component library...</Accordion.Panel>
  </Accordion.Item>
  <Accordion.Item>
    <Accordion.Header>
      <Accordion.Trigger>How does it work?</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>Components are server-rendered...</Accordion.Panel>
  </Accordion.Item>
</Accordion.Root>

Examples

Default Open

Set an item as expanded by default.

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

<Accordion.Root>
  <Accordion.Item open>
    <Accordion.Header>
      <Accordion.Trigger>This item starts open</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>This content is visible by default.</Accordion.Panel>
  </Accordion.Item>
</Accordion.Root>

Disabled Items

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

<Accordion.Root>
  <Accordion.Item>
    <Accordion.Header>
      <Accordion.Trigger>General Settings</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>Configure language and display preferences.</Accordion.Panel>
  </Accordion.Item>
  <Accordion.Item disabled>
    <Accordion.Header>
      <Accordion.Trigger>Advanced Settings</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>This panel cannot be opened.</Accordion.Panel>
  </Accordion.Item>
</Accordion.Root>

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.

<Accordion.Root type="multiple">
  <Accordion.Item open>
    <Accordion.Header>
      <Accordion.Trigger>First Section</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>Content...</Accordion.Panel>
  </Accordion.Item>
  <Accordion.Item open>
    <Accordion.Header>
      <Accordion.Trigger>Second Section</Accordion.Trigger>
    </Accordion.Header>
    <Accordion.Panel>Content...</Accordion.Panel>
  </Accordion.Item>
</Accordion.Root>

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

HTML

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

React

All components accept className for styling.

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