Form
====
Spec: descriptive guidance, not a checkable rule.
It carries no forbidden and instead pair, and no `jig check` detector applies to it directly.
Section: Components and layout
**Anatomy:** heading → intro → required/optional convention → error summary slot → fields grouped by meaning → primary action → secondary action.
### Layout
- **One column.** It keeps a single downward path, so there is no decision about what to fill next, nothing gets missed, and screen-magnifier users — who see a narrow slice at a time — do not lose a second column entirely.
- **Exception:** short, genuinely related fields may sit side by side *within* the column's width — expiry date and CVC, city and postcode. They stay inside the single-column bounds, so they avoid the problems above.
- Group related fields under headings with `
`/``, spaced by `--spacing-stack`; fields within a group by `--spacing-group`.
- Ask for the minimum. Every field costs completions, adds a chance of error, and asks someone to hand over information they would rather not.
- Prefer an **opt-in** to an optional field (`P-11`).
### Validation timing (`F-38`)
On blur first; on change once a field has already errored, so recovery is immediate; everything on submit, with a summary that receives focus and links to each failed field.
The reference sets out three approaches — on submit, on blur, on every keystroke — and prescribes none of them, because each has a cost: on-submit leaves people guessing until the end and then confronts them with everything at once; on-blur interrupts; keystroke validation fires before someone has finished typing, and people type at different speeds. What it does pair explicitly is on-blur with keystroke validation *for recovery only* — "remove the error message once the error has been resolved" — which is the combination above, and the reason the keystroke half is scoped to fields that have already failed.
**The summary states the count** — "2 errors were found" — and each entry links to the field it names. Do not disable the submit button to prevent an invalid submission (`E-32`): a disabled control cannot be focused, so it cannot explain itself.
**An invalid field is marked by border, background tint, icon and text together** — never by colour alone (`C-20`), and never by one channel that a magnifier or a colour-blind user might miss.
### Multi-step
Beyond roughly three question groups, split it.
- Say up front how long it takes and what they will need.
- **Group into few, fuller steps** — six steps of five related questions, not thirty steps of one. More steps is more interaction cost, not less.
- Order **easiest to hardest**, so early progress is quick.
- Show progress. People push harder as they near the end.
- **Let them review and change answers before submitting**, then confirm success and say what happens next.
- Primary action start-aligned; "Back" as a tertiary button at the top left (`P-02`).
- Each step still submits without JavaScript (`F-41`) — steps are server-tracked positions, not a client-only wizard.
### Other rules
- Echo every submitted value back on error (`F-39`).
- The primary action works without JavaScript. Enhancement intercepts; it does not enable.
- Destructive or irreversible submissions confirm; in `operator`, by typing.
- Success navigates or updates in place with a persistent confirmation — not a toast that vanishes before it is read.