Commit Graph
100 Commits
Author SHA1 Message Date
makiolajandClaude Opus 4.6 81a654085d docs(32): create phase plans for setup sharing system
4 plans in 3 waves:
- Wave 1: Schema migration (isPublic→visibility) + shares table
- Wave 2: Share link service + API routes
- Wave 3: Share modal UI + shared setup viewer

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:05:36 +02:00
makiolajandClaude Opus 4.6 9965e356de docs(32): add research and validation strategy for setup sharing system
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:59:54 +02:00
makiolaj cb0c1e8c9a docs(32): UI design contract 2026-04-13 16:59:25 +02:00
makiolaj 49c59fded9 docs(state): record phase 32 context session 2026-04-13 16:51:32 +02:00
makiolaj 6833b90795 docs(32): capture phase context 2026-04-13 16:51:23 +02:00
makiolajandClaude Opus 4.6 2853477a75 chore: archive v2.2 User Experience Polish milestone
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Phases 28-31 archived to milestones/v2.2-phases/
Requirements and roadmap snapshots archived to milestones/

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:00:35 +02:00
makiolaj 92b84d2cd6 docs: capture todo - Auth prompt sign-in should redirect directly to Logto 2026-04-13 15:53:07 +02:00
makiolajandClaude Opus 4.6 ebf031a62c fix: cap onboarding to 5 categories with 4 items each
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:23:10 +02:00
makiolajandClaude Opus 4.6 03e0fe99fa feat: group onboarding items by category
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:19:02 +02:00
makiolajandClaude Opus 4.6 adbc13eb15 fix: SelectableItemCard used wrong formatter names, globalItems imageFilename→imageUrl
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:13:23 +02:00
makiolajandClaude Opus 4.6 2beabe88f9 fix: popular-items query referenced non-existent imageFilename on globalItems
CI / ci (push) Successful in 1m17s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 16s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:07:38 +02:00
makiolajandClaude Opus 4.6 29f925027c chore: one-liner fixing script for docker exec
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:58:19 +02:00
makiolajandClaude Opus 4.6 32fa261ec2 chore: diagnostic and fix script for catalog seeding
CI / deploy (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / ci (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:57:27 +02:00
makiolajandClaude Opus 4.6 9864a09fc1 chore: shell script for nuke-and-reseed (runs inside container)
CI / ci (push) Successful in 1m16s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:20:03 +02:00
makiolajandClaude Opus 4.6 c3874d031a chore: temp script to nuke dev seed user
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 14:15:54 +02:00
makiolaj cd55f3c282 fix: seedTags inserts missing tags instead of skipping when any exist
CI / ci (push) Successful in 1m15s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
2026-04-13 14:09:28 +02:00
makiolaj 80f4d1d9ae fix: lint formatting for seed data and item detail page
CI / ci (push) Successful in 1m14s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 17s
2026-04-13 14:03:25 +02:00
makiolaj ba13fa8ded docs: update roadmap, config, and UAT state
CI / ci (push) Failing after 20s
CI / deploy (push) Has been skipped
CI / e2e (push) Has been skipped
2026-04-13 13:56:56 +02:00
makiolaj 13883ea14d fix: add hobby tags to catalog seed data for onboarding discovery 2026-04-13 13:48:40 +02:00
makiolaj bedef04581 test(30): re-test UAT - 3 passed, 1 cosmetic, 3 blocked (catalog seed) 2026-04-13 13:45:47 +02:00
makiolaj c1177764ef docs(29-05): add execution summary 2026-04-13 13:42:20 +02:00
makiolaj ded6bf521e fix(29-05): add local crop state to ImageUpload for immediate preview 2026-04-13 13:42:06 +02:00
makiolaj d91d32deaf docs: capture todo - Fix Add Candidate button shows wrong modal on thread page 2026-04-13 13:39:58 +02:00
makiolaj c98ac6e46f docs(29): create gap closure plan for crop preview state 2026-04-13 13:37:57 +02:00
makiolaj e536f68bd1 docs(29): diagnose crop preview gap - ImageUpload missing local crop state 2026-04-13 13:36:50 +02:00
makiolaj 80cb313b08 test(29): re-test UAT - 4 passed, 2 issues (crop conflicts) 2026-04-13 13:34:00 +02:00
makiolajandClaude Opus 4.6 159ff824b2 fix: position crop button as overlay next to trash icon on image
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Moved the crop button from below the image into the ImageUpload
component as an absolute-positioned overlay next to the trash icon,
matching the visual pattern.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:49:10 +02:00
makiolajandClaude Opus 4.6 09952e37b4 fix: move crop button into edit mode so it's reachable
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The crop icon button was in the view-mode branch but conditioned on
isEditing, making it unreachable. Moved it below ImageUpload in the
edit-mode branch where it belongs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:44:56 +02:00
makiolajandClaude Opus 4.6 fe5bd49b75 fix: save dominant color from image upload to item record
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
ImageUpload was discarding the dominantColor returned by the upload
API. Now it passes the color through onChange and the item detail
page saves it to the item record immediately after upload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:39:13 +02:00
makiolajandClaude Opus 4.6 ef531f79b2 fix: update email display in UI after email change
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
The OIDC session token retains the old email after a Logto email
change. Now the server returns the new email in the response and
the frontend optimistically updates the auth cache.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:31:24 +02:00
makiolajandClaude Opus 4.6 6108db3dab debug: add detailed error logging for Logto M2M token request failures
CI / ci (push) Successful in 1m10s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Logs the URL, resource, app ID prefix, and response body when the
token request fails — helps diagnose 400 errors from Logto.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:18:05 +02:00
makiolajandClaude Opus 4.6 af58145fe1 feat: show avatar image in top nav when user has one
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
UserMenu now fetches the user's profile and displays their avatar
image in the nav button instead of the default circle-user icon.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:07:28 +02:00
makiolajandClaude Opus 4.6 b647e23f91 fix: use presigned S3 URLs for avatar images instead of /uploads/ paths
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Avatar images were rendered via /uploads/ which doesn't exist since
the S3 migration. Now the server enriches profile responses with
avatarImageUrl (presigned S3 URL) and the frontend uses it directly.
Also fixed the public profile page at /users/:id.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 23:02:45 +02:00
makiolajandClaude Opus 4.6 62916a8397 fix(F-08): stronger selected state on hobby picker cards + biome formatting
CI / ci (push) Successful in 1m13s
CI / deploy (push) Successful in 13s
CI / e2e (push) Has been skipped
Selected hobby cards now use dark gray fill with inverted white
text/icon for clear visual distinction. Also fixes biome formatting
across all changed files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:37:19 +02:00
makiolajandClaude Opus 4.6 596872d942 fix(F-05): use icon button for crop trigger and trash icon for image removal
Changed "Adjust framing" text to a crop icon button visible only in
edit mode. Replaced the X icon on the image remove button with a
trash icon for clearer semantics.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:36:40 +02:00
makiolajandClaude Opus 4.6 da5ce7da1d fix(F-06): auto-open crop editor after image upload on item detail
Added onCropChange and dominantColor props to ImageUpload in the item
detail page, so the crop editor opens automatically after uploading
a new image.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:35:59 +02:00
makiolajandClaude Opus 4.6 452928760a fix(F-01): fix avatar upload persistence on profile page
Replaced the one-shot initialized flag with a dirty flag that allows
the useEffect to re-sync local state from server data after a
successful save. Previously, once initialized was set to true, the
effect never ran again so avatar changes were lost on refetch.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:35:35 +02:00
makiolajandClaude Opus 4.6 957d661567 fix(F-03): pass imageUrl and crop/color props to ItemCard in CollectionView
The flat list was missing dominantColor/crop props, and the grouped
view was also missing imageUrl entirely — causing images not to render
on collection cards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:34:47 +02:00
makiolajandClaude Opus 4.6 e3124e49c9 fix(F-04): include crop/color fields in item queries and use dominantColor in GearImage
getAllItems and getItemById were not selecting dominantColor, cropZoom,
cropX, cropY from the database. GearImage was ignoring the dominantColor
prop. Now the fields flow end-to-end from DB to UI background fill.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:34:19 +02:00
makiolajandClaude Opus 4.6 581872b534 fix(F-07): add crop/color fields to updateItem service type
The updateItem function's TypeScript type was missing dominantColor,
cropZoom, cropX, and cropY fields, causing crop settings to silently
fail to save despite the Zod schema and DB schema supporting them.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:33:28 +02:00
makiolaj ce48121b2b test(31): complete UAT - 2 passed, 0 issues 2026-04-12 22:23:46 +02:00
makiolaj 2948cc5848 test(30): complete UAT - 3 passed, 1 cosmetic, 3 blocked 2026-04-12 22:22:03 +02:00
makiolajandClaude Opus 4.6 9318bc56ac style: fix biome formatting in logout redirect
CI / ci (push) Successful in 1m11s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:06:58 +02:00
makiolajandClaude Opus 4.6 4241023950 fix: use GEARBOX_URL for post-logout redirect URI
CI / ci (push) Failing after 12s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Behind a reverse proxy, c.req.url resolves to internal URL which
doesn't match the registered post_logout_redirect_uri in Logto.
Use GEARBOX_URL env var (already required for OAuth) as the
redirect target.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:05:53 +02:00
makiolajandClaude Opus 4.6 cba3804b31 fix: include client_id in Logto end-session redirect
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 13s
Logto needs client_id to validate the post_logout_redirect_uri and
auto-redirect back to the app. Without it, user gets stuck on
Logto's end-session success page.

Note: post_logout_redirect_uri must be registered in Logto Console
under the app's "Post sign-out redirect URIs".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:58:27 +02:00
makiolajandClaude Opus 4.6 23cfbf7e4b fix: redirect to Logto end-session endpoint on logout
CI / ci (push) Successful in 1m12s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 20s
After revoking the local session, redirect to Logto's /session/end
so the OIDC session is cleared too. Previously redirected to /login
which immediately re-authenticated via the still-valid Logto session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:54:49 +02:00
makiolajandClaude Opus 4.6 ddb76fd229 fix: destructure useLogout correctly in UserMenu
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 14s
useLogout() returns { logout } but was assigned directly, causing
"r is not a function" when clicking sign out.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:47:55 +02:00
makiolaj 84205563a7 test(29): complete UAT - 2 passed, 4 issues 2026-04-12 21:41:24 +02:00
makiolaj 094301cc92 test(28): complete UAT - 4 passed, 1 issue, 3 blocked 2026-04-12 21:30:53 +02:00
makiolajandClaude Opus 4.6 d749e41f7b fix: allow null avatarUrl in updateProfileSchema
CI / ci (push) Successful in 1m13s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 15s
The Zod schema rejected null for avatarUrl, but the client sends null
when the avatar is removed. Changed to z.string().nullable().optional().

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:24:11 +02:00
makiolajandClaude Opus 4.6 a0c01d388c fix: remove duplicate statements from migration 0004 and orphan migration file
CI / ci (push) Successful in 1m9s
CI / e2e (push) Has been skipped
CI / deploy (push) Successful in 1m19s
Migration 0004 contained CREATE TABLE and ALTER TABLE statements already
applied in migrations 0002 and 0003, causing PGlite test DB initialization
to fail (311 test failures). Stripped to only the new dominant_color and
crop_* columns. Also removed orphan 0000_fuzzy_shiva.sql.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:07:18 +02:00
makiolajandClaude Opus 4.6 15c9f94d67 docs(phase-30): complete phase execution — onboarding redesign
CI / ci (push) Failing after 17s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:50:09 +02:00
makiolajandClaude Opus 4.6 3870662dc6 docs(30): complete plan execution summaries for plans 02 and 03
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:48:59 +02:00
makiolajandClaude Opus 4.6 115766cf60 feat(30-03): replace OnboardingWizard with catalog-driven OnboardingFlow
Swap old 4-step modal wizard with new full-screen, hobby-personalized
onboarding experience. Delete OnboardingWizard.tsx.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:48:41 +02:00
makiolajandClaude Opus 4.6 0db8771574 fix(30-02): fix biome formatting in onboarding components
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:47:47 +02:00
makiolajandClaude Opus 4.6 5c18a3cd6c feat(30-02): build full-screen catalog-driven onboarding flow UI
Implements 5-step onboarding: Welcome, Hobby Picker, Item Browser,
Review, and Done. Includes hobby card selection, popular item grid
with check/uncheck, review list with remove, CSS step transitions,
and responsive grid layout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:46:55 +02:00
makiolajandClaude Opus 4.6 1de91bc024 docs(30-01): complete plan execution summary
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:44:42 +02:00
makiolajandClaude Opus 4.6 9448571993 fix(30-01): fix import ordering for biome lint compliance
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:44:13 +02:00
makiolajandClaude Opus 4.6 5b35e60477 feat(30-01): create onboarding route with Zod validation and register
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:43:29 +02:00
makiolajandClaude Opus 4.6 9da4c8435c feat(30-01): create onboarding service with batch item creation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:42:59 +02:00
makiolajandClaude Opus 4.6 d64708056f feat(30-01): add popular-items-by-tags endpoint to discovery routes
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:42:29 +02:00
makiolajandClaude Opus 4.6 2347d49b69 feat(30-01): add popular-items-by-tags query to discovery service
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:41:03 +02:00
makiolajandClaude Opus 4.6 d37e64e71c feat(30-01): add shared hobby configuration with tag mappings
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:40:43 +02:00
makiolajandClaude Opus 4.6 edd1cdde68 docs(30): create onboarding redesign plans (3 plans, 2 waves)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:38:14 +02:00
makiolaj 3906273a10 docs: update authentication.md with Logto setup checklist
CI / ci (push) Failing after 18s
CI / e2e (push) Has been skipped
CI / deploy (push) Has been skipped
2026-04-12 20:31:45 +02:00
makiolaj b355c333e5 docs(phase-31): complete phase execution and verification 2026-04-12 20:19:10 +02:00
makiolaj ff01410183 docs(31): add code review report 2026-04-12 20:18:11 +02:00
makiolaj 02319baaf5 docs(31): add execution summaries for plans 01 and 02 2026-04-12 20:17:25 +02:00
makiolaj 97b1936148 style(31-01): fix biome lint formatting for JSX expressions 2026-04-12 20:16:29 +02:00
makiolaj f69861d449 feat(31-02): add responsive icon buttons to global item detail page
Replace text action buttons (Add to Collection, Add to Thread) with
icon-only buttons on mobile. Uses plus and message-square-plus icons.
All icon buttons have aria-label and 44px touch targets.
2026-04-12 20:16:08 +02:00
makiolaj 410a6491fe feat(31-02): add responsive icon buttons to setup detail page
Replace text action buttons (Add Items, Public/Private toggle, Delete
Setup) with icon-only buttons on mobile. Migrate inline SVGs to
LucideIcon component (plus, globe, trash-2). All icon buttons have
aria-label and 44px touch targets.
2026-04-12 20:15:33 +02:00
makiolaj b6f12fa93d feat(31-01): add responsive icon buttons to candidate detail page
Replace text action buttons (Edit, Pick as winner, Delete) with
icon-only buttons on mobile viewports (below md: breakpoint). Desktop
retains full text+icon buttons. All icon buttons have aria-label and
44px touch targets.
2026-04-12 20:14:58 +02:00
makiolaj 7effedea3f feat(31-01): add responsive icon buttons to item detail page
Replace text action buttons (Duplicate, Delete, Edit) with icon-only
buttons on mobile viewports (below md: breakpoint). Desktop retains
full text buttons. All icon buttons have aria-label and 44px touch targets.
2026-04-12 20:14:28 +02:00
makiolaj 8a01930de1 docs(31): create execution plans for mobile icon buttons 2026-04-12 20:12:37 +02:00
makiolajandClaude Opus 4.6 6c76dbbee3 docs(phase-29): complete phase execution
Phase 29 Image Presentation verified and marked complete.
14/14 must-haves passed. Next: Phase 30 Onboarding Redesign.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:11:10 +02:00
makiolaj c57e260e59 docs(31): add validation strategy 2026-04-12 20:10:22 +02:00
makiolaj 9721fbb5cc docs(31): research mobile icon button implementation 2026-04-12 20:09:53 +02:00
makiolajandClaude Opus 4.6 dd3cee1a64 docs(29): add execution summaries for plans 03 and 04
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:09:30 +02:00
makiolajandClaude Opus 4.6 6509b33501 feat(29-04): create backfill script for dominant colors
One-time migration script processes items, globalItems, and
threadCandidates to extract dominant colors via Sharp. Idempotent,
batched (10 concurrent), with progress logging.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:09:17 +02:00
makiolaj 9817a80f32 docs(31): UI design contract for mobile icon buttons 2026-04-12 20:08:44 +02:00
makiolajandClaude Opus 4.6 a18b9d37bd feat(29-03): add crop editor to item and candidate detail pages
Add "Adjust framing" button to item detail and candidate detail
pages. Crop editor appears inline, persists via update mutations.
Fix lint issues in ImageCropEditor import ordering.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:08:08 +02:00
makiolajandClaude Opus 4.6 78a097cba2 feat(29-03): integrate crop editor into ImageUpload
Show ImageCropEditor after successful upload when onCropChange
callback is provided. Editor replaces image preview temporarily.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:04:29 +02:00
makiolajandClaude Opus 4.6 23f62fde3d feat(29-03): create ImageCropEditor component
Zoom+pan editor using react-easy-crop with zoom slider, save/cancel
buttons, and dominant color background. Returns crop coordinates
for persistence.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 20:03:34 +02:00
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolaj febc43a074 docs(30): UI design contract 2026-04-12 20:01:24 +02:00
makiolaj fd0a7eef47 docs(state): record phase 31 context session 2026-04-12 20:01:20 +02:00
makiolaj 240aed266c docs(31): capture phase context 2026-04-12 20:01:20 +02:00
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolaj d8ede7a942 docs(phase-30): add validation strategy 2026-04-12 19:59:41 +02:00
makiolaj 673d3db06a docs(30): research onboarding redesign phase 2026-04-12 19:59:11 +02:00
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolajandClaude Opus 4.6 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
makiolaj 11cc082f40 docs(state): record phase 30 context session 2026-04-12 19:55:50 +02:00