Commit Graph

191 Commits

Author SHA1 Message Date
a35d9e3017 feat(nav): TopNav LINKS 5개 → 2개 (Music | Custom Build) + Try now → /music
헤더 안 b 적용. 각 사업부 허브로 진입.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:48:23 +09:00
9fb9ae6a79 feat(home): 메인 안 2 적용 — Brand Hero + 2-up + Music 섹션 + Custom Build + Final CTA
- Brand Hero: 60vh, "현직 엔지니어가 만드는 두 가지" + 영상 blur 35%
- Two-up: Music 카드(영상+₩39,000~) / Custom Build 카드(정적 그라데이션+견적)
- Music 섹션: 기존 Features+Before/After+마퀴 그대로 보존
- Custom Build 섹션: 4 카드 (자동화는 외주 흡수) + 납품 5건 사례 + 견적 CTA
- Final CTA: "어느 쪽이든 시작하세요" + 두 분기 CTA
- 메인 진입점: Music → /music, Custom Build → /work

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:46:45 +09:00
5309f6d08b feat(work): /work/blog — 현 /services/blog 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:41:58 +09:00
31c376da07 feat(work): /work/saju + input + result — 현 /saju 컨텐츠 이동
- saju 페이지 + 입력 폼 + 결과 + AI 해석 + 사주 컴포넌트 모두 이동
- depth 변경 → 모든 import @/ 절대 경로
- 내부 Link href + router.push 새 URL로
- 카탈로그 spec(49만 코어 + 11 모듈)은 보류 — 무료 사주 분석만 마이그
- API route /api/saju/* 변경 없음

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:39:14 +09:00
f9f8882710 feat(work): /work/website + 8 samples — 현 /services/website 컨텐츠 이동
- 메인 페이지 + layout
- 8 sample 페이지: bakery, corporate, dashboard, game, interior, portfolio, reading, shopping
- import @/ 절대 경로 변환
- 내부 Link href 새 URL로

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:32:19 +09:00
9fabde02b2 feat(work): /work/freelance — 현 /freelance 이동 + #automation 앵커
- portfolio 데이터 lib/freelance-portfolio 에서 import (양쪽 페이지 공유)
- depth 변경으로 모든 import @/ 절대 경로 변환
- 자동화 사례 그룹에 id="automation" — /work/freelance#automation 진입 가능
- 내부 Link href 새 URL로 변환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:27:37 +09:00
ff76bab84f feat(work): /work 허브 신설 — Custom Build 4 카드 + 5건 사례 + 견적 폼
- 4 카드: 외주 / 웹사이트 / AI 사주 / 블로그 (자동화는 외주 흡수)
- 납품 사례: lib/freelance-portfolio 5건 import
- 견적 CTA: ContactModal('외주 개발 문의')
- 가격 표 없음 — 가격 미정 (P3에서 추가 예정)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:22:37 +09:00
5c23f135b1 feat(music): /music/studio — 현 /studio 컨텐츠 이동 (depth 변경 → @/ 절대 import)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:20:39 +09:00
807c01246b feat(music): /music/samples — 현 /services/music/samples 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL.
원본은 Phase D에서 삭제 예정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:17:43 +09:00
868b78f4f6 feat(music): /music/packs — 현 /services/music 컨텐츠 이동
@/ 절대 경로 import + 내부 Link 새 URL로 변환.
원본 app/services/music/* 는 Phase D에서 삭제 (현재는 양쪽 존재 → redirect 우선).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:15:51 +09:00
96cc452d37 feat(music): /music 허브 신설 — 3 카드 (팩 상세 / 샘플 / 스튜디오)
Music 사업부 진입점. /music/{packs,samples,studio} 으로 분기.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:12:51 +09:00
a6aae53b89 feat(packs): lib/freelance-portfolio — 외주 납품 5건 데이터 추출
/work 허브 + /work/freelance 양쪽 import. 단일 source of truth.
원본은 app/freelance/page.tsx — Phase B6에서 lib import로 교체.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:11:04 +09:00
b74cfacf8d feat(routing): next.config.ts redirects() 10개 추가
P1 IA 마이그레이션 — 기존 URL → 새 URL 영구 리다이렉트 (permanent: true):
- /services/music → /music/packs
- /services/music/samples → /music/samples
- /studio → /music/studio
- /freelance → /work/freelance
- /services/website → /work/website
- /services/website/samples/:slug → /work/website/samples/:slug
- /services/blog → /work/blog
- /saju → /work/saju
- /saju/input → /work/saju/input
- /saju/result → /work/saju/result

이 시점에 destination 페이지 아직 없음 (Phase B에서 생성). 단, redirect 자체는 빌드 OK.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:09:26 +09:00
666dbd94da docs(plan): 홈 재구조 P1 implementation plan — 17 task, 4 phase
4월 27일 brainstorm 의 A-1 결정 + 5월 16일 spec 구현:
- Phase A (2): next.config redirects 10개 + lib/freelance-portfolio 추출
- Phase B (9): /music 허브 + /music/{packs,samples,studio} + /work 허브
  + /work/{freelance,website,saju,blog} + website samples 8개 + saju 7개
- Phase C (4): app/page.tsx 안 2 + TopNav 2개 LINKS + PublicShell footer
  + layout JSON-LD URL 갱신
- Phase D (2): 원본 25 파일 삭제 + build/lint/시각 회귀

핵심 안전 장치:
- Phase A/B/C/D 분할로 빌드 무중단 (원본 + 신규 양쪽 존재 기간 보호)
- push 시점은 Phase D 완료 후 (사용자 시각 회귀 후)
- 모든 task 마지막 step: git log -3 직접 검증 (Phase 2 subagent commit 누락 이슈 대비)
- redirect 영구 (301) — 외부 링크/검색 인덱스 보존

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 03:02:49 +09:00
eaa0c18438 docs(spec): 홈 재구조 P1 — IA 마이그레이션 + 메인 안 2 + 헤더 안 b
4월 27일 brainstorm의 A-1 결정을 구현 spec으로 확정.

CEO 결정 8개 라인:
- 메인 안 2 (Brand Hero + 2-up Card)
- 헤더 안 b (Music | Custom Build | Try now)
- /work, /music URL prefix, 10 redirects
- 사주 단순 URL 마이그 (카탈로그 spec 보류)
- 자동화는 /work/freelance 흡수 (Custom Build 4라인)
- /about 미신설 (Brand Hero가 약식 회사 표지)
- 가격 미정 → 견적 문의 CTA만
- 외주 진행 5건 비공개, 납품 5건만 사례

Phase A/B/C 분할 마이그레이션 (인프라+신규 → 원본 삭제+안 2 → 검증).
push는 Phase B 완료 후 무중단 배포.

신규 21+, 수정 5, 삭제 21 파일.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 02:55:28 +09:00
4d2607b940 chore(deps): React 19.2.6 + Next 16.2.5 (서버 컴포넌트 보안 패치) 2026-05-13 13:17:25 +09:00
774835a37a feat(mypage): 다운로드 버튼 활성화 (Phase 2) + status 분기
- packFiles state + /api/packs/list-mine fetch (RLS 우회 위해 admin client 라우트)
- handleDownload: /api/packs/sign-link 호출 → window.location 이동
- 카드: 자료 리스트 DB SSOT (PACK_ASSETS.files 폐기)
- order.status === 'completed' 만 다운로드 활성, 그 외는 Phase 1 placeholder 유지
- 4시간 만료 안내 추가

빌드 복구: B3에서 깨진 mypage 빌드를 이번 commit이 복구.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:11:08 +09:00
c94ec83986 feat(admin): AdminSidebar에 "팩 자료" 메뉴 추가
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:07:56 +09:00
a6f460d77c feat(admin): /admin/packs — 자료 업로드 + 인라인 편집 + 삭제 UI
- 업로드: tier 선택 + label + 파일 → /api/admin/packs/upload-url 토큰 발급
  → XHR로 web-backend에 직접 multipart POST (진행률 추적)
- 리스트: tier별 그룹 + label inline 편집 (blur 시 PATCH)
- 삭제: confirm 후 DELETE → soft delete

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:07:07 +09:00
ce23c4e612 feat(api): /api/admin/packs — admin 파일 목록/편집/삭제
- GET: pack_files 목록 (deleted_at IS NULL)
- PATCH: { id, label?, sort_order?, min_tier? } 인라인 편집
- DELETE: web-backend 통한 soft delete

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:05:30 +09:00
3f0c5e7f1c feat(api): /api/admin/packs/upload-url — admin 일회성 HMAC 업로드 토큰 발급
15분 만료 + jti 단발성. 브라우저는 이 토큰을 web-backend /api/packs/upload에
직접 multipart POST 시 Authorization Bearer 헤더로 전달 → Vercel function body
limit 우회 (5GB 업로드).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:04:19 +09:00
f40940ca4b feat(api): /api/packs/sign-link — 사용자 다운로드 권한 검증 + DSM 링크 발급
- supabase auth → user
- contact_requests.status='completed' 인 Music 팩 구매 확인
- extractPackTier로 tier 도출, hierarchy 매핑
- pack_files.min_tier 매칭 검증
- web-backend signLink 호출 → 4시간 만료 URL 반환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:03:13 +09:00
e9f44a6fd9 refactor(packs): PACK_ASSETS.files 폐기 → DB SSOT
Phase 2 시작 — pack_files 테이블이 자료 리스트 source of truth.
PACK_TIER_NAMES export 신규 추가 (mypage가 카드 제목용으로 참조).
TIER_LABEL, extractPackTier 변경 없음.

Note: 이 commit 단독으로는 mypage 빌드 깨짐. Task C3 (mypage page.tsx 수정)
에서 PACK_ASSETS 참조 제거 + 새 데이터 흐름 적용 후 빌드 복구.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:01:43 +09:00
3e64030239 feat(packs): lib helpers — pack-files supabase 쿼리 + web-backend HMAC 클라이언트
- pack-files.ts: tier hierarchy + getPackFilesForTiers + getPackFileById
- web-backend.ts: signLink (HMAC sig) + mintUploadToken (일회성 jti, 15분 만료)
  + listPackFilesViaBackend + deletePackFileViaBackend

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:00:30 +09:00
ace46fb2ae feat(db): pack_files 테이블 마이그레이션 — Phase 2 자료 다운로드 SSOT
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 08:58:39 +09:00
0c6a86d96d docs(plan): mypage Phase 2 — NAS 다운로드 자동화 implementation plan (15 tasks, 2 repos)
4 phase 구성:
- Phase A (web-backend repo, 6 tasks): packs-lab 스캐폴드 + HMAC 인증 + DSM client + routes + tests + docker/nginx
- Phase B (jaengseung-made, 6 tasks): supabase migration + lib helpers + pack-assets 마이그레이션 + 3 API routes
- Phase C (jaengseung-made, 3 tasks): admin packs 페이지 + sidebar + mypage 다운로드 활성화
- Phase D (2 tasks): 통합 smoke test (수동) + 메모리 갱신

부록 A: 단계별 빌드 안전성 분석 (B3-C3 사이 빌드 깨짐 → C3 commit 직후 push로 일괄 배포)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 07:52:41 +09:00
03b3ae8a17 docs(spec): mypage Phase 2 — NAS 자료 다운로드 자동화 설계
CEO 결정 7개 라인:
- 파일 전달: Synology File Station 공유 링크 (DSM 7.x SYNO.FileStation.Sharing v3)
- 업로드: admin UI 자동화
- 아키텍처: Vercel → web-backend (NAS) → DSM
- 다운로드 UX: 파일별 개별 버튼
- 공유 링크 만료: 4시간
- 파일 크기 한도: 5GB
- order.status completed 흐름: 기존 /admin/contacts 코드 활용 (운영 매뉴얼만 갱신)

핵심 아키텍처:
- 사용자 다운로드: Vercel API → supabase 인증/권한 → web-backend → DSM 공유 링크
- admin 업로드 (5GB): Vercel은 일회성 HMAC 토큰만 발급 → 브라우저가 web-backend에 직접 multipart POST → Vercel function body limit 우회
- pack_files 테이블 신설 (min_tier + label + file_path), DB가 SSOT, PACK_ASSETS.files 폐기

두 repo 작업: jaengseung-made (Vercel) + web-page-backend (NAS, FastAPI).
HMAC 32 byte 시크릿 + 일회성 jti + 4시간 만료로 디지털 콘텐츠 누출 방어.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 07:43:12 +09:00
e6435c1c66 chore(shell): Sidebar.tsx 삭제 (사용처 0)
DashboardShell에서 사이드바 분기를 제거하면서 Sidebar 컴포넌트는 더 이상
어디에서도 import되지 않음. 파일 삭제로 dead code 정리.

(AdminSidebar는 별도 컴포넌트로 admin shell에서 계속 사용 중 — 영향 없음)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 08:07:41 +09:00
a965d95a24 refactor(shell): DashboardShell 사이드바 분기 통째 제거 → PublicShell 폴백
mypage가 PublicShell + TopNav를 사용하도록 라우팅 단순화:
- SIDEBAR_PATHS 상수 + Sidebar import + useSidebar 분기 + 모바일 top bar
  + 사이드바 안의 카카오 버튼 + 사업자 정보 footer + style 블록 모두 삭제
- Standalone 분기(/login·/signup·/admin)는 그대로 유지
- 카카오 버튼은 PublicShell로 이미 이동(Task 3)
- 사업자 정보 footer는 PublicShell footer가 동일 정보 보유

Sidebar.tsx 자체는 다음 커밋(Task 7)에서 삭제 — 사용처 0이 됨.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 08:07:08 +09:00
dda7b0e16a style(mypage): 브랜드 블루 → 보라/슬레이트 일괄 토큰 마이그레이션
Liquid Glass 메인 surface와 톤 정렬:
- 본문 배경 #f0f5ff → slate-50
- 액센트 #1a56db → violet-600 (탭 active, 버튼, 링크)
- 카드 보더 #dbe8ff → slate-200
- 다크 카드(프로젝트 헤더) #04102b → #060e20 (kx-surface 일관)
- 강조 박스 blue-50/200 → violet-50/200
- 다크 위 텍스트 blue-300/60 → white/50 등
- 탭 button min-w-[100px] 추가 (모바일 wrap 시 텍스트 잘림 방지)

의미 색(emerald/orange/amber/red/rose/pink/cyan/sky)는 시그널이므로 보존.
프로젝트 헤더 in_progress 상태 핀은 sky 계열로 이전(브랜드 블루 잔존 제거).
Task 4에서 추가된 새 코드(AI 스튜디오 카드 등)도 함께 마이그레이션.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 04:08:35 +09:00
4dfea6cdc8 fix(mypage): hero 아바타 div에 aria-hidden 추가 (a11y)
코드 리뷰 후속 (I-1):
인접 div에 사용자 이메일이 텍스트로 노출되므로 아바타 글자는 decoration.
스크린 리더가 외톨이 글자("B" 등)를 읽지 않도록 aria-hidden 처리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 04:03:17 +09:00
754d81139e feat(mypage): hero 축소 + "구매한 팩" 탭 신설 + 빠른 메뉴 AI 스튜디오 추가
- Hero: bg-[#04102b] → kx-surface, py-10→py-8, 아바타 보라 액센트, 가입일 톤 다운,
  로그아웃 버튼 제거 (TopNav가 담당)
- Tab type에 'packs' 추가, 결제 내역 다음 위치에 "구매한 팩" 탭
- packOrders 계산: orders.service 에서 extractPackTier로 Music 팩만 필터
- 신규 탭 JSX: status별 분기(완료/처리중/대기) + 자료 리스트 + 비활성 다운로드 버튼
  + 카톡 안내. Phase 2에서 다운로드 활성화 예정
- 빠른 메뉴: AI 스튜디오 카드 1개 추가 (사주·외주 옆), grid-cols-2→sm:grid-cols-3
- 탭 컨테이너 flex-wrap 적용 (모바일 7개 wrap)
- handleLogout 함수 제거 (사용처 없어짐)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:58:34 +09:00
11bbd00d88 feat(shell): PublicShell에 카카오 1:1 상담 플로팅 버튼 추가
DashboardShell 사이드바 분기에서 mypage 전용으로만 노출되던 카카오 버튼을
모든 공개 페이지(메인/서비스/외주/사주/결제/legal/mypage 등)에서 노출되도록 이동.
DashboardShell 쪽 원본은 Task 6에서 사이드바 분기 제거와 함께 자연 삭제 예정.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:52:10 +09:00
22fe05b4d8 fix(nav): TopNav auth 구독 안정화 + 로그아웃 UX 보강
코드 리뷰 후속:
- (I-1) useMemo로 supabase client 안정화 → 매 렌더 re-subscribe 제거
- (I-2) getUser() → getSession() → first paint flash 거의 제거 (localStorage 동기 읽기)
- (M-1) 로그아웃 router.push → router.replace → 보호 페이지 백스택 잔존 방지
- (M-2) 모바일 로그아웃 button transition-colors 추가 (데스크톱과 일관)

Defer (별도 검토):
- M-3 로그인 시 Try now 사라짐 — marketing 결정 필요
- M-5 잔여 flash — Phase 2 server prop hydration 시 완전 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:50:41 +09:00
601bc38a12 feat(nav): TopNav supabase auth 구독 + 로그인 상태 토글
- 로그아웃 시: "로그인" link + "Try now" 버튼 (기존)
- 로그인 시: "마이페이지" link + "로그아웃" 버튼 (신규)
- 데스크톱 + 모바일 오버레이 둘 다 동일 패턴
- Sidebar.tsx:93-103 의 auth 구독 패턴 차용

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:46:16 +09:00
2e780f2dcd refactor(packs): TIER_LABEL SSOT + Phase 2 migration note
코드 리뷰 후속 (I1+M2):
- TIER_LABEL: PackTier → 한국어 표시명 single source of truth
- PACK_ASSETS[*].name 백틱 템플릿으로 TIER_LABEL 참조
- extractPackTier if-ladder → LABEL_TO_TIER lookup (자동 derive)
- 마케팅 카피(입문/프로/마스터) 변경 시 한 곳만 수정으로 mypage·music 동기화

추가 코멘트 (M1, I3):
- U+00B7 middle-dot 명시
- Phase 2 PackFile 형태 마이그레이션 가이드 (files: string[] → { label, url? }[])

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:44:10 +09:00
a8fea0368e feat(packs): Music 팩 3티어 정적 자료 매핑 + tier 추출 함수
- PACK_ASSETS: starter/pro/master 각 자료 리스트 (Phase 1 placeholder, 실제 파일 URL은 Phase 2)
- extractPackTier(): orders.service "구매 신청: AI 음악 마스터 팩 · {tier}" → tier key
  · "·" 뒤의 마지막 단어로 매칭하여 "마스터 팩" + "프로" 같은 충돌 회피

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:39:16 +09:00
d2bdc6a854 docs(plan): mypage Liquid Glass Phase 1 — 8 task implementation plan
Spec docs/superpowers/specs/2026-04-27-mypage-liquidglass-redesign.md 의 7개 섹션
모두 task로 매핑. 검증 인프라 부재 → lint + build + 시각 회귀 3단계 검증.

Task 순서 안전 분석(부록 A): 각 commit 후 mypage 로그아웃 경로 + 카카오 진입 항상 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:37:49 +09:00
3c3f1e0298 docs(spec): mypage Liquid Glass 리뉴얼 Phase 1 — PublicShell 통합 + 음악 통합 placeholder
CEO 결정 5개 라인:
- 음악 통합 = B(구매한 팩 자료) + C(스튜디오 링크 — TopNav에 이미 있음)
- 구조 = PublicShell + TopNav 통합, Sidebar 제거
- 톤 = Hybrid Dark Hero + Light Cards (kx-surface + 보라 액센트)
- NAS 호스팅 = Phase 1 디자인/구조만, Phase 2 자료 호스팅 별도
- 신원 표시 = TopNav "마이페이지/로그아웃" link + mypage 축소 hero

변경 범위 (4 파일):
- DashboardShell.tsx: 사이드바 분기 + 카카오 버튼 통째 삭제
- TopNav.tsx: supabase auth 구독 + 로그인 상태 토글 (Sidebar 패턴 차용)
- Sidebar.tsx: 삭제 (사용처 0)
- mypage/page.tsx: 디자인 토큰 마이그레이션 + hero 축소 + "구매한 팩" 탭 신설

신규: lib/pack-assets.ts (3 tier 정적 자료 매핑 + extractPackTier 함수)
이동: 카카오 플로팅 버튼 → PublicShell footer 다음

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 03:30:07 +09:00
3033572ecb polish(home,seo): P0 final review 반영 — 명명 통일 + priceSpec 정리 + 카드 분석
Final code reviewer 후속 3건:
- 명명 통일: Home 카드 "웹사이트" → "웹사이트 제작", "사주 카탈로그" → "AI 사주" /
  JSON-LD "맞춤 개발 외주" → "외주 개발". Footer와 4개 라인 라벨 일치.
- priceSpecification 스텁 제거 (Schema.org price-on-request 관용 표기 아님).
  P1에서 자체 정가 확정 시 Offer.price + priceCurrency 동시 추가 예정.
- 카드별 trackCTAClick("home_v6_custom_build_card_<key>") 5개 추가 — P1 IA
  결정용 라인별 클릭 데이터.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:47:36 +09:00
47e2460f8f fix(seo): OfferCatalog 외주·웹사이트 항목 SEO 정합성 보강
- provider @id: #person → #business (기존 5개 항목과 provider 일관성)
- priceSpecification 스텁 추가 (priceCurrency만, price 미정) — Search Console
  incomplete Offer 경고 방지, "price-on-request" 시그널.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:34:59 +09:00
0a4d5b70da feat(seo): OfferCatalog에 외주·웹사이트 Service 항목 추가 (가격 미정)
Custom Build 사업부의 두 라인을 JSON-LD에 노출:
- 맞춤 개발 외주 (/freelance)
- 웹사이트 제작 (/services/website)

자체 정가가 미정이라 Offer.price 생략 (P1에서 가격 확정 후 추가).
provider는 기존 Person(@id="...#person") 재사용.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:30:29 +09:00
3ce992ab95 fix(home): Custom Build 섹션 grid orphan + 모달 service 컨텍스트화
- 카드 grid: grid-cols-2 md:grid-cols-5 → grid-cols-1 sm:grid-cols-2 lg:grid-cols-5
  (모바일 orphan 방지)
- ContactModal service를 state로 lift (modalService) — Custom Build CTA에서
  "외주 개발 문의" 자동 선택. 모달 close 시 "일반 문의"로 리셋.
- 카드 화살표 span에 aria-hidden 추가 (a11y)
- 카드 Link 의 redundant inline style 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:26:56 +09:00
721790e14d feat(home): Final CTA 위에 Custom Build 미니 섹션 추가 (5라인 + 견적 CTA)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:21:34 +09:00
ba6d015c4a feat(footer): Company 컬럼을 Custom Build로 재정비 (외주·웹사이트 추가)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:18:11 +09:00
0069b1529f feat(nav): TopNav에 외주(/freelance) 진입점 추가
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:15:14 +09:00
f2370131ef docs(spec,plan): 홈 재구조 brainstorm + P0 implementation plan
- spec: Music + Custom Build 동등 두 사업부 (A/A-1) IA 재구조
  · /work 사용, /work/saju 통합, 자체 정가, 외주 5건 비공개
  · 메인 안 2 (Brand Hero + 2-up) + 헤더 안 b 추천
  · TODO P0~P3 우선순위
- plan: P0 4 task (TopNav 외주 링크 / 푸터 Custom Build / 메인 미니 섹션 / JSON-LD)
  · 결제는 이미 계좌이체 단일화 상태(Music/Blog) 발견 → P0 결제 task 제외
  · 사주 1,000원 PG는 미해결로 부록 분리

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:12:51 +09:00
50163669d6 chore(scripts): 사주 인용구 삽입 스크립트 추가
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:12:38 +09:00
d5a26c462d chore(media): hero·feature 영상 자산 추가
홈 hero 배경(hero-bg.mp4)과 Features 섹션의 Prompt·Visual 데모 영상 3종 추가.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:12:34 +09:00
32dce9ea1e feat(home): Liquid Glass + Jua 폰트로 헤더·푸터·홈·뮤직 페이지 전환
- layout.tsx: Bagel/Inter/Manrope/SpaceGrotesk → Jua 단일화 + GlassFilter 마운트
- globals.css: 글래스 효과·Jua 폰트 변수
- TopNav: 알약형 글래스 헤더 (스크롤 시 max-w-3xl 축소)
- PublicShell: 푸터 정돈
- 홈 page.tsx: hero 영상 배경 + GlassButton CTA + 트윗 마퀴
- 뮤직 page.tsx: SparklesOverlay + 3D card effect

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 02:12:29 +09:00