Form page pattern
A single editing surface with section-grouped fields and a sticky save/discard bar that appears when the form is dirty — the edit-a-record / settings page (as opposed to a step-by-step wizard). An unsaved-changes guard and a validation summary keep edits safe. Modeled after Polaris (Page + Form + ContextualSaveBar). Used by settings, record edit, and admin detail-edit surfaces.
Status: v0.1.0 — Draft. Promoted from the Shopify Polaris parity scan (metadocsstack #091). Source: https://polaris.shopify.com/patterns (Page + ContextualSaveBar).
R1 — When to use (vs wizard / inline edit / one-thing)
- Form page (this): the user edits many related fields of one record
on one page, saving as a unit (settings, profile, product edit).
- Wizard (
specs/patterns/wizard-multistep.kmd): a sequentialfirst-time flow with per-step gates.
- Inline edit (
specs/patterns/inline-edit.kmd): change one value inplace without a save bar.
- One-thing-per-page governs the granularity within a step, not this
all-at-once editing surface.
R2 — Section grouping
Fields are grouped into titled sections (each an <h2> + optional description) that chunk a long form into scannable units. Sections are visual grouping, not separate submits — the page saves as a whole (R3).
R3 — Sticky save bar (dirty-driven)
- The form starts clean; a save/discard bar appears only when the
form becomes dirty (a value changed), and pins to the top or bottom so it is always reachable while scrolling.
- It holds a primary Save and a secondary Discard; Save is disabled
while invalid (R5) and shows a pending state while saving.
- Discard reverts all fields to the last-saved state (with a confirm if
changes are substantial).
R4 — Unsaved-changes guard
Navigating away (back, link, close, route change) while dirty prompts a confirm ("You have unsaved changes") — never lose edits silently. Pairs with specs/navigation/back-behavior.kmd. A successful Save clears the dirty state and the guard.
R5 — Validation
- Validate on Save (and optionally on blur per field). On failure, show a
validation summary that links to the first offending field (the GOV.UK/koderwebkit error-summary), plus inline messages per
specs/errors/user-facing-messages.kmd. - Focus moves to the summary / first error on a failed save.
R6 — Accessibility & i18n
- Sections use real headings; each field has an associated label; the save
bar is keyboard-reachable and its state (disabled/pending) is announced.
- The dirty→save-bar appearance is announced politely (not a focus steal).
- All chrome (Save/Discard, section titles, the unsaved-changes prompt) is
translatable per
specs/i18n/contract.kmd.
Não-escopo
- Step-by-step flows (
specs/patterns/wizard-multistep.kmd). - Single-value editing (
specs/patterns/inline-edit.kmd). - Individual field components (text field, money input, selects).
- Autosave-without-a-save-bar surfaces (a different model).