Skip to main content

U.S. flagU.S. flag

An official website of the United States government

CMS Design System

CMS Design System v2 is released!  See our migration guide.

Text field

Jump to guidance View related guidance in the U.S. Web Design System

Text fields allow users to enter any combination of letters, numbers, or symbols of their choosing (unless otherwise restricted). Text fields can span single or multiple lines.

Code snippet
<div>
  <label class="ds-c-label ds-u-margin-top--0" for="input-singleline">
    <span>Single line field</span>
  </label>
  <input
    class="ds-c-field"
    id="input-singleline"
    name="singleline"
    value="Example text"
    type="text"
  />
</div>
<div>
  <label class="ds-c-label" for="input-number">
    <span> Number field</span>
  </label>
  <input
    class="ds-c-field"
    id="input-number"
    name="number"
    value="123"
    type="text"
    inputmode="numeric"
    pattern="[0-9]*"
  />
</div>
<div>
  <label class="ds-c-label" for="input-password">
    <span>Password field</span>
  </label>
  <input
    class="ds-c-field ds-c-field--inverse"
    id="input-password"
    name="password"
    type="password"
    value="Example text"
  />
</div>
<div>
  <label class="ds-c-label" for="input-small"><span>Small size field</span></label>
  <input class="ds-c-field ds-c-field--small" id="input-small" name="tinysize" type="text" />
</div>
<div>
  <label class="ds-c-label" for="input-medium"><span>Medium size field</span></label>
  <input class="ds-c-field ds-c-field--medium" id="input-medium" name="mediumsize" type="text" />
</div>
<div>
  <label class="ds-c-label" for="input-multiline">
    <span>Multiline field</span>
  </label>
  <textarea class="ds-c-field" id="input-multiline" name="multiline" rows="4"></textarea>
</div>
<div>
  <label class="ds-c-label" for="input-error">
    <span>Error field</span>
    <span class="ds-c-field__hint">Helpful hint text</span>
    <span class="ds-c-field__error-message" role="alert">
      Example error message
    </span>
  </label>
  <input class="ds-c-field ds-c-field--error" id="input-error" name="error" type="text" />
</div>
<div>
  <label class="ds-c-label" for="input-success"><span>Success field</span></label>
  <input class="ds-c-field ds-c-field--success" id="input-success" name="success" type="text" />
</div>
<div>
  <label class="ds-c-label" for="input-disabled">
    <span>Disabled field</span>
  </label>
  <input
    class="ds-c-field ds-c-field--inverse"
    id="input-disabled"
    name="disabled"
    type="text"
    disabled
  />
</div>
<div class="example--wrapper example--inverse">
  <div>
    <label class="ds-c-label ds-u-margin-top--0" for="input-inverse">
      <span>Inverse field</span>
      <span class="ds-c-field__hint ds-c-field__hint--inverse">Helpful hint text</span>
      <span class="ds-c-field__error-message ds-c-field__error-message--inverse"
        >Example error message</span
      >
    </label>
    <input
      class="ds-c-field ds-c-field--inverse ds-c-field--error"
      id="input-inverse"
      name="inverse"
      type="text"
    />
  </div>
</div>
React

<TextField>

View source file

A TextField component renders an input field as well as supporting UI elements like a label, error message, and hint text.

Code snippet
ReactDOM.render(
  <div>
    <TextField
      defaultValue="Example value"
      label="Single line field"
      labelClassName="ds-u-margin-top--0"
      name="single_example"
    />
    <TextField defaultValue="123" label="Number field" name="number_example" numeric />
    <TextField
      label="Password field"
      name="password_example"
      type="password"
      defaultValue="Example value"
    />
    <TextField label="Small size field" name="small_example" size="small" />
    <TextField label="Medium size field" name="medium_example" size="medium" />
    <TextField label="Multiline field" multiline name="multiline_example" />
    <TextField
      errorMessage="Example error message"
      hint="Helpful hint text"
      label="Error field"
      name="error_example"
    />
    <TextField label="Success field" fieldClassName="ds-c-field--success" name="success_example" />
    <TextField label="Disabled field" disabled name="disabled_example" />
    <div className="example--wrapper example--inverse">
      <TextField
        labelClassName="ds-u-margin-top--0"
        errorMessage="Example error message"
        hint="Helpful hint text"
        label="Inverse example"
        name="inverse_example"
        inversed
      />
    </div>
  </div>,
  document.getElementById('js-example')
);

Props

React Properties Documentation
NameTypeDefaultDescription
ariaLabelstring

Apply an aria-label to the text field to provide additional context to assistive devices.

classNamestring

Additional classes to be added to the root div element

defaultValuestring, number

Sets the initial value. Use this for an uncontrolled component; otherwise, use the value property.

disabledbool
errorMessagestring, number, element, or array
errorMessageClassNamestring

Additional classes to be added to the error message

errorPlacement'top', 'bottom'

Location of the error message relative to the field input

fieldClassNamestring

Additional classes to be added to the input element

focusTriggerbool

Used to focus input on componentDidMount()

hintstring, number, element, or array

Additional hint text to display

idstring

A unique id to be used on the text field.

inputReffunc

Access a reference to the input or textarea element

requirementLabelstring, number, element, or array

Text showing the requirement ("Required", "Optional", etc.). See Required and Optional Fields.

inversedbool

Applies the "inverse" UI theme

label

Required

string, number, element, or array

Label for the input

labelClassNamestring

Additional classes to be added to the FormLabel.

labelIdstring

A unique id to be used on the label field.

mask'currency', 'phone', 'ssn', 'zip'

Apply formatting to the field that's unique to the value you expect to be entered. Depending on the mask, the field's appearance and functionality may be affected.

multilinebool

Whether or not the text field is a multiline text field

name

Required

string
numericbool

Sets inputMode, type, and pattern to improve accessiblity and consistency for number fields. Use this prop instead of type="number", see here for more information.

onBlurfunc
onChangefunc
rowsnumber, string

Optionally specify the number of visible text lines for the field. Only applicable if this is a multiline field.

size'small', 'medium'

Set the max-width of the input either to 'small' or 'medium'.

typestring'text'

HTML input type attribute. If you are using type=number please use the numeric prop instead.

valuestring, number

Sets the input's value. Use this in combination with onChange for a controlled component; otherwise, set defaultValue.

Guidance

When to use

  • If you can’t reasonably predict a user’s answer to a prompt and there might be wide variability in users’ answers.
  • When using another type of input will make answering more difficult. For example, birthdays and other known dates are easier to type in than they are to select from a calendar picker.
  • When users want to paste in a response.

When to consider alternatives

Usage

  • Don't use placeholder text in form fields. Use hint text instead, if you need to provide contextual information. Placeholder text disappears after a user types a value, therefore users will no longer have that text available when they need to review their entries. People who have cognitive or visual disabilities have additional problems with placeholder text.
  • The length of the text field provides a hint to users as to how much text to write. Do not require users to write paragraphs of text into a single-line input box; use a textarea instead.
  • Text fields are among the easiest type of input for desktop users but are more difficult for mobile users.
  • Only show error messages or styling after a user has interacted with a particular field.

View the "Forms" guidelines for additional guidance and best practices.

Accessibility

  • Group each set of thematically related controls in a fieldset element. Use the legend element to offer a label within each fieldset. The fieldset and legend elements make it easier for screen reader users to navigate the form.
  • Keep your form blocks in a vertical pattern. This approach is ideal, from an accessibility standpoint, because of limited vision that makes it hard to scan from left to right.

Customization

The following Sass variables can be overridden to theme a field:

  • $input-border-color
  • $input-border-color-inverse
  • $input-border-radius
  • $input-line-height
  • $input-border-width
  • $input-padding

Related patterns

Learn more