Components / Inputs

Composer nativelite

The chat input box: a growing text field with a submit button and optional attachments.

Children
none
Loading the renderer…
Composer rendered by the React renderer on Web
Web React
Composer rendered by the SwiftUI renderer on iOS
iOS SwiftUI
Composer rendered by the Compose renderer on Android
Android Compose
Composer rendered by the gpui renderer on Desktop
Desktop gpui

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

attachments
busy
PropTypeDefaultDescription
placeholderstring–Hint text while empty.
valuebindstring–The draft text; bind it.
submitLabelstring"$string.send"The submit button's accessibility label.
attachmentsbooleanfalseShows the attach control.
busybooleanfalseTurns submit into a stop while a reply streams.
NameKind
on.submitevent: runs an action
on.changeevent: runs an action
on.stopevent: runs an action
Role
textbox
Semantics
textbox (multiline) + send button
KeysAction
Entersubmit; Shift+Enter: newline
Escape while busystop
Recipe parts
Composer/rootComposer/fieldComposer/placeholderComposer/attachmentComposer/send
Keyed by
attachmentsbusy:hover:pressed:focus:disabled:checked:open:selected:invalid:dragover

Themes · Write a theme

Composer

ONE composer for comments, steering and reporter replies: a radius-16 card of card fill under a card hairline, holding an optional attachment strip, a borderless 36-min field and a tool row of 24px ghost glyph buttons with a right-aligned submit whose glyph is the primary tint.

More

EXP-877's `inline` arm is the steer card — the round submit rides the field's own row instead of a tool row under it. The opaque variant swaps to the opaque card fill and the strong stroke — it floats over a feed on mobile, and an alpha fill there shows the conversation through it. EXP-961 moved it into @exp/ui: the card owns CHROME AND LAYOUT only, and every caller keeps its own field, upload and send.