Files
familysync/.planning/phases/17-ui-optimization-polish/17-REVIEW-FIX.md
T

57 lines
3.4 KiB
Markdown

---
phase: 17-ui-optimization-polish
fixed_at: 2026-06-18T14:04:00Z
review_path: .planning/phases/17-ui-optimization-polish/17-REVIEW.md
iteration: 3
findings_in_scope: 2
fixed: 2
skipped: 0
status: all_fixed
---
# Phase 17: Code Review Fix Report (Iteration 3)
**Fixed at:** 2026-06-18T14:04:00Z
**Source review:** .planning/phases/17-ui-optimization-polish/17-REVIEW.md
**Iteration:** 3
**Summary:**
- Findings in scope: 2 (fix_scope: all — includes Info)
- Fixed: 2
- Skipped: 0
**Gate status after fixes (all pass):**
- `pnpm --filter @familysync/pwa test` → pass (22 files, 266 passed / 0 failed)
- `pnpm --filter @familysync/pwa typecheck` → pass (tsc + e2e tsconfig)
- `pnpm --filter @familysync/pwa lint` → pass (eslint `--max-warnings 0`)
## Fixed Issues
### CR-01: `useFocusTrap` visibility filter excluded all focusables under jsdom (CI gate failed)
**Files modified:** `apps/pwa/src/hooks/useFocusTrap.ts`
**Commit:** 287ecae
**Applied fix:** The prior iter-3 auto-fix (WR-01) rejected every focusable under jsdom because there `getBoundingClientRect()` returns all-zero geometry and `offsetParent` is `null` for every node, which short-circuited the trap (`focusable.length === 0`) and broke the two pre-existing WR-07 focus-trap regression tests — making `pnpm test` (a CI gate) fail at 2 failed / 264 passed.
Made the visibility heuristic tolerant of a non-layout environment: it now derives `hasLayout = r.width > 0 || r.height > 0 || el.offsetParent !== null`, and when there is no evidence of a layout engine (jsdom) it treats the node as visible instead of filtering it. Only when a real layout exists does it apply the `offsetParent === null` / zero-geometry exclusion, so genuinely hidden/collapsed nodes are still excluded in a real browser. The `hidden`-attribute exclusion is unambiguous regardless of layout, so it was hoisted out and kept unconditional. Result: all 266 PWA tests pass, including both WR-07 cases.
### IN-01: Focus-trap containment guard was unreachable as wired (harmless dead branch)
**Files modified:** `apps/pwa/src/hooks/useFocusTrap.ts`
**Commit:** 287ecae
**Applied fix:** The handler is wired only to each dialog's own `onKeyDown`, so it can only run while focus is already inside the dialog subtree; the `!dialogRef.current.contains(document.activeElement)` containment branch could therefore never evaluate true and delivered no actual containment guarantee. Per the review's recommendation, removed the inert branch and replaced its misleading comment with an accurate note: this is a deliberate boundary-only trap (a `document`-level `keydown`/`focusin` listener would be required for true containment, and is unnecessary for the current always-focus-the-heading-on-open flows). No behavior change in any real scenario — it only removes a comment that implied a guarantee the wiring cannot provide.
## Skipped Issues
None.
## Prior Iterations
Iterations 1 and 2 fixed the earlier batches of findings (15 in iter-1, then the iter-3 review's WR-01/IN-02/IN-03 set). The IN-02 (favicon.ico coupling) and IN-03 (OidcRedirect visible status) fixes were confirmed clean by the final re-review. This iteration-3 report supersedes those and records the final state: the WR-01 regression (CR-01) and its inert containment guard (IN-01) are now resolved, with all CI gates green.
---
_Fixed: 2026-06-18T14:04:00Z_
_Fixer: Claude (gsd-code-fixer)_
_Iteration: 3_