Commit Graph

360 Commits

Author SHA1 Message Date
a1a281d059 docs(phase3a): 음악 서비스 공개화 설계 — 스토리→음악·무료·회원저장 (WS1~5)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-03 12:33:55 +09:00
a5b47a0278 docs(phase2.6): CLAUDE.md — 사주 전 화면 라이트 재스킨 반영
- 사주 시스템 섹션: 결과 화면 → 전 화면(랜딩·입력·결과)
- 2026-07-03 라이트 재스킨 완료 명시

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 11:32:25 +09:00
d5be617eb2 feat(phase2.6): 사주 입력 화면·폼 라이트 재스킨
app/work/saju/input/page.tsx: 다크 히어로(#04102b + repeating-linear
-gradient 텍스처) → bg-[var(--jsm-navy)] 플랫 밴드, violet 배지 →
navy 위 accent-soft, 하드코드 hex(#dbe8ff/#1a56db/#7c3aed/#04102b) →
jsm-line/jsm-accent/jsm-ink 토큰.

SajuForm.tsx: 제출 버튼 gradient(#1a56db→#7c3aed) → 플랫
bg-[var(--jsm-accent)] hover:bg-[var(--jsm-accent-hover)]. 폼 필드
보더·포커스·선택 버튼·체크박스의 하드코드 hex를 동일 역할의
--jsm-line/--jsm-accent/--jsm-ink 토큰으로 통일.

useSajuForm 상태·핸들러·submit·라우팅 로직은 라인 단위로 100% 동일
(className/style만 변경). grep gradient|violet|purple|blur 게이트
0건, npm run build 성공, npm test 30/30 유지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 11:25:53 +09:00
abec100a73 feat(phase2.6): 사주 랜딩 라이트 재스킨 — gradient/보라→--jsm, 텍스처 제거
app/work/saju/page.tsx 순수 시각 변경(className/style만). 히어로·MY RECORDS·
바로시작 CTA·PRICING 비교표·FAQ 전 구간의 #04102b/violet/gradient 하드코드를
--jsm-navy/ink/accent/accent-soft/line/surface-alt 토큰으로 치환하고
repeating-linear-gradient 텍스처와 다크 카드 테두리(#1a3a7a)를 제거해
result 페이지(Phase 2.5)와 동일한 navy 밴드 무테두리 flat 관용구로 정렬.
데이터 조회·상태·JSX 구조는 변경 없음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 11:18:43 +09:00
fc55e6a928 @
docs(phase2.6): 사주 랜딩·입력 재스킨 구현 플랜 (3 Task)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
@
2026-07-03 11:13:36 +09:00
4f41f09a8c docs(phase2.6): 사주 랜딩·입력 라이트 재스킨 설계 — 2.5 패턴 연속 (WS1~3)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-03 11:11:05 +09:00
5ace251b58 feat(phase2.5): 사주 result page 라이트 재스킨 + CLAUDE.md 반영
app/work/saju/result/page.tsx의 히어로 다크 그라디언트/violet 배지, 사이드바
다크 카드, 4기둥 표, 대운 카드를 --jsm 토큰(navy/surface/surface-alt/line/
ink/accent)으로 순수 시각 치환. 서버 로직(사주 계산·hasPaid·로또 구독 조회)과
JSX 구조는 무변경. CLAUDE.md 사주 시스템 섹션에 재스킨 완료 이력 반영.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-03 10:51:22 +09:00
15825616a3 refactor(phase2.5): SajuFortuneSection 중복 Glyph 제거 — SajuIcons 재사용
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 10:39:13 +09:00
fa9cda4f50 feat(phase2.5): SajuFortuneSection 라이트 재스킨 — 로또 아이콘 SVG, 라디얼 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 10:32:02 +09:00
5e79ea9233 feat(phase2.5): SajuAISection 라이트 재스킨 — 이모지→SVG, gradient/보라→--jsm
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 10:19:39 +09:00
57a95dee16 feat(phase2.5): 사주 섹션 인라인 SVG 아이콘 세트(SajuIcons)
- SajuIcon 컴포넌트 및 12개 stroke 기반 SVG 아이콘 정의
- SECTION_ICON_ORDER 배열로 섹션 순서 관리(기질·오행·지지·신살·재물·직업·애정·건강·대운·세운·황금기·종합)
- LottoIcon 추가 export
- currentColor 사용으로 색상 커스터마이징 가능

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 10:10:50 +09:00
e50b5a6dc9 docs(phase2.5): 사주 결과 화면 라이트 재스킨 설계 — --jsm 전환·이모지→SVG (WS1~4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-03 10:06:54 +09:00
65ff294e89 feat(phase2): TopNav 사주·타로 진입점 + CLAUDE.md 정합화
- TopNav LINKS에 /work/saju, /tarot 추가 (5링크, 모바일 드로어 자동 반영)
- CLAUDE.md: 핵심 IA에 사주/타로 공개 라우트 추가, 숨김 서비스 표에서
  /work/saju* 제거(공개 전환), 사주 시스템 안내문 갱신, 파일 구조에
  tarot/·api/tarot/·lib/tarot/·lib/ai-usage.ts 반영

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:55:44 +09:00
124478e3d6 feat(phase2): 마이페이지 AI 기록 탭 — 사주·타로 결과 통합
saju_records와 GET /api/tarot/readings를 병합 조회해 마이페이지 5번째
탭으로 노출한다. 사주는 결과 페이지로 바로 돌아갈 수 있는 링크를,
타로는 뽑은 카드·요약·조언/주의 접이식을 제공한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:50:12 +09:00
96a0b06706 fix(phase2): 사주 무료화 잔재 정리 — 결제완료 배지→AI해석완료, 잉여 표현·stale 주석
- SajuAISection.tsx 415행: "결제 완료" 배지 → "AI 해석 완료"로 변경 (로그인 회원 무료 정책에 맞춤)
- page.tsx 86행: hasPaid = !!user → hasPaid = true 단순화 (if (user) 블록 내 중복)
- page.tsx 540행: 주석 "(사주 결제 시 표시)" → "(로그인 시 표시)" 갱신 (현행 정책 반영)

Tests: 30 PASS ✓  Build: success ✓

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 21:43:09 +09:00
26fef53174 feat(phase2): 사주 AI 해석 무료화 — 결제 게이트 → 로그인 게이트
- page.tsx: hasPaid를 orders 'saju_detail' paid 조회 대신 로그인 여부(!!user)로 산출
- SajuAISection: 미로그인 시 "개편 준비 중" 안내를 /login?next= 유도 CTA로 교체
- analyze fetch가 429(일일 무료 횟수 초과)를 받으면 전용 에러 메시지 표시(재시도 버튼 숨김)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:36:13 +09:00
5fd7ab8872 feat(phase2): 사주 공개 전환 + analyze 로그인·일일제한(서버 강제)
- app/work/saju/layout.tsx: isServiceVisible 가드 제거, 사주 서비스 공개 전환
- lib/service-visibility.ts: HideableService에서 saju 제거
- app/api/admin/services/route.ts: DEFAULT_SERVICES에서 saju 행 제거
- app/api/saju/analyze/route.ts: saju_detail 결제 게이트(403) 제거,
  로그인(401) + 서버측 일일 1회 제한(429, ai_usage_log 기반)으로 교체.
  recordUsage는 실제 Gemini 해석 성공 반환 직전에만 호출(MOCK 폴백 제외)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:28:24 +09:00
a9f5d8cee6 feat(phase2): 타로 UI(3카드 리딩) + 카드 이미지 78종
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:17:52 +09:00
b3d845a532 feat(phase2): 타로 저장·조회 API (user_id + RLS 본인 조회)
- POST /api/tarot/readings: 로그인 필수, interpretation_json 검증 후 insert
- GET /api/tarot/readings: 세션 클라이언트로 본인 것만 조회 (RLS tarot_select_own), 최신순
- Task 6·9가 소비

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 21:04:48 +09:00
10a60300ae fix(phase2): 타로 interpret 견고성 — maxOutputTokens 8192 + wall-clock 가드로 호출 상한 축소
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:01:43 +09:00
3acc1dbbe6 feat(phase2): 타로 interpret API — Gemini strict JSON + 인증·일일제한·reroll
lib/tarot/prompt.ts에 TarotInterpretation 스키마·시스템 프롬프트·JSON
파싱/검증 유틸을 추가하고, app/api/tarot/interpret/route.ts에서 사주
analyze와 동일한 Gemini 모델 폴백(getGenerativeModel systemInstruction +
generationConfig) 패턴을 재사용해 인증(401)→일일제한(429)→입력검증(400)
→API키(503)→호출 순서로 처리한다. GEMINI_API_KEY 미설정 시 예시 데이터
대신 503을 반환해 실데이터 오염을 막고, 스키마 검증 실패 시 사유를
주입해 1회 reroll한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:53:53 +09:00
84b36267bf feat(phase2): 일일 사용량 유틸(KST) + tarot_readings·ai_usage_log 마이그레이션
- kstDayStartISO: KST 자정을 UTC ISO로 변환
- getTodayUsage, recordUsage: AI 사용량 조회·기록
- DB: tarot_readings, ai_usage_log 테이블 생성
- saju service_settings 삭제 (숨김 해제)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 20:46:35 +09:00
53e8b592f0 feat(phase2): 타로 셔플·reference 순수 유틸 + 테스트
Fisher-Yates 셔플, 카드 픽 생성, 참고 블록/메타데이터 빌더 구현.
Task 4(interpret API)·Task 6(UI)에서 소비됨.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:40:30 +09:00
1752e68d55 feat(phase2): 타로 78장 카드 데이터 TS 포팅 + 무결성 테스트
web-ui(src/pages/tarot/data/cards.js)의 메이저 22장·마이너 56장 데이터와
buildMinor/buildMinorDetails 생성 로직을 lib/tarot/cards.ts로 값 변경 없이
포팅. TarotCard/Spread 타입 부여, SPREADS는 three_card만 유지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:35:14 +09:00
19a5559899 docs(phase2): 사주 재활성 + 타로 신규 구현 플랜 (10 Task)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 20:27:32 +09:00
878c0fbf49 docs(phase2): 사주 재활성 + 타로 신규 설계 — 공개·무료화·일일제한·web-ui 포팅 (WS1~4)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 20:22:27 +09:00
57f6eb6684 docs(phase1): CLAUDE.md — showcase·발주 탭·광고 관리·packs 정리 반영
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:36:28 +09:00
d5f194e7b1 chore(phase1): admin/packs 레거시 페이지 제거 (API는 products·mypage 공유로 유지)
- DELETE: app/admin/packs 페이지 디렉토리 전체 제거
- MODIFY: AdminSidebar.tsx에서 '팩 자료' 네비게이션 항목 제거
- VERIFY: /api/admin/packs API 엔드포인트는 유지 (products·mypage 공유)
- VERIFY: npm test (4 passed) + npm run build (success, no errors)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:32:05 +09:00
a85758566a feat(phase1): admin 광고 관리 — 채널·캠페인 CRUD 탭 + 에셋 탭 재편
admin/marketing을 2탭(광고 채널/마케팅 에셋)으로 재구성하고 ad-channels
API(GET/POST/PATCH/DELETE)를 소비하는 CRUD UI를 신규 추가. 기존 에셋
그리드·체크리스트·PNG 변환 기능은 손실 없이 assets 탭으로 이동. 사이드바
라벨을 '마케팅 에셋' → '광고 관리'로 갱신.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:27:34 +09:00
f693c4c5b4 fix(phase1): ad-channels API 입력 견고성 — JSON 파싱 try/catch + 문자열 타입 가드
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:22:17 +09:00
3e031a1c80 feat(phase1): ad_channels 테이블 + admin CRUD API
- Migration: ad_channels table (uuid, name, url, status, memo)
- Routes: GET/POST /api/admin/ad-channels (list/create)
- Routes: PATCH/DELETE /api/admin/ad-channels/[id] (update/delete)
- Auth: admin_token verification via verifyAdminTokenNode
- RLS: service_role only, no additional policies

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:19:09 +09:00
90be0d6316 feat(phase1): admin 견적 리스트 발주 뱃지 + 진행 상태 라벨 확장
- status 타입에 'in_progress' | 'completed' | 'delivered' 추가
- STATUS 맵 확장: 3개 신규 상태 추가 및 accepted 라벨 변경
  * accepted: '수락 · 발주' (기존 녹색)
  * in_progress: '진행중 · 발주' (파란색)
  * completed: '완료 · 발주' (에메랄드)
  * delivered: '납품 완료 · 발주' (틸)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:16:49 +09:00
976511df44 feat(phase1): mypage 발주·진행 섹션 — projects API 배선 + 견적코드 연결
견적 수락 시 발주서로 전환되는 프로젝트를 마이페이지에 표면화.
GET /api/projects로 quotes+milestones를 조회해 총액·마일스톤 타임라인을 표시하고,
POST /api/projects/link로 공개 견적 코드를 계정에 연결하는 폼을 추가했다.
기존 requests 탭의 의뢰 카드 리스트는 그대로 유지(탭 key 호환), 라벨만 발주·진행으로 변경.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:11:58 +09:00
3db3d91a40 feat(phase1): /showcase 제작 사례 허브 + TopNav 제작 사례 + robots 죽은 경로 정리
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:05:31 +09:00
e5ff5ec84f feat(phase1): showcase 데모 메타 단일 소스 + 무결성 테스트
- /showcase 제작 사례 허브가 소비할 데모 8종 메타 모듈화
- slug/title/description/tags 필수 필드 검증 테스트 3건
- Task 2(showcase 라우트)가 SHOWCASE_SAMPLES import 가능

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:01:43 +09:00
6234f4277a docs(phase1): 외주 코어 구현 플랜 (8 Task)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 15:00:13 +09:00
559134100d docs(phase1): 외주 코어 설계 — 발주서 통합·제작 사례 허브·광고 관리 (WS1~5)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 14:55:57 +09:00
1b75b27188 chore(phase0): DB 마이그레이션(DROP 3테이블+packages 행) + CLAUDE.md 정합화
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:27:50 +09:00
7366c18692 chore(phase0): 고아 API 제거 — track/[token](페이지 직접조회로 대체됨)·saju/lotto
- app/api/track/[token]: 페이지에서 Supabase 직접 조회로 대체됨
- app/api/saju/lotto: 프론트 fetch 0회, 외부 saju-engine 전용

참조: Task 6 (Phase 0 cleanup)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:25:05 +09:00
8c5858b350 chore(phase0): deepfield 파티클 잔재 3파일 + three/@types/three 의존성 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:22:01 +09:00
592b3fcf4e chore(phase0): redirect에 가린 죽은 페이지 4종 + 전이 고아(ContactForm·freelance-portfolio) 제거
- /work → /outsourcing 리다이렉트에 가려진 app/work/page.tsx 제거
- /work/freelance → /outsourcing 리다이렉트에 가려진 freelance/ 디렉토리 제거
- /work/website → /portfolio 리다이렉트에 가려진 app/work/website/page.tsx 제거
- /music/packs → /products 리다이렉트에 가려진 app/music/packs/ 디렉토리 제거
- 유일 소비처(freelance/)가 삭제된 ContactForm.tsx 제거
- 유일 소비처(/work, /work/freelance)가 삭제된 freelance-portfolio.ts 제거

samples/** 8종과 layout.tsx는 유지됨.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:15:30 +09:00
1e926fcb19 chore(phase0): PortOne 잔재 제거 — 계좌이체 단일 소스 확정, saju 결제 CTA 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:12:38 +09:00
8e1cf9b4e1 chore(phase0): packages·subscription 제거 — 페이지/API/cron/vercel.json + 파급(stats·members·saju) 수정
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:07:56 +09:00
88fe56163d chore(phase0): eBay 세트 제거 — 문진·문서 admin/API/lib/CONTENT + cheerio
Delete:
- app/api/questionnaire/ (submit/route.ts)
- app/admin/questionnaire/ (page.tsx)
- app/api/admin/questionnaire/ (route.ts + [id]/route.ts)
- app/admin/documents/ (page.tsx)
- app/api/admin/documents/ ([filename]/route.ts)
- lib/ebay-tools/ (crawler.ts·pricing.ts·ai-analyzer.ts·types.ts)
- CONTENT/ebay-tool-{questionnaire,proposal}.html
- CONTENT/ARCHITECTURE_EBAY_PARTS_TOOL.md

Modify:
- app/admin/components/AdminSidebar.tsx: Remove NAV_ITEMS for /admin/documents & /admin/questionnaire
- package.json: Remove cheerio dependency

Verify: npm test (4 files, 20 tests PASS), npm run build OK

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:02:47 +09:00
0c6ebb2eaa docs(phase0): 정리·삭제 구현 플랜 (7 Task)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 14:00:40 +09:00
9241eac4e1 docs(refactor): SaaS 운영 리팩토링 로드맵 + Phase 0 정리·삭제 설계
비전 재정의(외주 메인 + 사주·타로·음악 별도 서비스) 기반 Phase 0~3 로드맵.
Phase 0: eBay 세트·packages/subscription·PortOne 잔재·죽은 페이지·고아 코드 삭제 설계.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 13:47:29 +09:00
gahusb
65f0a6bb41 Merge PR #2: 라이트 고craft 재설계 (홈·외주·제품 3면)
Deep Field 다크 → 라이트 단일 시스템 재설계. 검증 통과(test 20/20, build 86/86).
2026-06-30 16:15:35 +09:00
7e1105f574 fix(redesign): ScrollReveal reduced-motion 시 transition까지 생략(정적 표시)
기존엔 스크롤 스태거만 건너뛰고 700ms 전환은 남았음 → instant 분기로 완전 정지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A2N6SziVSPfavx1j5rAs52
2026-06-30 14:53:23 +09:00
f4fd0f60c9 chore(redesign): 재설계가 죽인 다크/스크롤큐 CSS 제거 + 연결선 gradient 제거
globals.css: --jsm-dark-* 토큰, --jsm-accent-bright, .jsm-dark-form,
.df-scroll-dot/@keyframes df-scroll-cue 제거 (전부 소비처 0).
홈 PROCESS 연결선 linear-gradient → solid 인셋 라인.

유지: --kx-*/.kx-*(/, packages·work·music 사용), .gradient-text(/portfolio/[token] 사용)
— 숨김·레거시 라우트라 이번 범위 밖.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A2N6SziVSPfavx1j5rAs52
2026-06-30 14:52:22 +09:00
37465701af feat(redesign): 제품 페이지 craft 정렬(공통 언어)
max-w-5xl→6xl, 타입 스케일·여백 리듬·카드 스펙(rounded-2xl/hover)을
홈·외주와 통일. surface↔surface-alt 교차 4섹션.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01A2N6SziVSPfavx1j5rAs52
2026-06-30 14:49:10 +09:00