--- phase: 20-fab-full-screen-catalog-search plan: 02 subsystem: ui tags: [react, framer-motion, fab, overlay, catalog-search, tags] requires: - phase: 20-01 provides: UIStore FAB/catalog state, useTags hook, useGlobalItems with tag filtering provides: - FabMenu component with animated mini menu - CatalogSearchOverlay with search, tag filtering, result cards - Root layout integration with global FAB visibility affects: [21-add-to-collection-flow, 22-manual-add-flow] tech-stack: added: [] patterns: [full-screen overlay pattern, FAB mini menu with framer-motion spring animations] key-files: created: - src/client/components/FabMenu.tsx - src/client/components/CatalogSearchOverlay.tsx modified: - src/client/routes/__root.tsx key-decisions: - "FAB visible on all authenticated non-public routes instead of collection-only" - "CatalogSearchOverlay resets search/tags state on close for fresh experience each open" - "Add button on result cards is a stub for Phase 21 wiring" - "Omitted Add Manually link from empty state -- premature for Phase 20" patterns-established: - "FAB mini menu: framer-motion spring animations with staggered entrance" - "Full-screen catalog overlay: fixed inset-0 z-50 with body scroll lock" requirements-completed: [CATFLOW-01, CATFLOW-02] duration: 11min completed: 2026-04-06 --- # Phase 20 Plan 02: FAB Menu & Catalog Search Overlay Summary **Global FAB with animated mini menu and full-screen catalog search overlay with debounced search, tag chip AND-filtering, and result card grid** ## What Was Built ### FabMenu Component (115 lines) - Fixed-position FAB button (bottom-right) with framer-motion rotation animation (+ to x) - Mini menu with "Add to Collection" (Package icon) and "Start New Thread" (Search icon) options - Conditional "New Setup" option when on setups page - Subtle backdrop overlay that closes menu on click - Spring animations with staggered entrance (50ms delay between items) - Auto-hides when catalog search overlay is open ### CatalogSearchOverlay Component (262 lines) - Full-screen white overlay (z-50) with slide-up animation - Context-aware header showing "Adding to Collection" or "Starting a Thread" - Large autofocused search input with 300ms debounce - Horizontal scrollable tag chips with active (blue) / inactive (gray) toggle states - Result card grid (1/2/3 columns responsive) matching GlobalItemCard badge pattern - Skeleton loading grid (6 cards) with pulse animation - Empty state with contextual messaging - Body scroll lock when overlay is open - State reset on overlay close ### Root Layout Integration - Replaced old single-action collection-only FAB with global FabMenu - FAB now visible on all authenticated pages (collection, threads, setups, dashboard, settings, global-items) - FAB hidden on login and public profile/setup pages - CatalogSearchOverlay rendered globally, manages own visibility via UIStore - Removed unused openAddPanel reference from root ## Deviations from Plan ### Auto-fixed Issues None -- plan executed exactly as written. ## Known Stubs | File | Location | Stub | Resolution | |------|----------|------|------------| | CatalogSearchOverlay.tsx | handleAddStub() | Add button on result cards does nothing | Phase 21 wires add-to-collection and add-to-thread flows | | FabMenu.tsx | "New Setup" onClick | Closes menu but no action | Phase 21 or existing setup creation flow | ## Commits | Task | Commit | Description | |------|--------|-------------| | 1 | 7204608 | FabMenu and CatalogSearchOverlay components | | 2 | e13f958 | Wire into root layout, replace old FAB | | 3 | -- | Auto-approved checkpoint (visual verification) | ## Verification - `bun run lint` -- passes (no errors in new/modified files) - `bun run build` -- succeeds - `bun test` -- service tests pass (UI components are client-only) ## Self-Check: PASSED