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.