feat: preserve focus and catalog context during public navigation
Quality / test (push) Canceled after 0s

This commit is contained in:
2026-09-10 07:53:03 -04:00
parent a02965de4a
commit 73c430b8a5
15 changed files with 175 additions and 12 deletions
+19
View File
@@ -70,3 +70,22 @@ Remaining manual coverage: native browser zoom, screen-reader speech and route
announcements (VoiceOver/Safari or NVDA/Firefox), and the full live-data navigation
journey. Automated checks and accessibility-tree inspection do not certify WCAG
conformance or replace those reviews.
## Public route navigation — 2026-09-10
- Catalog cards use router links with ordinary URL/open-in-new-tab behavior.
- Catalog and public detail pages set descriptive browser titles. Detail titles
update to the product name or error message after loading.
- Entry focuses the named main landmark with a visible keyboard outline. It is
programmatically focusable (`tabindex=-1`) without adding an extra Tab stop.
Query updates and asynchronous results do not move focus again.
- Filtered catalog links carry their origin in `from`; “Back to catalog” restores
that URL. Only `/` and catalog query URLs are accepted; external or non-catalog
destinations fall back to `/`. Browser Back retains its normal history behavior.
- Three public Playwright tests exercise keyboard navigation, query preservation,
browser Back, direct product links, not-found titles, safe return URLs, and a
delayed response while focus remains on the return link. They intercept public
API responses and do not require credentials or mutate production data.
These checks verify browser focus, titles, and navigation behavior. Screen-reader
speech and native browser zoom remain manual follow-ups from the earlier review.
+10 -2
View File
@@ -131,14 +131,22 @@ Verified locally: `npm test` passes 166 tests with no failures (23 domain, 79 ap
- Coverage includes validation/partial-update/clearing tests, public HTTP contracts, PostgreSQL repository reads, settings edit/clear interactions, both public page integrations, and absent/plain-text/dark-theme component stories.
- Validation: 166 API tests, 23 isolated PostgreSQL/Redis integration tests, 10 web tests, production web build, Storybook build, and Storybook interaction/accessibility runner (32 suites / 84 tests).
### Latest Vertical Slice: Public Browsing Accessibility
### Public Browsing Accessibility
- Public gallery labels use API image descriptions, controls wrap at narrow widths, and failed API image URLs have an accurate accessible fallback.
- Long detail text and seller contacts reflow, read-only condition badges no longer add inactive buttons to keyboard navigation, and detail loading/errors expose announcement roles.
- Added keyboard, 320px reflow, 200% text enlargement, and detail-state regression stories. Browser review and its native-zoom/screen-reader limitations are recorded in `docs/ACCESSIBILITY.md`.
- Validation: 166 API tests, 10 web tests, production web build, Storybook build, and 32 Storybook suites / 93 tests. This frontend-only slice changes no persistence or API contracts.
Next bounded slice: public route navigation accessibility. Review catalog → listing/product → back navigation with a screen reader, add appropriate page titles and route-focus handling where missing, and cover navigation in browser tests. Include native 200% zoom review.
### Latest Vertical Slice: Public Navigation Accessibility
- Catalog cards use router links; catalog and detail pages have descriptive titles and named, focused main landmarks on entry.
- Async responses and query updates preserve user focus. Filtered catalog URLs survive the explicit return link and browser Back; return destinations are restricted to the catalog.
- Added three public browser navigation tests and return-path validation coverage; updated page/card Storybook interactions.
- Validation: 166 API tests, 11 web tests, 3 public Playwright tests, production web build, Storybook build, and 32 Storybook suites / 93 tests. No API or persistence changes.
- Screen-reader speech and native browser zoom remain manual review items; this slice verifies browser focus and title behavior.
Next bounded slice: clearing configured seller contact methods. The Settings form currently converts blank email/phone values to omitted fields, so the server's partial-update merge retains old contacts. Support explicit removal through validation, settings UI/API, and public detail output, with edit/clear regression coverage.
## Next Milestone