Commit Graph

365 Commits

Author SHA1 Message Date
5f7e66c220 feat(saju-ui-v2): tokens.css — 디자인 변수 + 한글 폰트 토큰 (.saju-v2 scope) 2026-05-27 01:51:01 +09:00
6040d5fd7f fix(saju-ui-v2): index.html — Noto Serif KR link 복구 (v1 saju/tarot 페이지 폰트 회귀 방지)
spec: head 내 <title> 다음 줄에 기존 Noto Serif KR 링크를 복구.
이전 커밋(dd719f5)에서 링크를 삭제한 것을 수정.

최종 헤드에 포함:
- 2x preconnect (googleapis, gstatic)
- 1x Noto Serif KR stylesheet (복구)
- 1x Nanum/Gowun stylesheet (유지)

v1 saju/tarot 페이지의 'Noto Serif KR' font-family 참조 유지.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-27 01:48:28 +09:00
dd719f5b2e feat(saju-ui-v2): Google Fonts (Nanum Myeongjo/Gothic/Gowun Batang) preconnect + link 2026-05-27 01:46:27 +09:00
e91b7feada chore: .gitignore에 .worktrees/ 추가 (worktree 격리 작업 보호) 2026-05-27 01:43:26 +09:00
ac098faeea chore(saju-v1): horyung-main + background PNG 자산 추가
호령 캐릭터 메인 PNG와 배경 자산을 main에 commit. v2 리디자인의
Mascot variant=full 매핑 + worktree 격리 작업에 필요.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 01:43:04 +09:00
6e5aabc94c feat(saju): 궁합보기 v2 placeholder + SajuNav 통합 2026-05-26 08:36:40 +09:00
69d17f787a feat(saju): 오늘운세 페이지 (FortuneRing + 4 ScoreCard + LuckyBox + good_signs/warnings) 2026-05-26 08:35:41 +09:00
435e6fb1bc feat(saju): 오늘운세 컴포넌트 3개 (FortuneRing + ScoreCard + LuckyBox) 2026-05-26 08:33:52 +09:00
2d2895c9a4 feat(saju): 사주풀이 결과 페이지 (4기둥 + 오행 + 12개월 + AI 12항목) 2026-05-26 08:32:35 +09:00
36665ec308 feat(saju): 사주풀이 5 컴포넌트 + useSajuReading hook 2026-05-26 08:31:10 +09:00
2dd92d025f feat(saju): 메인 페이지 정식 구현 (호령 hero + 3 ActionCard + 입력 폼) 2026-05-26 08:28:46 +09:00
66be5105a8 feat(saju): useSajuForm + SajuInputForm + ActionCard 2026-05-26 08:27:12 +09:00
c274a8f5e7 feat(saju): HoryungMascot + SajuNav 공통 컴포넌트 2026-05-26 08:25:37 +09:00
8fd7f83586 feat(saju): Saju.css 컬러 토큰 + 폰트 + 격리 + Noto Serif KR Google Fonts 2026-05-26 08:23:00 +09:00
3e30612b38 feat(saju): 호령 캐릭터 PNG 6개 추출 (horyung.png + saju_color_sheet.png)
PIL-based extraction script with measured crop coordinates:
- horyung.png (1055x1491, 3-view layout): bust shot + front view
- saju_color_sheet.png (1536x1024, 6 emotion stickers row):
  greeting, thinking, pointing, happy (left 4 of 6)

Output files (public/images/saju/horyung/):
- horyung-bust.png (590x478)
- horyung-front.png (697x507)
- horyung-greeting.png (150x216)
- horyung-thinking.png (150x216)
- horyung-pointing.png (150x216)
- horyung-happy.png (150x216)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 08:20:36 +09:00
eab52ca424 feat(saju): api helpers (saju + compat) + 라우트 + 아이콘 + placeholder pages 2026-05-25 20:31:35 +09:00
e634cdedba feat(api): tarot endpoint를 /api/tarot/* 로 이전 (agent-office 분리) 2026-05-25 18:56:40 +09:00
192c8a8c8c fix(tarot): 랜딩 영상 element 복원 + scroll-cue 제거
- codex UI 재구성 시 <video> element 자체와 .tarot__hero-video CSS가
  누락되어 영상 재생 불가 (poster img만 정적 표시).
- <video> 복원 (autoplay, loop, muted, playsInline) + poster fallback.
- CSS z-index 0으로 poster 위, overlay(1) 아래에 stack.
- prefers-reduced-motion @media display:none 동작 복원.
- 사용자 요청에 따라 tarot__scroll-cue 제거.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 14:56:35 +09:00
a6721e6536 fix(tarot): 해석 완료 시 자동 AI 탭 전환 + 새 리딩 시 해석 state 잔존 버그
Issue 1 — 우측 패널 탭이 hardcoded is-active로 클릭/state 없음:
- InterpretationPanel에 activeTab state 추가
- useEffect로 interpretation 도착 시 자동 'ai' 탭 전환, 없으면 'card'
- 두 탭 콘텐츠 분리: card=카드 의미·상징·조언, ai=위치 해석·종합·상호작용·근거

Issue 2 — useTarotReading hook의 interpretation이 새 리딩 시작에 잔존:
- hook에 reset() 함수 추가 (status/interpretation/readingId/error 초기화)
- Reading.jsx의 startShuffle/openCardSpread/restart/resetCards/changeSpread
  5개 액션에서 모두 reset() 호출 — 새 리딩 시작 시 이전 해석 완전 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 14:53:31 +09:00
94569a4c45 Enhance tarot reading experience 2026-05-24 12:39:20 +09:00
6d73a075f7 feat(tarot): 랜딩 상단 nav + account 제거, ARCANA TAROT brand만 유지
topbar wrapper 제거, brand가 hero-content 직속 첫 자식이 됨.
nav(오늘의 카드/타로 리딩/스프레드/가이드/마이 페이지) + account(프리미엄/로그인)
모두 제거 — brand 단독으로 좌상단 표시.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 02:04:12 +09:00
840cc28043 feat(tarot): 반응형 풀-width 레이아웃 + clamp 기반 fluid sizing
랜딩:
- topbar로 brand + nav 같은 줄에 묶음 (시안 부합)
- hero content max-width 1200→1600px, padding clamp(24px,4vw,80px)
- h1 size clamp(40px,6vw,84px), margin clamp(40px,6vw,80px)
- sub max-width 520px→44ch + line-height
- tier-row repeat(auto-fit, minmax(240px,1fr)) — 큰 화면 자동 펼침

Reading:
- max-width 1280→1800px, padding clamp(20px,3vw,60px)
- grid columns clamp 기반 fluid (좌 22vw, 우 26vw)
- mid breakpoint 1280px에서 비율 보정, 1024px 이하 single column

History: max-width 960→1400px

Card grid: repeat(auto-fit) — 화면 폭 활용
640px 이하 step indicator wrap + cta wrap

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:40:13 +09:00
423304dce3 feat(tarot): 시안 기반 UI 재구성 — 랜딩 좌→우 그라데이션 + Reading 테이블 배경
랜딩(tarot_main_landing_page.png 참고):
- hero overlay를 full-screen dark에서 좌→우 그라데이션으로 변경
- 좌측만 어둡게 (텍스트 가독), 우측은 영상 선명히 노출

Reading(tarot_card_select_page.png 참고):
- tarot_table.png 배경 fixed (보라 신비 톤 + vignette)
- 상단 step indicator (질문 & 설정 → 카드 선택 → 해석)
- 패널 backdrop-filter blur + 금색 보더로 시안 느낌 강화
- 하단 남은 카드 row 미리보기 (12장)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:12:04 +09:00
024e340e0c fix(tarot): 히어로 영상이 정적 poster img에 가려지는 z-index 충돌 해결
video와 poster img가 같은 z-index:0 + position:absolute였고 DOM 순서상
poster가 늦게 와서 video를 영원히 덮음 → 영상 재생 중이지만 안 보임.

z-index 계층 명시: poster=0 (fallback) → video=1 → overlay=2 → content=3.
video display:none 처리되면 뒤의 poster img가 자동 노출되도록 stacking 정리.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 01:02:28 +09:00
b46f4aed80 chore(tarot): 히어로 영상 압축 (9.4MB → 4.47MB)
5MB threshold 이하로 압축. 첫 paint 데이터 부담 절감.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:55:19 +09:00
09e2b67039 feat(tarot): 카드 78장 + 카드 뒷면 PNG 자산 통합
라이더-웨이트 메이저 22 + 마이너 56 + 카드 뒷면.
slug 매핑 (the-fool, ace-of-wands 등)으로 자동 표시.
TarotCard 뒷면 참조를 SVG → PNG로 전환.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:54:15 +09:00
f3551815d1 feat(tarot): 라우팅 4 페이지 + navLinks 추가 (T17)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:49:32 +09:00
bc6c45dee3 feat(tarot): History.jsx — 마이페이지 (T16)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:48:01 +09:00
d08b20a4b5 feat(tarot): Reading.jsx — 3장 스프레드 메인 (T15)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:46:29 +09:00
44bbff297f feat(tarot): TodayCard.jsx — 원카드 페이지 (T14)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:45:01 +09:00
1387d91ac5 feat(tarot): 랜딩 페이지 Tarot.jsx (T13)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:43:48 +09:00
ce84e277a4 feat(tarot): Tarot.css 디자인 토큰 + 4 페이지 스타일 (T12)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:42:35 +09:00
4c82fa9b21 feat(tarot): TarotCard·CardGrid·SpreadSlots·InterpretationPanel 컴포넌트 (T11)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:39:22 +09:00
d91be529eb feat(tarot): useTarotReading hook + api helper 6종 (T10)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:36:08 +09:00
1a7dfe73e4 feat(tarot): useTarotShuffle hook (Fisher-Yates + reversed 플래그) (T9)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:33:03 +09:00
cdf8759aef feat(tarot): 카드 78장 메타데이터 (메이저 22 + 마이너 56) (T8)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:30:41 +09:00
2042457000 feat(tarot): 히어로 영상 + 배경 + 카드 뒷면 SVG (T7)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 00:25:54 +09:00
c998753eea feat(insta): 카드 탭 트렌딩 키워드 중복 제거 + 10개씩 페이지네이션
KeywordsPanel이 전체 목록을 세로로 길게 표시하던 것을, 동일 keyword
중복 제거(최고 score 유지)·score 내림차순 후 페이지당 10개만 렌더하고
이전(←)/다음(→) 페이저로 탐색하도록 변경. 카테고리 변경 시 첫 페이지 리셋.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 03:03:36 +09:00
a846ab89e6 feat(lotto): 헤더 카드를 자율 학습 시스템으로 업데이트
Why: v1(능동 시그널) + v2(자율 가중치 학습) + v2.1(활동 가시화)로
시스템이 진화한 것을 반영. 기존 '시뮬레이션 추천 시스템' 3 bullet
→ '자율 학습 시뮬레이션' 4 bullet (학습 루프·시그널·시뮬·AI 큐레이터).
2026-05-23 02:43:47 +09:00
ef392f02ed refactor(evolver): Lotto 탭으로 통합 + 다크 테마 + activity 스크롤
- EvolverTab.jsx 신규 생성: evolver 컴포넌트를 탭 body로 추출
- Evolver.jsx → Lotto 페이지 thin wrapper로 교체 (/lotto/evolver URL 유지)
- Lotto.jsx: useLocation으로 pathname 감지 → initialTab 결정
- Functions.jsx: 4번째 탭 '🧬 자율 학습' 추가 + initialTab prop 수용
- Evolver.css: light → dark 테마 전환 (rgba/slate 팔레트), activity-list max-height+scroll 적용

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 02:38:33 +09:00
2543dc335d feat(evolver): Evolver 페이지 + LottoActivityTimeline + EvolverActions + 라우터
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 02:19:07 +09:00
b99d720179 feat(evolver): TrialsGrid + BaseDiff + BaseHistory 3 컴포넌트
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 02:16:15 +09:00
734bc6532e feat(evolver): WinnerCard — Radar + 이전 base overlay + 메타 정보 2026-05-23 02:14:58 +09:00
5fd32030ab feat(evolver): useEvolverApi hook (4 fetch + activity merge sort) 2026-05-23 02:14:16 +09:00
e8d33906ba feat(evolver): api.js에 evolver + lotto activity fetch helpers (6개) 2026-05-23 02:13:35 +09:00
6533743100 fix(stock): 총 매입을 각 종목 매입가의 단순 합으로 표시
요약카드(백엔드 매입가×수량)와 증권사별(매입가 단순 합) 총 매입이 서로
달라 혼란. 박재오 정의대로 총 매입 = Σ매입가(수량 미곱산)로 통일.
getBrokerSummary를 stockUtils.computeBrokerSummary로 추출(테스트 5건),
usePortfolio가 portfolioSummary.total_buy를 프론트 단순 합으로 override해
요약카드·증권사별·AI 프롬프트가 동일 값 사용. 손익은 avg_price×수량 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 11:15:58 +09:00
e42b643731 refactor(stock): 거래 데스크에서 AI 투자 탭 제거
TAB_AI 탭과 관련 컴포넌트(AiTradeTab)·훅(useAiBalance) 삭제. 헤더 카드는
aib 모의투자 요약 분기를 제거하고 항상 포트폴리오 요약을 표시.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 08:30:44 +09:00
ee5700dc95 feat(agent-office): 모바일 사이드패널 전체화면 토글 + music 에이전트 이미지 교체
모바일 바텀시트(Commands/Tasks)가 55vh로 작아 내용 확인이 불편 → 헤더에
전체화면 토글 버튼 추가(100dvh 확장, 데스크톱은 숨김). music 에이전트
이미지를 agent_music_2로 교체.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 08:30:38 +09:00
ec5fee8429 chore(agent-office): drop unused break state styling
Backend no longer emits the 'break' state (see web-backend
de8adae). Remove the matching entry from STATE_COLORS and the
.ao-card-dot.break CSS rule. Safe because AgentCard's unknown-state
fallback (DEFAULT_STATE_COLOR) handles any stray legacy value.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 08:44:58 +09:00
96cc5e7839 fix(agent-office): render TaskTab result_data when it's already an object
Old code assumed result_data was a JSON string and ran JSON.parse on it,
falling back to returning the value verbatim on parse error. When the
backend ships result_data as a dict (e.g. compose tasks return
{music_task_id, tracks}), JSON.parse threw, the catch returned the raw
object, and React threw error #31 'Objects are not valid as a React
child' the moment the user expanded the task row.

Extract formatResultData helper: object → JSON.stringify, JSON string
→ parse then pretty-print, plain string → as-is.

Regression tests cover all three input shapes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 08:38:06 +09:00