Screen Blueprint — TwoMore (투마)
Status: Reference Last reviewed: 2026-09-11
One current-state blueprint per real screen, read from the component code — what the page is for, what it is made of top to bottom, its states, its actions, and the gaps the code itself admits. The entries live in per-area files under screen-blueprints/; this file holds the conventions and the generated index.
Gate: yarn check:screen-blueprints (in yarn check) fails when a screen has no entry, an entry names a route that does not exist, two entries claim one route, an entry's header block or sections are malformed, or the screen file has commits newer than the entry's Verified date. Changing a screen means re-reading its entry and re-dating it in the same commit. The QA board and docs/workflows/page-blueprints.json are parsed from these files — there is no second copy to keep in sync.
History: the pre-2026-09-11 single-file document, with its change logs, is archived at history/screen-blueprint-archive-2026-09-11.md. Per-change narrative belongs in git and the rebuild log, never in an entry.
1. Conventions
Entry contract (parsed by scripts/lib/screen-blueprints.mjs)
#### <English title> (<Korean shell title>)
- **Route:** `/clubs/[clubId]/members`
- **Screen:** `ClubMembersScreen` — `packages/features/clubs/src/club-members-screen.tsx`
- **Shell:** DetailShell · title `멤버 관리` · headerRight: …
- **Design:** ratified | unreviewed
- **Verified:** YYYY-MM-DD
**Purpose.** One sentence.
**Anatomy.** A fenced tree, top of screen to bottom.
**States.** Bullets: loading / empty / error / offline / role-gated variants.
**Actions.** Bullets: each tappable → destination or mutation.
**Gaps.** ⚠ bullets that are true in the code today, or `none found`.Routeis the join key to the page inventory — one route in backticks (a screen serving several routes lists them comma-separated). A pure<Redirect>route is not a screen and gets no entry.Design:ratified= an owner ruling exists for this design;unreviewed= written from the code and not yet reviewed by the owner. Flipping toratifiedis the owner's call: the QA board has a toggle, andyarn docs:apply-qa-board <saved-board.html>writes the board's rulings back into these files (and prints the board's notes).Verifiedis the date the entry was last read against the screen file. The gate compares it to git history.- Annotation language is English; Korean appears only as the actual UI copy in backticks or quotes.
- Current state only. No change logs, no "was", no history paragraphs.
Tree symbols
| Symbol | Meaning |
|---|---|
→ | Navigation destination |
▸ | Conditional render (role, data, feature flag) |
✦ | Call-to-action button |
[C] | Component name as it appears in code |
Cross-cutting rules the entries assume
- Empty states: structural chrome (headers, tabs, nav) always persists; sections with no data use progressive disclosure unless the section is a primary feature (empty-state-ux-analysis.md).
- Terminology: terminology-guide.md — 클럽 tab, 일정 = session, 경기 = match/activity tab, pickup = 번개 in code, 참석/불참 = RSVP, 가입 = club membership.
- Tabs: tab-switching screens use
SegmentedTabs/TabView/TabPanel, never conditional rendering of hook-bearing panes (canon/components.md). - Overlays:
ModalPanelonly — the layout contract is in canon/styling.md.
2. Screen index
clubs — screen-blueprints/clubs.md · 20 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Club List (클럽) | /(tabs)/(clubs) | MainTabShell | ratified | 2026-09-17 |
| Club Admin (관리) | /clubs/[clubId]/admin | DetailShell | unreviewed | 2026-09-16 |
| Club Album (앨범) | /clubs/[clubId]/album | DetailShell | unreviewed | 2026-09-14 |
| Club Analytics (성장 분석) | /clubs/[clubId]/analytics | DetailShell | unreviewed | 2026-09-13 |
| Club Attendance (출석 현황) | /clubs/[clubId]/attendance | DetailShell | unreviewed | 2026-09-17 |
| Board Post Detail (게시글) | /clubs/[clubId]/board/[postId] | DetailShell | ratified | 2026-09-16 |
| Board Create Post (글쓰기) | /clubs/[clubId]/board/create | DetailShell | unreviewed | 2026-09-17 |
| Club Challenges (도전 과제) | /clubs/[clubId]/challenges | DetailShell | ratified | 2026-09-17 |
| Club Dues (회비) | /clubs/[clubId]/dues | DetailShell | unreviewed | 2026-09-17 |
| Club Detail — place surface (클럽 홈) | /clubs/[clubId] | PlaceShell (CollapsingTopBar + CollapsingHeaderLayer) | ratified | 2026-09-17 |
| Join Review Detail (가입 심사) | /clubs/[clubId]/join-review/[userId] | DetailShell | ratified | 2026-09-16 |
| Club Members (멤버 관리) | /clubs/[clubId]/members | DetailShell | ratified | 2026-09-17 |
| Partner Suggester (복식 파트너 추천) | /clubs/[clubId]/partners | DetailShell | unreviewed | 2026-09-17 |
| Public Club Profile (클럽 미리보기) | /clubs/[clubId]/preview | DetailShell | ratified | 2026-09-17 |
| Club Sessions (일정 관리) | /clubs/[clubId]/sessions | DetailShell | ratified | 2026-09-16 |
| Club Settings (클럽 설정) | /clubs/[clubId]/settings | DetailShell | ratified | 2026-09-17 |
| Club Venues (코트 관리) | /clubs/[clubId]/venues | DetailShell | ratified | 2026-09-16 |
| Create Club Wizard (클럽 만들기) | /create-club | WizardShell | ratified | 2026-09-17 |
| Join Club (클럽 가입하기) | /join-club | DetailShell | ratified | 2026-09-17 |
| Leaderboard Share Redirect | /lb/[clubId] | none (bare YStack states, no AppHeader/DetailShell) | unreviewed | 2026-09-13 |
home — screen-blueprints/home.md · 2 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Home (일간/주간/월간 브리핑) | /(tabs)/(home) | MainTabShell | ratified | 2026-09-13 |
| Notification Center (알림) | /home/notifications | DetailShell | ratified | 2026-09-16 |
legal — screen-blueprints/legal.md · 4 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Contact & FAQ (문의하기) | /legal/contact | DetailShell (via ContentPage, ground="canvas") | unreviewed | 2026-09-17 |
| Announcements (공지사항) | /legal/notices | DetailShell (via ContentPage, ground="canvas") | unreviewed | 2026-09-17 |
| Privacy Policy (개인정보 처리방침) | /legal/privacy | DetailShell (via ContentPage → PolicyDocumentPage, ground="canvas") | unreviewed | 2026-09-14 |
| Terms of Service (이용약관) | /legal/terms | DetailShell (via ContentPage) | unreviewed | 2026-09-13 |
matches — screen-blueprints/matches.md · 3 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Match Result Share Preview | /m/[matchId] | DetailShell | unreviewed | 2026-09-13 |
| Match Board | /match-board | DetailShell | ratified | 2026-09-17 |
| Tournament Board | /tournament-board | DetailShell | unreviewed | 2026-09-17 |
messaging — screen-blueprints/messaging.md · 4 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| DM Thread | /messages/[threadId] | DetailShell | ratified | 2026-09-17 |
| DM Add Members (멤버 초대) | /messages/add-members | DetailShell | unreviewed | 2026-09-16 |
| DM Inbox (메시지) | /messages | DetailShell | unreviewed | 2026-09-16 |
| DM Create Group (단톡방 만들기) | /messages/new-group | DetailShell | unreviewed | 2026-09-16 |
profile — screen-blueprints/profile.md · 7 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Profile (프로필) | /(tabs)/(profile) | MainTabShell | ratified | 2026-09-17 |
| Profile Share Receiver | /p/[userId] | none (bare route file, no MainTabShell/DetailShell) | unreviewed | 2026-09-11 |
| Public Profile | /profile/[userId] | DetailShell | ratified | 2026-09-17 |
| Achievements Gallery (업적) | /profile/achievements | DetailShell | unreviewed | 2026-09-13 |
| Friends (친구 목록) | /profile/friends | DetailShell | unreviewed | 2026-09-17 |
| Add Friend (친구 찾기) | /profile/friends/add | DetailShell | unreviewed | 2026-09-17 |
| Practice Log (연습 기록) | /profile/practice | DetailShell | ratified | 2026-09-16 |
records — screen-blueprints/records.md · 6 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Records (기록) | /(tabs)/(records) | MainTabShell | unreviewed | 2026-09-16 |
| Record Detail | /records/[period] | DetailShell | ratified | 2026-09-16 |
| Head-to-Head (상대 전적) | /records/analysis/rivals | DetailShell | unreviewed | 2026-09-17 |
| Record Day Detail (일일 요약) | /records/day | DetailShell | unreviewed | 2026-09-13 |
| Records History (전적) | /records/history | DetailShell | ratified | 2026-09-16 |
| Records Leaderboard (리더보드) | /records/leaderboard | DetailShell | ratified | 2026-09-13 |
sessions — screen-blueprints/sessions.md · 13 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Activity (경기) | /(tabs)/(sessions) | MainTabShell | ratified | 2026-09-16 |
| Court Directory (테니스장) | /courts | DetailShell | ratified | 2026-09-17 |
| Create Session Wizard | /create-session | WizardShell | unreviewed | 2026-09-17 |
| Session Invite Share Preview | /s/[sessionId] | DetailShell | unreviewed | 2026-09-13 |
| Session Attendance (출석 확인) | /sessions/[sessionId]/attendance | DetailShell | unreviewed | 2026-09-16 |
| Session Edit (일정 수정) | /sessions/[sessionId]/edit | DetailShell | ratified | 2026-09-17 |
| Pickup Host Dashboard (호스트 관리) | /sessions/[sessionId]/host | DetailShell | unreviewed | 2026-09-17 |
| Session Detail | /sessions/[sessionId] | DetailShell | ratified | 2026-09-17 |
| Match Rules Editor (경기 규칙) | /sessions/[sessionId]/match-rules | DetailShell | unreviewed | 2026-09-16 |
| Session Participants (참석자 관리) | /sessions/[sessionId]/participants | DetailShell | unreviewed | 2026-09-16 |
| Session Payments (결제 현황 / 비용 정산) | /sessions/[sessionId]/payments | DetailShell | unreviewed | 2026-09-17 |
| Public Pickup Preview | /sessions/[sessionId]/preview | DetailShell | unreviewed | 2026-09-16 |
| Spectator Scorecard (경기 스코어카드) | /sessions/[sessionId]/scorecard | DetailShell | ratified | 2026-09-17 |
settings — screen-blueprints/settings.md · 9 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Settings (설정) | /settings | DetailShell | ratified | 2026-09-16 |
| Blocked Users (차단 목록) | /settings/blocked | DetailShell | unreviewed | 2026-09-17 |
| Change Password (비밀번호 변경) | /settings/change-password | DetailShell | unreviewed | 2026-09-13 |
| Consent History (동의 이력) | /settings/consent/history | DetailShell | unreviewed | 2026-09-14 |
| Consent Management (동의 관리) | /settings/consent | DetailShell | unreviewed | 2026-09-17 |
| Delete Account (회원 탈퇴) | /settings/delete-account | DetailShell | unreviewed | 2026-09-13 |
| Edit Profile (프로필 수정) | /settings/edit-profile | DetailShell | ratified | 2026-09-17 |
| Profile Visibility (프라이버시) | /settings/privacy | DetailShell | unreviewed | 2026-09-13 |
| Notification Settings (알림 설정) | /settings/signal-preferences | DetailShell | unreviewed | 2026-09-13 |
venues — screen-blueprints/venues.md · 8 screens
| Screen | Route | Shell | Design | Verified |
|---|---|---|---|---|
| Venue Directory Detail | /directory-venues/[id] | DetailShell | ratified | 2026-09-16 |
| Venue Contribution Detail | /venue-contributions/[id] | DetailShell | unreviewed | 2026-09-16 |
| Venue Contributions Inbox | /venue-contributions | DetailShell | unreviewed | 2026-09-13 |
| New Venue Contribution | /venue-contributions/new | DetailShell | unreviewed | 2026-09-13 |
| Venue Owner Claim Detail | /venue-owner-claims/[id] | DetailShell | unreviewed | 2026-09-16 |
| Venue Owner Claims List | /venue-owner-claims | DetailShell | unreviewed | 2026-09-13 |
| New Venue Owner Claim | /venue-owner-claims/new | DetailShell (via OwnerFrame) | unreviewed | 2026-09-13 |
| Venue Detail | /venues/[id] | DetailShell | ratified | 2026-09-16 |