[FE-01] 테마 토큰 시스템 (라이트/다크) 신설
작업 내용 (설계 의도)
변경 사항
근거: 20260704-채팅시스템고도화-design-fe-app.md “테마 토큰 정의 표”·“상태관리 설계”.
mobile/에 테마 인프라가 전무하다(모든 화면 색 하드코딩, no-hardcoded-color·no-single-mode 위반). 이 티켓은 모든 채팅/커뮤니티 화면 티켓의 선행 병목인 테마 토큰 시스템을 신설한다.
theme/tokens.ts— 시맨틱 토큰 객체(light/dark) 정의. 설계 문서의 토큰→라이트/다크 매핑 표가 SSOT.theme/useTheme.ts— 현재 모드의 토큰 객체를 반환하는 훅.useColorScheme()기본 +themeStore오버라이드 반영.theme/themeStore.ts— Zustand 스토어(mode: 'system'|'light'|'dark'), MMKV 영속(lib/mmkv-storage재사용).theme/ThemeProvider.tsx— 앱 루트 마운트용 프로바이더(정의만,_layout.tsx와이어업은 FE-15).- 스타일 생성 헬퍼:
createStyles(theme)패턴 문서화(각 화면은 함수형 StyleSheet).
_layout.tsx·(tabs)/_layout.tsx는 이 티켓에서 수정하지 않는다(FE-15 통합 티켓 소유). 프로바이더는 정의만 제공한다.
의존
- 없음 (wave 1)
다이어그램
클래스 의존
flowchart LR Screen[화면 컴포넌트] --> useTheme useTheme --> themeStore useTheme --> ColorScheme[useColorScheme RN] themeStore --> MMKV[mmkv-storage] useTheme --> tokens[tokens.ts light/dark]
테스트 케이스
- 시스템이 다크 모드면
useTheme()가 다크 토큰 객체를 반환한다 themeStore.mode='light'오버라이드 시 시스템이 다크여도 라이트 토큰을 반환한다mode='system'이면useColorScheme값을 따른다- 라이트/다크 토큰 객체가 동일한 키 집합을 갖는다(키 누락 없음)
- themeStore 변경이 MMKV에 영속되어 재생성 시 유지된다