Skip to main content
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 Coverage, stated honestly. One real, already-documented gap is directly load-bearing for the tabbed case below: TITAN-GAP-30 — the design library’s tab component has an Error 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.

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 — see TITAN-ERR-02. 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 — per TITAN-GAP-30 above — the tab bar itself cannot flag which section holds the problem.

When to validate

As-you-type is the exception, not the default. It earns its cost only when the feedback itself is the point — a password-strength meter, a character counter approaching a limit. Most fields have nothing useful to say about a value that isn’t finished yet, and flagging one red mid-keystroke reads as the form being broken rather than helpful.

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

Per FieldLabel, a field’s helper text and error text occupy one shared slot — the error replaces the helper, it never renders alongside it. The error always renders below the field, in that slot, matching the confirmed reading order (label, field, then helper-or-error) on FieldLabel’s own page.

Behavior

Constraints

Content

All error copy is sentence case, per TITAN-ERR-04 — 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 see TITAN-FORMVAL-06: focus goes 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 TITAN-GAP-30 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. 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.
Last modified on September 2, 2026