- Two-row sticky toolbar: search input + view toggle (Row 1), tag/weight/price filter pills (Row 2)
- Tag filter popover with click-outside close via useRef/useEffect
- Weight and price range filter popovers with min/max sliders
- Active filter removable pills + Clear all button
- Grid view uses existing GlobalItemCard, list view uses Link-based GlobalItemListRow
- SkeletonGrid and SkeletonList loading states
- Empty state with context-aware message (query vs no catalog items)
- Search input pre-fills from ?q= URL param, debounces 300ms
- No framer-motion, no manual entry mode, no Add buttons
- Add validateSearch with z.object({ q }) to route definition
- Use Route.useSearch() to get q param instead of local state
- Remove duplicate search input UI, debounce state and useEffect
- Show "Showing results for X" label when q is present
- Update empty state text based on whether q param exists
- Replace fake button with real text input and search icon
- Navigate to /global-items?q=query on Enter or icon click
- Clear input after navigation
- Remove openCatalogSearch usage from TopNav (FAB/BottomTabBar flows unchanged)
Root cause: COOLIFY_TOKEN secret had a leading space (0x20) causing
401 Unauthenticated. Strip whitespace with tr before passing to curl.
Also removes debug diagnostics.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Previous run failed at od -t x1z (unsupported in Alpine busybox).
Switch to hexdump -C which is available in Alpine.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add hex dump of token prefix to check for hidden characters,
and try curl --oauth2-bearer as alternative auth method.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Logs token length, pipe presence, webhook URL, and full response
body to diagnose authentication failures in CI.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Replace arrow entity + "Dashboard" back link with ArrowLeft icon + "Discover"
- Consolidate title and search into a single flex row (wraps on mobile)
- Reduce outer padding from py-6 to py-4
- Remove subtitle paragraph and separate mb-6/mb-8 section margins
- Delete HeroSection function (Discover Gear heading, search bar, Go to Collection link)
- Remove unused imports: Link, Search (lucide-react), useAuth, useUIStore
- LandingPage now starts directly with PopularSetupsSection
- Search now exclusively in TopNav bar
- Replace TotalsBar import with TopNav and BottomTabBar imports
- Remove isDashboard and totalsBarProps variables
- Render TopNav instead of TotalsBar
- Add /setups to isPublicRoute for anonymous direct navigation
- Wrap FabMenu in hidden md:block for mobile hiding
- Add BottomTabBar after FAB block (md:hidden in component itself)
- Add pb-16 md:pb-0 to root div to prevent content occlusion by bottom tab bar
- Fixed bottom tab bar for mobile (md:hidden) with z-20 stacking
- 4 tabs: Home, Collection, Setups, Search with Lucide icons
- Collection and Setups fire openAuthPrompt for anonymous users
- Search tab calls openCatalogSearch('collection') to open overlay
- Active route highlighting via useMatchRoute
- Framer Motion entry animation (y slide + fade)
- iOS safe area padding with env(safe-area-inset-bottom)
[Rule 1 - Bug] Used 'house' icon instead of 'home': lucide-react has no 'Home' icon (only 'House')
- Sticky top nav bar replacing TotalsBar with full navigation
- Logo, Home/Collection/Setups links, search bar, and user avatar
- NavLinkOrButton helper: button for anon users on protected routes, Link for authenticated
- Active route highlighting via useMatchRoute
- Desktop search bar triggers openCatalogSearch('collection')
- Desktop nav links hidden on mobile (hidden md:flex)
- Uses LucideIcon wrapper, not direct lucide-react imports
[Rule 1 - Bug] Used 'house' icon fallback check: plan specified 'home' which does not exist in lucide-react; 'search' and 'layers' verified present
- Update dashboard.spec.ts: replace old card heading tests with discovery section tests
- Add TopNav presence test (Home/Collection/Setups links in nav)
- Add mobile bottom tab bar test with 375px viewport
- Mark removed dashboard card tests as test.fixme with explanatory comments
- Update collection.spec.ts: replace setups tab test with fallback-to-gear test
- Add standalone /setups route test in new Setups page describe block
- All tests expected to fail until Plans 01-03 implement the new UI
Remove unused functions and imports from route tests, fix array index key
warnings in skeleton components, apply biome formatting.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>