Jump to a component
Core · Forms
Field
Field puts the form's label over a control that does not carry its own (a segmented control, chips, a group of options), with an optional hint under it.
Live, from @anicanon/sakuga 2.0.0
Sakuga for iOS and Android is coming
iOS
Coming soon
Field for iOS is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
Android
Coming soon
Field for Android is in the roughs. The tokens it will read are the ones on this page, the same on every platform.
- Use it for
- The label and hint over a control that has none of its own: a segmented control, chips, a group of options, swatches.
- Not for
- Typed words, which carry their own labelTextField
- A list choice, which carries its own labelSelect
- Explaining a field on hover or focusFieldHelp
- A label over a strip or a group inside a panelSectionHeader
Guidelines
- It uses the same label and hint as
TextFieldandSelect, so a form reads as one column whatever the control. optionaladds "· optional" to the label.
import { Field, SegmentedControl } from '@anicanon/sakuga/ui';
export default function FieldExample() {
return (
<Field
label="Story Map"
hint="Free: the script isn’t checked against the story. You can switch later."
>
<SegmentedControl
label="Story Map mode"
value="Free"
options={[
{ label: 'Story Map', value: 'Story Map' },
{ label: 'Free', value: 'Free' },
]}
/>
</Field>
);
}PropsFieldProps
labelrequiredstringchildrenrequiredReactNodehintstringoptionalbooleanidstringclassNamestringIt has no tokens of its own: it draws with TextField’s, listed here.
Each token reads a role, and the role lands on a value in each theme. Change the role and every component that reads it follows.
Colour
field-labelTextField and Select: label.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7field-hintTextField and Select: hint under the control.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7field-bgTextField and Select: control fill.bg-canvasneutral-50#f6f6f8bg-canvasneutral-950#07070afield-borderTextField and Select: control edge.border-controlshade-a52rgba(11,10,16,0.52)border-controlwhite-a45rgba(255,255,255,0.45)field-fgTextField and Select: value.text-primaryneutral-925#0b0a10text-primaryneutral-0#fffffffield-placeholderTextField and Select: placeholder.text-mutedneutral-600#5c5b67text-mutedneutral-400#a3a3a7field-highlightTextField: a field that changed or needs attention.accentcamellia-600#c2335faccentcamellia-400#f4779fSpace and shape
field-gapgap-smfield-label-gapgap-smfield-control-min-heightsize-targetfield-control-padding-xinset-mdfield-control-radiusradius-smfield-control-inset-ring-widthline-hairlinefield-control-focus-inset-ring-widthline-strongfield-control-area-paddinginset-mdfield-control-area-min-heightfield-control-highlight-inset-ring-widthline-strongfield-wrap-icon-leftinset-mdfield-wrap-control-padding-leftfield-icon-sizeicon-size-smfield-help-target-sizefield-forced-edge-widthline-hairlinefield-forced-focus-widthline-strongType
field-label-fonttext-microfield-opt-font-weightweight-mediumfield-control-fonttext-bodyfield-control-placeholder-font-weightweight-regularfield-control-area-font-weightweight-regularfield-control-area-line-heighttext-body-line-heightfield-hint-fonttext-smallMotion
field-control-durationmotion-fastfield-control-easingease-standardChecked automatically with axe-core 4.11.4 against WCAG 2.2 A and AA, on the live preview above, in light and dark, on 26 October 2026.
- Result
- No issues found, in light or in dark.
- By design
- A group named by its
labeland described by itshint, so the control inside is announced within it, with "optional" read as part of the name. - Not tested
- The automated check doesn't test keyboard use, focus order or what a screen reader says. The lines above are the design system's own account of them.