Forms across the app hand-roll labels, errors and aria wiring, so spacing, required markers and error rendering vary page by page. #7364 introduced the field layer (FieldLabel, FieldError, typed InputGroup); this epic tracks rolling it out: every field-shaped control gets a *Field counterpart that owns the label, tooltip, error and aria wiring, and the escape hatches (InputGroup's component prop, the Select E2E fork) get deleted behind lint/test guardrails.
Convention: controls render widgets, Field components own the wiring.
Related: #5746, and #7999 (FieldLabel typography) tracked there.
Forms across the app hand-roll labels, errors and aria wiring, so spacing, required markers and error rendering vary page by page. #7364 introduced the field layer (FieldLabel, FieldError, typed InputGroup); this epic tracks rolling it out: every field-shaped control gets a *Field counterpart that owns the label, tooltip, error and aria wiring, and the escape hatches (InputGroup's component prop, the Select E2E fork) get deleted behind lint/test guardrails.
Convention: controls render widgets, Field components own the wiring.
Related: #5746, and #7999 (FieldLabel typography) tracked there.