diff --git a/docs/redesign/phase-5/p5-15/p5-15-04/mobile-drawer/README.md b/docs/redesign/phase-5/p5-15/p5-15-04/mobile-drawer/README.md index 9f6325a..1a8d012 100644 --- a/docs/redesign/phase-5/p5-15/p5-15-04/mobile-drawer/README.md +++ b/docs/redesign/phase-5/p5-15/p5-15-04/mobile-drawer/README.md @@ -7,3 +7,11 @@ The unchanged native reduced-motion drawer case still fails. A nonmutating test The instrument calls the original HTMLElement focus implementation without changing its arguments/behaviour. It records only synthetic fixture DOM states. The existing hard/soft assertions are unchanged; no sleep, skip or expected-failure marker is added. This is transition/entry handling, not evidence that all navigation permanently traps the user. PRES-E07 remains FAIL at this RED checkpoint. A minimal successor must focus from the visible entering phase, preserve a user's already-selected internal focus, and leave MUI containment/Escape/restoration protection enabled. Human screen-reader/device acceptance remains incomplete; production remains NO-GO. + +## Verified successor + +The existing `onEntered` callback now also recovers focus when the active element is outside the drawer. It retains internal user-selected focus. Testing `onEntering` established that its ancestor can still be hidden; that attempted implementation was not committed. Waiting for the existing completed transition is the correct lifecycle boundary. MUI autofocus, containment, Escape and focus restoration remain enabled. + +Fresh native assertions pass 2/2: keyboard opening under reduced motion selects Dashboard, Escape returns to Open navigation, and emulated touch mode/orientation navigation retains focus. The shell's three focused unit suites pass 10/10 and the production frontend build passes. One preceding run failed before exercising the drawer because a prebuilt export pointed at port 5202 instead of the fixture API at 5302; its trace establishes the setup error. The corrected native run uses the matching build, no retry, relaxed assertion or arbitrary delay. + +The bounded defect is repaired. PRES-E07 can return to PARTIAL, with human screen-reader and physical-device obligations still open. This is not production or complete accessibility acceptance. diff --git a/job-tracker-ui/src/layout/AppShell.tsx b/job-tracker-ui/src/layout/AppShell.tsx index d4ec0ad..bacaf90 100644 --- a/job-tracker-ui/src/layout/AppShell.tsx +++ b/job-tracker-ui/src/layout/AppShell.tsx @@ -615,7 +615,7 @@ export default function AppShell({ slotProps={{ paper: { "aria-label": t("navigation") }, transition: { onEntered: (node: HTMLElement) => { - if (node === document.activeElement) node.querySelector('[role="button"]')?.focus(); + if (node === document.activeElement || !node.contains(document.activeElement)) node.querySelector('[role="button"]')?.focus(); } }, }} sx={{