From c9f932be65261a1fd091f51b28014e336cab6aae Mon Sep 17 00:00:00 2001 From: shankar0123 Date: Thu, 14 May 2026 16:44:37 +0000 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20Phase=205=20Accessibility=20+?= =?UTF-8?q?=20Forms=20=E2=80=94=20close=20FE-H3=20+=20UX-H4=20primitive=20?= =?UTF-8?q?+=20FE-M1=20primitive=20+=20axe-core=20gate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the Phase 5 batch from cowork/frontend-design-audit.html: ships the joint UX-H4 + FE-M1 lever (FormField primitive + react-hook-form + zod schemas) and the FE-H3 fix (Headless UI Dialog focus trap on the 3 inline-managed modals), with an axe-core regression test + CI guard to prevent UX-H4 regressions. ═════════════════════════ AUDIT VERIFICATION ═════════════════════════ Confirmed live against the repo before implementing: • Q1 labels / htmlFor / input-id = 139 / 6 / 0 (audit said 138 / 6 / 0 — labels +1, otherwise accurate) • Q2 no form library installed (no react-hook-form, formik, @tanstack/react-form, final-form) • Q3 3 inline-managed dialog sites confirmed: SCEPAdminPage.tsx:272, AgentsPage.tsx:314, ESTAdminPage.tsx:281 • Q4 audit's top-6 list was OFF — actual top form-heaviest pages by useState count are: OIDCProviderDetailPage 21, AgentGroupsPage 18, CertificatesPage 17, CertificateDetailPage 14, BreakglassPage 13, ProfilesPage 13 — NOT the audit-suggested OnboardingWizard 5 (now split in Phase 4) / OIDCProvidersPage 8 / IssuersPage 11 / ProfilesPage 13 / TargetsPage 9 / ApprovalsPage 5. Audit's intuition skipped the higher-useState pages. • Q5 jest-dom imported in src/test/setup.ts — axe-core landed cleanly ═════════════════════════════ CLOSURES ═══════════════════════════════ UX-H4 (label/input binding) — FormField primitive shipped • web/src/components/FormField.tsx wraps a