Skip to main content

What it is

A field the reader types a value into directly — a single line, or several as multiline. Input is the default for free text and numbers with no fixed set of valid answers; the moment the answer comes from an enumerable set, that is a different decision. This page covers the single-line and multiline variants together, since choosing between them is one decision about the same field, not two components.

Live example

Exports

Vocabulary

Placeholder is not a label. It disappears the moment the field has a value or focus in some implementations, and is not reliably announced as a label by assistive technology. See TITAN-FLD-01.

Choose Input when

  • The value is free text or a number the reader types, with no fixed set of valid answers.
  • The expected answer is short enough to read within the field for a single line, or longer for multiline.

Choose something else when

Anatomy

Variants, sizes, and states

Confirmed from the Figma library, not source. Real axes on this component: Type (Default · Error), State (Default · Focused · Filled · Disabled), Multiline, Search bar, and Left Icon — each boolean and independently combinable. Filled means “has a value,” a named state distinct from empty, which this page did not previously call out. Search bar is a real, named configuration of this same component — not a separate search component.

Edge and failure states

Tokens

Composition

Always paired with FieldLabel above it. Multiple Inputs stack vertically inside Form — no vertical-rhythm token between stacked fields was found in the snapshot; see Gaps. For a complete field rather than the bare control, compose through FormInput with type="text" — see TITAN-INPUT-08.

Content

Accessibility

What this component does not handle: validating its own value or deciding when an error should show — both belong to Form validation.

Constraints

Known issues

Input: open issues

Divergences, open decisions, and undocumented gaps for Input.

Why it works this way

Numeric fields trade the native spinner for typed entry because the spinner’s usability problems — accidental scroll-edits, inconsistent cross-browser sizing — outweigh the convenience of clicking to increment. A reader who wants to change a number by a fixed step can still type the new value directly. Multiline never inherits the platform default row count for the same reason Button holds its width while loading: an undeclared dimension makes identical markup render at different sizes depending on the browser, which is a layout bug waiting to be noticed rather than a design decision anyone made. Read-only and disabled stay visually distinct because they answer different questions — “can I change this” versus “does this even apply right now” — and a reader who cannot tell which one they’re looking at cannot tell whether the fix is theirs to make.

Status

Last modified on September 7, 2026