← Cockpit Wireframes Pages by level Navigation map
Pages — personal lists, rankings and venues▾
Shipped app (old grammar)Components · 공유 키트상세 페이지 — 플랫 언어Session Card · 밴드 없는 카드
홈 · Home
Home · 홈
시작 · Entry
Onboarding · 시작
ArchiveStrip Map · 세션 스트립 전체 시나리오Headers · 헤더 아이콘Card Continuity · 카드 = 상세의 예고편Session Hero · 더 조용한 공유 카드 (제안)Session Share Card · 히어로 = 공유 카드Session List Frame · 날짜 섹션 · 패널 필터 · 2+2 카드Compaction — 일정 · 코트 · 스코어카드Compaction — 클럽 상세 · 홈Compaction — 기록 · 프로필Live anchor — 진행 중 밴드Density · 카드 밀도토스트 — 리디자인 제안Club List · 클럽Clubs · 클럽클럽 상세 — 여섯 탭 플랫운영 섹션 — 플랫 목표위저드 내비게이션 — 결정 보드드래프트 복원 — 무음 복원클럽 조 편성 — 모델 결정 보드게스트 → 회원 — 심사 흐름Page polish — titled postsWeb app — desktop layoutProduct questions — openWeb app — desktop adaptation, round 2Visual tone — pure white, flat rows, one Tag, a colour budgetLibrary — chrome, surfaces, rows, labelsLibrary — controls, overlays, states, formsLibrary — page patterns, scaling, motionLibrary — additions from the pagesEmpty-once — 프로필 빈 섹션Notification groups — 할 일 밴드 그룹화Profile Cockpit · 프로필 압축Session Detail — Redesign · 일정Venue Detail — Redesign · 테니스장Profile Detail — Redesign · 프로필Tournament Detail — Redesign · 대항전Applicant Detail — Redesign · 가입 심사Canvas Migration — 회비 · 멤버 · 규칙Record Detail — Redesign · 기록Venue Finder · 코트 찾기Venue Filters · 코트 필터 재구성Notifications · 알림Panel Placement · 하단 고정
For owner review

Pages — personal lists, rankings and venues

친구, 업적, 테니스 여정, 순위표, 차단한 사용자, 동의 이력, the 테니스장 pane with its search and filter, and the two receipts: the ideal, the states, the roles and every overlay on its trigger page; 순위표 and 테니스장 also in English, at 200% and in dark.

L3-18친구 목록

Answer the requests, see the friends and remove one; every row opens the profile.

친구 목록
친구 신청
이서연
2시간 전서초구
수락
거절
박지훈
어제강남구
수락
거절
최유나
어제 보냄송파구
신청 취소
친구
정
정우진
서초구
한소희
강남구
오
오민석
송파구
윤하늘
마포구
강
강도윤
용산구
윤채원
성동구
9:41
친구
844 FOLD
Ideal Requests answer in the row; every row opens 프로필; the FAB finds a friend
States
친구 목록
아직 친구가 없어요같이 친 사람에게 친구 신청을 보내 보세요
9:41
친구
First run No friends and no requests: no button, the FAB is the action
친구 목록
친구 신청12건
남
남궁선우하람찬솔이든가온 (서초 주말 오전 YB 테니스 클럽 총무)
2시간 전경기 성남시 분당구
수락
거절
박지훈
어제강남구
수락
거절
이서연
2시간 전서초구
수락
거절
친구
황
황보서윤아름다운하늘 (YB 테니스 클럽 총무님)
경기 성남시 분당구 정자동 한솔마을
정
정우진
서초구
한소희
강남구
오
오민석
송파구
윤하늘
마포구
강
강도윤
용산구
9:41
친구
Overflow Names wrap, never cut; 12 requests show three rows, then 9개 더 보기 in place
친구 목록
9:41
친구
Loading One skeleton at the person-row pitch
친구 목록
친구 목록을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
친구
Error One retry covers all three queries
친구 목록
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
친구
Offline, cold Never the first-run state
친구 목록
친구 신청
이서연
2시간 전서초구
수락
거절
박지훈
어제강남구
수락
거절
최유나
어제 보냄송파구
신청 취소
친구
정
정우진
서초구
한소희
강남구
오
오민석
송파구
윤하늘
마포구
강
강도윤
용산구
윤채원
성동구
9:41
오프라인이에요
다시 시도
친구
844 FOLD
Offline, cached The app’s strip; the list unchanged: a received request’s 수락 and 거절 queue and stay live
Overlays
친구 목록
친구 신청
이서연
2시간 전서초구
수락
거절
박지훈
어제강남구
수락
거절
최유나
어제 보냄송파구
신청 취소
친구
정
정우진
서초구
한소희
강남구
오
오민석
송파구
윤하늘
마포구
강
강도윤
용산구
윤채원
성동구
9:41
친구
친구 신청을 취소할까요?취소해도 다시 신청할 수 있어요
닫기신청 취소
신청 취소 A sent request is withdrawn behind a Dialog; danger repeats the action
친구 목록
Route/profile/friends, pushed from the 프로필 friends summary (FriendsScreen). The tab bar is hidden; one h1, 친구 목록; pull to refresh is the system control.StackHeader 56 (back, 친구 목록; no +) · the Module 친구 신청 (Section head 28 + 12; at most three rows, the received first: 116 with the answer pair, when then the region, and a sent one 68 with 신청 취소; past three the head shows the total and the lone toggle N개 더 보기 48 opens the rest in place) · the Feed 친구 (Section head 28 + 12 with no count; rows 68, the region on line 2) · FAB 친구 56 above the home inset. The Module is not drawn when there is no request; with the Module and the Feed both empty the first-run EmptyState stands in.ReadsuseFriends, useIncomingFriendRequests and useOutgoingFriendRequests: the page draws once all three have settled, and any one failing is one error state. Row: profileDisplayName, region, avatarUrl. Actions: accept, decline (the same mutation cancels an outgoing request). The Module takes the first three of the incoming requests, then the outgoing, newest first; its total is their sum.TapsEvery row → 공개 프로필 (push, prefetch on press-in), request rows included; its ⋯ holds 친구 끊기. 수락 and 거절 act at once and keep their own stops. 신청 취소 → a Dialog, then withdraws. The FAB 친구 (spoken 친구 찾기) → 친구 찾기. N개 더 보기 (drawn only when the Module hides requests) → the rest, in place, in the same order.Headings and labelsh1 친구 목록, h2 친구 신청 and 친구. "이서연, 2시간 전, 서초구" (row), then "이서연 수락" and "이서연 거절" (the pair); a sent one, "최유나, 어제 보냄, 송파구", then "최유나 신청 취소"; "정우진, 서초구". The FAB reads "친구", spoken "친구 찾기".RulingsEvery person row opens 공개 프로필 (owner) · the 대기 중 Badge becomes the section title, 신청 취소 the one trailing control · the cohesion pass (the owner, 2026-10-25): a list creates with its FAB, so the header + is gone and the FAB 친구 opens 친구 찾기, and the first-run state carries no button because the FAB is the action; 요청 취소 is 신청 취소 and asks a Dialog, as everywhere (§ 1.19); the remove icon left the rows, since 친구 끊기 lives once, in 공개 프로필’s ⋯ (§ 1.18); the friend rows carry no Level tag (library § 6: the lime tag shows only on a Roster cell, the Podium, the identity Block and a ranking row where a level run starts); more of the requests opens in place, never on a page that is not drawn · the Dialog names the person and its buttons name their actions · a cold offline start is never the first-run state · R3 (2026-10-20): the requests are one bounded Module above the Feed, not two sections of it. The weekly work stays on the page and answers in its row (library § 1.15, rule 2), the received first, three rows at most (the preview law), so a long queue costs one N개 더 보기 and not the page; a door Cell with the count was the other way and would hide the answer pair one tap away. The Feed is the friends alone, its head with no count (the heads that section a Feed may carry theirs).

L3-19친구 찾기

Search players by name and send a request; the row shows where each one stands.

친구 찾기
서연
이서연
서초구
친구
박서연
강남구
친구 신청
최서연
송파구
신청 보냄
김
김서연
마포구
친구 신청
정
정서연
용산구
친구 신청
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Ideal Three row states: friend, 친구 신청, requested
States
친구 찾기
이름으로 친구 검색
이름으로 친구를 찾아보세요이름을 입력하면 바로 찾아요
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Idle The field is focused, with no 취소; nothing typed yet
친구 찾기
서연
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Searching Five skeleton rows while the debounce runs
친구 찾기
서연
이서연
서초구
친구
박서연
강남구
신청 보냄
최서연
송파구
신청 보냄
김
김서연
마포구
친구 신청
정
정서연
용산구
친구 신청
9:41
친구 신청을 보냈어요
After 친구 신청 The row flips to a Tag; a result Toast
친구 찾기
서연서연
검색 결과가 없어요이름을 다시 확인해 보세요
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
No result A sentence and the way on; no button
친구 찾기
서연
검색하지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Error Under the field, with one retry
친구 찾기
서연
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Offline, cold Offline, not an empty result
친구 찾기
Route/profile/friends/add (AddFriendScreen), pushed from the FAB of 친구 목록, the 프로필 friends summary, 기록 empty states and the message pickers. No tab bar; one h1, 친구 찾기; the keyboard opens with the page.StackHeader 56 · 8 · Search field 44 (gray100, 40 tall; noCancel: the caret and the clear × only, back is the way out) · 12 · PersonRows 68. The keyboard covers the rows below the fifth; the list scrolls above it.ReadsuseProfileSearch(debounced query, 20) minus the viewer; per row useFriendship: accepted → Tag 친구, pending (or sent in this session) → Tag 신청 보냄, none → the 친구 신청 control. useSendFriendRequest flips the row at once.TapsA row → 공개 프로필 (push); 친구 신청 sends the request and leaves the row on the page with a result Toast. Back returns to the opener.Headings and labelsh1 친구 찾기; the field is a search landmark named "이름으로 친구 검색"; results announce a count ("검색 결과 5명"). "박서연, 강남구", then "박서연 친구 신청".RulingsA result row opens 공개 프로필 (owner) · the state is a Tag only where the row differs from the default, the action is the row control, 친구 신청 (§ 1.19; the one verb the list exists for, § 1.18); the field has no 취소 and the rows no Level tag (the cohesion pass, the owner, 2026-10-25; library § 6) · idle and no-result states carry a sentence in 해요체 · no coloured action: the page has no CTA.

L3-09업적

A browse-only gallery of the achievements a player can earn, earned ones in colour.

업적
8개 중 4개 달성남은 업적 4개
승부4/8
첫 챌린지 달성
첫 월간 챌린지를 완료했어요
랠리 스윕
한 달 동안 랠리 챌린지를 모두 완료했어요
에이스 스윕
한 달 동안 에이스 챌린지를 모두 완료했어요
챔피언 스윕
한 달 동안 챔피언 챌린지를 모두 완료했어요
카테고리 마스터
한 카테고리의 모든 티어를 완료해 보세요
월간 올클리어
한 달 모든 챌린지를 완료해 보세요
3개월 연속 챌린지
3개월 연속 챌린지를 달성해 보세요
6개월 연속 챌린지
6개월 연속 챌린지를 달성해 보세요
9:41
844 FOLD
Ideal An ordinary account: the 승부 group, four earned
Medal ladder
업적
56
브론즈
실버
골드
플래티넘
잠김
숨김
48
9:41
Ladder, light Silver 1 star, gold 2, platinum a double frame and 3; locked and hidden are outlines
업적
56
브론즈
실버
골드
플래티넘
잠김
숨김
48
9:41
Ladder, dark The same ladder; platinum lighter
States
업적
8개 중 0개 달성남은 업적 8개
승부0/8
첫 챌린지 달성
월간 챌린지를 완료해 보세요
랠리 스윕
랠리 챌린지를 모두 완료해 보세요
에이스 스윕
에이스 챌린지를 모두 완료해 보세요
챔피언 스윕
챔피언 챌린지를 모두 완료해 보세요
카테고리 마스터
한 카테고리의 모든 티어를 완료해 보세요
월간 올클리어
한 달 모든 챌린지를 완료해 보세요
3개월 연속 챌린지
3개월 연속 챌린지를 달성해 보세요
6개월 연속 챌린지
6개월 연속 챌린지를 달성해 보세요
9:41
844 FOLD
Day one Nothing earned: every tile an outline, the hint says how
업적
7개 중 3개 달성남은 업적 4개
성장2/4
10경기 달성
10경기를 완료했어요
첫 승리
첫 경기에서 승리했어요!
50경기 달성
50경기를 하면 받을 수 있어요
47/50
100경기 달성
100경기를 하면 받을 수 있어요
47/100
출석1/2
한 달 꾸준히 참여
4주간 꾸준히 테니스를 즐겼어요
3개월 꾸준히 참여
12주 연속 참여하면 받을 수 있어요
9/12
숨은 업적0/1
숨겨진 업적
9:41
844 FOLD
Not reachable Progress, other groups, a hidden row: parked
업적
승부
9:41
Loading The progress line and media-row skeletons
업적
업적을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
Error EmptyState error with one retry
업적
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
Offline, cold EmptyState offline
업적
8개 중 4개 달성남은 업적 4개
승부4/8
첫 챌린지 달성
첫 월간 챌린지를 완료했어요
랠리 스윕
한 달 동안 랠리 챌린지를 모두 완료했어요
에이스 스윕
한 달 동안 에이스 챌린지를 모두 완료했어요
챔피언 스윕
한 달 동안 챔피언 챌린지를 모두 완료했어요
카테고리 마스터
한 카테고리의 모든 티어를 완료해 보세요
월간 올클리어
한 달 모든 챌린지를 완료해 보세요
3개월 연속 챌린지
3개월 연속 챌린지를 달성해 보세요
6개월 연속 챌린지
6개월 연속 챌린지를 달성해 보세요
9:41
오프라인이에요
다시 시도
844 FOLD
Offline, cached The strip under the header; the gallery unchanged
업적
Route/profile/achievements, pushed from the 프로필 achievements section (AchievementsGalleryScreen). No tab bar; one h1, 업적. A gallery: the rows are not links.StackHeader 56 · 16 · the progress line 22 (8개 중 4개 달성 | 남은 업적 4개) · one section per display group that lists a type (title 28 + 12, count earned/total) · MediaRows 80 with a glyph-tile Thumb. Only what can be earned today is listed, plus anything already held, so about 54 of the 74 types stay hidden.ReadsuseAchievements(userId) is the held set; ACHIEVEMENT_TYPES filtered by isAchievementShown. The catalog gives the glyph, the tier and the display group; the strings give name, description (earned) and hint (locked). Progress (quantitative types) reads usePlayerStatsDetail through getProgress.TapsNone: no row opens anything and the page has no action beyond back. (The achievement_unlocked push opens 프로필.)Headings and labelsh1 업적, h2 per group. Rows are text in order: "첫 챌린지 달성, 브론즈, 달성, 첫 월간 챌린지를 완료했어요" · "에이스 스윕, 실버, 잠김, 에이스 챌린지를 모두 완료해 보세요" · "50경기 달성, 실버, 잠김, 50경기를 하면 받을 수 있어요, 47/50". The tier is in the spoken name, never colour alone.RulingsThe medal ladder: bronze is the plain tile, silver adds a frame and 1 star, gold the frame and 2, platinum a second line and 3; locked and hidden are an outline, not a fill · A hidden row is its name alone, 숨겨진 업적: it no longer reads 달성 조건 보기, a door that opened nothing (the cohesion pass, the owner, 2026-10-25) · glyph tiles from the medal set: earned is the solid tier fill with an on-colour glyph, locked is a 1.5 $border outline with a secondary glyph · progress is a trailing figure, not a bar · the unreachable states (progress, the other groups, the hidden row) stay drawn and marked: the build either schedules the unlock engine or deletes them · the Strip of 달성 and 총 업적 only restated the counts of the group heads under it (4/8, or 2/4 + 1/2 + 0/1), so one line of progress and what is left opens the page instead, not tiles (review 46, M3).

L3-08테니스 여정

Read the notes you left on your matches, newest first, and, on the player plan, have the season told back to you.

테니스 여정
이번 달
경기
9
노트
4
9월 18일 (금)오늘
토요 아침 복식
올림픽공원 테니스장
세컨드 서브 때 토스를 낮게 가져갔더니 힘이 덜 들어갔어요. 다음에는 리턴 위치를 한 발 앞으로 옮겨 봐야겠다.
9월 15일 (화)
매치
탄천 테니스장
1세트는 괜찮았는데 2세트에서 체력이 떨어졌어요.
9월 9일 (수)
수요 저녁 단식
양재 시민의숲 테니스장
네트 앞 발리를 세 번이나 놓쳤어요.
매치
올림픽공원 테니스장
처음 같은 편이 된 서연 씨와 호흡이 잘 맞았다.
8월 30일 (일)
일요 정모
반포 한강공원 테니스장
바람이 심해서 로브가 계속 길었어요.
9:41
844 FOLD
Ideal This month’s Strip, then the notes by day; the head has no door
States
테니스 여정
아직 남긴 노트가 없어요경기가 끝나면 노트를 남겨 보세요
9:41
No notes yet An EmptyState with no head and no door
테니스 여정
이번 달
9:41
Loading Tile and text-row skeletons; no door yet
테니스 여정
노트를 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
Error EmptyState error with one retry
테니스 여정
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
Offline, cold EmptyState offline
테니스 여정
이번 달
경기
9
노트
4
9월 18일 (금)오늘
토요 아침 복식
올림픽공원 테니스장
세컨드 서브 때 토스를 낮게 가져갔더니 힘이 덜 들어갔어요. 다음에는 리턴 위치를 한 발 앞으로 옮겨 봐야겠다.
9월 15일 (화)
매치
탄천 테니스장
1세트는 괜찮았는데 2세트에서 체력이 떨어졌어요.
9월 9일 (수)
수요 저녁 단식
양재 시민의숲 테니스장
네트 앞 발리를 세 번이나 놓쳤어요.
매치
올림픽공원 테니스장
처음 같은 편이 된 서연 씨와 호흡이 잘 맞았다.
8월 30일 (일)
일요 정모
반포 한강공원 테니스장
바람이 심해서 로브가 계속 길었어요.
9:41
오프라인이에요
다시 시도
844 FOLD
Offline, cached The strip under the header; the notes unchanged
Plan
AI 요약플레이어 플랜
2026년 시즌
올해는 38경기를 뛰어 22번 이겼어요. 봄에는 서브 때문에 고민이 많았는데, 6월부터 토스를 낮게 가져가면서 더블폴트가 눈에 띄게 줄었어요.
노트에는 체력 이야기가 자주 나와요. 2세트에서 지친다는 메모가 네 번 있었고, 스트레칭을 챙기기 시작한 8월 이후로는 3세트까지 간 경기에서 이긴 비율이 올랐어요.
남은 숙제는 네트 앞이에요. 발리 실수가 아쉬웠던 날의 가장 큰 이유였어요. 다음 달에는 리턴 위치를 한 발 앞으로 옮겨 보세요.
노트 12개와 38경기의 기록으로 정리했어요. AI가 쓴 글이라 틀린 내용이 있을 수 있어요.
9:41
AI 요약, subscriber Not built: no summarising function. The season in three paragraphs
테니스 여정
이번 달
경기
9
노트
4
9월 18일 (금)오늘
토요 아침 복식
올림픽공원 테니스장
세컨드 서브 때 토스를 낮게 가져갔더니 힘이 덜 들어갔어요. 다음에는 리턴 위치를 한 발 앞으로 옮겨 봐야겠다.
9월 15일 (화)
매치
탄천 테니스장
1세트는 괜찮았는데 2세트에서 체력이 떨어졌어요.
9월 9일 (수)
수요 저녁 단식
양재 시민의숲 테니스장
네트 앞 발리를 세 번이나 놓쳤어요.
매치
올림픽공원 테니스장
처음 같은 편이 된 서연 씨와 호흡이 잘 맞았다.
8월 30일 (일)
일요 정모
반포 한강공원 테니스장
바람이 심해서 로브가 계속 길었어요.
9:41
AI 요약은 플레이어 플랜에서 볼 수 있어요
남긴 노트와 전적으로 한 시즌의 이야기를 정리해 드려요
플레이어 플랜 보기
AI 요약, free account Not built: no summarising function. A Sheet names the plan, with its one button
Text size
테니스 여정
이번 달
경기
9
노트
4
9월 18일 (금)오늘
토요 아침 복식
올림픽공원 테니스장
세컨드 서브 때 토스를 낮게 가져갔더니 힘이 덜 들어갔어요. 다음에는 리턴 위치를 한 발 앞으로 옮겨 봐야겠다.
9월 15일 (화)
매치
탄천 테니스장
1세트는 괜찮았는데 2세트에서 체력이 떨어졌어요.
9월 9일 (수)
수요 저녁 단식
양재 시민의숲 테니스장
네트 앞 발리를 세 번이나 놓쳤어요.
매치
올림픽공원 테니스장
처음 같은 편이 된 서연 씨와 호흡이 잘 맞았다.
8월 30일 (일)
일요 정모
반포 한강공원 테니스장
바람이 심해서 로브가 계속 길었어요.
9:41
844 FOLD
200% text The note runs whole and the glyph drops under it
테니스 여정
Route/profile/journey (proposed: JourneyScreen; the app has no match note yet), pushed from 프로필’s last Cell, 테니스 여정, where 연습 기록 was (library § 1.23, owner review 52). The list family (§ 1.17): no tab bar; one h1, 테니스 여정; no FAB and no band, because a note is written where its match ends, on the result page (노트 남기기 ›), never here.StackHeader 56 · 12 · the head 이번 달 (the first head, 40) with no door (AI 요약 is not built) · the Strip, tiles face, 80 (경기, 노트: the month’s matches and notes) · Day header (24 above, 12 below; the date, and 오늘 or 어제 where it is) · Text rows (min 68): line 1 the match (the session, or 매치), line 2 its venue, the note under them, two lines then an ellipsis, the mood glyph trailing on line 1. Notes of one day share a Day header. No chevron: a row opens the match’s result. From 1.5x text the note runs whole and the glyph drops under the text.ReadsBuilt: useMatchNotes(userId), an infinite read that pages by whole days (list_match_notes, p_before_day): MatchNote { matchId, sessionId, sessionFormat, sessionEventType, venueName, mood: good | ok | bad, body (500 characters at most), matchDay, createdAt }, newest day first. The Strip counts the Seoul calendar month’s matches and notes, and comes with the first page. A note is private to its author (§ 1.23): nothing here reaches an opponent or a club. Not built: the summary job (AI 요약).TapsA row → that match’s result (routes.scorecard), where the note’s glyph and 노트 남기기 › edit it · AI 요약 is not built, so the head has no door (the frames jy-ai and jy-free stay drawn for when it is) · empty: nothing to tap, the next match’s result page asks for the note · back → 프로필.Spokenh1 테니스 여정; h2 이번 달 and each Day header (“9월 18일 금요일, 오늘”). A row is a button reading the match, the mood in words and the note whole: “토요 아침 복식, 올림픽공원 테니스장, 좋았어요, 세컨드 서브 때 …”; the glyph is hidden from the reader because the words say it. The reading page and the plan Sheet (jy-ai, jy-free) are not built.RulingsOwner review 52 (2026-10-31: “Let’s remove anything related to practice entirely. We can add a journal/journey section so that people can make notes about their matches. We will give subscribers an ability to summarize their tennis journey through the use of AI.”): the practice log is gone, with its page, its rows and its Sheets, and this page took its Cell on 프로필 (§ 1.23) · a list of the list family (§ 1.17): the notes at once, the head 이번 달 and its Strip first, and the head carries the one door · the mood is a glyph with its words spoken, and a note is private by default · AI 요약 is a subscriber’s reading page; a free account meets the plan, never a dead door · with no notes there is no head and no door, since there is nothing to count or to summarize · a club’s 여정 (the club plan, basic and above) is told from the club’s sessions, results and photos, never from a member’s note: 클럽 테니스 여정, below.

L3-51클럽 테니스 여정

Read the club’s month, newest first: its sessions, their results and the photos uploaded, told from the club’s own data and never from a member’s note. On the club plan.

클럽 테니스 여정강남 라켓클럽
이번 달
일정
4개
경기
19경기
사진
8장
9월 18일 (금)오늘
금요 저녁 복식
대치유수지체육공원19:00
9월 17일 (목)어제
9월 17일 정모
올림픽공원 테니스장14:00
9월 17일 정모 결과
8경기최다승 박지훈 4승
9월 17일 사진
8장이서연
9월 12일 (토)
토요 아침 복식
올림픽공원 테니스장09:00
토요 아침 복식 결과
5경기최다승 이서연 3승
9월 5일 (토)
9월 첫째 주 정모
탄천 테니스장14:00
9월 첫째 주 정모 결과
6경기최다승 최유나 3승
9:41
844 FOLD
Ideal This month’s Strip, then the club’s sessions, results and photos by day
States
클럽 테니스 여정강남 라켓클럽
아직 쌓인 기록이 없어요일정과 경기, 사진이 생기면 여기에 모여요
9:41
Nothing yet An EmptyState with no head and no Strip
클럽 테니스 여정강남 라켓클럽
이번 달
9:41
Loading Tile and text-row skeletons
클럽 테니스 여정강남 라켓클럽
클럽 기록을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
Error EmptyState error with one retry
클럽 테니스 여정강남 라켓클럽
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
Offline, cold EmptyState offline
클럽 테니스 여정강남 라켓클럽
이번 달
일정
4개
경기
19경기
사진
8장
9월 18일 (금)오늘
금요 저녁 복식
대치유수지체육공원19:00
9월 17일 (목)어제
9월 17일 정모
올림픽공원 테니스장14:00
9월 17일 정모 결과
8경기최다승 박지훈 4승
9월 17일 사진
8장이서연
9월 12일 (토)
토요 아침 복식
올림픽공원 테니스장09:00
토요 아침 복식 결과
5경기최다승 이서연 3승
9월 5일 (토)
9월 첫째 주 정모
탄천 테니스장14:00
9월 첫째 주 정모 결과
6경기최다승 최유나 3승
9:41
오프라인이에요
다시 시도
844 FOLD
Offline, cached The strip under the header; the entries unchanged
Plan
클럽 테니스 여정강남 라켓클럽
9:41
클럽 테니스 여정은 클럽 플랜에서 이용할 수 있어요
클럽의 일정과 경기 결과, 사진을 한 달씩 모아 보여 드려요
Below basic The plan named in one sentence, no button for anyone; × closes it and leaves the page
클럽 테니스 여정
Route/clubs/[clubId]/journey (proposed: ClubJourneyScreen; the app has no club journey yet), pushed from 클럽 홈’s 기록 pane, whose closing Cell group holds 선수별 전적 and 클럽 테니스 여정 (library § 1.23, the lead’s ruling of 2026-11-01). The list family (§ 1.17): no tab bar; one h1, 클럽 테니스 여정, with the club’s name as the header’s subtitle; no FAB and no band, because the page makes nothing: a session is made on 클럽 홈, a result on its match, a photo in 앨범 관리.StackHeader 56 (the subtitle names the club) · 12 · the head 이번 달 (the first head, 40; no door) · the Strip, tiles face, 80 (일정, 경기, 사진: the month’s sessions, the matches played in them and the photos uploaded) · Day header (24 above, 12 below; the date, and 오늘 or 어제 where it is) · Text rows (min 68): line 1 what the entry is, line 2 its facts, the kind’s glyph trailing (a calendar for a session, a trophy for its results, an image for photos). A day holds its sessions by later start first, each followed by its result, then the photos uploaded that day (one row per uploader, titled “{M월 D일} 사진”; a result is titled “{the session’s title} 결과”). No chevron: a row opens the thing itself.ReadsBuilt: useJourneyPage(clubId), composed from existing reads. Sessions: useClubSessionsInRange with getMonthRange(), drafts and cancelled left out. Results: one useClubResultsFeed read with a month window (limit 50), never one read per session; a result whose session is not among the month’s sessions is left out; the winner’s name is resolved at read time and a 친선 session shows its count and no winner line. Photos: get_club_photo_days (approved, not archived, bucketed by the club’s own timezone, one row per uploader and day), the uploader’s name resolved at read time. The Strip counts the month’s sessions, the matches in the kept results and the uploads. The plan gate: the entitlement clubJourneyEnabled (false on free and player; true on basic, pro, club_plus), client-side only, and the page waits for the club’s subscription read before it shows the Sheet. Only club data is read: never a member’s match note (library § 1.23).TapsA session row → that session’s 일정 상세 · a result row → the same 일정 상세, where its matches and scores are · a photo row → 앨범 (the club’s approved photos) · back → 클럽 홈. Empty: nothing to tap. A club below the basic plan: the page opens on its header and the Sheet 클럽 플랜 at once; the Sheet has no button for anyone, official or member, until a club plan page exists (jc-plan-member is the frame), and × closes the Sheet and leaves the page for 클럽 홈 (a page with nothing under it is not left open).Spokenh1 클럽 테니스 여정 and the club’s name as its subtitle; h2 이번 달 and each Day header (“9월 17일 목요일, 어제”). A row is a button reading its kind in words, its title and its facts: “일정, 9월 17일 정모, 올림픽공원 테니스장, 14:00”, “경기 결과, 9월 17일 정모 결과, 8경기, 최다승 박지훈 4승”, “사진, 9월 17일 사진, 8장, 이서연”; the glyph is hidden from the reader because the words say it. The Sheet reads “클럽 테니스 여정은 클럽 플랜에서 볼 수 있어요”.RulingsThe lead’s ruling of 2026-11-01 (the owner’s rule: research, then implement): notes stay private, so the club’s 여정 is told from the club’s data and there is no 클럽에 공유 control anywhere (§ 1.23’s promise; § 1.18, one home per action) · a list of one kind of item (§ 1.20): the club’s entry is one Text row, as the Feed holds one Feed item for its sessions, results and photos; the glyph names the kind, and a day’s kinds are not split into three shelves under a Day header · a list of the list family (§ 1.17): the notes at once, the head 이번 달 and its Strip first; the head carries no door, since a summary of the club’s season is not part of this page (the member’s AI 요약 is a person’s reading page, 테니스 여정) · with nothing yet there is no head and no Strip · the plan is the club’s, so the wall names a plan and not an account: a club below basic meets a Sheet, never a dead door on 기록.

L3-17순위표

Where the player stands: a Podium for the top three, then ranked rows by club, friends, region or nation.

순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
844 FOLD
Ideal Club scope: the head’s Choice holds the scope; Podium, then rank 4 to 11; the viewer is 나
Scopes
순위표
친구 순위
친구
정
2위
정우진
1,588
1위
한소희
1,641
오
3위
오민석
1,547
4
김민준 (나)
24승 14패▲22
1,482
5
강
강도윤
9승 14패▲6
1,455
6
윤하늘
11승 13패▼3
1,418
7
윤채원
8승 12패
1,376
9:41
친구 The viewer among friends: the same Podium and rows
순위표
내 순위
31위
상위
3%
전체 인원
1,284명
서초구 지역 순위
지역
정
2위
정우진
1,774
1위
한소희
1,861
오
3위
오민석
1,702
4
최유나
26승 17패강남 라켓클럽
1,655
5
윤하늘
11승 13패서초 아침 테니스
1,631
6
강
강도윤
9승 14패송파 베이스라인
1,604
7
윤채원
8승 12패마포 서브앤발리
1,579
8
임하준
4승 9패강남 라켓클럽
1,533
9:41
844 FOLD
지역 Tiles of the viewer’s standing above the head, not between it and the rows
순위표
전국 순위
전국
42
주영호
14승 11패제주 한라 테니스
2,221
43
남
남기현
13승 12패부산 해운대 클럽
2,213
44
서
서예린
16승 15패서초 아침 테니스
2,206
45
조수진
12승 14패대전 둔산 테니스
2,198
46
배
배태훈
15승 13패광주 라켓 클럽
2,191
47
강
강도윤
9승 14패송파 베이스라인
2,187
48
문
문지호
10승 9패인천 송도 클럽
2,181
49
신유진
17승 18패대구 수성 테니스
2,176
50
류
류도현
11승 10패울산 라켓 크루
2,170
내 순위
3,418
김민준 (나)
24승 14패강남 라켓클럽
1,482
9:41
844 FOLD
전국, end of list Outside the top 50: 내 순위 and one end line; the head has pinned and draws the one hairline; rank column 40
States
순위표
클럽 순위
클럽
가입한 클럽이 없어요클럽에 가입하면 클럽 순위를 볼 수 있어요
클럽 찾기
9:41
No club First run: the button resolves it
순위표
지역 순위
지역
지역을 설정해 주세요프로필에서 지역을 설정하면 지역 순위를 볼 수 있어요
지역 설정
9:41
No region A profile field is missing: the button opens it
순위표
친구 순위
친구
아직 친구가 없어요친구가 생기면 친구 순위를 볼 수 있어요
친구 찾기
9:41
No friends The scope’s empty state; the head and its Choice stay, so the scope can change
순위표
강남 라켓클럽
클럽
아직 순위가 없어요경기를 기록한 멤버가 생기면 순위가 보여요
9:41
Not ready No ranked member yet: no button, no share
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
844 FOLD
기간 set 이번 달 makes the Choice ink
순위표
강남 라켓클럽
클럽
이번 달 경기한 멤버가 없어요기간을 바꾸면 더 많은 멤버를 볼 수 있어요
전체 기간 보기
9:41
기간 hides all Filtered-empty: the button restores 전체
순위표
서초 주말 오전 테니스 즐기는 사람들
클럽
2위
박지훈
1,812
남
1위
남궁선우하람찬솔이든가온
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
7
윤하늘
11승 13패▼3
1,547
9
강
황보서윤아름다운하늘 (YB 테니스 클럽 총무님)
9승 14패▲6
1,455
9:41
Overflow A 20-character club, a wrapped podium name, ties
순위표
강남 라켓클럽
클럽
9:41
Loading Podium and row skeletons; the head is real
순위표
강남 라켓클럽
클럽
순위를 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
Error Under the head, one retry
순위표
강남 라켓클럽
클럽
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
Offline, cold Never “not ready”
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
오프라인이에요
다시 시도
844 FOLD
Offline, cached The strip under the Header; the page unchanged
Overlays
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
순위 범위
대상
클럽
친구
지역
전국
기간
전체
이번 주
이번 달
클럽 ▾ A value Sheet, two groups: 대상 and 기간; 클럽 and 전체 are checked
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
티어 안내
그랜드마스터2,500+ ELO
복식 NTRP 4.5+단식 NTRP 4.0+참고치
마스터2,000–2,500 ELO
복식 NTRP 4.0–4.5단식 NTRP 3.5–4.0참고치
골드현재 티어1,400–2,000 ELO
복식 NTRP 3.5–4.0단식 NTRP 3.0–3.5참고치
실버900–1,400 ELO
복식 NTRP 3.0–3.5단식 NTRP 2.5–3.0참고치
브론즈400–900 ELO
복식 NTRP 2.0–3.0단식 NTRP 1.5–2.5참고치
티어 안내 The one explainer; the viewer’s tier is marked
English, 200% and dark
Rankings
Gangnam Racket Club
Club
2nd
Jihoon Park
1,812
1st
Seoyeon Lee
1,890
3rd
Yuna Choi
1,747
4
WJ
Woojin Jung
18W 12L▲40
1,688
5
Sohee Han
21W 19L▼12
1,641
6
Minjun Kim (me)
24W 14L▲22
1,592
7
MO
Minseok Oh
15W 16L
1,547
8
Haneul Yoon
11W 13L▼3
1,498
9
DK
Doyun Kang
9W 14L▲6
1,455
10
Chaewon Yoon
8W 12L
1,412
11
Hajun Lim
4W 9L▲3
1,226
9:41
844 FOLD
English Short scopes, 1st 2nd 3rd, (me); sentence case
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
9:41
844 FOLD
200% text Rows stack; Podium names wrap; the hint stays beside the title; chrome caps 1.3
순위표
강남 라켓클럽
클럽
2위
박지훈
1,812
1위
이서연
1,890
3위
최유나
1,747
4
정
정우진
18승 12패▲40
1,688
5
한소희
21승 19패▼12
1,641
6
김민준 (나)
24승 14패▲22
1,592
7
오
오민석
15승 16패
1,547
8
윤하늘
11승 13패▼3
1,498
9
강
강도윤
9승 14패▲6
1,455
10
윤채원
8승 12패
1,412
11
임하준
4승 9패▲3
1,226
9:41
844 FOLD
Dark The ideal frame on the dark canvas
순위표
Route/records/leaderboard (RecordsLeaderboardScreen), opened from 기록’s 순위 Module (its 전체 보기 ›, which passes the Module’s scope: 클럽, 친구, 지역 or 전국). No tab bar; one h1, 순위표; pull to refresh is the system control.StackHeader 56 (공유 in the club scope) · 12 · 지역: Strip, tiles face (lead 8 above, 80; two rows, 168, in Korean, where 1,284명 does not fit a third of the width) above the head · the Feed’s head (Section head 40, 32 under the tiles on 지역; the title is the scope’s own: the club, 친구 순위, "{지역} 지역 순위" or 전국 순위; the Info hint (?) of the tier explainer after it and the scope Choice ▾ at its end, ink while a period is set) · Podium 168 · 16 · PersonRows 68 (a record on every row) to rank 50 · 내 순위 for a viewer outside the top 50 · the end line (a Caption row, 8 above). The head pins under the Header, the page having no Panes, and draws the one hairline once the list scrolls.Reads클럽: useClubRatingRanks with useClubProfiles (ranked members only, ties share a rank, the viewer’s rank is read, not searched). 친구: useFriends with the viewer, ranked by the same rating. 지역: useRegionalRanking and useRegionalLeaderboard. 전국: the global top 50. The scope 기록’s Module passes is the page’s first value. Row: rank, name, avatar, the record (recordValue) and the 7-day ELO change (eloDelta7d), elo; getTierFromElo and isTierRunStart place the level Tag. 기간 is new: it narrows the pool to players with matches in the period; the order stays by ELO.TapsA podium column or a row → 공개 프로필 (push, prefetch on press-in). The Info hint (?) after the title, 티어 안내 → the tier Sheet, which lists the tiers alone. The head’s Choice → the value Sheet 순위 범위, two groups: 대상 (클럽, 친구, 지역, 전국) and 기간 (전체, 이번 주, 이번 달); a tap applies and closes it. 공유 → the system share sheet with the top five. 클럽 찾기 → the 클럽 tab’s explore pane; 친구 찾기 → 친구 찾기; 지역 설정 → 프로필 수정.Headings and labelsh1 순위표, h2 the Feed’s head. "티어 안내" (the hint, a button after the title) · "클럽, 팝업" (the Choice reads its value) · "순위 범위, 대상, 클럽, 팝업" · "4위, 정우진, ELO 1,688, NTRP 3.5, 18승 12패, 7일간 40점 상승" (rank first; the level and the line 2 are part of the name, never stops of their own) · the viewer’s row ends "나".RulingsPodium for the top three, the Figure column from rank 4 with the rank column as wide as the widest rank on the page (24, 32 or 40) · line 2 is the record (N승 N패) and the 7-day change (▲ or ▼, none at 0); 지역 and 전국 name the club in place of the change · the level Tag only where a level run starts, always on the Podium · R3 (2026-10-20): a ranking page’s scope is its Feed head’s Choice, 클럽 · 친구 · 지역 · 전국, the same four as 기록’s 순위, never page Tabs; a figure that describes the scope (지역’s tiles) sits above the head, not between it and the rows · the head holds one Choice, so 기간 is a group of the Choice’s own Sheet; a set period makes the Choice ink; a period lists the players who played a rated match in it, ranked by current ELO (ruled 2026-10-11, logged for veto) · with no Panes the Feed’s head pins under the Header, so it is the lowest pinned layer and the one that draws the hairline, the Header none · the list ends with one Caption row, 순위는 상위 50명까지 보여요, and no door: the 내 순위 row is the last row and the Info hint the page’s explainer · the head holds one control, the Choice: the tier explainer is the Info hint (?) after the title and no link in the head, and the tier Sheet lost its caption line (the cohesion pass, the owner, 2026-10-25; § 1.16) · an empty state carries a button only when one resolves it.

L3-20차단한 사용자

The people the player has blocked, each with one action to unblock.

차단한 사용자
정
정우진
차단 해제
한소희
차단 해제
오
오민석
차단 해제
윤하늘
차단 해제
9:41
Ideal Four people; the one action is tonal on every row
States
차단한 사용자
정
정우진
차단 해제
A
a3f9c2e1
차단 해제
오
오민석
차단 해제
9:41
Unresolved profile An id’s first eight characters stand in
차단한 사용자
차단한 사용자가 없어요차단하면 여기에서 해제할 수 있어요
9:41
First run Nobody to unblock: a sentence, no button
차단한 사용자
9:41
Loading Five skeleton person rows
차단한 사용자
차단한 사용자를 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
Error EmptyState error with one retry
차단한 사용자
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
Offline, cold EmptyState offline
차단한 사용자
정
정우진
차단 해제
한소희
차단 해제
오
오민석
차단 해제
윤하늘
차단 해제
9:41
오프라인이에요
다시 시도
Offline, cached The strip under the header; the list unchanged
Overlays
차단한 사용자
정
정우진
차단 해제
한소희
차단 해제
오
오민석
차단 해제
윤하늘
차단 해제
9:41
정우진님을 차단 해제할까요?다시 메시지를 주고받을 수 있어요
닫기차단 해제
차단 해제 Names the person; the commit is primary, not danger
차단한 사용자
Route/settings/blocked (SettingsBlockedUsersScreen), pushed from 설정 › 프라이버시. No tab bar; one h1, 차단한 사용자.StackHeader 56 · 12 · PersonRows 64 (no line 2), no section head: the page is one list.ReadsuseBlockedUsers() gives the ids; useProfilesByIds(ids) resolves names and photos in one bulk read (a profile that fails to resolve prints the first eight characters of its id). Loading is the ids or the profiles in flight; only an ids failure is the error state. useUnblockUser mutates and the row leaves the list.TapsA row → 공개 프로필 (the friendship band is hidden for a blocked person). 차단 해제 → the confirm Dialog → unblock, then a result Toast; it keeps its own stop.Headings and labelsh1 차단한 사용자. "정우진" (the row, opens the profile), then "정우진 차단 해제" (the control, named for its owner). After the Dialog focus returns to the list.RulingsEvery person row opens 공개 프로필 (owner; today the row is static) · the Dialog commit is primary, not danger, because unblocking is reversible · the Dialog names the person and its buttons name their actions.

L1-03c테니스장

Find a venue nearest first or by province: search at the top right and one filter Sheet, where 가까운 순 and 저장됨 are filters too.

경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
테니스장강남구
탄천 테니스장
0.8km코트 10면하드야외
영업 중시간당 10,000원4.2
테니스장송파구
잠실 보조경기장
1.2km코트 6면하드야외
영업 중시간당 12,000원4.0
테니스장성동구
서울숲 테니스장
2.4km코트 4면하드야외
영업 중무료4.5
테니스장송파구
올림픽공원 테니스장
3.1km코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
양재 시민의숲 테니스장
3.9km코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장강남구
대치유수지체육공원
4.6km코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장서초구
반포 한강공원 테니스장
5.3km코트 8면클레이야외
영업 종료시간당 8,000원4.1
9:41
홈클럽경기기록프로필
844 FOLD
Ideal 가까운 순 is on by default: nearest first, its Choice under the head
States
경기
예정매치 찾기테니스장
가까운 테니스장
필터 4
가까운 순테니스장
서울 강남구 외 1곳실내
테니스장송파구
올림픽 파크텔 코트
1.4km코트 2면하드실내
영업 종료시간당 18,000원3.8
테니스장강남구
대치유수지체육공원
3.9km코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장강남구
삼성 실내 테니스장
5.0km코트 3면하드실내
영업 중시간당 20,000원3.9
9:41
홈클럽경기기록프로필
Filtered 필터 4 is ink; each value removable, the region as one
경기
예정매치 찾기테니스장
서울128곳
필터
테니스장강남구
탄천 테니스장
코트 10면하드야외
영업 중시간당 10,000원4.2
테니스장송파구
잠실 보조경기장
코트 6면하드야외
영업 중시간당 12,000원4.0
테니스장성동구
서울숲 테니스장
코트 4면하드야외
영업 중무료4.5
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
양재 시민의숲 테니스장
코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장강남구
대치유수지체육공원
코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장서초구
반포 한강공원 테니스장
코트 8면클레이야외
영업 종료시간당 8,000원4.1
9:41
홈클럽경기기록프로필
844 FOLD
가까운 순 removed Nothing on: one section per province, 필터 ▾ alone in the head
경기
예정매치 찾기테니스장
위치 권한이 꺼져 있어요
설정 열기
서울128곳
필터
테니스장강남구
탄천 테니스장
코트 10면하드야외
영업 중시간당 10,000원4.2
테니스장송파구
잠실 보조경기장
코트 6면하드야외
영업 중시간당 12,000원4.0
9:41
홈클럽경기기록프로필
Location denied 가까운 순 stays off; one Notice says why
경기
예정매치 찾기테니스장
가까운 테니스장
필터 2
가까운 순저장됨
테니스장송파구
올림픽공원 테니스장
1.2km코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
양재 시민의숲 테니스장
3.1km코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장마포구
마포 구민체육센터
9.2km코트 3면하드실내
영업 종료시간당 20,000원3.9
9:41
홈클럽경기기록프로필
저장됨 저장됨 joins the default: the saved venues alone, uncapped
경기
예정매치 찾기테니스장
가까운 테니스장
필터 4
가까운 순연습장
서울 용산구24시간
조건에 맞는 테니스장이 없어요필터를 줄이거나 다른 지역으로 찾아보세요
필터 초기화
9:41
홈클럽경기기록프로필
Filtered-empty The one empty cause; the button resets to the default 가까운 순
경기
예정매치 찾기테니스장
제주86곳
테니스장제주시
제주 한라 테니스장
코트 6면하드야외
영업 중시간당 10,000원4.2
테니스장서귀포시
서귀포 월드컵 테니스장
코트 8면하드야외
영업 중시간당 12,000원4.3
테니스장제주시
애월 테니스 클럽
코트 2면하드실내
영업 종료시간당 20,000원3.9
목록에 없는 테니스장 추가
9:41
홈클럽경기기록프로필
End of list The Tabs have pinned and draw the one hairline; one end line and its door
경기
예정매치 찾기테니스장
서울1,284곳
필터
테니스장서초구
양재 시민의숲 테니스장 (서초구민 체육센터 부설 옥외 코트 A동)
코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장경기 성남시 분당구
분당 중앙공원 테니스장
코트 6면하드야외
영업 중시간당 12,000원4.3
테니스장강남구
탄천 테니스장
코트 10면하드야외
영업 중시간당 10,000원4.2
경기1,011곳
테니스장송파구
잠실 보조경기장
코트 6면하드야외
영업 중시간당 12,000원4.0
테니스장성동구
서울숲 테니스장
코트 4면하드야외
영업 중무료4.5
9:41
홈클럽경기기록프로필
844 FOLD
Overflow A 2-line name adds a line; a long district crops; 1,284곳
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
9:41
홈클럽경기기록프로필
844 FOLD
Loading The head and its filter are real; five skeleton items
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
테니스장을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
홈클럽경기기록프로필
Error EmptyState error under the head and its filter
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
홈클럽경기기록프로필
Offline, cold EmptyState offline
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
테니스장강남구
탄천 테니스장
0.8km코트 10면하드야외
영업 중시간당 10,000원4.2
테니스장송파구
잠실 보조경기장
1.2km코트 6면하드야외
영업 중시간당 12,000원4.0
테니스장성동구
서울숲 테니스장
2.4km코트 4면하드야외
영업 중무료4.5
테니스장송파구
올림픽공원 테니스장
3.1km코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
양재 시민의숲 테니스장
3.9km코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장강남구
대치유수지체육공원
4.6km코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장서초구
반포 한강공원 테니스장
5.3km코트 8면클레이야외
영업 종료시간당 8,000원4.1
9:41
오프라인이에요
다시 시도
홈클럽경기기록프로필
844 FOLD
Offline, cached The strip under the header; the pane unchanged
Overlays
경기
예정매치 찾기테니스장
가까운 테니스장
필터 4
가까운 순테니스장
서울 강남구 외 1곳실내
테니스장송파구
올림픽 파크텔 코트
1.4km코트 2면하드실내
영업 종료시간당 18,000원3.8
테니스장강남구
대치유수지체육공원
3.9km코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장강남구
삼성 실내 테니스장
5.0km코트 3면하드실내
영업 중시간당 20,000원3.9
9:41
홈클럽경기기록프로필
필터
보기
가까운 순저장됨
지역
서울 강남구 외 1곳
종류
전체테니스장
연습장테니스 샵
시설
실내야간 조명주차샤워
예약 가능공공영업 중무료
초기화결과 3개 보기
필터 ▾ 보기, 지역, 종류, 시설: the region a Picker Cell, a Choice set per facet, the count is live
Search takeover
테니스장 이름이나 지역으로 검색
취소
최근 검색
올림픽
양재
반포 한강
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Recent Text rows with a ×; the field is focused
올림
취소
등록된 테니스장3곳
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장송파구
올림픽 공원 보조 테니스장
코트 4면클레이야외
영업 중시간당 9,000원4.0
테니스장송파구
올림픽 파크텔 코트
코트 2면하드실내
영업 종료시간당 18,000원3.8
9:41
ㅂㅈㄷㄱㅅㅛㅕㅑㅐㅔ
ㅁㄴㅇㄹㅎㅗㅓㅏㅣ
⇧ㅋㅌㅊㅍㅠㅜㅡ⌫
123스페이스완료
Typing Registered venues only; Naver waits for the key
올림픽
취소
등록된 테니스장3곳
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장송파구
올림픽 공원 보조 테니스장
코트 4면클레이야외
영업 중시간당 9,000원4.0
테니스장구리시
올림픽 체육센터 테니스장
코트 6면하드야외
영업 중시간당 7,000원4.1
네이버 검색 결과
올림픽 스포츠 센터
서울 송파구 올림픽로 424
올림픽 테니스 아카데미
서울 강동구 천호대로 1139
네이버 제공
찾는 곳이 없나요?
목록에 없는 테니스장 추가
9:41
844 FOLD
Results A flat group, then Naver, then the door
하늘코트
취소
검색 결과가 없어요다른 지역이나 이름으로 검색해 보세요
찾는 곳이 없나요?
목록에 없는 테니스장 추가
9:41
844 FOLD
No result The door is the way out; no reset button
올림픽
취소
9:41
844 FOLD
Searching Five skeleton Feed items
올림픽
취소
검색하지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
844 FOLD
Error EmptyState error with one retry
올림픽
취소
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
844 FOLD
Offline, cold EmptyState offline
English, 200% and dark
Games
UpcomingPickupsVenues
Nearby venues
Filters 1
Nearest
VenueGangnam
Tancheon
0.8km10 courtsHard
Open now10,000 KRW/hr4.2
VenueSongpa
Jamsil Annex
1.2km6 courtsHard
Open now12,000 KRW/hr4.0
VenueSeongdong
Seoul Forest
2.4km4 courtsHard
Open nowFree4.5
VenueSongpa
Olympic Park
3.1km12 courtsHard
Open now12,000 KRW/hr4.3
VenueSeocho
Yangjae Forest
3.9km6 courtsTurf
Open now10,000 KRW/hr4.4
VenueGangnam
Daechi Park
4.6km4 courtsHard
Open now15,000 KRW/hr4.2
VenueSeocho
Banpo Riverside
5.3km8 courtsClay
Closed8,000 KRW/hr4.1
9:41
HomeClubsGamesRecordsProfile
844 FOLD
English Short names and facts; the Tabs fit
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
테니스장강남구
탄천 테니스장
0.8km코트 10면하드야외
영업 중시간당 10,000원4.2
9:41
홈클럽경기기록프로필
200% text The three Tabs cap at 1.3 and still fit; the rows stack
경기
예정매치 찾기테니스장
가까운 테니스장
필터 1
가까운 순
테니스장강남구
탄천 테니스장
0.8km코트 10면하드야외
영업 중시간당 10,000원4.2
테니스장송파구
잠실 보조경기장
1.2km코트 6면하드야외
영업 중시간당 12,000원4.0
테니스장성동구
서울숲 테니스장
2.4km코트 4면하드야외
영업 중무료4.5
테니스장송파구
올림픽공원 테니스장
3.1km코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
양재 시민의숲 테니스장
3.9km코트 6면인조잔디야외
영업 중시간당 10,000원4.4
테니스장강남구
대치유수지체육공원
4.6km코트 4면하드실내
영업 중시간당 15,000원4.2
테니스장서초구
반포 한강공원 테니스장
5.3km코트 8면클레이야외
영업 종료시간당 8,000원4.1
9:41
홈클럽경기기록프로필
844 FOLD
Dark The ideal frame on the dark canvas
테니스장
RouteThe 경기 tab’s third pane (/(tabs)/(sessions), ?tab=courts): VenueDirectoryContent → VenueFinder, intent explore. A tab root: the tab bar shows with 경기 active, no back, one h1, 경기. /courts is gone; this pane is the directory’s only mount. R3 (2026-10-20): the pane is a Feed and nothing else; no Module sits above it.StackHeader 56 (경기, 검색 at the top right) · Tabs 48 (they pin; once the pane scrolls they draw the one edge hairline, the Header none) · 24 · the pane’s first Section head, whose one control is the filter trigger, 필터 ▾ or 필터 N ▾ in the selected look, in the head either way: 가까운 테니스장 while 가까운 순 is on, else the first province (서울, with its count) · only while a filter is on, one row of removable Choices under the head (36, then 16): the default 가까운 순 first, then the Sheet’s order, the region as one Choice · the list nearest first (the distance leads the facts) or one section per province (head 72 with its count, Feed items 128) · while the next page loads, skeleton Feed items at the same pitch · the end: its door, the Cell 목록에 없는 테니스장 추가 (48, 32 below the last row) · tab bar 64 + inset (98).ReadsuseVenueFinderData: the directory query, view counts for the kind facet, useSavedVenueIds (the 저장됨 filter) and, with 가까운 순 on and a location fix, buildNearbyRows (distanceKm). 가까운 순 opens on once, and only when the location is already granted (the app never asks on open); the viewer can remove it, and turning it on asks for location once. The facets are VenueFilterBar’s: 종류 (전체, 테니스장, 연습장, 테니스 샵; the Sheet draws plain labels, the live count rides on its button), 지역 (RegionDistrictFilter: 시/도, then 시/군/구, no default region) and the kind’s facilities (전체: 실내, 주차, 예약 가능, 영업 중, 무료; 테니스장 adds 야간 조명, 샤워, 공공; 연습장: 볼머신, 레슨, 스크린, 주차, 24시간, 영업 중). Order: nearest first, else the provinces. The recent searches are per-device and live on the search page, not on the pane. Row: name, district, courtCount, isVenueOpenNow; the thumb is the venue photo, else the static map, else the court tile.TapsA row → 장소 상세 (push). 검색 → the Search takeover. 필터 ▾ (the first head) → the FilterSheet: 보기 (가까운 순, 저장됨), 지역 (a Picker Cell: the 시/도 picker, then 시/군/구), 종류, 시설; a removable Choice clears only its own filter, and 초기화 in the Sheet or in the filtered-empty state returns to the defaults (가까운 순 on). 가까운 순 asks for location once, then lists nearest first, or stays off and shows the Notice 위치 권한이 꺼져 있어요 when denied, whose action 설정 열기 opens the device settings. 저장됨 lists the saved venues alone, in place; removing its Choice returns to the whole list. 목록에 없는 테니스장 추가 → the new-proposal form (장소 정보 제안, L4-07).Headings and labelsh1 경기, h2 가까운 테니스장 or, in the provinces, 서울 and its sisters. The Tabs: "테니스장, 탭, 3개 중 3번째, 선택됨". A row: "테니스장, 송파구, 올림픽공원 테니스장, 코트 12면, 하드, 야외, 영업 중, 시간당 12,000원, 평점 4.3". The filter: "필터", and "필터 2" while two are on; a removable Choice: "가까운 순 삭제". Search takeover recents: "올림픽 삭제" for the ×.RulingsSearch is the header icon, the filter is the first head’s one control (필터 ▾, or 필터 N ▾) and the active filters sit under that head only while they are on, one removable Choice each: the always-on control row is gone (the owner’s page review, 2026-10-27) · 가까운 순 and 저장됨 are filters like 종류, 지역 and 시설 (the owner: "all filters as well"), all in the FilterSheet; 가까운 순 is on by default and shows as an active filter that can be removed (R3: the saved venues are a filter of the Feed, not a capped Module above it, and 최근 본 코트 is gone; the recent searches are on the search page) · the region is one filter, the app’s RegionDistrictFilter, and a region of several districts reads as one Choice (서울 강남구 외 1곳) · the Sheet is built only from the shared field pieces, as a form is (the owner’s page review, 2026-10-28; the filter grammar): 보기 first, then where (지역, a Picker Cell), then what (a Choice set per facet, plain labels with no count inside a Choice), fields 32 apart · venue rows are Feed items (review 46, M21, proposed): the overline names the kind and the district, the name is the title (two lines allowed), the court count, surface and indoor are the facts (the distance leads them while 가까운 순 is on), whether it is open now, the price and the rating (a star) are the who row, which takes the footer’s place; no bookmark (saving lives in the venue page) · the Feed ends with its one door, 목록에 없는 테니스장 추가, named by what it opens (장소 정보 제안 내역 opens from 설정’s 보낸 제안 since owner review 48) (§ 1.19; the cohesion pass, the owner, 2026-10-25: the place is a 테니스장 on a row, in a search and in a Feed’s doors, a 장소 only in a page’s own name; the saved filter is 저장됨, the one word for saved things and the 경기 tab’s word for saved sessions, never 저장한 테니스장, 즐겨찾기 or 코트) · a Notice carries a state and its one way out: location denied says so once and offers 설정 열기, and 가까운 순 stays off · recent searches are Text rows with a × · a Naver result is not a venue yet: its one control saves, which adds it.

L3-30장소 정보 제안 내역

Receipts of the venue corrections the player sent, and the ones waiting for their review.

장소 정보 제안 내역
제안
내가 보낸 제안
올림픽공원 테니스장
정보 수정, 확인2026년 9월 14일
검토 대기
반포 한강공원 테니스장
코트 추가, 수정2026년 9월 2일
승인됨
새벽 테니스 클럽
새 테니스장2026년 8월 27일
추가 정보 필요
잠실 보조경기장
문제 신고2026년 8월 11일
거절됨
서울숲 테니스장
정보 수정, 확인2026년 7월 30일
취소됨
소유권 신청 내역
9:41
테니스장
Ideal The head’s Choice ▾ is the one filter; five statuses; the FAB is the action, the door to 소유권 신청 내역 ends the Feed
States
장소 정보 제안 내역
제안
내가 보낸 제안
아직 보낸 제안이 없어요보낸 제안과 검토 결과를 여기서 다시 볼 수 있어요
소유권 신청 내역
9:41
테니스장
First run, mine No button: the FAB is the action
장소 정보 제안 내역
제안
검토할 제안
검토할 제안이 없어요보낸 제안과 검토 결과를 여기서 다시 볼 수 있어요
소유권 신청 내역
9:41
테니스장
First run, inbox The head stays, its Choice on 검토할 제안; the copy follows the scope
장소 정보 제안 내역
제안
내가 보낸 제안
양재 시민의숲 테니스장 (서초구민체육센터 옥외 코트 A동)
정보 수정, 확인2026년 9월 14일
추가 정보 필요
올림픽공원 테니스장
휴장, 폐업, 이전, 재개장2026년 9월 2일
새 제안으로 바뀜
반포 한강공원 테니스장
코트 추가, 수정2026년 9월 2일
승인됨
소유권 신청 내역
9:41
테니스장
Overflow A 2-line name beside the longest status
장소 정보 제안 내역
제안
내가 보낸 제안
9:41
테니스장
Loading The head is real; six skeleton two-line rows; the FAB stays
장소 정보 제안 내역
제안
내가 보낸 제안
제안을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
테니스장
Error EmptyState error under the head
장소 정보 제안 내역
제안
내가 보낸 제안
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
테니스장
Offline, cold EmptyState offline
장소 정보 제안 내역
제안
내가 보낸 제안
올림픽공원 테니스장
정보 수정, 확인2026년 9월 14일
검토 대기
반포 한강공원 테니스장
코트 추가, 수정2026년 9월 2일
승인됨
새벽 테니스 클럽
새 테니스장2026년 8월 27일
추가 정보 필요
잠실 보조경기장
문제 신고2026년 8월 11일
거절됨
서울숲 테니스장
정보 수정, 확인2026년 7월 30일
취소됨
소유권 신청 내역
9:41
오프라인이에요
다시 시도
테니스장
Offline, cached The app’s strip; the viewer’s own receipts stay without actions, the review inbox is withheld
Roles
장소 정보 제안 내역
제안
검토할 제안
양재 시민의숲 테니스장
정보 수정, 확인2026년 9월 16일
검토 대기
탄천 테니스장
코트 추가, 수정2026년 9월 15일
검토 대기
분당 중앙공원 테니스장
새 테니스장2026년 9월 12일
추가 정보 필요
소유권 신청 내역
9:41
테니스장
검토할 제안 The Choice’s other value: the same row for the review scope; the Choice takes the selected look
장소 정보 제안 내역
로그인이 필요해요장소 정보를 제안하려면 로그인해 주세요
로그인
9:41
Signed out A wall with 로그인: signing in resolves it
Overlays
장소 정보 제안 내역
제안
내가 보낸 제안
올림픽공원 테니스장
정보 수정, 확인2026년 9월 14일
검토 대기
반포 한강공원 테니스장
코트 추가, 수정2026년 9월 2일
승인됨
새벽 테니스 클럽
새 테니스장2026년 8월 27일
추가 정보 필요
잠실 보조경기장
문제 신고2026년 8월 11일
거절됨
서울숲 테니스장
정보 수정, 확인2026년 7월 30일
취소됨
소유권 신청 내역
9:41
테니스장
제안 보기
내가 보낸 제안
검토할 제안
내가 보낸 제안 ▾ A value Sheet of two values, the first checked; a tap selects and closes it
장소 정보 제안 내역
Route/venue-contributions (VenueContributionsScreen), reached from 설정’s 장소 정보 제안 내역 row (it opens 내가 보낸 제안), from the venue owner’s Notice on 장소 상세 (검토할 제안), from a receipt link. A decided suggestion’s push and its 알림 row open 제안 상세 (L3-33), not this list. No tab bar; one h1, 장소 정보 제안 내역; the FAB is pinned.StackHeader 56 · 12 · the Feed’s head 제안 (Section head 40, none above it) with the page’s one filter, the Choice ▾, at its end (내가 보낸 제안; ink on 검토할 제안) · Text rows 68 (infinite scroll: the next page loads as skeleton rows) · the end: its door, the Cell 소유권 신청 내역 › 48 (32 below the last row) · FAB 56 above the home inset. Signed out: the permission wall, no head and no FAB.ReadsuseVenueContributions({ scope, venueId }) → kind, status, venueName or the new venue’s name, createdAt. L1 = venueName, else the new venue’s name, else the kind. L2 = kind and the date (date only). The Tag is the status: 검토 대기, 승인됨 (done), 거절됨, 추가 정보 필요 (attention), 취소됨, 새 제안으로 바뀜. useAuth gates the wall.TapsA row → 제안 상세 (push). The head’s Choice ▾ → the value Sheet 제안 보기 (내가 보낸 제안, 검토할 제안; a tap selects and closes). The Cell → 소유권 신청 내역. The FAB (테니스장, spoken 목록에 없는 테니스장 추가) → 장소 정보 제안 (new form, L4-07). 로그인 → sign-in.Headings and labelsh1 장소 정보 제안 내역, h2 제안. "내가 보낸 제안, 팝업" (the Choice reads its value). A row: "올림픽공원 테니스장, 정보 수정, 확인, 2026년 9월 14일, 검토 대기". The Cell: "소유권 신청 내역, 이동". The FAB: "테니스장", spoken "목록에 없는 테니스장 추가".RulingsThe header is the page’s own name, 장소 정보 제안 내역, which is also the word of every door that opens it (§ 1.19; the cohesion pass, the owner, 2026-10-25), and the FAB’s label is the noun, 테니스장 · receipts are Text rows (min 68) with the status as the one Tag, no map tile and no time of day · the shipped chip pair becomes the Feed head’s Choice ▾, not Tabs: a detail page keeps no Tabs and a list page leads with the list, its one filter the Choice in the first Section head, as 알림’s is (the page levels, the owner, 2026-10-20) · the head stays on every state of the list, so the view can change from an empty one · the wall carries 로그인 because signing in resolves it, and has neither head nor FAB · the first-run states carry no button because the FAB is the action · a cold offline start is not the error state · R3 (2026-10-20): a list creates with its FAB, so the CTA band is gone, and the door Cell to the other receipt list sits at the Feed’s end, under one end line.

L3-31소유권 신청 내역

The ownership claims the player filed, and the queue the staff review.

소유권 신청 내역
신청 내역
내 신청
올림픽공원 테니스장
소유권 신청2026년 9월 10일
검토 대기
양재 시민의숲 테니스장
소유권 양도2026년 8월 21일
승인됨
탄천 테니스장
소유권 신청2026년 7월 14일
추가 정보 필요
잠실 보조경기장
소유권 신청2026년 6월 2일
거절됨
9:41
소유권 신청
Ideal The head’s Choice ▾ is the one filter; four claims; the FAB files a new one
States
소유권 신청 내역
신청 내역
내 신청
아직 소유권 신청이 없어요보낸 신청은 여기에 남아요. 보내기 전 내용은 이 화면을 나가면 사라져요.
9:41
소유권 신청
First run, mine No button: the FAB is the action
소유권 신청 내역
신청 내역
운영팀 검토
이 목록에 신청이 없어요보낸 신청은 여기에 남아요. 보내기 전 내용은 이 화면을 나가면 사라져요.
9:41
소유권 신청
First run, inbox The head stays, its Choice on 운영팀 검토; the copy follows the scope
소유권 신청 내역
소유권 링크를 열 수 없어요링크를 다시 확인해 주세요
9:41
Invalid link Not found; the header back is the way out
소유권 신청 내역
신청 내역
내 신청
9:41
소유권 신청
Loading The head is real; six skeleton two-line rows; the FAB stays
소유권 신청 내역
신청 내역
내 신청
신청 내역을 불러오지 못했어요연결을 확인하고 다시 시도해 주세요
다시 시도
9:41
소유권 신청
Error EmptyState error under the head
소유권 신청 내역
신청 내역
내 신청
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
소유권 신청
Offline, cold EmptyState offline
소유권 신청 내역
신청 내역
내 신청
올림픽공원 테니스장
소유권 신청2026년 9월 10일
검토 대기
양재 시민의숲 테니스장
소유권 양도2026년 8월 21일
승인됨
탄천 테니스장
소유권 신청2026년 7월 14일
추가 정보 필요
잠실 보조경기장
소유권 신청2026년 6월 2일
거절됨
9:41
오프라인이에요
다시 시도
소유권 신청
Offline, cached The app’s strip; the viewer’s own applications stay, the create FAB waits
소유권 신청 내역
신청 내역
운영팀 검토
오프라인이에요연결되면 자동으로 다시 불러와요
다시 시도
9:41
소유권 신청
Offline, queue hidden The staff queue is not shown offline, even when this visit read it online: the offline state stands
Roles
소유권 신청 내역
신청 내역
운영팀 검토
반포 한강공원 테니스장
소유권 신청2026년 9월 17일
검토 대기
서울숲 테니스장
소유권 양도2026년 9월 15일
검토 대기
분당 중앙공원 테니스장
소유권 신청2026년 9월 13일
추가 정보 필요
9:41
소유권 신청
운영팀 검토 The Choice’s other value: the staff queue, claims awaiting a decision; the Choice takes the selected look
소유권 신청 내역
로그인이 필요해요소유권 신청 내역을 보려면 로그인해 주세요
로그인
9:41
Signed out A wall with 로그인; no head, no FAB
Overlays
소유권 신청 내역
신청 내역
내 신청
올림픽공원 테니스장
소유권 신청2026년 9월 10일
검토 대기
양재 시민의숲 테니스장
소유권 양도2026년 8월 21일
승인됨
탄천 테니스장
소유권 신청2026년 7월 14일
추가 정보 필요
잠실 보조경기장
소유권 신청2026년 6월 2일
거절됨
9:41
소유권 신청
신청 보기
내 신청
운영팀 검토
내 신청 ▾ A value Sheet of two values, the first checked; a tap selects and closes it
소유권 신청 내역
Route/venue-owner-claims (VenueOwnerClaimsScreen inside OwnerFrame), reached from 장소 정보 제안 내역 and the claim editor. No tab bar; one h1, 소유권 신청 내역; the FAB is pinned.StackHeader 56 · 12 · the Feed’s head 신청 내역 (Section head 40, none above it) with the page’s one filter, the Choice ▾, at its end (내 신청; ink on 운영팀 검토) · Text rows 68 · the end line (a Caption row, 8 above) · FAB 56 above the home inset. The stack of 장소 정보 제안 내역 without its door.ReadsuseVenueOwnerClaims({ scope, venueId, status }) → kind, status, venueName, createdAt; OwnerFrame gates the route (the route schema, the session, useVenueOwnerScope). The shipped row also prints the tenure state and the revision: those live on 장소 소유권, where the row leads.TapsA row → 장소 소유권 (push). The head’s Choice ▾ → the value Sheet 신청 보기 (내 신청, 운영팀 검토; a tap selects and closes). The FAB (소유권 신청) → 소유권 신청 (new form, with the venue when the page was opened for one). 로그인 → sign-in. Back returns to the opener.Headings and labelsh1 소유권 신청 내역, h2 신청 내역. "내 신청, 팝업" (the Choice reads its value). A row: "올림픽공원 테니스장, 소유권 신청, 2026년 9월 10일, 검토 대기".RulingsThe same Text row and the same head as 장소 정보 제안 내역: the two views are the Feed head’s Choice ▾, not Tabs (the page levels, the owner, 2026-10-20) · signed out is a permission wall with 로그인, with no head · an invalid link is a not-found state whose way out is the header back, so it has no head and no button · the first-run copy follows the scope · R3: the FAB replaces the CTA band, and the list ends with one end line and no door (the page is reached from 장소 정보 제안 내역 and the claim editor, and every row opens its 장소 소유권).
Spec (grounding, anatomy)

The second half of the list routes of the flat v2 redesign, composed from the shared kit. Frames and one-line captions are visible; the specs sit behind the Show specs toggle.

route · packages/features/profile/src/ (friends-screen, add-friend-screen, achievements-gallery-screen, journey-screen (proposed), settings-blocked-users-screen, consent-history-screen) · packages/features/records/src/ (records-leaderboard-screen) · packages/app/src/presentation/components/sessions/venue-finder.tsx · packages/features/sessions/src/venue-contributions/ and venue-owner-claims/ grounded in 35 source file(s)
packages/features/profile/src/friends-screen.tsxpackages/features/profile/src/add-friend-screen.tsxpackages/features/profile/src/achievements-gallery-screen.tsxpackages/features/records/src/records-leaderboard-screen.tsxpackages/features/records/src/leaderboard/use-leaderboard-source.tspackages/features/records/src/leaderboard/leaderboard-copy.tspackages/features/records/src/leaderboard/leaderboard-source.tspackages/ui/src/podium.tsxpackages/features/records/src/leaderboard/leaderboard-parts.tsxpackages/features/records/src/leaderboard/leaderboard-list.tsxpackages/app/src/presentation/components/tier-info-sheet.tsxpackages/features/profile/src/settings-blocked-users-screen.tsxpackages/features/profile/src/consent-history-screen.tsxpackages/features/activity/src/activity-screen.tsxpackages/app/src/presentation/components/venue-explore/venue-explore-pane.tsxpackages/app/src/presentation/components/sessions/venue-finder.tsxpackages/app/src/presentation/components/sessions/venue-finder/venue-finder-header.tsxpackages/app/src/presentation/components/sessions/venue-finder/venue-finder-browse-list.tsxpackages/app/src/presentation/components/sessions/venue-finder/venue-finder-contribution-row.tsxpackages/app/src/presentation/components/sessions/venue-finder/venue-finder-search-results.tsxpackages/app/src/presentation/components/sessions/venue-filter-bar.tsxpackages/app/src/presentation/components/sessions/directory-venue-card.tsxpackages/app/src/presentation/components/venue-search-results-list.tsxpackages/app/src/presentation/components/searched-venue-row.tsxpackages/features/sessions/src/venue-contributions/list-screen.tsxpackages/features/sessions/src/venue-contributions/contribution-row.tsxpackages/features/sessions/src/venue-owner-claims/list-screen.tsxpackages/features/sessions/src/venue-owner-claims/claim-summary.tsxpackages/app/src/domain/entities/subscription.entity.tspackages/app/src/presentation/hooks/use-feature-gate.tspackages/app/src/presentation/hooks/queries/use-sessions.tspackages/app/src/presentation/hooks/queries/use-feed-sessions.tspackages/app/src/presentation/hooks/queries/use-club-media.tspackages/app/src/domain/entities/session-result-summary.entity.tspackages/features/clubs/src/club-album-screen.tsx