Skip to content

fix: make limited-time shop filter impossible to miss - #71

Merged
SteveSimonson merged 2 commits into
mainfrom
fix/limited-filter-ux
Jul 31, 2026
Merged

fix: make limited-time shop filter impossible to miss#71
SteveSimonson merged 2 commits into
mainfrom
fix/limited-filter-ux

Conversation

@SteveSimonson

Copy link
Copy Markdown
Owner

Fixes #70

Summary

Limited mode used to look almost like normal shop browse. Now:

  • Always-on amber banner when `?limited=1`: “Filter on · This week only”, piece count vs full house, Show full collection
  • Removable chips for This week / room / search
  • Toggle becomes This week · On with pressed styling
  • Results line: “This week · N of 64 in the house”
  • Header + top bar flip to Full collection / exit when limited is active

Test plan

  • /shop?limited=1 → loud banner + chips; exit returns full house
  • Header “This week” → limited; then button becomes “Full collection”
  • Category + limited still shows filter-on badge + banner below
  • Clear all wipes limited + cat + search

When This week is on, show a high-visibility banner (count vs full
house + Show full collection), removable filter chips, pressed toggle
label, and header/top bar that flip to Full collection exit paths.
@SteveSimonson

Copy link
Copy Markdown
Owner Author

Independent review — limited filter UX (#71 / #70)

Scope checked: limited-mode visibility, exit paths, Layout + useSearchParams safety, a11y (aria-pressed / role="status").
Typecheck: npx tsc --noEmitpass (exit 0).

Limited mode visibility — good

The core problem in #70 (silent filter) is fixed well:

  • Global top bar flips to rust Filter on · This week only with “not the full house” + exit link when pathname is shop and ?limited=1.
  • Always-on in-page banner whenever limited (including under CategoryHero), with piece count vs house total.
  • Removable chips, results line (This week · N of {houseTotal}), toggle This week · On with pressed styling, CategoryHero badge/copy.
  • Empty state copy calls out the weekly list specifically.

Hard to stay in limited mode without noticing.

Exit paths — good, with one consistency nit

Exits are plentiful and intentional:

Control Behavior
Top bar “Show full collection” to="/shop" (clears all shop query)
Header / mobile “Full collection” to="/shop"
Banner CTA updateParams({ limited: null }) (keeps cat / q)
“This week only” chip drops limited only
Clear all / Clear filters setParams({})
Empty: “Turn off This week” drops limited only
Empty: “Show full collection” clear all

Nit: The same label “Show full collection” means two different things (strip only limited vs wipe all params). Prefer either (a) banner CTA → /shop / clearAllFilters, or (b) rename the limited-only action to “Turn off This week” (as empty state already does) so exit language matches behavior.

Footer still always links This week → ?limited=1 (entry only); header flips. Minor, not blocking.

Layout + useSearchParams safety — OK

  • App is BrowserRouter + nested Route element={<Layout />} (src/App.tsx). Layout is always under a router context; no data-router/Suspense requirement for useSearchParams here.
  • Read-only usage (const [searchParams] = useSearchParams()) is fine; no setter race with Shop.
  • limitedMode is correctly gated: onShop && searchParams.get('limited') === '1', so non-shop routes keep the moss promo bar.
  • Re-render of Layout on any search-param change is expected cost for site chrome that mirrors shop state.

No safety issue for this stack (react-router-dom ^7.18).

A11y — mostly solid, one real nit

Good

  • Toggle: aria-pressed={limited} with clear on/off labels — correct toggle pattern.
  • Limited banner: role="status" + aria-live="polite" announces filter-on state to AT.
  • Chips: aria-label={Remove filter: ${label}}; decorative icons aria-hidden.
  • Active filters region: aria-label="Active filters".

Nit (incorrect aria-current)

aria-current={limitedMode ? 'page' : undefined}

When limited is on, this sits on the “Full collection” exit link. That link is a destination, not the current location/state. Screen readers can hear “current page” on the escape CTA while the user is still filtered. Prefer dropping aria-current here, or only reflecting “this week is active” via the in-page aria-pressed toggle (already correct). Do not mark the exit control as current.

(role="status" already implies live polite; redundant aria-live is harmless.)

Other small notes (non-blocking)

  • Header exit to bare /shop while banner preserves room/search is the same label/behavior split as above; product decision is fine if labeled clearly.
  • CategoryHero badge no longer names the room (“This week in {title}” → “Filter on · This week only”); OK given the always-on banner under the hero.

Summary

Meets #70 acceptance: limited mode is unmistakable, counts are framed against the house total, chips + clear-all exist, header offers full collection when limited is active. Typecheck clean. No merge-blocking functional defects; fix or consciously accept the CTA-label consistency and aria-current nits.

VERDICT: APPROVE_WITH_NITS

@SteveSimonson
SteveSimonson merged commit 5104d56 into main Jul 31, 2026
1 check passed
@SteveSimonson
SteveSimonson deleted the fix/limited-filter-ux branch July 31, 2026 04:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Limited-time shop filter UX is invisible

1 participant