Field
Form field with a label, an input or control, and optional validation handling.
This component can wrap the following:
- A single form input or control
- An input group (e.g. a group of Radios or Checkboxes)
- A set of nested fields (inputs wrapped in their own Field components).
The following Codex components can be used inside the Field component:
- Checkbox
- ChipInput
- Combobox
- Lookup
- Radio
- SearchInput
- Select
- TextArea
- TextInput
- ToggleSwitch
Demos
Configurable
Note that this configurable demo is only shown with a TextInput inside the Field. See the demos below for use of the Field component with other types of inputs or groups of inputs, along with code samples.
See the validation and error state demo below for more information about how to add and customize an error message.
Name | Value |
---|---|
Props | |
labelIcon | |
optionalFlag | |
hideLabel | |
isFieldset | |
disabled | |
status | |
Slots | |
label | |
description | |
help-text | |
View | |
Reading direction | |
Note: For icon properties, the relevant icon also needs to be imported from the @wikimedia/codex-icons package. See the usage documentation for more information. |
With rich description and help text
You can include markup in the description
and help-text
slots. Only links and text formatting are recommended as description and help text should be concise.
With validation and error state
You can display a validation message based on the current status of the field. Set the status
prop based on the field's validity, then pass in an object of messages
keyed on validation status type. If there is a message for the current status, it will be displayed.
The status
you bind to the Field component will also be passed down to its child components, which will display appropriate styles for that status (e.g. a red border in the error state). You do not need to bind the status
prop to the child input components.
Setting the status based on field validity is up to you. In the example below, it's done as you're changing the input. You could also validate on blur to give the user a chance to finish filling out the field.
Try entering a username into the field below that's longer than a single character to see the error state and error message.
Fieldsets
For any field that contains multiple inputs or controls, set the isFieldset
prop to true
. This will output a <fieldset>
element with a <legend>
instead of a label. Below are some examples of fieldsets.
Radio group
Groups of Radio or Checkbox components are considered fieldsets.
Complex field with two inputs
The field below has two inputs, a TextInput and a Select. In addition to the field-level label, each input needs its own individual label. In this case, the individual labels can be visually hidden. In the example below, the labels are included in two different ways:
- For the TextInput, the Label component is used with
hideLabel
set totrue
- For the Select, an
aria-label
is applied
Note that, when you enter erroneous data in the TextInput below, error styles for both the TextInput and the Select will display since they are both contained in a single Field. If you need to show separate states for each input, see the nested Fields example below.
Fieldset with nested Fields
In this example, each input within the field needs its own visible label, description, validation status, and validation message. To accomplish this, each input is wrapped in a Field component. The entire field is wrapped in a top-level Field component with isFieldset
set to true
.
Note that each sub-field has its own status. This enables you to show error styles only for the input that contains the error, not the entire fieldset.
Nested fields will become disabled when their parent field is disabled.
With custom help text content
The help-text
slot is not limited to static text – more complex markup, including other components and bound values, can be provided here as well. Below is an example of a custom character counter embedded inside a Field. The counter is bound to the modelValue
of the TextArea component inside the Field, and an error message is displayed if this text exceeds the maximum allowed number of characters.
Usage
Props
Prop name | Description | Type | Values | Default |
---|---|---|---|---|
labelIcon | Icon before the label text. Do not use this if including a start icon within the input component. | Icon | - | '' |
optionalFlag | Text to indicate that the field is optional. For example, this might be '(optional)' in English. This text will be placed next to the label text. | string | - | '' |
hideLabel | Whether the label should be visually hidden. Note that this will also hide the description. | boolean | - | false |
isFieldset | Whether this field contains a group of inputs. When true, this outputs a <fieldset> element with a semantic <legend> . When false, it outputs a <div> with a semantic <label> . | boolean | - | false |
disabled | Whether the entire field is disabled. | boolean | - | false |
status | status attribute of the input. | ValidationStatusType | 'default' , 'error' | 'default' |
messages | Message text keyed on validation status type. | ValidationMessages | - | () => { return {}; } |
Slots
Name | Description | Bindings |
---|---|---|
label | Label text. | |
description | Short description text. | |
default | Input, control, or input group. | |
help-text | Further explanation of how to use this field. |
CSS-only version
See the CSS-only Label docs for instructions on making the label visually-hidden or adding a label icon.
Markup structure
Single input
Fieldset
Inside a <form>
, use a <fieldset>
element for input groups.
When outputting a <fieldset>
, the markup of this component is quite different:
- The outer element is the
<fieldset>
instead of a<div>
- A
<legend>
is used instead of a<label>
. See docs on the CSS-only Label for more info. - The description is included inside the
<legend>
- The
for
andaria-describedby
attributes are not needed
With help text
To add help text below the input or control:
- Add the
.cdx-field__control--has-help-text
class to the control wrapper - Add a
<div>
below the control wrapper with the class.cdx-field__help-text
This works with single fields and fieldsets.
Disabled
To display a disabled field:
- Add the
.cdx-field--disabled
class to the outer element - Add the
.cdx-label--disabled
class to the.cdx-label
element - Disable the input(s) or control(s) (in the example below, the
disabled
attribute is added to the<input>
element)
This works with single fields and fieldsets.
Error status and message
To display error styles and show an error message:
- Add the
.cdx-field--status-error
class to the outer element - Apply error styles to the input (in the example below, the
.cdx-text-input--status-error
class is applied to the text input wrapper) - Add the validation message below the control wrapper