Skip to content

feat: Phase 1 remaining — FK profiles, UI sizing, type safety (#35)#80

Merged
thxforall merged 31 commits into
mainfrom
feat/phase1-remaining
Apr 4, 2026
Merged

feat: Phase 1 remaining — FK profiles, UI sizing, type safety (#35)#80
thxforall merged 31 commits into
mainfrom
feat/phase1-remaining

Conversation

@thxforall
Copy link
Copy Markdown
Contributor

Summary

1차 릴리즈 (Epic #35) 잔여 작업 통합 PR.

Closes

Closes #60, Closes #62, Closes #63, Closes #64, Closes #65, Closes #66, Closes #68, Closes #79

1차 릴리즈 잔여 (이 PR 범위 밖)

Test plan

  • Explore 페이지 카드에서 아티스트 프로필 이미지 표시 확인
  • Editorial 오른쪽 패널 → 아티스트 48px 가운데, 브랜드 로고 28px 확인
  • Editorial full page → 동일 사이즈 확인
  • 모바일 반응형 레이아웃 정상 동작
  • Admin /admin/login 페이지 접근 및 로그인 정상
  • 404/500 에러 페이지 DECODED 브랜딩 확인
  • 메인 페이지 섹션 정상 렌더링

🤖 Generated with Claude Code

thxforall and others added 30 commits April 4, 2026 16:17
Remove VirtualTryOnTeaser, CommunityLeaderboard, PersonalizeBanner,
MainFooter — no longer rendered. Clean dead exports and imports.
#68 resolved: EditorialSection/TrendingListSection replaced by
TrendingPostsSection/EditorialMagazine with enrichArtistName dedup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add route-level error boundary with retry + home navigation.
Restyle global-error.tsx to match brand design (dark theme, #eafd67 accent).
Both capture exceptions to Sentry.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Create /admin/login with Supabase email/password auth.
Exempt /admin/login from proxy protection.
Redirect unauthenticated admin users to /admin/login instead of /.
Brand-consistent dark theme with #eafd67 accent.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add Suspense skeleton for explore page, stabilize image containers
with min-height/aspect-ratio, fix AnimatePresence and key issues
in actively rendered components.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reflect main page renewal, warehouse FK migration, explore search,
admin login, error pages, decoded pick curation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Move /admin/login page to (admin-auth) route group so it renders
outside admin layout.tsx auth check, preventing infinite 307 loop.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…redirect (#64)

Replace redirect("/admin/login") with bare children render in layout.tsx
when user is not authenticated. proxy.ts handles redirecting non-login
admin routes. Remove conflicting (admin-auth) route group.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Apply dark theme (#050505), #eafd67 accent, DECODED wordmark,
and Explore CTA. Consistent with error.tsx and global-error.tsx.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Hide modal container (visibility: hidden) before router.back() so
GSAP context revert doesn't briefly restore opacity on unmount.
Applied to both desktop fade-close and mobile swipe-close paths.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Document generated API structure, orval.config.ts settings,
regeneration workflow, usage patterns, and extension points.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add nullable warehouse FK fields to PostListItem DTO so frontend
can use them for filtering. Both list_posts and admin_list_posts
now return these fields.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add nullable warehouse FK brand_id to SolutionResponse and
SolutionListItem. Complements artist_id/group_id on PostListItem.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…_id) (#62)

Regenerated from running server. PostListItem now includes
artist_id/group_id, Solution DTOs include brand_id.
Run `bun run generate:api` to update local frontend types.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Support filtering posts by warehouse FK IDs alongside existing
artist_name/group_name string filters. Update line count stats.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pass warehouse artistProfileMap from server component to ExploreClient.
Display artist avatar and name on explore grid cards using next/image
when profile data exists and no search highlight is active.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
#79)

Show artist/group name on every explore card (not just search mode).
Display profile avatar when warehouse match exists.
Remove incorrectly hardcoded hasMagazine from explore page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Thread artistProfileMap from server to ImageDetailModal/Content.
Display profile avatar + name in editorial preview and full views.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…n explore cards (#79)

Remove artist overlay from explore cards (revert to search-only).
Add buildBrandProfileMap to warehouse-entities.
Show brand logos on items in detail modal/page.
Route all profile images through image-proxy to avoid CORS.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ap (#79)

artist_name "danielle" has no warehouse entry, but group_name
"NewJeans" does. Try artist_name first, fall back to group_name
for profile image lookup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Artists/groups limit 50→500 to include all warehouse records.
Lisa was outside top-50 by created_at, causing profile lookup miss.
Remove temporary console.log debug statements.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
)

The call sites fetchWarehouseArtists(50) overrode the new default.
Now uses default limit(500) to fetch all artists/groups.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
spotToItemRow was hardcoding brand: null. Now extracts from
solution.metadata.brand which contains the brand name string
(e.g. "Celine"). Enables brand logo display via brandProfiles lookup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… call (#79)

Same limit issue as artists — Celine was outside top 100 by created_at.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Pass brandProfiles to MagazineItemsSection and render brand logo
next to brand name in item details. This is the component that
renders items in explore-preview (magazine) mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Defines size adjustments for artist profile (48px centered),
magazine item images (compact w-48), and brand logos (28px)
to unify explore-preview, full page, mobile, and desktop layouts.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Artist profile: 48px centered layout (both explore-preview and full page)
- Magazine items: compact image md:w-48, brand logo 28px
- Brand text: unified typography-overline across compact/full

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bump explore-preview main item image from w-48 to w-52
to create more visual hierarchy over Similar Items cards.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Updated via supabase gen types typescript.
Reflects current DB schema including warehouse tables.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Cast solution.keywords to string[] | null for type safety
- Add price_currency fallback ?? "KRW"
- Rename media_title → title (TryGallerySection)
- Format Rust chained method calls (clippy style)
- Align hooks/queries with updated supabase types

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Update STATE.md and ROADMAP.md for phase-1 progress
- Update warehouse schema docs
- Remove obsolete image-ratio/item-image plans
- Add editorial UI sizing plan and search filter spec
- Update FLW-08 my-try flow spec

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@thxforall thxforall merged commit 364bd79 into main Apr 4, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment