From e5ff43439546d443581640057f0442bf23621e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 15 May 2026 18:03:57 +0200 Subject: [PATCH] docs(planning): mobile audit report for measurements and workouts --- .../v1427-r3c-mobile-measurements-workouts.md | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 .planning/research/v1427-r3c-mobile-measurements-workouts.md diff --git a/.planning/research/v1427-r3c-mobile-measurements-workouts.md b/.planning/research/v1427-r3c-mobile-measurements-workouts.md new file mode 100644 index 000000000..1e1e45eeb --- /dev/null +++ b/.planning/research/v1427-r3c-mobile-measurements-workouts.md @@ -0,0 +1,171 @@ +--- +file: .planning/research/v1427-r3c-mobile-measurements-workouts.md +purpose: Mobile capability audit — measurements list / new-form / edit + workouts surface +created: 2026-05-15 +auditor: MA4 +--- + +# Mobile audit — measurements and workouts + +## Summary + +Reviewed the four files that compose this surface: `src/app/measurements/page.tsx` (74 LOC), `src/components/measurements/measurement-form.tsx` (446 LOC), `src/components/measurements/measurement-list.tsx` (820 LOC), `src/components/measurements/measurement-list-meta.ts` (metadata). Confirmed by grep that no client-side workouts route or component exists in `src/app/workouts` or `src/components/workouts`; B7 only wired `pickCanonicalWorkout()` into the JSON read path and there is currently no UI surface to attach, list, or detail workouts on the web. The measurements UI ships a dedicated mobile card grid (`md:hidden` branch in the list), which is good, but the new-measurement and edit dialogs are full-screen-hostile, numeric inputs are missing every keyboard hint and a11y attribute, and tap targets sit between 32 and 40 px on the mobile row's action buttons. 14 findings: 1 Critical, 5 High, 6 Medium, 2 Low. + +Two findings (F1, F4) overlap with the MA1 dashboard report at `.planning/research/v1427-r3c-mobile-dashboard.md` because the same `` is mounted from `/` and `/measurements`; the consolidator should de-duplicate when bucketing. + +## Findings + +### F1 — Numeric inputs ship without `inputmode`, `enterkeyhint`, `autocomplete`, or `aria-*` wiring + +- Severity: Critical +- Axis: logic + code +- File: `src/components/measurements/measurement-form.tsx:266-335`, also re-used in `measurement-list.tsx:601-608` (edit dialog) +- Symptom: Every numeric field (`sys`, `dia`, `puls`, `value`, `edit-value`) renders `` with no `inputMode`, no `enterKeyHint`, no `autoComplete` override, no `aria-required`, no `aria-invalid`. On iOS Safari `type="number"` still surfaces the full QWERTY keyboard by default unless `inputMode="decimal"` is set; the user then has to slide to the digit pane to type a weight. Form validation errors render as a single `role="alert"` block at the form bottom and are not linked back to the offending field via `aria-describedby`, so VoiceOver users do not hear which field failed. +- Evidence: `grep -n "inputMode\|inputmode\|enterkeyhint\|aria-required\|aria-invalid" measurement-form.tsx measurement-list.tsx` returns zero hits across both files. +- Recommended fix: Add `inputMode="decimal"` (and `enterKeyHint="next"` / `"done"` for the last field) to every numeric ``. Mirror `aria-required={true}` on `required` fields and toggle `aria-invalid` when the field rejects parse / range. Link the existing error banner via `aria-describedby={errorId}`. +- Effort: S + +### F2 — Mobile list row edit / delete buttons sit at 32 and 40 px, below the 44 pt floor + +- Severity: High +- Axis: visual +- File: `src/components/measurements/measurement-list.tsx:529-541` +- Symptom: The `md:hidden` mobile row uses `