Commit Graph

117 Commits

Author SHA1 Message Date
334bf334f6 feat(quick-260411-0zq): global items page reads query from URL search params
- 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
2026-04-11 00:47:23 +02:00
04e32c2017 feat(quick-260411-0zq): convert TopNav search button to real input with navigation
- 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)
2026-04-11 00:46:54 +02:00
4aab1fe1f8 feat(260411-022): compact global items catalog header
- 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
2026-04-11 00:06:03 +02:00
a576f53d33 fix(27): lint fixes — unused param, import order, formatting
All checks were successful
CI / ci (push) Successful in 1m8s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
2026-04-10 23:54:46 +02:00
c628d6b79c feat(27-03): remove hero section from landing page
- 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
2026-04-10 23:47:50 +02:00
d99ebbd8be feat(27-03): wire TopNav, BottomTabBar, and FAB changes into __root.tsx
- 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
2026-04-10 23:47:30 +02:00
24ed71975f feat(27-01): create BottomTabBar component
- 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')
2026-04-10 23:44:56 +02:00
dccb1f8d3f feat(27-01): create TopNav component
- 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
2026-04-10 23:44:31 +02:00
7fd9845c13 feat(27-02): remove Setups tab from Collection page
- TAB_ORDER reduced to [gear, planning]
- searchSchema z.enum updated; .catch("gear") handles old ?tab=setups URLs
- SetupsView import and render branch removed
- AnimatePresence, slide variants, CollectionView/PlanningView unchanged
2026-04-10 23:43:49 +02:00
329bfce379 feat(27-02): add /setups top-level route page
- Creates src/client/routes/setups/index.tsx
- Renders SetupsView inside standard max-w-7xl page container
- Follows existing createFileRoute pattern from $setupId.tsx sibling
2026-04-10 23:43:33 +02:00
6e3ce4a31f fix: resolve biome lint errors in discovery files
All checks were successful
CI / ci (push) Successful in 1m8s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
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>
2026-04-10 15:15:58 +02:00
8aaf4352ed feat(26-03): rewrite landing page as public discovery page
- Replace DashboardPage with LandingPage using discovery hooks
- Add HeroSection with Discover Gear heading and catalog search trigger
- Add PopularSetupsSection using useDiscoverySetups with PublicSetupCard
- Add RecentItemsSection using useDiscoveryItems with GlobalItemCard
- Add TrendingCategoriesSection using useDiscoveryCategories with pills
- Conditional Go to Collection CTA for authenticated users
- Loading skeletons with animate-pulse for all three sections
- Empty state handling: sections return null when no data
- SectionSkeleton helper for consistent loading states
- All clickable elements have cursor-pointer
2026-04-10 15:01:49 +02:00
0bf1c68043 feat(26-03): enhance PublicSetupCard with itemCount and creatorName
- Add optional itemCount and creatorName fields to PublicSetupCardProps
- Render item count badge (blue pill) when itemCount > 0
- Render creator attribution line when creatorName is present
- Reorder card layout: name, creator, then count/date row
- Add cursor-pointer to Link className
- Backward compatible: existing usages passing only id/name/createdAt unaffected
2026-04-10 15:00:57 +02:00
747a1c3727 feat(26-02): React Query hooks for discovery data
- Create useDiscoverySetups, useDiscoveryItems, useDiscoveryCategories hooks
- Export DiscoverySetup and DiscoveryCategory interfaces
- Set staleTime 2min for setups/items, 5min for categories
2026-04-10 14:57:53 +02:00
fc9a9134e8 chore(25-02): apply biome formatter to task 1 and 2 files 2026-04-10 11:06:11 +02:00
e4a65314bd feat(25-02): add attribution display on catalog detail page
- GlobalItem interface extended with sourceUrl, imageCredit, imageSourceUrl fields
- Attribution block below image: Photo credit and source link when present
- Product page link (sourceUrl) at bottom of detail page
- Image div mb-6 moved to attribution paragraph for consistent spacing
2026-04-10 11:05:52 +02:00
7b0efae0c4 feat(24-02): render-first root layout, guarded write actions, public setup viewing
- Remove authLoading spinner gate — app renders immediately for all visitors
- Expand isPublicRoute to include /, /global-items/*, /setups/*, /users/, /login
- Replace hard window.location.href redirect with soft navigate() after auth resolves
- Remove onboarding loading spinner — pass isAuthenticated as enabled to guard query
- Add AuthPromptModal to root JSX for global availability
- Guard Add to Collection and Add to Thread buttons with isAuthenticated check
- Rework setup detail page to use usePublicSetup for anonymous visitors
- Wrap all write action UI (Add Items, Delete, Public toggle, remove/classify) in isAuthenticated guards
2026-04-10 10:09:41 +02:00
cd85715d05 feat(24-02): add auth prompt state, modal, usePublicSetup hook, guard onboarding
- Extend uiStore with showAuthPrompt/openAuthPrompt/closeAuthPrompt state
- Create AuthPromptModal component with sign in/sign up CTAs pointing to /login
- Add usePublicSetup hook to useSetups for anonymous setup viewing via public API
- Rework useOnboardingComplete to accept enabled param (guards auth-gated call)
2026-04-10 10:06:59 +02:00
570be6fcc1 fix: prevent crash on login when user has no active threads
All checks were successful
CI / ci (push) Successful in 1m4s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
activeThreads[0].id in useEffect dependency array threw when the array
was empty. Use optional chaining to safely handle the empty case.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 22:48:29 +02:00
41e58d0153 wip: in-progress feature work (manual entry, collection view)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 15:28:34 +02:00
3f3c08c512 fix: format phase 22 worktree files that were committed unformatted
Some checks failed
CI / ci (push) Failing after 12s
CI / e2e (push) Has been skipped
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:49:09 +02:00
3638e7b240 fix: resolve all lint errors across source and test files
Some checks failed
CI / ci (push) Failing after 11s
CI / e2e (push) Has been skipped
- Fix unused function parameters (prefix with _)
- Fix unused imports in test files
- Fix import ordering in test files
- Auto-fix formatting issues across 22 files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:39:47 +02:00
e19d40e232 refactor: strip stats and unit switcher from top bar
Some checks failed
CI / ci (push) Failing after 19s
CI / e2e (push) Has been skipped
Remove weight unit switcher pills and collection stats (items, weight,
spent) from TotalsBar. Top bar now shows only logo/title and user menu.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:32:02 +02:00
024e9f909b fix: make image read-only for reference items, rename delete to remove
- Reference items show catalog image as read-only in edit mode (no upload)
- "Delete" button renamed to "Remove from Collection" for reference items

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:27:16 +02:00
69308e293f fix: restrict edit mode for reference items to personal fields only
Reference items (linked to global catalog) now show name, brand, weight,
and MSRP as read-only in edit mode with "from the catalog" hint. Only
personal fields (notes, category, quantity, image, product URL) are
editable. Standalone items retain full edit access.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:22:09 +02:00
56b81ee8ab fix(23): resolve UAT issues — duplicate header, image position, catalog submit style
- Remove duplicate back arrow/header from ManualEntryForm (overlay already shows it)
- Move ImageUpload to top of ManualEntryForm for visual cohesion
- Change "Submit to Catalog?" from text link to checkbox-style toggle

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 19:17:05 +02:00
f0e1cf4b9b feat(23-01): wire ManualEntryForm into CatalogSearchOverlay
- Add manualEntryMode and savedItemName local state with resets on overlay close
- Back arrow is context-sensitive: returns to search when in manual mode, closes overlay otherwise
- Header text updates to 'Manual Entry' or 'Item Added' in manual entry mode
- Search input, filters, and view toggles hidden when in manual entry mode
- EmptyState now accepts onAddManually callback with context-sensitive link text
- Persistent 'Can't find it? Add manually' link shown below search results
- ManualEntryForm rendered inline when manualEntryMode is active
- Success card shown after save with 'Submit to Catalog?' toast-only button
- 'Add Another' resets to search, 'Done' closes overlay
2026-04-06 17:56:41 +02:00
153b6cb76a feat(23-01): create ManualEntryForm component
- Compact form with name, category, weight, price, purchase price, product URL, notes, image
- Uses CategoryPicker and ImageUpload reusable components
- Calls useCreateItem without globalItemId for standalone item creation
- Back arrow (ArrowLeft) calls onBack prop to return to search results
- Converts price strings to cents via Math.round(Number(val) * 100)
- No toast.success on save — success card in overlay handles feedback
2026-04-06 17:38:13 +02:00
5ae0dd1b2d docs(23): capture phase context 2026-04-06 17:25:35 +02:00
c33b7c7bdc feat(22-02): build AddToThreadModal with thread picker and new thread flow
- Create AddToThreadModal with pick/create modes for thread selection
- Support existing thread selection with category display
- Support new thread creation with candidate in one step
- Pre-select session thread via catalogSessionThreadId
- Auto-switch to create mode when no active threads exist
- Wire AddToThreadModal at root layout level
2026-04-06 16:00:34 +02:00
ed76236294 feat(22-01): wire catalog search and detail page to collection/thread modals
- Replace handleAddStub with handleAdd dispatching to correct modal by mode
- Global item detail page: add both "Add to Collection" and "Add to Thread" buttons
- Remove console.log stub from detail page
- Import useUIStore in both components

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:56:40 +02:00
f309c73304 feat(22-01): add UIStore modal states, AddToCollectionModal, and sonner toasts
- Extend UIStore with addToCollectionModal, addToThreadModal, catalogSessionThreadId
- Create AddToCollectionModal with category dropdown, notes, purchase price
- Install sonner and add Toaster + AddToCollectionModal to root layout
- closeCatalogSearch now resets catalogSessionThreadId

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 15:55:44 +02:00
a62357c063 Merge branch 'worktree-agent-a00c5cfa' into Develop
# Conflicts:
#	.planning/REQUIREMENTS.md
#	.planning/STATE.md
#	src/client/components/CatalogSearchOverlay.tsx
#	src/client/routes/threads/$threadId.tsx
2026-04-06 15:15:57 +02:00
4c79735426 feat(21-03): remove slide-out panels from root layout and clean UIStore
- Remove Item and Candidate SlideOutPanel instances from __root.tsx
- Remove SlideOutPanel, ItemForm, CandidateForm imports from root
- Remove panel state (panelMode, editingItemId, candidatePanelMode, editingCandidateId) from UIStore
- Remove panel actions (openEditPanel, openAddPanel, closePanel, etc.) from UIStore
- Preserve currentThreadId derivation for CandidateDeleteDialog
- Update CollectionView empty state to use catalog search instead of add panel
- Update ItemForm/CandidateForm with onClose prop replacing store panel close
- Clean all dead panel references across src/client/
2026-04-06 15:12:59 +02:00
1f79c5ca3c feat(21-03): rewire card click handlers to navigate to detail pages
- ItemCard navigates to /items/$itemId instead of opening edit panel
- CandidateCard navigates to /threads/$threadId/candidates/$candidateId
- CandidateListItem navigates to candidate detail page
- CatalogSearchOverlay cards navigate to /global-items/$globalItemId
- Add button on catalog cards uses stopPropagation to prevent navigation
2026-04-06 15:07:51 +02:00
a5a40b2068 Merge branch 'worktree-agent-a4608610' into Develop
# Conflicts:
#	.planning/ROADMAP.md
#	.planning/STATE.md
#	src/client/routes/threads/$threadId.tsx
2026-04-06 15:04:13 +02:00
6474033414 Merge branch 'worktree-agent-a1363a63' into Develop
# Conflicts:
#	.planning/ROADMAP.md
#	.planning/STATE.md
2026-04-06 15:04:00 +02:00
52c9ec3fe2 docs: stage before wave 1 merge 2026-04-06 15:03:45 +02:00
47b416effd feat(21-02): replace slide-out panel with add-candidate modal on thread page
- Add local AddCandidateModal component with all candidate form fields
- Remove openCandidateAddPanel UIStore dependency
- Modal includes image upload, category picker, pros/cons, validation
2026-04-06 15:02:13 +02:00
408025bb36 feat(21-01): enhance catalog detail page with Add to Collection button
- Add image placeholder (package icon) when no imageUrl exists
- Add 'Add to Collection' button stub between specs and description
- Button styled per D-10, logs to console (actual flow wired in Phase 22)
- Consistent layout with item detail page
2026-04-06 15:02:07 +02:00
3228bcadbe feat(21-01): create private item detail page with edit mode toggle
- Full detail page at /items/:id with hero image, name, spec badges, notes, product link
- Edit mode toggle: read-only by default, editable inputs when Edit clicked
- Save persists via useUpdateItem, Cancel reverts to read-only
- Duplicate and Delete actions via existing hooks/dialogs
- Back link to /collection, loading shimmer, error state
- CategoryPicker and ImageUpload in edit mode
2026-04-06 15:01:10 +02:00
cecaf78ead feat(21-02): restructure thread route and create candidate detail page
- Move $threadId.tsx to $threadId/index.tsx for nested route support
- Create candidate detail page at /threads/:threadId/candidates/:candidateId
- Edit mode toggle with form fields for all candidate properties
- Back navigation, pick-as-winner, and delete actions
2026-04-06 15:00:25 +02:00
e13f9584fa feat(20-02): wire FabMenu and CatalogSearchOverlay into root layout
- Replace old single-action FAB with FabMenu component
- Add CatalogSearchOverlay to root layout
- FAB now visible on all authenticated non-public routes
- Detect setups page for conditional New Setup menu item
- Remove unused openAddPanel reference
2026-04-06 08:04:10 +02:00
720460852c feat(20-02): add FabMenu and CatalogSearchOverlay components
- FabMenu with animated mini menu (Add to Collection, Start Thread, New Setup)
- CatalogSearchOverlay with debounced search, tag chip filtering, result cards
- Loading skeleton grid and empty state
- Framer Motion animations for menu entrance/exit and overlay transitions
2026-04-06 08:02:59 +02:00
67facea338 feat(20-01): extend UIStore with FAB/catalog state, add useTags hook, update useGlobalItems
- Add fabMenuOpen, openFabMenu, closeFabMenu to UIStore
- Add catalogSearchOpen, catalogSearchMode, openCatalogSearch, closeCatalogSearch
- openCatalogSearch also closes FAB menu (natural flow)
- Create useTags hook with 5-min staleTime cache
- Add optional tags parameter to useGlobalItems for tag filtering
2026-04-06 07:57:47 +02:00
574a12e6fa fix: OIDC auth flow, Vite proxy, and PostgreSQL query compat
- Add auth redirect in root layout for unauthenticated users
- Proxy OIDC routes (/login, /callback, /logout) through Vite dev server
- Strip Secure flag from OIDC cookies in dev mode (HTTP localhost)
- Disable retry on auth query to prevent stale cookie loops
- Fix SQLite .get()/.all()/.run() calls in category and global-item
  services for PostgreSQL compatibility
- Add userId scoping to category service functions
- Add OIDC error logging in auth middleware
- Apply linter auto-formatting across affected files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 18:25:31 +02:00
b2936b098e Merge branch 'worktree-agent-af80e237' into Develop
# Conflicts:
#	.planning/REQUIREMENTS.md
#	.planning/STATE.md
2026-04-05 13:21:56 +02:00
a9956681ba feat(18-05): add public profile page and setup visibility toggle
- Create public profile page at /users/$userId with avatar, name, bio, setups
- Create PublicSetupCard component for profile page setup listing
- Add isPublic toggle button on setup detail page
- Add Public badge to SetupCard in list view
- Update useSetups hook with isPublic field on interfaces
2026-04-05 13:19:36 +02:00
f5233d075f feat(18-04): add LinkToGlobalItem component for catalog linking
- Search-based dropdown to find and link global catalog items
- Shows linked status with link to global item detail page
- Unlink button to remove association
- Debounced search with loading and empty states
2026-04-05 13:18:24 +02:00
f53f66d321 feat(18-04): add global item hooks, catalog browse page, and detail page
- useGlobalItems/useGlobalItem/useLinkItem/useUnlinkItem hooks
- Global catalog browse page with search, debounce, and skeleton loading
- Global item detail page with owner count badge
- GlobalItemCard component with brand, model, specs badges
2026-04-05 13:17:39 +02:00