📋 Todo25
F-001
iOS 프로젝트 부트스트랩 (SwiftUI, iOS 16+)
기반
참조 · 의존 · 수용 조건
참조: spec §6.1
의존: 없음
- Xcode 프로젝트 생성, 빌드 성공
- iOS 16+ 시뮬레이터 빈 화면 표시
- SwiftLint 기본 룰 설정
- README.md에 빌드/실행 안내 1줄
F-002
디자인 토큰 (색·폰트·간격)
기반
참조 · 의존 · 수용 조건
참조: ux.html 톤 가이드, docs/styles.css CSS 변수
의존: F-001
Color+Tokens.swift에 styles.css의 CSS 변수 매핑
- 다크 모드 자동 전환 (system)
- SwiftUI Preview에서 라이트/다크 둘 다 확인
F-003
Card / Collection SwiftData 모델
데이터
참조 · 의존 · 수용 조건
참조: spec §4.3
의존: F-001
- Card / Collection / Dialogue / Tone enum 정의 (spec 4.3 그대로)
- Collection ↔ Card 다대다 관계 (cardIDs 배열)
- "전체 씨앗" 시스템 컬렉션 자동 시드
- 유닛 테스트: 카드 1개 생성·다중 컬렉션 소속·삭제
F-004
백엔드 POST /translate Mock (Cloudflare Worker)
백엔드
참조 · 의존 · 수용 조건
참조: spec §4.2
의존: 없음 (병렬 가능)
- Cloudflare Worker 또는 로컬 Node 서버에 mock 엔드포인트
- 요청: text + targetLang + tone, 응답: 외국어/발음/카테고리/톤/대화/mp3(base64 placeholder)
- 한국어 1문장 입력 시 항상 같은 mock 응답 반환
- cURL 한 줄로 테스트 가능 (README 예시)
F-005
하단 탭바 골격 (Home / Collections / Friends / Me)
참조 · 의존 · 수용 조건
참조: ux 메뉴 트리
의존: F-001, F-002
- SwiftUI
TabView 4개 탭
- 각 탭은 빈 화면 + 제목 라벨
- 탭 아이콘 SF Symbols (커스텀 일러스트는 v1.1)
F-006
홈 화면 골격 + 빈 상태
참조 · 의존 · 수용 조건
참조: spec §4.4, ux P02
의존: F-003, F-005
- 헤더(아바타·타이틀·+ 버튼) + 빈 상태 카피
- 씨앗 0일 때 "안녕! 같이 첫 씨앗 담아볼까요?" + 큰 + 버튼
- 씨앗 N개일 때는 placeholder 카드 목록 (다음 카드에서 진짜 데이터)
F-007
볼주머니 위젯 + 일일 카운트
참조 · 의존 · 수용 조건
참조: spec §4.9
의존: F-003, F-006
- 10개 슬롯 dot 표시 + 햄스터 마스코트 (정적 SVG 또는 PNG)
- 일일 카운트 UserDefaults 또는 SwiftData 저장
- 자정 리셋 (사용자 로컬 시간)
- 카운트 변경 시 0.3초 ease-out 애니메이션
F-008
씨앗 카드 행(Row) 컴포넌트
참조 · 의존 · 수용 조건
참조: ux P03
의존: F-002, F-003
- 외국어 17pt · 발음 13pt · 카테고리 칩 · 언어 깃발 + 미니 재생 버튼
- 탭 시 콜백
- 일본어·스페인어·영어 폰트 폴백 처리
F-009
+ 액션 시트 (Input 진입)
참조 · 의존 · 수용 조건
참조: ux P06
의존: F-006
- + 탭 시 시트: 타이핑 / 스크린샷 / 음성 / 새 주머니 / 취소
- 볼주머니 가득 시 입력 옵션 회색 + 메시지
- 오프라인 시 새 씨앗 옵션 회색 + 메시지
F-010
타이핑 입력 화면
참조 · 의존 · 수용 조건
참조: ux P06a
의존: F-009
- 멀티라인 텍스트 필드 + placeholder
- 언어/톤 셀렉터 시트
- 텍스트 있을 때 "완료" 활성
- helper text: "여러 문장도 괜찮아요…"
F-011
Processing 화면 + 진입 연결
참조 · 의존 · 수용 조건
참조: ux P09
의존: F-010
- 풀스크린 모달 + 햄스터 채워지는 애니메이션
- "볼주머니에 담는 중…" 카피
- 5초 후 취소 버튼 등장
F-012
/translate 실 호출 + 응답 파싱
백엔드
참조 · 의존 · 수용 조건
참조: spec §4.2
의존: F-004, F-011
URLSession 또는 async/await
- mp3 base64 → 파일 시스템 저장
- Card 인스턴스 생성 + Collection 자동 분류 (1차: "전체 씨앗"만)
- 일일 볼주머니 카운트 +1
- 에러 시 재시도 토스트
F-013
Card Detail 골격 (외국어·발음·한국어)
참조 · 의존 · 수용 조건
참조: ux P05
의존: F-003, F-008
- 언어 라벨 · 외국어 30pt · 발음 17pt · 한국어 15pt
- 주머니 소속 칩들 + "주머니에 담기" + 버튼 (다음 카드)
- 뒤로가기 + ⋯ 버튼 (다음 카드에서 시트 연결)
F-014
내 표현 듣기 (단일 mp3 + 단어 하이라이트)
참조 · 의존 · 수용 조건
참조: spec §4.6
의존: F-013
AVAudioPlayer 재생 + 정지
- 재생 중 외국어 토큰별 시각 하이라이트 (CJK 2-3자 단위 / Latin 단어 단위)
- 버튼 ▶ → ■ 토글
F-015
대화 맥락 표시 + 대화 전체 듣기
참조 · 의존 · 수용 조건
참조: spec §4.6
의존: F-014
- 3턴 대화 (상대-나-상대), "나" 줄 시각 강조
- 3개 mp3 순차 재생 (delegate 체인, 0.8초 간격)
- 현재 줄 강조 + "재생 중" 배지 (파형 SVG)
- 중간 정지 가능
F-016
Actions Sheet + Delete Confirm
참조 · 의존 · 수용 조건
참조: ux P05a
의존: F-013
- ⋯ → Actions Sheet (씨앗 정보 미리보기 + 액션 그룹)
- "씨앗 삭제" → Delete Confirm
- 삭제 시 모든 Collection에서 제거 + 카드 자체 삭제
F-017
주머니에 담기 시트 (다대다 토글)
참조 · 의존 · 수용 조건
참조: spec §4.3 다대다
의존: F-003, F-016
- 주머니 목록 + 체크박스 + 색상 도트
- "여러 주머니에 동시에 담을 수 있어요" 안내
- 토글 시 즉시 반영 (낙관적 업데이트)
F-018
Categories Sheet (다중 분류)
참조 · 의존 · 수용 조건
참조: spec §4.2 카테고리
의존: F-013
- 8개 카테고리 다중 체크
- "여러 분류에 동시에 담을 수 있어요" 안내
- 씨앗 상세에 칩으로 반영
F-019
새 주머니 만들기 시트
참조 · 의존 · 수용 조건
참조: ux P08
의존: F-003, F-009
- 이름 30자 제한, 색상 6개, 표지(자동/아이콘/사진)
- 미리보기 타일
- 저장 시 Collection 생성 + 홈에 반영
F-020
Collection Detail 화면 + 전체 재생
참조 · 의존 · 수용 조건
참조: ux P04
의존: F-008, F-014
- 주머니 메타 헤더 + 인라인 이름 편집
- "전체 재생" 버튼 (씨앗 사이 간격)
- 씨앗 행 리스트 → 탭 시 Card Detail
- ⋯ → 편집/공유/삭제 시트
F-021
2단 필터 + 전역 검색
참조 · 의존 · 수용 조건
참조: spec §4.7
의존: F-008
- 언어·카테고리 칩 (AND, 재탭 해제, 초기화 버튼)
- 검색 화면: 외국어/발음/한국어/주머니명 매칭, 강조 표시
- 결과 0 빈 상태 카피
F-022
스크린샷 입력 — Source Sheet + Detect
참조 · 의존 · 수용 조건
참조: ux P06c
의존: F-009
- Source Sheet: PHPicker · UIImagePickerController · 클립보드
- Detect: 다크 뷰어 + OCR 오버레이 (1차: 백엔드 mock OCR 사용)
- 영역 토글 + 전체 선택/해제
- "다음" 버튼으로 Confirm 진입
F-023
스크린샷 입력 — Confirm + 일괄 처리
참조 · 의존 · 수용 조건
참조: ux P06c3
의존: F-012, F-022
- 담을 씨앗 미리보기 + 일괄 옵션(언어/톤/카테고리)
- 항목별 삭제
- 완료 시 N개 동시 변환 → "N개 씨앗을 담는 중…"
- 전체 일일 볼주머니 카운트 +N
F-024
음성 입력 (SFSpeechRecognizer)
참조 · 의존 · 수용 조건
참조: spec §4.1
의존: F-009
SFSpeechRecognizer 온디바이스 인식
- 마이크 권한 요청 + 거부 시 fallback 메시지
- 녹음 중 펄스 애니메이션
- 변환된 텍스트 편집 가능
F-025
오프라인 검출 + 가득 상태 + 마일스톤 토스트
참조 · 의존 · 수용 조건
참조: spec §4.9, spec §4.10
의존: F-006, F-007, F-009
- NWPathMonitor → ✈ 오프라인 배지
- 입력 시도 시 회색 처리 + 메시지
- 10/10 도달 시 위젯 색 변화 + 메시지
- 50/100/500 누적 시 토스트 + 햅틱