Skip to content

Frontend PR #643 now connects to the filtered catalogue contract in backend PR #452. Both remain open. Types and series come from scoped server facets, while product requests use pages of 30. Series-list browsing does not fetch every product. The existing three-column layout is virtualized, preserving light/dark theme tokens.

Search waits 300 ms; stale responses cannot overwrite a newer selection. A session-only LRU cache holds at most 60 validated pages, with two-minute freshness; facets have five-minute freshness and at most 16 cached scopes. Keys isolate host/client, game, region, type, series, query and offset. Cached first-page results appear immediately, stale data is revalidated, failed refreshes keep cached data and initial-page revalidation invalidates following cached pages. Following pages are appended without duplicate IDs and stop at the last page.

Images use the existing native cache and content-addressed approved URLs. Grid thumbnails are separate from detail art, which is requested on opening. Missing or failed thumbnails leave a placeholder. Native disk caches can be evicted by the OS; this is not guaranteed offline catalogue storage. Prices are not implemented and will require their own shorter-lived cache/update timestamp.

Validation: lint and TypeScript pass; Jest reports 247 suites and 2,389 passing tests, with two suites and 11 pre-existing skipped tests. Sixteen targeted tests cover the client/cache/controller and component interactions across light/dark. The Maestro flow is updated, but npm run e2e cannot run because Maestro is not installed, although an Android emulator is connected. No current-build native visual verification, PostgreSQL integration or iOS build is claimed.

No dependency or native-build changes, runtime demo products, prices, collection writes, image import/publication, VPS deployment or merge. Existing generated Android resources remain uncommitted. Real products still need a reviewed import and derivative publication before they can appear in the application.