Accordion / expander
Single-open: opening one closes the rest
Per-session overrides. Leave untouched to inherit the registry defaults for this model + provider.
Inaccessible.
Multi-open: each section toggles independently
✓ 142 modules · 2.4s
Lazily fetched on first expand, collapsed by default so a long transcript never floods the card.
Read 4 files · searched 2 sources · drafted summary.
Pushing to main needs your sign-off. Warm tones (here, REVIEW) are status only, never a decorative accent.
Header accessory + uncontrolled: always-visible delete, each self-manages
Open me and delete me independently. The trash button never toggles the row, and no host holds my open state (defaultExpanded seeds it, I keep it).
Open me and delete me independently. The trash button never toggles the row, and no host holds my open state (defaultExpanded seeds it, I keep it).
Zebra (experimental): opt-in alternating row tone; default stays plain
Alternating rows carry a whisper of neutral wash that is theme-following, opt-in, and beneath the hairlines.
This row is the toned one (even).
Plain again (odd).
Toned (even).
Single-open: sampling · multi-open: 1 section expanded. The island is live.
Parameters
Section titled “Parameters”A header trailing-accessory slot renders always-visible controls (a delete button, a
count badge) in the header, collapsed or expanded, pinned left of the chevron and
outside the toggle target so interactive controls fire independently and never toggle
the row (a real <button> cannot nest inside the row’s toggle <button>, so the
accessory is a sibling). Expansion is controlled (expanded + onExpandedChange) or
uncontrolled (defaultExpanded, self-managed). One shared contract: Compose (a
sibling in the header Row) and Swift (a sibling in the header HStack) mirror the same
shape; group single/multi-open coordination stays host-owned as before.
An opt-in zebra wash tones alternating rows (even rows a whisper of neutral on-card @
4%, odd rows plain) on the accordion container, theme-following, default off, resting
surface only (beneath hairlines / selection / hover). Experimental: the design lead is
evaluating; not canon. Mirror lives on all three platforms via the same container opt-in.
The intended spec is unified; these are the real divergences between the shipped platforms:
- Disclosure indicator (resolved): a rotating chevron wins (interpolatable, reduced-motion-safe). Compose (today swaps
KeyboardArrowDown↔KeyboardArrowUp) and Swift (swapschevron.right↔chevron.down) conform to rotation, not icon-swap. - Chevron position (resolved): trailing wins (leading is content’s seat, trailing is the affordance’s). Swift (today leading) conforms.
- Open policy (resolved): a
modeparam, defaultsingle,multipleopt-in. Voice (single-openexpandedID) and Android (multi-open stacked sections) both adopt the sharedmode. - Reveal motion: web animates
grid-rowsheight + opacity; ComposeexpandVertically + fadeIn; Swift a.springlayout change. Same intent, three engines. - Packaging: neither native app ships a reusable
Accordion; both inline the header+body pattern. Web’s@dizyx/nockerl-reactAccordion/AccordionItemis the intended canonical surface.