The problem
A form with several fields needs to tell the reader which ones are wrong before it can be submitted, without interrupting every keystroke with a red border and without waiting until submission to report a mistake made in the first field. Two separate decisions travel under one name here: when to check a field, and where to show the result. Getting the timing wrong either marks a field invalid before the reader has finished typing it, or defers every error to a full-page failure discovered only on submit. Getting the placement wrong disconnects the message from the field it is about. On a long or tabbed form, a third problem appears that a single field’s validation does not have: the invalid field can be out of view entirely — scrolled past on a long page, or on a tab the reader is not looking at. Nothing about validating one field in isolation explains what should happen when the invalid one isn’t the one currently in front of the reader — and the shipped tab bar itself has no way to flag which section holds the problem, a real gap this page’s tabbed-form guidance has to work around (see Known issues).When to validate
Vocabulary
When this applies
- A form has one or more fields whose values need to be checked against a rule before the form can be submitted or a record saved.
- The check is a validation of a value, not a confirmation of an action’s consequences.
When it doesn’t
Structure
Behavior
Constraints
Content
All error copy is sentence case — see Error messages
for the full copy rules this pattern inherits rather than restates.
Accessibility
- An invalid field sets
aria-invalid="true"in addition to the visible color and text change — per Input, the visual swap alone is not reliably announced. - The error text is associated to its field via
aria-describedby, so it is read immediately after the field itself, not only when the reader happens to look down at it. - On a blocked submit, focus moves to the first invalid field — this is a focus change a screen-reader user needs, not just a visual one, since nothing else tells them where to go.
- A page-level error summary is announced as a whole when it appears (a live region, or focus landing on its heading) — but focus moves on to the first field immediately after, not left resting on the summary.
- As-you-type feedback (a strength meter, a character count) updates a live region sparingly — announcing every keystroke is unusable; announce on a meaningful change in the result, not on every character.
Variations
Anti-patterns
Validating every field as-you-type by default. A required-field check that turns red the moment the reader starts typing punishes them for a value that isn’t finished, not for a value that’s wrong. An error summary with no link to the field. A list of “2 errors” at the top of a long form that doesn’t jump to or name the specific field forces the reader to hunt for what it means — the summary exists to shorten that hunt, not relocate it. Deferring every check to submit. A form that says nothing until the reader presses Submit, then reports every mistake at once, spends the reader’s effort on fields they had already finished and moved past minutes earlier. Treating the tab-bar’s silence about errors as settled. Building a tabbed form and assuming a future version will surface a per-tab error marker is building against a real, open gap as if it were already closed. It isn’t — the page-level summary is required precisely because the tab bar can’t do this today.Known issues
Gaps in the current rules
- Whether a field’s error should persist if the reader navigates to a different tab and back without correcting it, or whether re-focusing it should re-check silently.
- Whether an async, round-trip validation (a uniqueness check, an availability check) needs its own transient loading state on the field, distinct from the form’s overall submit-in-flight state — Structure and Behavior don’t cover it.
- What a reader sees between pressing Submit and a round-trip validation’s result returning, for a field that depends on a server check.
Why it works this way
Timing and placement are two separate decisions because they fail independently. A field validated at the right moment but reported in the wrong place still sends the reader hunting; a field reported in the right place but checked too early still reads as broken before it’s finished. Treating them as one decision is how a page ends up validating everything as-you-type simply because that’s also when it happens to render the message closest to the field. The page-level summary is a concession to a gap, not a preferred pattern. It’s restricted to long or tabbed forms specifically because a summary above a form the reader can already see whole just repeats what the field-level message already says. It earns its place only where the tab bar’s own missing error signal leaves no other way to point at an invalid field the reader isn’t looking at.Related
Input, Select, and FieldLabel — the components this pattern composes with. Error messages — the copy rules this page’s Content section follows rather than restates. Views overview and TITAN-GAP-30 — the tab-error gap this page’s tabbed-form guidance works around.Status
Proposal — first pass, not an audited Invoca screen. No Titan design library or shipped product surface was available while writing this page. What follows is built from general interaction-design practice and from the constraints Foundations and Components already establish — see Status. One real, already-documented gap is directly load-bearing for the tabbed case below: TITAN-GAP-30 — the design library’s tab component has anError display state and the shipped code has no error
treatment for a tab at all. If an invalid field sits on a tab the reader isn’t looking at,
there is currently no shipped way to flag that tab. The page-level error summary proposed
below is a workaround for that real gap, not a claim that it is closed.