Commit Graph

800 Commits

Author SHA1 Message Date
6f4fd78b8b feat(29-03): install react-easy-crop for image framing editor
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:03:13 +02:00
9636033361 fix(29-02): lint fixes for GearImage integration
Fix unused parameter warning and formatting issues across all
updated components.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:02:38 +02:00
66d9c4157b feat(29-02): update detail pages and LinkToGlobalItem to use GearImage
Replace object-cover on item detail, global item detail, candidate
detail, global items index, and LinkToGlobalItem. Detail pages use
dominant color backgrounds. LinkToGlobalItem uses cover mode for
32px thumbnails.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:02:12 +02:00
febc43a074 docs(30): UI design contract 2026-04-12 20:01:24 +02:00
fd0a7eef47 docs(state): record phase 31 context session 2026-04-12 20:01:20 +02:00
240aed266c docs(31): capture phase context 2026-04-12 20:01:20 +02:00
91846b5ca2 feat(29-02): update ComparisonTable, CatalogSearchOverlay, ImageUpload
Replace object-cover with GearImage across ComparisonTable,
CatalogSearchOverlay (2 instances), and ImageUpload preview.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:00:46 +02:00
05c09182fd feat(29-02): update CandidateCard and CandidateListItem to use GearImage
Replace object-cover with GearImage for fit-within rendering on
candidate cards and list items.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:59:44 +02:00
d8ede7a942 docs(phase-30): add validation strategy 2026-04-12 19:59:41 +02:00
673d3db06a docs(30): research onboarding redesign phase 2026-04-12 19:59:11 +02:00
2865e657d0 feat(29-02): update ItemCard and GlobalItemCard to use GearImage
Replace object-cover with GearImage component for fit-within rendering.
Add dominantColor and crop props to both card components.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 19:58:39 +02:00
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