Commit Graph

639 Commits

Author SHA1 Message Date
06d3984161 feat(29-02): create GearImage component for fit-within rendering
Renders images with object-contain by default (letterbox/pillarbox),
object-cover when cover prop is set, or CSS transform when crop
values are present. Parent container uses dominant color background.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:57:54 +02:00
34804731a1 feat(29-01): add image presentation fields to Zod schemas
Add dominantColor, cropZoom, cropX, cropY to createItemSchema,
createCandidateSchema, and upsertGlobalItemSchema.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:56:56 +02:00
2696b78f9e feat(29-01): extract dominant color in image upload endpoints
Both POST /api/images and POST /api/images/from-url now return
dominantColor in their response body.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:56:34 +02:00
e305fa7ae5 feat(29-01): add dominant color extraction via Sharp
extractDominantColor() resizes image to 1x1 pixel for weighted average
color. Integrated into fetchImageFromUrl to return dominantColor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:56:21 +02:00
b637b105fb feat(29-01): generate migration for image presentation fields
Migration adds dominant_color, crop_zoom, crop_x, crop_y to items,
global_items, and thread_candidates. Run db:push to apply.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:56:01 +02:00
11cc082f40 docs(state): record phase 30 context session 2026-04-12 19:55:50 +02:00
b2cb6451b0 docs(30): capture phase context 2026-04-12 19:55:50 +02:00
36363a8ca3 feat(29-01): add dominantColor and crop fields to schema
Add dominant_color, crop_zoom, crop_x, crop_y columns to items,
global_items, and thread_candidates tables.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:55:47 +02:00
cee15002ae feat(29-01): install Sharp for image processing
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:55:23 +02:00
718b118fb8 docs(29): fix plan file naming convention
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:52:37 +02:00
7064c6cdf1 docs(29): research, validation, and 4 plans for image presentation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:51:36 +02:00
eac7cea0c8 docs(29): UI design contract 2026-04-12 19:47:13 +02:00
1e1f49fc01 docs(state): record phase 29 context session 2026-04-12 19:42:16 +02:00
b1ffd62ee3 docs(29): capture phase context 2026-04-12 19:42:11 +02:00
40e7f94c52 docs(phase-28): complete phase execution 2026-04-12 17:51:49 +02:00
c7fa80bd66 docs(28): add plan summaries for all three plans 2026-04-12 17:51:03 +02:00
1b0013422f feat(28-03): add profile navigation link and extend /me with createdAt
Adds Profile link to UserMenu dropdown (above Settings), extends /me
endpoint to return user's createdAt for member-since display, and
updates AuthState interface with optional createdAt field.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:50:36 +02:00
23692514cb feat(28-02): create profile page with account management, separate from settings
Adds /profile route with four sections: profile info (reuses ProfileSection),
account info (email + member since), security (password change/set), and
danger zone (account deletion with typed confirmation). Removes ProfileSection
from settings page per D-01.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:49:10 +02:00
e8207a33f9 feat(28-01): add account management routes for password, email, and deletion
Creates /api/account routes with password change (verifies current first),
email update, has-password check, and account deletion with public setup
anonymization. Adds Zod validation schemas and registers routes in index.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:47:17 +02:00
fcd8279d79 feat(28-01): create Logto Management API client service with M2M auth
Implements LogtoManagementClient with token caching, password verification,
password update, email update, user deletion, and has-password check.
All methods proxy to Logto Management API via M2M credentials.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 17:45:48 +02:00
37030c397e docs(28): create phase plans for profile and Logto integration 2026-04-12 17:42:49 +02:00
7d8e196571 docs(28): UI design contract 2026-04-12 17:39:27 +02:00
18fa93dd01 docs(phase-28): add validation strategy 2026-04-12 17:37:57 +02:00
28218ad9e6 docs(28): research Logto Management API integration for profile and account management 2026-04-12 17:37:31 +02:00
a3ccffd5f4 docs: ship v2.1, add v2.2 and v2.3 milestones to roadmap 2026-04-12 17:33:14 +02:00
b71900efbd docs(state): record phase 28 context session 2026-04-12 17:33:06 +02:00
631fe3e6b5 docs(28): capture phase context 2026-04-12 17:32:58 +02:00
b234988db2 docs(quick-260411-1h2): update STATE.md with quick task completion
All checks were successful
CI / ci (push) Successful in 1m24s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
2026-04-11 01:13:40 +02:00
770c5128b7 docs(quick-260411-1h2): complete rebuild global items page with sticky toolbar plan 2026-04-11 01:13:28 +02:00
ee3b6f74e3 feat(quick-260411-1h2): rebuild global items page with sticky toolbar and inline filters
- 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
2026-04-11 01:12:55 +02:00
deb10ed359 docs(quick-260411-0zq): search UX redesign plan and gitignore tmp/
All checks were successful
CI / ci (push) Successful in 1m10s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
2026-04-11 00:50:15 +02:00
c56850954c docs(quick-260411-0zq): complete redesign search UX plan
- Add SUMMARY.md for quick task 260411-0zq
- Update STATE.md with completed quick task entry
2026-04-11 00:49:19 +02:00
467eb8737d chore(quick-260411-0zq): regenerate route tree with updated search params
- Route tree picks up validateSearch for /global-items/ route
- Also adds /setups/ route entry that was missing from previous generation
2026-04-11 00:47:41 +02:00
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
e9d8ddc418 fix: strip whitespace from Coolify token in deploy step
All checks were successful
CI / ci (push) Successful in 1m10s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 7s
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>
2026-04-11 00:31:57 +02:00
a69e78357f debug: fix Alpine-incompatible od command in Coolify deploy step
Some checks failed
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Failing after 7s
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>
2026-04-11 00:29:43 +02:00
8cdeeb2600 debug: deeper Coolify token diagnostics
Some checks failed
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Failing after 7s
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>
2026-04-11 00:25:55 +02:00
4cdb0f7993 debug: add diagnostic logging to Coolify deploy step
Some checks failed
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Failing after 7s
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>
2026-04-11 00:23:06 +02:00
dc5499283c docs(quick-260411-022): Fix global items search bar layout
All checks were successful
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
2026-04-11 00:07:08 +02:00
ef488913a2 docs(260411-022): complete global items header layout fix plan 2026-04-11 00:06:21 +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
3144d290d4 docs(phase-27): evolve PROJECT.md after phase completion 2026-04-10 23:52:48 +02:00
acb4672aed docs(phase-27): complete phase execution 2026-04-10 23:52:28 +02:00
2b27309b23 docs(27-03): complete root layout integration plan
- SUMMARY.md: TopNav/BottomTabBar wired, hero removed, /setups public route
- STATE.md: progress 100%, session recorded
- ROADMAP.md: phase 27 marked Complete (4/4 plans)
2026-04-10 23:48:43 +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
83b760a6d6 docs(27-01): complete TopNav and BottomTabBar plan
- SUMMARY.md: two components created, house icon deviation documented
- STATE.md: advanced to plan 4/4, progress 91%, decision recorded
- ROADMAP.md: phase 27 updated (3/4 summaries)
2026-04-10 23:45:56 +02:00
5984aabd40 docs(27-00): complete wave 0 E2E scaffolding plan
- Create 27-00-SUMMARY.md with test changes documentation
- Update STATE.md: advance plan to 3/4, add decisions, update session
- Update ROADMAP.md: reflect 2/4 summaries complete for phase 27
2026-04-10 23:45:01 +02:00