Components / Navigation

Collapsible macrolite

One disclosure section with a title row that shows or hides its children.

Built from
BoxIconText
Children
many
Loading the renderer…
Collapsible rendered by the React renderer on Web
Web React
Collapsible rendered by the SwiftUI renderer on iOS
iOS SwiftUI
Collapsible rendered by the Compose renderer on Android
Android Compose
Collapsible rendered by the gpui renderer on Desktop
Desktop gpui

View exponential-ui-collapsible, painted by each native renderer.

PropTypeDefaultDescription
titlerequiredstring–The header text.
openbindbooleanfalseWhether the body shows; bind it.
countnumber–A count shown in the header.
NameKind
on.changeevent: runs an action
Role
group
Semantics
trigger = button with aria-expanded. The trigger is a button with aria-expanded = open ($a11y).
KeysAction
EnterSpacetoggle
Recipe parts
Collapsible/rootCollapsible/triggerCollapsible/chevronCollapsible/titleCollapsible/countCollapsible/body
Keyed by
open:hover:pressed:focus:disabled:checked:open:selected:invalid:dragover

Themes · Write a theme

Disclosure header

EXP-962: the fold toggle INSIDE a row, and the whole of it is one line of bare text — a 12px chevron pointing right folded and down open, the label muted and brightening under the pointer, `aria-expanded` stating the fold, the entire line the target.

More

The steer feed's tool groups, its Exponential calls, its subagent lanes and its long bodies, the workflow card's agents and the issue group's own header each drew this by hand before it was one component. `chevron="trailing"` parks the glyph at the far edge instead, for a row whose siblings carry none and must not indent out of line with them. It is NOT the group band above: that is a filled strip heading a LIST. And it may not contain another button — a fold's own action renders beside it, because a button inside a button is invalid markup.

iOSleftover
ToolGroupRow / ExpToolGroupRow / SubagentGroupRowapps/ios/Exponential/UI/Session/AgentSessionView.swift

three private structs repeat the 11pt chevron row, each with its own @State expanded

Androidleftover
ToolGroupRow / ExpToolGroupRow / SubagentGroupRowapps/android/app/src/main/java/com/exponential/app/ui/session/AgentSessionScreen.kt

the same three private composables, each rebuilding the chevron row

Desktopok
controls::rows::disclosure_headerapps/desktop/crates/exponential-ui-gpui/src/controls/rows.rs

EXP-963: the steer feed's tool groups, Exponential runs, subagent lanes and workflow agents fold on it

Collapsible

The fold BEHIND a disclosure header: Radix Collapsible owns the open state and the content's mount, the header owns the words and the chevron.

More

It never draws chrome of its own, so a fold reads as the surface it sits in (a settings group, a transcript's Show work, a properties section). The natives fold with their own animation primitives under the same disclosure header. In the catalog: `Collapsible`, or a `Section collapsible` when the fold heads a list.

Webok
Collapsible / CollapsibleContentpackages/ui/src/collapsible.tsx
iOSn/a

a fold = DisclosureHeader + a conditional view

Androidn/a

a fold = DisclosureHeader + AnimatedVisibility

Desktopn/a

a fold = disclosure_header + the caller's own child toggle