클럽 홈
Route/clubs/[clubId] (ClubDetailScreen with five panes), pushed over the tabs so there is no tab bar; a 회비 push or a 회비 door opens it at the 회비 pane (the owner, 2026-10-21). A non-member sees the same route and page (review 41: the separate 클럽 미리보기 retires): the band, the hero, no Tabs, the public 소식 and the join action. One h1, the club name; the header title fades in once the band has gone.Zones (§1.14)Lead: MediaBand 208 (the album; status bar inside) and the hero 82 (logo 56 overlapping the band by 16; 114 with a two-line name) · 8 · Panes: Tabs 48 (홈 · 채팅 · 기록 · 멤버 · 회비; the 일정 pane is gone, review 41; 순위 became 기록, review 46) · 24 to a title, 16 to a row (the Tabs rule) · no Block inside a club page (the owner, 2026-10-20: the band and the hero lead it, so a pane opens on its own sections) · 홈 pane: one value Cell, 홈 코트, with the venue as its value and its chevron (it opens 장소 상세; none when the club has none), then Feed 소식, the club’s one Feed under the same grammar as 홈 (sessions with the viewer’s state, 결과, 공지, 자유, 경기 후기, 소개, 사진; a pinned notice first as 고정 공지; the source is the author or host; a post with no photo shows the author’s face). FAB 56 on 홈: 글 for a member (the noun; spoken 글쓰기), 만들기 for an official, who makes more than one kind (its MenuSheet: 일정 만들기, 행사 만들기, 글쓰기); none elsewhere. A non-member: the CTA band with the join action instead of the FAB.ReadsThe club, the viewer’s role and the unread count (the 홈 Tab count); the album and the cover (a default cover when there is none); the home court (clubs.homeCourtVenueId; the 홈 코트 Cell is absent when it is null); the 홈 Feed: the club’s sessions, posts, album uploads and closed records; per other pane: its chat rooms, its 기록 (the season, the standings and the club-scoped records), the members by role, the dues by the club’s plan (a member’s own dues rows and session_payments, and useClubBankAccount: one per club, readable by members; the history is every period paid, newest first). A non-member: public sessions (visibility public) and public photos (club_media visibility), as counts with no names.TapsGear → the 관리 sheet (the kit’s FvkAdminSheet, review 46, M28: 운영 멤버 관리, 일정 관리, 회비 관리, 출석 현황, 신고 관리, then 설정 테니스장 관리, 클럽 대항전, 성장 분석, 클럽 설정; the counts ride their doors; 클럽 나가기 last) · ⋯ → 클럽 알림 (a value Sheet of the three levels, opened in place; also a row of the 관리 sheet’s 설정 group) and 클럽 나가기 (a Dialog); 신고 waits until a club can be reported · 공유 (a member’s) → the club’s invite Sheet (frame club-dues-invite: the club’s name in the title, the 초대 코드 as a copy Cell, the link, 공유하기 the one primary, which alone opens the OS share sheet) · the owner’s Notice 초대 링크 보내기 and the 회비 pane’s setup step 멤버 초대 → the same Sheet, the one home of the club’s invite (§1.18; the DM’s add-people form is not it); a visitor’s 공유 stays the OS share sheet with the public club page, because a visitor is not a member and never sees the invite code · a Feed item → its page (a session, a post, the album, the record) · a long press → reactions and the post’s commands · 전체 ▾ → the 소식 filter Sheet · 만들기 (an official) → its MenuSheet: 일정 만들기, 행사 만들기, 글쓰기 · 글 (a member) → 글쓰기 · 입금했다고 알리기 → the 입금 완료 Sheet · the copy button on the 계좌번호 row → the number to the clipboard and a Toast, "계좌번호를 복사했어요" (the clipboard arrives with the next native build, W5; until then the share sheet) · a 납부 내역 row presses nothing (a Text row is the record itself; no receipt page is drawn) · N개 더 보기 under 납부 내역 → the older periods, in place · the 시즌 ▾ Choice → the season Sheet · the 홈 코트 Cell → 장소 상세 · the 순위 head’s Choice → a value Sheet (전체, 조별); N명 더 보기 → the rest of the table, in place · a 순위 row → the record Sheet (최근 20회 중 참석, never a rate; its doors: the named 최고의 파트너 and 천적 → their 공개 프로필, then 공개 프로필 and 나와의 전적) · a pair in 최고의 파트너 → the partner sheet (a pair that includes you → the other member’s 추천 점수 Sheet, the one 복식 파트너 추천 draws) · 복식 파트너 추천 › (that head’s door) → 복식 파트너 추천 · an official’s 가입 신청 row on 멤버 → 가입 신청 · a 멤버 row → 공개 프로필, an official’s too (the shipped row presses nothing; no row has a ⋯) · the pane-end Cell 멤버 관리 → 멤버 관리, where a member’s Sheet holds 역할 바꾸기, 조 정하기 and 내보내기 · the Cell 참가비 내역 at the 회비 pane’s end → 참가비 내역, and an official’s Cell 회비 관리 under it → 회비 관리 · the Cell 선수별 전적 at the 기록 pane’s end → 선수별 전적, and the Cell 클럽 테니스 여정 under it → 클럽 테니스 여정 (a club below the basic plan meets the Sheet 클럽 플랜 there) · a 채팅 row → its thread. A non-member: a session → 매치 미리보기 (apply as a guest), the join action → by policy (가입하기, 가입 신청하기, 초대 코드로 가입; see "Joining").Joining (owner review 50, L2-01)The visitor 클럽 홈 is the page a non-member joins from (the owner: “I thought we already had a non-member facing home page of a club, which would what non-members would view to apply”); /join-club is the invite-code page and nothing more. The pinned band follows the club’s 가입 방식. 바로 가입: 가입하기, then the member’s 홈 (replace). 승인 후 가입: 가입 신청하기 opens one Sheet, 가입 신청, with one optional message (자기소개, 500 characters, as the app) and 신청 보내기; the band then reads 승인 대기, disabled (the language pass’s word; the app’s applyPending says 신청 검토 중), with the app’s hint 총무가 승인하면 알려드릴게요; a rejected request reads 다시 신청하기 and opens the same Sheet. 초대 전용: 초대 코드로 가입 opens 초대 코드로 가입. A club at its 정원 (정원이 다 찼어요, attention) or an archived club (보관된 클럽이에요) draws its Notice under the band and no join action. The server asks an applicant with no attendance to attend a public session first (먼저 공개 일정에 참석해 주세요); the Sheet’s error line carries it.Headings and labelsh1 the club name, a tablist of five, h2 per section. "강남 라켓클럽, 강남구, 멤버 42명" (hero) · "홈, 읽지 않은 소식 3개" (Tab) · "관리, 처리할 일 있어요" (gear) · "홈 코트, 올림픽공원 테니스장" (the 홈 pane’s Cell) · a Feed item in its own order.RulingsReview 41: the club follows 홈’s grammar, one Feed for everything the club does, sessions included; the 일정 pane and the 다음 일정 Module are gone (the 일정 filter lists the sessions, soonest first; officials manage them in 관리 › 일정 관리); no onboarding missions; a non-member sees this page with public items only. Earlier: MediaBand with ‹ and at most two icons · 관리 is the gear with a badge and a one-time Coachmark (IA-4, IA-7) · no shelves on the 홈 pane (review 39) · the Feed item has no button the 순위 level Tag only where a run starts · each dues fact is stated once (the club’s dues are 회비 관리’s, a member’s own are this pane’s) · the 순위 row’s record Sheet opens on tiles (ELO, 클럽 순위, 클럽 승률) · the 소식 filter (전체, 일정, 결과, 게시글, then the board’s 공지, 자유, 경기 후기, 소개, 사진; 운영진 for officers) is a value Sheet · the account number is the kit’s one copy row (review 46, M11: 은행, 계좌번호 with its copy icon button, 예금주; no long-press caption, a Toast confirms the copy). Review 46 (M28): the 관리 sheet splits in two groups, 운영 for the work that comes back (with the counts) and 설정 for the rare, from one registry in the kit; the club’s home court is one value Cell at the top of the 홈 pane, a fact that opens its place, not a list; the 순위 peek’s chips pressed nothing, so the people it names and its own doors are rows; a member’s 회비 pane ends with the Cell that goes to the session fees. The owner, 2026-10-21: 내 회비, the member’s own dues page, folded into the 회비 pane, the one place a member reads and pays their dues; a 회비 push or a 회비 door opens 클럽 홈 at 회비, and 회비 관리 is the officials’ alone. The cohesion pass (the owner, 2026-10-25; §1.18, §1.19): a row has no ⋯, so the 멤버 pane’s rows open 공개 프로필 for everyone and an official’s member commands are 멤버 관리’s Sheet; the official’s 회비 pane is a member’s plus the pane-end door 회비 관리 (with its count); 순위’s head holds its count and one Choice (전체 | 조별, a value Sheet) and the list ends in N명 더 보기, never a 전체 보기 to a page that is not drawn (one grammar per meaning: 전체 보기 › opens a page, N개 더 보기 opens in place, a head’s fold collapses a group); the FAB reads 글 for a member and 만들기 (its MenuSheet) for an official; the header is 공유 then the gear or the ⋯; the owner’s Notice is a state with its one action (아직 멤버가 나뿐이에요 | 초대 링크 보내기), which opens the club’s invite Sheet like a member’s header 공유 and the 회비 pane’s step 멤버 초대 (one home, §1.18; a visitor’s 공유 shares the public page instead), no instruction and no line about how it works; the Level tag shows only on a 순위 row where a level run starts; a door reads the title of the page it opens (공개 프로필, not 프로필). Which page opens which is the generated navigation map (Page grammar).기록 pane (review 46, M10)The club’s 기록, under the grammar of the personal 기록. The season: a Section head “2026 가을 시즌” with the Choice 시즌 ▾ (a Sheet of seasons), over three tiles (경기 184, 활동 멤버 38명, 최근 20회 평균 참석 17회); no Block inside a club page · 32 · 순위: head 40 (42명 and its one Choice 전체 ▾, a value Sheet of 전체 and 조별), PersonRow 68 × 4 (the top three and the viewer; the level where a run starts, the ELO as the figure), then the lone toggle 38명 더 보기 48, which opens the rest in place · 조별: a head and three rows per 조 with the rank restarting in each and the win rate as the figure, each 조 ending in its own N명 더 보기 · 최고의 파트너 and 라이벌과 천적: three pairs each (two faces, two names with the break, facts, one figure), no note (the owner, 2026-10-20: no meta lines) · 최근 20회 출석: three rows, N회 as the figure (the title names the measure) · 7일 상승세: three rows by the 7-day ELO change (the order is not by level, so no Level tag and no slot) · the closing Cell group, two Task Cells (the door idiom of the tabs): 선수별 전적 (everyone’s records) and 클럽 테니스 여정 (the club’s month told from its sessions, results and photos, never from a member’s note; the club plan). A Module with nothing to say is absent (early season: the standings only).기록 reads and rulesClub-scoped bulk reads of player_partner_records and player_matchups_by_format (00692; friendlies skipped), calculateStandings with each 조 as a pool, a season window (a writer for season_records, or compute on read) and a per-match 조 snapshot. A club-mate reads what a club-mate may: one trust fact, 최근 20회 중 참석 N회, never a rate or an absence (M6; those are the officials’ on 멤버 관리 and 출석 현황). A pair needs 5 matches together (the ratified rule); the pair sheet is the one partner sheet the 대진 flow also opens. 복식 파트너 추천 left the 멤버 pane for this pane and that flow.멤버 pane (review 46, M16)The roster only: role groups, 조 and the 신뢰 점수 on line 2 (신뢰 72점; none before five recorded sessions). An action is time-bound and carries a verb, so it is not a row of the list: for an official one 할 일 row on top, 가입 신청 with its count, opens 가입 신청 (the applications and the guests to recommend) and disappears when done. 단톡방 and 초대 are on 멤버 관리’s ⋯. The pane ends, for an official, with the door 멤버 관리. A row opens 공개 프로필 for everyone (review 46, M28: the shipped row presses nothing), where 나와의 전적 is, and no row has a ⋯: an official’s commands on a member (멤버 기록, 역할 바꾸기, 조 정하기, 내보내기) are their Sheet on 멤버 관리, so the pane draws no command and no Level tag (the cohesion pass, the owner, 2026-10-25; §1.18). 멤버 stays collapsed under its head’s fold, as on 멤버 관리.회비 pane (review 46, M17)Dues follow the club’s own plan (monthly, quarterly, yearly or one-off), and this pane is the one place a member reads and pays them (the owner, 2026-10-21). A member reads the open period as a Section head (3분기 회비 | 7월~9월) over two tiles (낼 금액 90,000원, 9월 25일까지 D-6; no Block inside a club page), the account on the one copy row, 입금했다고 알리기 as the band’s one action and the periods already paid. An official sees the same pane, their own dues as a member who pays (the band too, while something is owed), and its end adds the door 회비 관리 with its count (확인 대기 3): the month, the sections, the verbs and the ledger are 회비 관리’s, the officials’ alone, so the pane no longer mirrors them, nor the month’s one line, nor the plan’s note (the cohesion pass, the owner, 2026-10-25; §1.18). Empty: an official gets the setup steps (입금 계좌 등록하기, 회비 정하기, 첫 일정 만들기, 멤버 초대하기, which opens the club’s invite Sheet), a member one calm line and no button. A member’s pane ends with the Task Cell 참가비 내역 (review 46, M28), the way from the dues to the session fees.회비 pane, a member’s plans (the owner, 2026-10-21)Stack under the Tabs: 24 · head 40 and the Strip, tiles face, 80 · 입금 계좌 head 72 and the copy row (은행, 계좌번호 with its copy icon button, 예금주) · 납부 내역 head 72 and a Text row per period paid (68) · the toggle N개 더 보기 48 (분기 5, 매월 9) · 20 (32 under 한 번, which lists no period) · the Task Cell 참가비 내역 48, and for an official 회비 관리 with its count under it · the CTA band 102. The plan decides the head, the tiles and the history, and the pane keeps its shape: 분기 (the default; 6개월 has no frame of its own and reads as 분기 does, with its own period), 매월 (9월 회비, an overdue month: the second tile says 14일 지남), 매년 (2026년 연회비, one amount and its D-103; two periods of history and no toggle), 한 번 (총회 회식비, "한 번만": the name of the charge, 낼 금액 and the due date with its days left; one thing and no 납부 내역) and, with two charges open, 두 건 (the charge due soonest leads, here the month, and the Cell 미납 2건 counts them; owner decision 4, M4). The first tile is always what I owe; the second is the deadline with its days left (분기 D-6, 매년 D-103, 한 번 D-11), the days gone once it is overdue (14일 지남) or the price of one session. Paid: the head’s count says 완납 and the tiles say what was paid and when (낸 금액, 낸 날); no account and no band.