Accordion

Sections that expand one truth at a time.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
Connected rows in one card — one open at a time
Render the success state the moment an action is taken, then reconcile with the server — rolling back only if it fails. It makes an interface feel instant.
Everything sits on a 4px base grid. Components snap to multiples of 4 so vertical rhythm stays even across the whole system.
Exactly one warm accent per view — the primary action. Everything else steps back so that single light points forward.
Configuration
Style
Open mode
Numbers
A short answer to “getting started”, revealed when the row opens.
A short answer to “configuration”, revealed when the row opens.
A short answer to “billing”, revealed when the row opens.
<Accordion variant="joined" numbered />
Behavior — The Engineering Contract
Prop / eventTypeNotes
variantjoined · separateConnected rows, or discrete cards
allowMultiplebooleanKeep several sections open at once
defaultOpennumberIndex open on first render
Item.titleReactNodeThe always-visible header
Enter / SpaceToggle the focused section

An Accordion hides secondary detail until asked for. For peer views use Tabs; for a step-by-step flow use a Stepper.

Anatomy
01Open section
A short answer, revealed when this section is open.
02Closed section
A short answer, revealed when this section is open.
1IndexOptional mono number for ordered sets.
2HeaderFull-width button; the whole row toggles.
3ChevronRotates 90° to show open state.
Do's and Don'ts
✓ Do
01Billing
A short answer, revealed when this section is open.

Use it for secondary detail — FAQs, settings groups, fine print.

✕ Don't
A
A short answer, revealed when this section is open.
B
A short answer, revealed when this section is open.

Don't hide primary content behind a click. Keep essentials visible.

✓ Do
01First truth
A short answer, revealed when this section is open.
02Second
A short answer, revealed when this section is open.

Keep one section open at a time so focus stays on one truth.

✕ Don't
One lonely row
A short answer, revealed when this section is open.

Don't wrap a single section in an accordion. Just show it.

In context: Examples
A · FAQ
01How do refunds work?
A short answer, revealed when this section is open.
02Is my data secure?
A short answer, revealed when this section is open.

Frequently-asked questions, one answer at a time.

B · Settings
Notifications
A short answer, revealed when this section is open.

Grouped settings as separate, collapsible cards.

C · Order summary
Shipping details
A short answer, revealed when this section is open.

Progressive disclosure in a checkout or form.

Measurements & Tokens
TokenValueRole
--acc-head-pad15px 16pxHeader padding
--acc-card#0E0F12Section surface
--acc-divider#1A1A1AHairline in joined mode
--acc-hover#131418Header hover fill
--acc-chevron90° · .22sOpen rotation
--acc-easegrid-rows .25sBody expand transition
Code
<div class="o-acc o-acc--joined">
  <div class="o-acc__item is-open">
    <button class="o-acc__head" aria-expanded="true">
      <span class="o-acc__num">01</span> What is an optimistic update?
      <svg class="o-acc__chevron">…</svg>
    </button>
    <div class="o-acc__body"><div><div class="o-acc__inner">…</div></div></div>
  </div>
</div>