From 73c430b8a5611dee384076e3dc7d7dd01753fd7d Mon Sep 17 00:00:00 2001 From: FragginWagon Date: Thu, 10 Sep 2026 07:53:03 -0400 Subject: [PATCH] feat: preserve focus and catalog context during public navigation --- apps/web/src/assets/styles/global.scss | 2 + .../molecules/ListingCard.stories.js | 1 + .../src/components/molecules/ListingCard.vue | 9 ++- apps/web/src/composables/usePublicPage.js | 10 +++ apps/web/src/pages/CatalogPage.stories.js | 7 +- apps/web/src/pages/CatalogPage.vue | 5 +- .../src/pages/ListingDetailPage.stories.js | 2 + apps/web/src/pages/ListingDetailPage.vue | 13 +++- .../src/pages/ProductDetailPage.stories.js | 2 + apps/web/src/pages/ProductDetailPage.vue | 13 +++- apps/web/src/services/public-navigation.js | 5 ++ apps/web/tests/e2e/public-navigation.spec.js | 77 +++++++++++++++++++ apps/web/tests/public-navigation.test.js | 10 +++ docs/ACCESSIBILITY.md | 19 +++++ docs/IMPLEMENTATION-STATUS.md | 12 ++- 15 files changed, 175 insertions(+), 12 deletions(-) create mode 100644 apps/web/src/composables/usePublicPage.js create mode 100644 apps/web/src/services/public-navigation.js create mode 100644 apps/web/tests/e2e/public-navigation.spec.js create mode 100644 apps/web/tests/public-navigation.test.js diff --git a/apps/web/src/assets/styles/global.scss b/apps/web/src/assets/styles/global.scss index ac3e424..be18879 100644 --- a/apps/web/src/assets/styles/global.scss +++ b/apps/web/src/assets/styles/global.scss @@ -124,3 +124,5 @@ h1 { max-width: 760px; margin: var(--space-3) 0 var(--space-4); font-size: var(- .admin-shell__content { padding: var(--space-6); } .admin-workspace-grid { grid-template-columns: 1fr; } } + +.public-page-focus:focus-visible { outline: var(--border-strong) solid var(--color-focus); outline-offset: -3px; } diff --git a/apps/web/src/components/molecules/ListingCard.stories.js b/apps/web/src/components/molecules/ListingCard.stories.js index f43c395..d4bae3b 100644 --- a/apps/web/src/components/molecules/ListingCard.stories.js +++ b/apps/web/src/components/molecules/ListingCard.stories.js @@ -43,5 +43,6 @@ export const KeyboardReachable = { const canvas = within(canvasElement); await userEvent.tab(); await expect(canvas.getByRole('link')).toHaveFocus(); + await expect(canvas.getByRole('link')).toHaveAttribute('href', '/listings/listing-1'); }, }; \ No newline at end of file diff --git a/apps/web/src/components/molecules/ListingCard.vue b/apps/web/src/components/molecules/ListingCard.vue index e29f36f..0af59c9 100644 --- a/apps/web/src/components/molecules/ListingCard.vue +++ b/apps/web/src/components/molecules/ListingCard.vue @@ -1,4 +1,9 @@