Field
A form row: a label, the control, and one message line under it. Field exists for the part no control owns on its own: every field family already owns its label, but nothing else in the kit renders helper or error text, so that message is what Field adds.
When the row wraps a single field-family control that has no label of its own, Field hands the label down to it rather than drawing one alongside, so each platform still places it its own way: a static title above on web and iOS, the floating in-container label on Android, and required goes down with it. Over any other control (a Switch, a group) Field draws the label above with its star, and on iOS and Android the label says "required" in its own name. Set error and it replaces helper in the same slot, so the row never changes height and nothing below it jumps.
Email
We'll never share your email.
iOS
Email
We'll never share your email.
Android
Email
We'll never share your email.
Web
tsx
Default
Error
Email address
Password
Username
Phone number
Date of birth
Amount
Helper text
Wrapping a control that keeps its own label
In a form
Measure
Props
Do & Don’t
The message line
Don’t
Stack a raw Text under the control: it drifts from the caption scale, misses the destructive tone, and is never announced as an error.
Do
Email
Enter a valid email address.
Put helper and error text on the Field, so the row owns one message slot and the type and color stay right in both states.
The label
Don’t
Label the control from outside with your own Text: the label can never float, and the tap target no longer includes it.
Do
Email
Let Field hand the label to the control it wraps, so Android can float it inside the box.