Commit graph

36 commits

Author SHA1 Message Date
98b27a5fae 페이지 전환 애니메이션 전체 revert
유저 체감 개선이 확실치 않고 오히려 버벅임 느낌이 남아있어 관련 6개
커밋 (d1764de, 1344a2f, 48f43ec, f5c5c69, 670d8ab, f63c1e0) 을 git revert.
StaggerGroup 컴포넌트 제거, Feature/Admin 페이지의 Suspense 스피너 복원,
보스 리스트의 border 구조 원복.

prefetch(7ebfe4a), backdrop-blur 제거(669b358), font-display optional
(6e2159c) 은 애니메이션 무관한 최적화라 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:46:46 +09:00
f63c1e06c5 애니메이션을 translateY 대신 scale로 변경해 CLS 제거
Chrome DevTools의 레이아웃 변경 원인 분석 결과 애니메이션 × 3이 CLS 0.17의
주요 원인으로 지목됨. translateY 애니메이션을 레이아웃 변경으로 카운트하는
케이스가 있음.

- StaggerGroup: y:30 → scale:0.97 로 변경. scale/opacity는 compositor-only
  속성이라 layout/paint 없이 GPU만 사용
- BossCrystal 루트 애니메이션도 동일하게 scale 기반으로 변경
- 자식 motion.div에 will-change: transform, opacity 명시적 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:42:25 +09:00
670d8abc12 보스 수익 계산기 카드 슬라이드업 애니메이션 복원 + GPU 힌트 강화
- initial y:30, duration 0.4 복원하되 will-change: transform, opacity
  명시해 GPU 레이어 승격 확실히
- delay 0.03초 추가해 첫 프레임 레이아웃 안정화 후 애니메이션 시작

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:26:14 +09:00
f5c5c6927e 보스 수익 계산기 초기 등장 끊김 완화
- BossCrystal 루트 애니메이션을 y 이동 없는 opacity fade (0.3s)로 단순화.
  외부 transform과 내부 stagger 애니메이션이 동시에 돌면서 합성 단계가
  겹치던 부하 제거
- will-change: opacity 힌트 추가해 GPU 레이어 승격 명시

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:22:42 +09:00
48f43ecc0b 보스 리스트 스태거 개선: 구분선 중복 제거 + 버벅임 완화
- 내부 row의 border-t/first:border-t-0 제거, 부모 divide-y로 통일
  (motion.div 래핑으로 first-child 판정이 어긋나 구분선 중복 생기던 문제)
- divide color는 divide-[var(--panel-border)]로 토큰 직접 지정
- stagger 파라미터 완화: yOffset 20→10, duration 0.3→0.25, 간격 0.04→0.03
  (동시 애니메이션/이미지 디코드 부담 감소)
- 보스 이미지에 loading=lazy, decoding=async 추가해 초기 프레임 블로킹 방지

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:19:13 +09:00
1344a2f7a9 StaggerGroup 파라미터를 프로미스나인 사이트와 동일하게 맞춤 + 보스 리스트 애니메이션
- StaggerGroup 기본값: y 30px / duration 0.4s / 간격 0.1s, default ease
  (프로미스나인 AlbumDetail 패턴과 일치)
- staggerDelay / yOffset / duration prop 받도록 커스터마이즈 가능
- BossCrystal fade-in 파라미터도 동일하게 맞춤
- BossSelector 보스 리스트에 StaggerGroup 적용 (항목 많으므로 간격 0.04s,
  y 20px, duration 0.3s 로 가볍게)
- CharacterPanel 은 Reorder.Group 드래그 로직과 충돌하므로 제외

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:16:56 +09:00
d1764dea94 feature 페이지 Suspense 스피너 제거 + 섹션 순차 페이드인 애니메이션
- FeaturePage / AdminFeaturePage의 Suspense fallback 스피너를 null로 변경
- components/common/StaggerGroup: 자식을 각 motion.div로 감싸 순차
  페이드인 (staggerChildren 0.07s, duration 0.35s, ease 0.22,1,0.36,1)
- Liberation(Genesis/Destiny), Symbol 페이지 root를 StaggerGroup으로 교체
- BossCrystal은 grid 레이아웃 특성상 root 전체를 motion.div로 감싸 fade-in
- hover prefetch와 함께 chunk 로드 시 깜빡임 없이 자연스럽게 등장

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 00:13:15 +09:00
dc48f57501 비활성 요소의 금지 커서 제거
index.css 의 전역 button:disabled { cursor: not-allowed } 규칙과 개별
컴포넌트의 disabled:cursor-not-allowed / cursor-not-allowed 클래스를 모두
제거해 비활성 상태에서 기본 화살표 커서를 유지한다. opacity 등 기존 시각
피드백은 유지.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 17:59:19 +09:00
7fc04cf371 보스 목록 스크롤을 OverlayScrollbars로 교체 + 좌우 여백
- features/boss-crystal/pc/user/BossSelector.jsx:
  * 목록 스크롤을 기본 overflow-y-auto → OverlayScrollbarsComponent
  * 메인 바디와 동일한 os-theme-maple os-theme-dark 테마
  * 헤더와 목록 좌우에 8px씩 추가 여백 (스크롤바와 내용 간격)
  * 헤더 행과 목록 row의 컬럼 정렬이 어긋나지 않도록 동기

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 17:11:00 +09:00
0dd81b56e5 유틸리티 함수 단위 테스트 추가 (vitest)
- package.json: vitest 추가 + test/test:watch 스크립트
- utils/__tests__/formatting.test.js (7 tests)
- features/symbol/__tests__/utils.test.js (8 tests)
- features/liberation/__tests__/utils.test.js (18 tests)
- features/boss-crystal/pc/admin/__tests__/constants.test.js (6 tests)

총 39개 테스트 통과 (716ms)
- formatMeso / formatMesoKorean 경계 조건
- computeCompletion (심볼 완료 시뮬레이션)
- bossEarn, calcWeekPoints, calcDoneEarn, calcMonthlyEarn
- getSchedulerWeekRange (1주차/2주차, 목요일 시작 등)
- computeCompletionDate (단순 계산/주차별 계산 모드)
- 보스 결정 난이도 정의 및 스타일 헬퍼

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 12:41:48 +09:00
c6ac3366cc 리팩토링 1단계: 공용 utils/FormField 추출
- utils/formatting.js 신설 (formatMeso, formatMesoKorean 통합)
- components/common/FormField.jsx 신설 (label+hint+error 공용 래퍼
  + formInputClass/formInputStyle 상수)
- 중복 정의 제거:
  * BossForm, SymbolForm, AdminMenuForm의 Field 로컬 정의 삭제
  * boss-crystal constants.js의 formatMeso → utils re-export
  * SymbolForm의 formatMesoKorean 로컬 정의 삭제
  * 3개 폼의 inputCls/inputStyle 상수 삭제

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 11:39:23 +09:00
b423d0ac82 구조 개편 2단계: features 내부에 pc/ 폴더 생성 + 이동
- features/boss-crystal/pc/: BossCrystal, BossCrystalAdmin, admin/, user/
- features/symbol/pc/: Symbol, SymbolAdmin, admin/
- features/liberation/pc/: Liberation, components/
- store.js, data.js는 feature 루트에 유지 (device 공용)
- registry.js: import.meta.glob 패턴을 './*/\{pc,mobile\}/*.jsx' 로 변경
- getMobileComponent 추가

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 11:26:12 +09:00
4789c56dfa 구조 개편 1단계: components/ 를 common/pc/mobile/로 분리
- components/common/: Select, Tooltip, ConfirmDialog, DatePicker,
  Checkbox, LoginDialog, CharacterSuggestDropdown (device 독립)
- components/pc/: Layout, Footer, NoticeWidget (PC 전용)
- components/mobile/: (placeholder)
- 모든 import path 업데이트

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 11:24:43 +09:00
45d325dfbe 푸터 조건 단순화 + 심볼 타입 배지 테마 대응
- 푸터를 홈 경로에서만 렌더링 (!fullscreen → isHome)
  이동 시 푸터가 잠깐 보였다 사라지는 플래시 제거
- 심볼 관리 타입 배지(아케인/어센틱/그랜드 어센틱) 테마별 토큰화
  라이트 모드에서 violet/sky/amber-300이 흰 배경에 안 보이던 문제 해결
- 계산기 페이지의 fullscreen 훅을 useLayoutEffect로 변경

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 11:12:19 +09:00
e78a18dedb 관리자 페이지 테마 토큰화 + 너비 정리
- AdminBoss/AdminFeaturePage/BossList/BossForm/SymbolList/SymbolForm 전체 이관
- Checkbox 공용 컴포넌트 테마 대응
- BossList/SymbolList/AdminImages/AdminFeaturePage 폴백에 max-w-5xl 통일
- BossForm/SymbolForm의 localStorage admin key를 auth store로 교체
- 홈(관리자) 하단 로그아웃 버튼 제거

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 11:05:25 +09:00
85b9a6b6d2 API 키 로그인 + 캐릭터 드롭다운 + 관리자 네비게이션
- API 키 로그인 다이얼로그 + 헤더 로그인 버튼
- /api/character/list 프록시 엔드포인트 (월드 아이콘 매핑 포함)
- 캐릭터 입력 포커스 시 드롭다운 (월드 아이콘, 레벨 정렬, 기존 캐릭 제외, 페이드 애니메이션)
- 관리자 인증을 API 키로 통합 (URL ?key= 파라미터 폐기)
- 헤더에 관리자 링크 버튼 / 홈 링크 버튼 (경로별 배타적 표시)
- 관리자 페이지에서 타이틀 우측에 "관리자" 텍스트
- 이미지 관리 페이지 테마 토큰화

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 10:54:12 +09:00
46b6237f75 보스 난이도 버튼: EASY/NORMAL/HARD 테두리 보강
border 색과 bg 색이 같아 구분이 안 되던 난이도에 rgba(0,0,0,0.55) 테두리 적용
테두리 두께 1.5px로 조정

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 16:10:09 +09:00
b63ab39977 ConfirmDialog 테마 토큰화 + 입력 필드 테마 전환 플래시 수정
- ConfirmDialog 전체를 dialog/icon/ring/danger-btn 토큰으로 이관
- 캐릭터 닉네임 입력의 transition 제거로 테마 전환 시 검은색 플래시 해결

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 12:20:55 +09:00
8e4c7b8c1b 캐릭터 목록에 OverlayScrollbars 적용
스크롤바가 레이아웃을 밀지 않도록 메인 바디와 동일한 오버레이 스크롤바 사용

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 12:17:14 +09:00
e0dd7d1bc4 보스 수익 계산기 페이지 테마 토큰화
- Select/Tooltip 공통 컴포넌트 테마 대응
- BossCrystal 루트/CharacterPanel/BossSelector 전체 이관
- 비활성 row/난이도 버튼 테마별 처리 (--disabled-opacity, --inactive-filter)
- 라이트 테마 warning 색상 갈색 → 주황 계열로 조정

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 12:15:04 +09:00
2d43b78ce4 보스 수익/해방 계산기도 zustand로 전환
- boss-crystal/store.js: characters/selectedChar/selections + persist
- liberation/store.js: calcMode + simple/weekly slot + persist
- 세 스토어(symbol 포함)에서 version/migrate/구 localStorage 호환 코드 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 19:20:50 +09:00
df0bb7d14b 해방 계산기/관리자 폼 소소한 UI 조정
- 해방: 현재 진행 상태의 흔적 입력 우측에 / N 필요량 표시 (관리자 경로 입력 스타일, text-base)
- 해방: 날짜/퀘스트/흔적 3열을 1:1:1 균등 비율로 정렬
- 주차별 계산 헤더 분모를 6500 고정 → 현재 진행 기준 남은 흔적
- 보스/메뉴 관리자 폼 mx-auto 중앙 정렬

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 18:49:52 +09:00
791f4f8e35 캐릭터 코디/기본 정보 자동 새로고침
보스 수익 계산기/심볼 계산기에서 저장된 캐릭터의 character_image, level,
직업 정보를 페이지 로드마다 /api/character/search로 재조회해 반영.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 13:48:03 +09:00
df057057ff UI 조정: 해방 주간 헤더 분기, 캐릭터 카드 보스 정렬
- 해방 주간 보스 설정 헤더: 단순 계산에선 합산만, 주차별에선 주간+월간/6500 분할 표시
- 보스 수익 계산기 캐릭터 카드의 보스 아이콘을 보스 목록 순서로 정렬 (12개 상한은 여전히 수익 기준으로 선발)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 22:07:23 +09:00
4e1d2556b2 보스 결정석 난이도 선택 UI를 CSS pill로 교체
이미지가 흐릿한 문제 해결. DIFFICULTIES 색상값을 사용해
EASY/NORMAL/HARD/CHAOS/EXTREME pill 버튼으로 직접 렌더링.

- 선택 시: 색상 풀톤
- 비선택 시: filter brightness(0.4)로 어둡게만 처리
- 크기 고정 (h-7 px-4)
- 브라우저 툴팁 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 20:50:37 +09:00
f7481acfa3 캐릭터 패널 보스 툴팁 순서 변경
보스 이름 · 난이도 → 난이도 · 보스 이름 순으로 표시하여 난이도 인지를 우선시.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 15:19:04 +09:00
f27c46f68d 캐릭터 카드 드래그 핸들 영역 제한
카드 전체가 드래그 리스너를 잡고 있어 태블릿에서 세로 스크롤이
불가능했던 문제 해결. useDragControls로 왼쪽 핸들 영역에서만
드래그가 시작되도록 변경.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 08:06:58 +09:00
0fb325b815 헤더/탭 제목, 커스텀 툴팁, 캐릭터 입력 UI 개선
- 커스텀 Tooltip 컴포넌트 (portal, fadeIn, 자동 위치 보정)
- 헤더에 현재 메뉴 제목 표시 (브레드크럼 스타일)
- 브라우저 탭 제목 자동 동기화
- 캐릭터 닉네임 검색 입력 강조 (아이콘, 두꺼운 테두리, 그림자)
- 결정 개수 강조 (큰 폰트, amber 색상)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:38:01 +09:00
7b6a821f36 보스 결정 사용자 페이지 + UI/UX 개선
레이아웃:
- 풀스크린 모드 컨텍스트 (BossCrystal 페이지에서 푸터 숨김 + viewport 고정)
- 캐릭터 패널: 자연 높이 + viewport 한도 + 내부 목록 스크롤
- 보스 패널: 헤더 고정 + 목록 내부 스크롤
- 커스텀 스크롤바 (전역)

캐릭터 패널:
- framer-motion Reorder로 드래그앤드롭 정렬
- 가로 캐릭터 행 + 6x2 보스 그리드 + 난이도 영문 첫글자 뱃지
- 총 수익에 ResizeObserver 기반 자동 폰트 fit
- 캐릭터 삭제 시 첫번째 자동 선택, 입력 재개 시 에러 메시지 자동 제거

기능:
- 공개 보스/캐릭터 API 추가
- API 키 라이브 키로 변경

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:17:49 +09:00
3df639c815 보스 폼 사용성 개선
- 가격 입력 시 Tab으로 다음 활성 가격 칸으로 이동 (체크박스 건너뜀)
- 최대 인원 기본값 6 → 3 (요즘 보스 기본)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:23:45 +09:00
89b0f1066d 하드 난이도 색상을 fuchsia(자홍)로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:13:06 +09:00
3fdd9fd981 난이도 배지 색상을 게임 내 이미지와 매치
이지(slate), 노말(sky), 하드(pink), 카오스(amber), 익스트림(red)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:09:23 +09:00
88c6d5d5f3 보스 목록 드래그 앤 드롭 정렬 추가
- @dnd-kit으로 드래그앤드롭 정렬 구현
- DragOverlay 패턴으로 부드러운 드래그 애니메이션
- 드롭 시 즉시 UI 반영 + reorder API 호출
- React 19 peer dep 충돌 해결을 위해 npm install --legacy-peer-deps 사용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:06:08 +09:00
b885f464c3 보스 결정 관리 개선
- 최대 인원수를 보스 단위로 통합 (난이도별 → 보스 공통)
- 가격 입력 시 쉼표 자동 표시 (text + inputMode=numeric)
- registry 캐싱으로 sub-route 변경 시 화면 갱신 안되던 버그 수정

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 16:01:04 +09:00
39cda0d958 보스 결정 관리 페이지(프론트) 추가
- 보스 추가/편집/삭제 폼 (이름, 이미지, 난이도별 가격/인원)
- BossList: 등록된 보스 카드 목록 + 추가 버튼
- 동적 라우트가 sub-path 지원하도록 변경 (:slug/*)
- 커스텀 Checkbox/Select 컴포넌트
- number input 화살표 전역 제거
- 가격 입력 시 메소 단위 미리보기 표시
- 결정석 → 결정으로 용어 통일

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:41:47 +09:00
1de5dcb7b9 URL slug 기반 동적 기능 페이지 라우팅 추가
- features/registry.js: import.meta.glob으로 자동 컴포넌트 등록
- /:slug → features/{slug}/{PascalCase}.jsx 매핑
- /admin/:slug → features/{slug}/{PascalCase}Admin.jsx 매핑
- AdminHome 카드 분리 액션 (본체→기능 관리, ⚙→메뉴 정보 편집)
- AdminFeaturePage에 메뉴 정보 편집 단축 링크 추가
- 예시: features/boss-crystal/ stub 컴포넌트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:27:04 +09:00