Components / Inputs

Input nativelite

A single-line text field.

A2UI basic
TextField
Children
none
Loading the renderer…
Input rendered by the React renderer on Web
Web React
Input rendered by the SwiftUI renderer on iOS
iOS SwiftUI
Input rendered by the Compose renderer on Android
Android Compose
Input rendered by the gpui renderer on Desktop
Desktop gpui

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

disabled
PropTypeDefaultDescription
labelrequiredstring–The field label.
namerequiredstring–The field's key in the submitted data.
typetext | email | password | number | search | url | tel"text"The keyboard and masking kind.
placeholderstring–Hint text while empty.
valuebindstring–The text; bind it to a data path.
disabledbooleanfalseShows it inert.
checks[check]–Validation rules (required, email, length, regex, numeric).
validateOnchange | blur | submit"blur"When the checks run.
NameKind
on.changeevent: runs an action
on.submitevent: runs an action
on.focusevent: runs an action
on.blurevent: runs an action
Role
textbox
Semantics
textbox
KeysAction
Entersubmit (fires submit, submits the Form)
Recipe parts
Input/rootInput/labelInput/fieldInput/placeholderInput/descriptionInput/error
Keyed by
typedisabled:hover:pressed:focus:disabled:checked:open:selected:invalid:dragover

Themes · Write a theme

Input row

A bare right-aligned field at 70% foreground inside the shell — no box, no border.

More

The row is the field's chrome.

iOSn/a

Form text rows use the system field inside GlassSection

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

Text field

36 tall, padding 0/12, radius 12, card fill under a card stroke; focus swaps the stroke to active — no ring.

More

Placeholder at 50%.

Desktopok
controls::inputs::glass_inputapps/desktop/crates/exponential-ui-gpui/src/controls/inputs.rs

focus swaps the stroke to strokeActive, no ring (EXP-720); the corner is radius.lg (EXP-963)

Field label

The 14px medium line that names a field, tied to it by htmlFor so the label is part of the hit box, and dimmed with the field when it is disabled.

More

It exists on the WEB only: every native lays a field out as a ROW that already carries its name on the left, so a label above the control there would say the same thing twice.

iOSn/a

same — the name is the row title inside GlassTextField / GlassPickerRow

Androidn/a

same — TextFieldRow / PickerRow carry the label themselves

Desktopn/a

a field's name is the glass row's own leading text — see input row

Search field

The ONE "filter this list" field: the text field with the search glyph INSIDE it and a ghost clear that appears only once there is something to clear — and puts the caret back in the field, so typing continues.

More

Eight of them existed at five heights, most a bare Input re-dressed by hand and none with either affordance, while both natives had drawn exactly this for years. Two rungs: md is the stock 36 field, sm the 28 one dense columns use — the Changes file tree's filter, a sidebar filter. It is an Input, not a new box: every chrome decision still comes from there.

Desktopok
controls::inputs::search_fieldapps/desktop/crates/exponential-ui-gpui/src/controls/inputs.rs

EXP-963: SearchFieldSize::Md 36 / Sm 28; the diff pane filter, every picker query and the search dialog draw it