Skip to content

Field

A form field with a label, an input or control, and an optional validation message.

Guidelines

Using fields

Field provides features for building an accessible, understandable form field to collect user input.

Example of a Codex Field with different field items: with a text input, with a select, and with a checkbox group.

Use the Field component to create form layouts and to create a variety of form inputs, such as text inputs, selects, radio buttons, checkboxes or toggle switches.

If you do not need to collect user input, do not use Field. For example, Field is not necessary to display a search input. Although search is built with a text input component, it triggers an action and is not a form item.

Specifications

Specification of Field.

It is composed of the following elements:

  1. Label
    A label serves as a precise and informative title for the form field, indicating the type of information to be entered. It can also incorporate a description. Explore Label to check the different label properties.
  2. Field
    The input element, or a group of inputs, where the user enters information. Field can use any form item such as text input, select, checkbox, etc.
  3. Helper text (optional)
    Text that provides additional information related to the field.
  4. Validation message
    An inline validation message will appear to provide feedback about the status of the field. For example, to provide an error message to the user when the field contains one or more errors.

Refer to the Field component in Codex Figma.

Types

The Field component's control can be any form item component designed to gather user input, including:

  • Text input and text area
  • Select
  • Combobox
  • Checkbox, radio groups, and toggle switch
  • Chip input
  • Lookup

However, components not intended for collecting user input, such as SearchInput, should not be used within Field.

Types of Fields based on its field content: with a text
input, with a select, with a combobox, with a checkbox group, with a radio group, and with a
toggle switch group.

A complex field may comprise multiple inputs, each accompanied by an individual label that can be visually concealed.

A Field component with two field items.

The helper text slot can include plain text with or without links.

A Field component with a helper text including a link.

When combining the Field component with TextArea, you can use a custom character counter within the helper text section. For non-TextArea items like TextInput, character counters are not used, as they are not relevant for shorter inputs.

The character counter counts down as the user types, turning into an error state when the character limit is exceeded. It displays the number of exceeded characters as negative numbers along with an inline error message, informing the user that the entered message or text is too long.

Example of a Field with a text area and characters counter.

Interaction states

Form fields have the following visually separate states:

Interaction states of the Field component: default, hover on field, focus field, filled field, disabled, read-only field, error, warning and success.

  1. Default
  2. Hover on field item
  3. Focused field item
  4. Filled field item
  5. Disabled
  6. Read-only
  7. Error
  8. Warning
  9. Success

The interactive states will exclusively impact the field item within Field. Hover, focus, filled, and read-only states apply solely to the field item (e.g. the text input).

Content

Form elements should guide the user to fill out the form easily. They will prevent the user from making mistakes.

Label and placeholder

Labels indicate what the input should be. Placeholders act as sample text for the kind of content the user needs to input. Different browsers handle placeholder text differently, and some have trouble displaying translations of placeholders. Use placeholders as helpful additions, but do not rely on them too heavily.

A screenshot of interface inputs conveying an example of helpful labels and placeholder text.

Do:
  • Make the label short, clear, and easy to scan. Consistent & Clear
  • Provide more context in the placeholder for what's indicated in the label. Clear

A screenshot of interface inputs conveying an example of repetitive and redundant labels and placeholder text.

Don't:
  • Leave out the label in favor of just a placeholder. Needed & Translatable
  • Repeat in the placeholder what’s in the label. Concise

Helper text

Helper text gives a user guidance on how to fill in the form field. These messages often clarify formatting or indicate character restrictions. Giving users appropriate context helps them to quickly and efficiently enter the input without errors.

A screenshot of interface inputs conveying an example of helpful and concise helper text.

Do:

A screenshot of interface inputs conveying an example of unnecessarily long helper text.

Don't:
  • List too many restrictions or use overly technical and robotic language. Relevant

Inline error

These are short, simple contextual messages that allow the user to quickly understand how to fix the error they just made.

A screenshot of interface inputs conveying an example of helpful and useful inline error text.

Do:

A screenshot of interface inputs conveying an example of inline error text without any instruction to correct the error.

Don't:

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.

Short description text
Longer help text to explain how to use this field
NameValue
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 messages

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 if they exist (e.g. a red border in the error state). You do not need to bind the status prop to the child input components. Note that form input components currently only have special styles for the error status.

Setting the status based on field validity is up to you. In the error 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, as demonstrated in the warning example and the success example.

Error

The error status can be used both to show an error message and to display the error state of the form input. Try entering a username into the field below that's longer than a single character to see the error state and error message.

Enter a unique username
Username cannot be longer than 1 character

Warning

The following example shows a warning message on blur if the username doesn't meet the criteria written in the help text. In this case, the username will be corrected to meet the criteria, and the message informs the user of this change. Note that form inputs do not display a "warning" state.

Enter a unique username
Username must be capitalized and have no spaces

Success

The following example shows a success message on blur when the username is unique. Note that form inputs do not display a "success" state.

Enter a unique username

Fieldset with radio group

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.

Groups of Radio or Checkbox components are considered fieldsets.

Notifications Choose how often you'd like to receive notifications
Note that you can update this preference later

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 to true
  • For the Select, an aria-label is applied

To give the user a chance to type a valid coordinate location, this example doesn't validate as the user types, but delays validation until the input is blurred. For an example of how to do validation as the user types, see the validation and error state example above.

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.

Coordinate location
Please enter coordinates as decimal degrees.

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.

Item weight
Numerical value of the weight
Must be from pre-approved list of units
Hint: try searching for "grams"

Fieldset 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.

Please enter a message of 100 characters or less

100

Vue usage

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

Props

Prop nameDescriptionTypeDefault
labelIconIcon before the label text.

Do not use this if including a start icon within the input component.
Icon''
optionalFlagText 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''
hideLabelWhether the label should be visually hidden.

Note that this will also hide the description.
booleanfalse
isFieldsetWhether 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>.
booleanfalse
disabledWhether the entire field is disabled.booleanfalse
statusstatus attribute of the input. This also determines which validation message is shown.ValidationStatusType'default'
messagesMessage text keyed on validation status type.ValidationMessages() => { return {}; }

Slots

NameDescriptionBindings
labelLabel text.
descriptionShort description text.
defaultInput, control, or input group.
help-textFurther 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

Short description text

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 and aria-describedby attributes are not needed
Legend text (optional) Short description text

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