← Cockpit Wireframes Pages by level Navigation map
Library — rows, cells and labels▾
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 · 하단 고정
Approved 2026-10-11 — the build spec until it ships

Library — rows, cells and labels

The rows and cells that make up every list and settings group, the headings above them, and the tags and avatars inside them, each in its states.

Feed item

One item for a Feed of mixed kinds (홈, 클럽 홈) and for every list of events: clubs, sessions, venues and 대항전. Four rows and 128 tall, always: on 홈 the facts row and the footer, in a list of one kind the facts row and the who row (the owner, 2026-10-20: at most four rows).

일정강남 라켓클럽
올림픽공원 테니스장
참석
내일 09:00
3일 전6/8
매치정우진
탄천 테니스장
화 20:00NTRP 3.0–4.0
3시간 전3/4
홈, approved: no who row, 128 tall (the kit’s item, unchanged)
마포구경쟁형
마포 서브앤발리
NTRP 3.0–4.0혼성복식
주 2회 저녁월 30,000원4자리 남음
강남구친목형
강남 라켓클럽
참석3
NTRP 3.0–4.0혼성복식
다음 일정 토 19:00
Club: level, composition, format; rhythm, dues, the gate
매치정우진
대치유수지체육공원
진행 중 2/3라운드
18:00~20:00
복식NTRP 3.0–4.02~3번 코트
일정강남 라켓클럽
올림픽공원
참석
09:00~11:00
복식3~4번 코트
Session: time and state; format, level and the booked courts
테니스장송파구
올림픽공원 테니스장
1.2km코트 12면하드야외
영업 중시간당 12,000원4.3
테니스장서초구
반포 한강 테니스장
코트 8면클레이야외
영업 종료시간당 8,000원4.1
Venue: the distance (by 가까운 순), courts, surface, indoor; open now, price, the rating
대항전승률
vs 반포 한강 테니스
9.14~9.28
2-1 앞서는 중
대항전총 승수
vs 송파 베이스라인
받은 신청
9.20~10.4D-2 시작
대항전: the period and the days left; the standing
200% text: the thumbnail 56, the title, the facts and the who row wrap
강남구친목형
강남 라켓클럽
참석3
NTRP 3.0–4.0혼성복식
다음 일정 토 19:00
Club
매치한소희
올림픽공원
참석
09:00~11:00
복식NTRP 3.0–4.03~4번 코트
Session with booked courts
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
영업 중시간당 12,000원4.3
Venue
대항전승률
vs 반포 한강 테니스
9.14~9.28D-6 종료
2-1 앞서는 중
대항전
Face thumbnail: the photo, else the initials on gray100 (the author inside a club, a result’s top winner)
경기 결과서초 테니스 모임
9월 17일 정모
8경기최다승 박지훈 4승
어제25
자유정우진
토요일 정모 끝나고 랠리 더 하실 분? 1시간 정도 코트 잡아 둘게요.
3일 전4
Face (128): a result with the top winner’s photo, a post with the author’s initials; a plain square, r8
경기 결과서초 테니스 모임
9월 17일 정모
8경기최다승 박지훈 4승
어제25
자유정우진
토요일 정모 끝나고 랠리 더 하실 분? 1시간 정도 코트 잡아 둘게요.
3일 전4
1.5×: the thumbnail is 56; the photo and the initials keep their square
Management, loading and dark
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
우리 클럽 3~5번 코트영업 중4.3
테니스장 관리: the ⋯ is a second stop on the overline’s line; the club’s own courts lead the who row
Loading: the thumbnail and four bars, 128 with or without a who row
매치이서연
반포 한강 테니스장
1자리 남음
20:00~22:00
복식NTRP 3.0–4.01~2번 코트
매치정우진
잠실 보조경기장
마감
19:00~21:00
복식NTRP 3.0–4.04번 코트
Dark: maps dimmed, tones in their dark text colours
Feed item (review 46, M12, M13, M18, M21, M22: the who row; the owner, 2026-10-20: at most four rows)
Anatomyrail · thumbnail 96 (56 from 1.5×, r8, nothing drawn on it) · 16 · the text column · rail; 16 above and below. Overline 13/18·600 secondary (the label | the source); title 16/24·600 ink, 2 below (one line; a post with no facts takes two); facts 15/22·500 ink, 2 below; then, at most four rows in all, either the footer 13/18·500 tertiary at the bottom (the posted time at the left, glyph counts at the right: 홈 and 클럽 홈) or the who row 15/22·500 ink, 2 below the facts (a list of one kind), never both. The whole item is one press target: no button, no Tag pill, no hairline.Heights128 (16 + 96 + 16) with or without a who row: the column is the thumbnail’s 96, as 홈 draws it, since the who row takes the footer’s place (18 + 26 + 24 + 24 = 92). A wrapping title (a club’s or a venue’s name, titleLines 2) adds 24: 152. A skeleton keeps the pitch.Thumbnailthe venue’s map, the first photo, else the source’s face: the club tile on 홈, the author’s or the host’s face inside a club (a result’s top winner), where a club tile would repeat on every row. The face is FvkThumb kind face: the person’s photo filling the square, or the initials on the avatar ground (gray100) when there is none, drawn with the Avatar’s own sources (a NULL photo is the initials, never a lock or a blur); r8, no edge, 96 (56 from 1.5×), nothing drawn on itWho rowWhat, then who: the facts row says what the object is, the who row what it asks of its people, and it takes the footer’s place, so a list item shows no posted time and no counts (the owner, 2026-10-20: at most four rows). Club: level, composition, format | rhythm, dues, the join gate (a member’s own club: the next session and their state). Session: the time and the deciding fact (seats only when two or fewer are left, or full) | format, composition (only when it restricts), level, booked courts. Venue: the distance first while 가까운 순 is on, courts, surface, indoor | open now, price, the rating last (★4.3; 테니스장 관리: the club’s own courts there first). 대항전: the period and the days left | the standing.FitA facts row is one line, about 238 at 390 (350 less the thumbnail 96 and the gap 16). The facts that fit are drawn whole; nothing is cropped. In Pretendard 15/500 a break costs 17, “NTRP 3.0–4.0” 98, “3~4번 코트” 75 and “복식” 28: format, level and courts fit (235), a fourth fact does not. For a session the order of giving way is composition (when it is the club’s own), then courts, then level; a joined session keeps its format and courts instead.Booked courtssessions.used_courts (migration 00499), written as the court numbers are everywhere: consecutive 3~4번 코트, else 1, 3번 코트, more than three scattered 코트 5면; a count only when the numbers are unknown (코트 1면), never invented. The session detail states them in its fact block and 일정 수정 edits them.TonesA fact may carry a tone, 600 in that tone’s text colour: success (참석, 호스트, 승), warn (a deadline, seats left at two or fewer, an official’s attention, 예비, 미납, 받은 신청), danger (진행 중), muted (마감, 정원 마감). A Count tag (the unread of 내 클럽) follows the title through the line slot; a ⋯ control (테니스장 관리) is a second stop on the overline’s line, its glyph’s edge on the rail.200%From 1.5× text the thumbnail is 56 and the title, the facts and the who row may wrap to two lines; the item grows with them.SpokenOne button, in the item’s own order: “매치, 정우진, 대치유수지체육공원, 오후 6시부터 8시까지, 진행 중 3라운드 중 2라운드, 복식, NTRP 3.0부터 4.0, 2번부터 3번 코트”. The thumbnail and the glyphs are hidden.ReplacesClubCard, SessionCardV2 and SessionCardFromEntry as list items, DirectoryVenueCard and VenueRow, ChallengeBlock; and, since review 39, PostRow, ResultRow and the session row in a Feed.

Feed end

Closes a Feed once its last page has loaded: the doors on, and the page’s tail. It draws no line.

일정강남 라켓클럽
올림픽공원
참석
09:00~11:00
복식3~4번 코트
매치 찾기
Rest: the door, a task Cell, 32 under the last row, the page’s 40 below
테니스장송파구
올림픽공원 테니스장
코트 12면하드야외
영업 중시간당 12,000원
없는 장소 추가
장소 정보 제안 내역
Two ways on: 테니스장 ends with the two ways to fix a missing venue
순위상위 50명
티어 안내
50
한소희
21승 19패▼12
1,388
No way on: only the 40 tail; the bound is in the head’s count (a ranking’s rows open profiles)
아직 보낸 제안이 없어요보낸 제안과 검토 결과를 여기서 다시 볼 수 있어요
소유권 신청 내역
Empty: the door follows the Empty state, 32 under it
English · 200% text · dark
SessionGangnam Racket Club
Olympic Park
Going
Tomorrow 09:00
DoublesCourts 3-4
Find a pickup
English: the door in the page’s language
매치 찾기
200%: the door’s Cell grows with the text
매치 찾기
Dark
Feed end (library § 1.14: a Feed ends with its doors, and no line)
Anatomyonce the last page has loaded: the doors, a task Cell 48 for each way on (an ink 15/22·500 label and a chevron; the Cells of one list are a Cell group, trimmed to the 12 a row list uses above and below), the first 32 under the last row (or under the Empty state) · the 40 under the last Cell is the page’s tail. It draws no line (owner review 48). The kit draws it once, FvkFeedEnd({doors}), and every list board calls itNo linewhat ended and what bounds a list are lines about the data, so the Feed end draws none (§ 1.16; the owner, 2026-10-28). A bounded list says its bound in its head’s count (순위 · 상위 50명); a list that has paged to its end simply stops, 40 under its last rowDoornames where to go on, a Cell for each way: 예정 › 매치 찾기, 매치 찾기 › 테니스장 찾기, 장소 정보 제안 › 소유권 신청 내역, 테니스장 › 없는 장소 추가 and 제안 내역. A door never repeats the page’s FAB: a list creates with its FAB, so 매치 찾기’s door is not 매치 만들기Whena list with no place to go on ends in its tail alone (소유권 신청 내역; 순위표, whose rows open profiles and whose head holds 티어 안내 ›); an empty list keeps its door (the door follows the Empty state, 32 below it); a list that has not loaded (loading, error, offline) has no Feed endSpokenread once, after the last row, each door as a button: “매치 찾기”Replacesthe page-local FeedEnd helpers of List A and List B (a Caption row, a Gap, a Cell group, a Gap)

MediaRow

The list row for things you open: a session, a club, a venue. Review 46 (proposed): in a list of clubs, sessions, venues or 대항전 these are Feed items (above); the MediaRow stays for pickers, the same-court list and the compact 홈 row.

올림픽공원 테니스장
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
양재 시민의숲 코트
토요일 07:00~09:00
혼복NTRP 3.5–4.5
마감 임박
대치유수지체육공원
일요일 20:00~22:00
복식 매치NTRP 3.0–4.0
참석
Rest: venue on line 1, time on line 2 in ink, format and level on line 3
Session hierarchy by context
9월 19일 (토)내일
올림픽공원 테니스장
19:00~21:00
복식NTRP 3.0–4.0
6/8
양재 시민의숲 코트
07:00~09:00
혼복NTRP 3.5–4.5
3/6
매치 찾기 under a day header: the day word is dropped
9월 19일 (토)내일
올림픽공원 테니스장
19:00~21:00
참석
대치유수지체육공원
21:00~23:00
예비
양재 시민의숲 코트
07:00~09:00
호스트
예정: no line 3 (already joined), a state Tag trailing
9월 19일 (토)내일
올림픽공원 테니스장
09:00~11:00
4/8
올림픽공원 테니스장
19:00~21:00
복식 매치NTRP 3.0–4.0
6/8
Club 일정: line 3 only for 매치 (96 high, the others 80)
올림픽공원 테니스장
09:00~11:00
복식NTRP 3.0–4.0
6/8
19:00~21:00
혼복NTRP 3.5–4.5
참석
21:00~23:00
단식NTRP 3.0–4.0
1/2
Same court: the court is named once; no thumb, the time leads
다음 일정내일, 9월 19일 (토)
일정 보기
09:00
올림픽공원 테니스장
☀️ 18°
올림픽공원 테니스장
09:00~11:00
6/8
양재 시민의숲 코트
19:00~21:00
3/6
홈 under the day Block: a 48 tile, a 16 line 1, a 13 line 2 (72)
Club and venue
강남 라켓클럽
서초구멤버 42명NTRP 3.0–4.0
2
서초 아침 테니스
서초구멤버 18명
모집 중
Club rows: an unread Count tag (내 클럽) or 모집 중 (클럽 찾기)
올림픽공원 테니스장
송파구코트 6면
반포 한강 테니스장
서초구코트 4면
Venue rows: the court tile, region and court count
Picked, with a leading ring (select: radio)
올림픽공원 테니스장
홈 코트송파구코트 4면
잠실 테니스장
송파구코트 3면
The chosen row is the home court: the ring leads on line 1 and draws its dot; the trash is the row’s one control
올림픽공원 테니스장
홈 코트송파구코트 4면
잠실 테니스장
송파구코트 3면
200%: the ring stays on line 1 and the trash at the end; the names wrap beside them
States
올림픽공원 테니스장
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
Pressed: scale .98, dim .80
올림픽공원 테니스장
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
Focus: a 2 ink ring, offset 2
올림픽공원 테니스장
송파구코트 6면
Selected: a trailing check, no fill
Loading: a square and two lines (three in discovery)
서울 송파구 올림픽공원 국제 테니스장 보조 코트와 연습 코트 전용 구역
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
Long venue name at 130%: two lines, then an ellipsis
올림픽공원 테니스장
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
200%: the count stays beside line 1; line 2 may take three lines
English (line budgets by role)
Olympic Park
Tomorrow 19:00–21:00
Doubles3.0–4.0
6/8
Yangjae Forest
Sat 07:00–09:00
Mixed3.5–4.5
Closing soon
Discovery: shortName, 24-hour clock, no NTRP prefix
Sat, Sep 19Tomorrow
Olympic Park
19:00–21:00
Going
Daechi Park
21:00–23:00
Waitlisted
Upcoming: Tags of one or two words
Gangnam Racket Club
Seocho42 members3.0–4.0
2
Seocho Morning Tennis
Seocho18 members
Recruiting
Club: two segments beside a Tag, three beside a figure
올림픽공원 테니스장
내일 19:00~21:00
복식NTRP 3.0–4.0
6/8
양재 시민의숲 코트
토요일 07:00~09:00
혼복NTRP 3.5–4.5
마감 임박
Dark
MediaRow
Anatomycontent width × min 80 · pad 12 · thumb 56 + 12 · text column · trailing element 12 from the text; no divider, no fill, no bookmark; the thumb is centred on the text blockLinesL1 17/24·600 ink (the venue or club) · L2 15/22: session rows the time range 500 ink tabular, club and venue rows MetaSegments 400 secondary · L3 (discovery only) 13/18·500 secondary, 4 under L2Trailingone element centred on L1: a count (6/8, 15/22·600 tabular) or one Tag; priority live, then 참석 / 예비 / 호스트, then 마감 임박; clubs: an unread Count tag or 모집 중Heights매치 찾기 96 (12 + 24 + 4 + 22 + 4 + 18 + 12) · 예정 80 · club 일정 80 (96 with L3) · same court 68 (74 at these line boxes) · 홈 compact 72Same courtwhen every row is at one court it is named once in the list head; rows drop the thumb; L1 is the time 17/24·600; L2 is sessionTitle() and level 15/22·500 secondaryPickeda picked venue in a group where exactly one is the home court (클럽 만들기 step 2), select="radio": [ring 24][12][thumb 56][12][text], so the text edge is 104 from the rail. The ring is the kit’s radio ring (2px secondary edge, a 12 ink dot when chosen) riding line 1 through the line slot; the chosen row says 홈 코트 first on line 2 and the row speaks as a radio (checked or not). The row’s one control is the remove trash at the end, danger, a second stop outside the press area, centred on the row with its 20 glyph’s edge on the rail; a draft court goes at once with a 되돌리기 Toast200%the trailing element stays beside line 1 while the longest word of any line plus the element plus 12 fits the text column; otherwise it wraps under the text block at the text edge, 4 below the last line; L2 may take three lines; L1 wraps to two lines (three from 1.5) before the ellipsisEnglishL2 at most 2 segments beside a Tag and 3 beside a figure; the flex segment truncates, fixed tokens never; shortName ("Olympic Park"); rows omit the NTRP prefix; Sat, Sep 19; 24-hour clock; counts 6/8Spokenone stop, composed from the row view model: "마감 임박, 내일 9월 19일 토요일 오전 9시부터 11시까지, 올림픽공원 테니스장, 복식, NTRP 3.0부터 4.0, 8명 중 7명 참석, 내 상태 참석". A picked row (select radio) is a radio in a group, checked or not (“올림픽공원 테니스장, 홈 코트, 송파구, 코트 4면, 선택됨”), and its trash the next stop, named for its owner (“올림픽공원 테니스장 지우기”)ReplacesSessionCardV2, SessionCardFromEntry, SessionCompactRow, ClubCard, DirectoryVenueCard, VenueSearchResultRow, VenueRowUseFor people use PersonRow; for label/value facts use a Cell.

PersonRow

The list row for people: members, dues, rankings, friends, applicants. Line 2 carries what the list exists to answer.

김민준
A조신뢰 84점
이서연
A조
박
박지훈
B조
최유나
Rest: line 2 holds at most two facts (68); a row with none is 64
Line 2 by context
김민준
A조신뢰 84점
이서연
B조 수동
박
박지훈
members: 조, then the 신뢰 점수; none when there is neither (64)
김민준 (나)
호스트
이서연
친구
박
박지훈
최유나
예비
participants: no line 2; a Level tag and at most one Tag (64)
최유나
예비 1번
정
정우진
예비 2번
waitlist: the position 예비 N번; a Level tag trails
정
정우진
10분 전 신청함께 6명
복식 파트너로 같이 치고 싶어요
수락
거절
한소희
1시간 전 신청
수락
거절
applicants: when, then the one decisive basis; the pair below
이서연
9월 17일 입금 완료 신청
박
박지훈
일부 납부남은 금액 20,000원
10,000원
최유나
dues: state and date, then 잔액; a figure only if partial
4
정
정우진
18승 12패▲40
1,402
5
한소희
21승 19패▼12
1,388
6
오세훈
15승 16패
1,351
ranking: the record, then the 7-day change; none at 0
4
정
정우진
18승 12패강남 라켓클럽
1,402
5
한소희
21승 19패서초 아침 테니스
1,388
ranking, 지역 and 전국: the club name takes the change's place
이서연
서초구
정
정우진
송파구
한소희
friends: the region, and a Level tag; none without a region
김민준
내일 모임 괜찮으세요? 코트는 제가 예약해 둘게요
5분 전
이서연
네, 참석할게요
어제
threads: the last message cropped to one line; time trails
박
박지훈
라이벌최근 5경기 2승 3패
5승 7패
정
정우진
최근 4경기 3승 1패
3승 1패
opponents: a callout, then the last matches; the record trails
김민준
강남 라켓클럽서초구
김
김민준
송파 테니스송파구
박지훈
search: club and region, only to tell people apart
이서연님이 입금을 알렸어요
강남 라켓클럽10,000원
5분 전
새 일정이 올라왔어요
강남 라켓클럽9월 19일 (토)
3시간 전
신뢰 점수가 4점 내려갔어요
무단 불참
9월 11일
notifications: the visual says who it came from (a face, the club's logo, the system's disc); line 2 the club, then the one specific thing; the time and the ⋯ trail
박지훈님 외 2명이 댓글을 남겼어요
강남 라켓클럽새 코트 후기
어제
강
강도윤님이 친구 신청을 보냈어요
강남 라켓클럽
수락
거절
1시간 전
한소희님 외 2명이 친구 신청을 보냈어요
notifications: a repeat is one row (the latest face, 외 N명); a pending 친구 신청 answers in its row, with no ⋯; a request group folds open in place
박
박지훈
불참 기록 3건
58%
이서연
96%
attendance: 불참 기록 on a flagged row only; the rate is the figure
김민준
이서연
불참
정
정우진
미확인
참석
불참
attendanceCheck: ✕ marks 불참, undo returns it, 미확인 asks
정
정우진
차단 해제
A
a3f9c2e1
차단 해제
blocked: no line 2; 차단 해제 is the one control
김민준
minjun@example.com
이서연
카카오 계정
accounts: the email; the provider when there is none
Variants
7
윤
윤지호
9승 14패▲6
987
8
강하늘
11승 13패▼3
962
9
배태훈
8승 12패
941
Rank: the number starts at the rail; its column fits the widest rank
김민준
내일 모임 괜찮으세요?
5분 전
이서연
네, 참석할게요
어제
박
박지훈
코트 예약했어요
어제
Marked: a leading dot, the text edge moves to 88
States
김민준
A조신뢰 84점
Pressed: scale .98, dim .80
김민준
A조신뢰 84점
Focus: a 2 ink ring, offset 2
김민준
A조신뢰 84점
Selected: a trailing check, no fill
김민준
A조신뢰 84점
Disabled: .5
Loading: a 40 circle and two lines
김
김민준 하늘 라켓 마스터 정예 회원님 겸 클럽 총무님
A조
30,000원
Names never cut: they wrap to two lines
김민준
A조
30,000원
200%: the figure stays beside line 1 while it fits
김민준하늘라켓
A조
30,000원
200%: a long word does not fit, so the figure drops, 4 below
김민준
1,482
이서연
1,455
Dark
English (line budgets by role)
Minjun Kim
Group ATrust 84
Seoyeon Lee
Group B
Members: group and trust fit one line
Minjun Kim
Marked paid Sep 17
JP
Jihun Park
Part paidRemaining 20,000 KRW
10,000 KRW
Dues: the state with its date, the balance in figures
Minjun Kim
Are you coming tomorrow?
5min
Seoyeon Lee
Yes, see you there
Yesterday
Messages: relative time as 5min
PersonRow
Anatomycontent width × min 68 (12 + 22 + 4 + 18 + 12), 64 with no line 2 (the 40 avatar sets it) · pad 12 · avatar 40 + 12 · L1 15/22·600 ink (the name, two lines at most, never cut) · L2 13/18·500 secondary, one MetaSegments line of at most two facts; an `extra` quote under it is the one allowed third lineLine 2 rulesline 2 answers the question the list exists for; the first fact is the decisive one · at most two facts, one line · never a repeat: a fact equal to the section head, the filter value, the trailing element or the Tag is dropped (NTRP beside a Level tag) · a fact that is the same on every row moves to the head (a Section head count or note, or the filter) · the same kind of fact on every row of a list: a row that lacks it omits line 2, it never substitutes another · no line 2, no space: a row with no fact is 64APIboards pass a `context` and `data` (and a `person`), never line-2 strings: fvkPersonL2(context, data, locale) resolves the facts and the trailing parts from FVK_PERSON_CTX; the low-level props (l1, l2, figure, level, tag, meta, control, answer) remain for one-offsmembers멤버 관리, 멤버 목록 · 조 (with 수동), then the 신뢰 점수 (신뢰 84점; none before five recorded sessions) · omit when there is no 조 and no score yet · trailing: the ⋯ control for officials, else noneparticipants참석자 · none, always · trailing: the Level tag, and one Tag (호스트 > 게스트 > 친구 > 예비)waitlist예비 · 예비 N번, never omitted (it is the position) · trailing: the Level tagapplicants가입 신청, 게스트 신청, 심사 대상 · 신청 시점 (“10분 전 신청”), then the one decisive basis (함께 N명 > 매너 N > 공개 일정 N회), the message as the quote line · no basis data: the time alone · trailing: the AnswerPair belowsuggestions추천할 만한 게스트, 친구 추천 · the reason, one (“함께 8회”, “실력이 비슷해요”) · trailing: one button (추천, 친구 추가)dues회비, the member’s own and the ledger · the state with its date (“9월 17일 입금 완료 신청”), then 잔액 · omit when the section already says it (완납, 미납) and nothing varies · trailing: a select checkbox in Select mode; a figure only for a partial balancefees참가비 · the state with its time (“9월 18일 21:30 신청”) · omit when the section says it · trailing: the amount or a Tagranking순위표, the club’s 순위 · the record (N승 N패), then the 7-day change (▲40 in the success text colour, ▼12 in the error text colour, 13/18·700 tabular, omitted at 0) · in 지역 and 전국 the club name takes the change’s place and crops, never the record · trailing: rank column, Level slot, ELO figurefriends친구 목록 · 지역 · omit when no region is set · trailing: the Level tag, or a row control (친구 삭제)requests친구 신청, 메시지 요청 · 시점, then the first message line or the 지역, cropped to one line · omit when there is no message · trailing: the AnswerPair belowthreads메시지 목록 · the last message, one line, cropped (from 1.5× it wraps), the sender’s name only in a group thread · never omitted · trailing: the time (13/18 secondary); the unread dot leads in the marker slotopponents상대 전적 · a callout label (라이벌, 천적, 최다 대결, 최고 승률), then 최근 N경기 N승 N패 · fewer than five matches: count what exists · trailing: the overall record as a figureresults경기 기록, a session’s 경기 · the date (history); the round, court and winners in a session view · never omitted · trailing: Tag and scorepicker단톡방, 멤버 초대 · none; a friend who is also a member shows the shared club · omit when the grouping already names the relation · trailing: the checksearchpeople results · 클럽, then 지역, only to tell people apart · omit when there is one match · trailing: nonereports신고, for officials · 신고 날짜, then 분류; the quoted reason as the `extra` line (two lines, clamped) · never omitted · trailing: nonenotifications알림 · where (the club), then the one specific thing (who, which session, how much); a title that is the club drops the club fact · trailing: the time as meta (13/18 secondary), a kind group’s fold chevron in its place; the unread dot leads in the marker slot, reserved on every rowattendance출석 현황 · 불참 기록 N건 on a flagged row only; every other row has no line 2 (64) · trailing: the rate as the figure column (15/22·700, right-aligned, no Level tag)attendanceCheck출석 확인 · 참석 is the silent default: no line 2 and a ✕ control (“정우진 불참으로 표시”); a marked row reads 불참 with an undo control; an unresolved row reads 미확인 with the AnswerPair 참석 · 불참 under itblocked차단한 사용자 · none (64) · trailing: the one control 차단 해제, an sm tonal Button; a profile that did not resolve prints the first eight characters of its id as the nameaccounts설정 (the signed-in account), a list of linked accounts · the email, else the provider · omit when neither is known · trailing: none; a linked account may carry a controlTrailingone element: an amount or score 15/22·700 tabular · an ELO figure with its Level tag (one cluster) · one Tag · trailing meta 13/18·500 secondary; text, figures and Tags centre on line 1, a control taller than 24 centres on the rowBADGE-EXCEPTIONa Tag appears only where the row differs from its list’s default (a roster’s default is 참석: only 호스트, 게스트, 친구, 예비 carry one; 호스트 > 게스트 > 친구 > 예비; the viewer’s own row takes the name suffix “(나)”); at most one per row200%the trailing figure or Tag stays beside line 1 while the longest word of any line plus the element plus 12 fits the text column (298 at 390 with an avatar); otherwise it wraps under the text block at the text edge, 4 below the last line; the rank column stays; names wrap to three linesSpokenone stop: “김민준, A조, 신뢰 84점”; dues “이서연, 9월 17일 입금 완료 신청”; ranking, rank first: “3위, 김민준, ELO 1,482, NTRP 3.5, 18승 12패, 7일간 40점 상승”; a row with a real second control keeps two stopsReplacesPersonRow, LeaderboardRow, renderRankRowItem and MyRankRow, MemberListItemRow, DuesRow, DmThreadRow; PlayerIdentityChip and PlayerIdentityCard stay for bylines and scoreboard slotsUseThe default tap opens the profile.

Text row

An object in a list that has no leading media: documents, receipts, history entries, recent searches.

이용약관 동의
2026년 9월 1일에 동의했어요
필수
개인정보 처리방침 동의
2026년 9월 1일에 동의했어요
마케팅 정보 수신 동의
동의하지 않았어요
선택
Rest: L1 15/22 semibold, L2 13/18 medium, one trailing element
올림픽공원
대치유수지체육공원
양재 시민의숲
Recent searches: a trailing × control, its own stop
States
이용약관 동의
2026년 9월 1일에 동의했어요
Pressed: scale .98, dim .80
Loading: two lines
클럽 회비 환불 및 탈퇴 시 정산 규정 개정과 개인정보 제3자 제공 안내에 동의
2026년 9월 1일에 동의했어요
Long text: line 1 wraps
이용약관 동의
2026년 9월 1일에 동의했어요
필수
200%: the Tag stays beside line 1; line 2 wraps whole
Anatomythe PersonRow text block without leading media: pad 12 · L1 15/22·600 ink · L2 13/18·500 secondary (from 1.5× it wraps whole) · min 68 · one trailing element (a Tag, a figure or a Row trailing control; never a chevron: a row opens the item itself) that stays beside line 1 while the longest word of any line plus the element plus 12 fits, else drops under the text block, 4 belowSpokenone stop composed of L1, L2 and the trailing text; a trailing control is a second stopChevronnone: a row opens the item itself (a document, a receipt, a match, a person, a thread), so it carries no chevron; a chevron is the suffix of a label that names where it goes (a Cell, a Door pill), never alone and never at a container’s edge · the verifier’s `chevron` check enforces itReplacesad hoc ListRow compositions for document and history listsUseA Cell is a label/value pair inside a settings group; a Text row is an object in a list.

Cell

A label/value pair or a single setting inside a group: facts, settings, pickers, toggles.

종목
복식
일시
9월 19일 (토) 09:00~11:00
테니스장
올림픽공원 테니스장
참가비
15,000원
Static: label secondary, value ink, hairlines between
Variants
알림 설정
공개 범위
클럽 멤버에게만
언어
한국어
도움말
Nav (chevron), value + chevron (opens a Sheet)
새 일정 알림
마케팅 알림
클럽 이름
강남 라켓클럽
한 줄 소개
입력해 주세요
Toggle (the row toggles it) and Input (the field)
한국어
English
日本語
Selected (a picker): a trailing check, a 600 ink label, no fill
승인 상태
확인 대기
가입 신청
승인 대기
클럽 일정 가져오기신규
Tag value, Tag value with chevron, label Tag
테니스장
올림픽공원 테니스장
일시
9월 19일 (토) 09:00
참가 마감
마감 뒤에는 예비로만 신청할 수 있어요
9월 18일 (금)
Edit (pencil), Locked (the lock, no reason line), Two-line
정렬
최신순
푸시 알림
꺼짐켜기
초대 링크
가입 신청
3
Trailing slot: Choice, Button, IconButton, count Tag
은행
국민은행
계좌번호
123-45-678901
예금주
김총무
Copy: the action Cell that copies its value; a copy icon button trails
클럽 탈퇴
저장 중…
알림 설정
Destructive: the label in danger; Busy: a spinner, siblings inert
전체 동의
[필수] 이용약관 동의
보기
[필수] 개인정보 처리방침 동의
보기
[선택] (광고) 마케팅 정보 수신 동의
보기
Consent: a leading 24 checkbox, [필수] and [선택], 보기 › as a Door pill
테니스장
선택
테니스장을 선택해 주세요
클럽 이름
이름을 입력해 주세요
Required Cell in a form: the asterisk, an unset picker, the error line
참가비는 어떻게 내나요?
계좌로 이체하면 호스트가 확인한 뒤 참석이 확정돼요.
Disclosure: the chevron turns, the body opens under the label
가입 신청
3건이 확인을 기다려요
참가 마감
마감 뒤에는 예비로만 신청할 수 있어요
Two-line: the trailing glyph is centred on the row, not on line 1
점수가 달라요
선수가 달라요
경기를 하지 않았어요
Lead radio: a 24 ring leads while a footer CTA follows
올림픽공원 테니스장
양재 시민의숲 코트
대치유수지체육공원
Lead check: a leading 24 checkbox; the content at 56
점수가 달라요
내가 아는 점수(선택)
예: 6-3
선수가 달라요
경기를 하지 않았어요
Expand: content that belongs to the row opens under it
공유하기
알림
3
삭제하기
Command: a plain pressable row; an icon leads, a count trails
States
공개 범위
클럽 멤버에게만
Pressed: scale .98, dim .80
공개 범위
클럽 멤버에게만
Focus: a 2 ink ring inside the box, 6 clear of the text
공개 범위
클럽 멤버에게만
Disabled: .5
Loading: a label bar at 40%, a value bar at 20%
이용 안내 및 환불 규정에 대한 동의 여부
클럽 규정에 따라 시작 24시간 전까지 무료로 취소할 수 있어요
Long text: label and value wrap, never ellipsized
공개 범위
클럽 멤버에게만
종목
복식
200%: the label over the value, 4 apart
테니스장
올림픽공원 테니스장
서울 송파구 올림픽로 424
참가 마감
9월 18일 (금)
마감 뒤에는 예비로만 신청할 수 있어요
200%, two-line with a value: the label, the value 4 under it, then line 2 4 under the value; the chevron centres on the Cell
일시
9월 19일 (토) 09:00
200%, Locked: the reason stays under the value and the lock centres on the Cell
계좌번호
123-45-678901
Copy at 200%: the label over the value, the icon button stays at the right
계좌번호
123-45-678901
계좌번호를 복사했어요
Copied: the page’s Toast says so; the row does not change
종목
복식
새 일정 알림
가입 신청
3
Dark
Format
Doubles
Visibility
Club members only
New session alerts
English: labels at most 26 characters
Cell
Anatomycontent width × min 48 · pad 12 · label 15/22·400 secondary at the left · value 15/22·500 ink at the right (wraps, right-aligned, never ellipsized) · 12 between · the cell hairline (#E5E5E5, 1px, rail to rail) between the Cells of one group, none after the last · one trailing slot · the row’s box reaches 8 past the rail on each side while its content stays on the rail, so the focus ring, drawn inside the box, keeps 6 clear of the text · a support line sits 4 under the Cell · a two-line Cell (line 2 under the label, 68) centres its trailing glyph on the row, not on line 1, and so does a single-line Cell whose label or value wrapsVariantsStatic · Nav (chevron 16) · Value + chevron · Toggle (Switch 52 × 32) · Input · Destructive · Command · Selected (check + 600 label) · Tag value · Label Tag · Edit (pencil 16, never beside a chevron) · Locked (the lock, no reason line) · Two-line (68) · Trailing slot (value, Tag, Choice ▾, sm tonal Button or IconButton, Switch, count Tag before the chevron) · Copy (the action Cell that copies its value, with its copy icon button) · Consent (a leading checkbox, a trailing 보기 Door pill) · Busy · Disclosure · Option (a choice row)Leadlead “check” or “radio” puts the mark in the leading slot, riding line 1 through the line slot: a 24 checkbox, or a 24 ring (2px secondary edge, a 12 ink dot when chosen); 12 after it, so the content starts 36 from the rail (56 from the frame edge); the chosen radio row’s label is 600 · a choice that waits for a footer CTA (Dispute, Decide) leads with the ring; a picker that selects and closes keeps the trailing 20 check · a leading `icon` (a 20 glyph that grows with the text to 1.5×, in the label’s colour) takes the same slot, the content at 52 from the rail edgeExpandan `expand` slot holds content that belongs to the row (a field, a score table): 8 above, 16 below, it owns its padding and the cell hairline follows itCommanda plain pressable row: an ink 400 label, no value, optionally a count Tag and a 16 chevron trailing (a menu row); Destructive is the same with the label and its icon in danger; `inset` sets the side padding to 16 and runs the hairline full width (the anchored Menu from 600 pt)Copythe action Cell that copies its value (owner review 46, M11; a copy icon button, “as is the case in many other apps”, the owner’s check of 2026-10-19): the value (an account number) and, in the trailing slot, the IconButton with the copy glyph (a 20 glyph in its 48 target, the visible edge on the rail, so the row stays 48); the one account row wherever a number shows (the 입금 안내 Sheet, 클럽 홈 › 회비): 은행, 계좌번호 with its icon button, 예금주 · the glyph has no text, so the button is named by the label and “복사” (“계좌번호 복사”) · the Toast “계좌번호를 복사했어요” is the page’s own state, and the clipboard arrives with the next native build (W5; until then the share sheet)Required Cellthe label carries the one asterisk ($errorText, hidden from assistive technology, "필수" in the name); an unset picker reads "선택" + chevron; the error is the support line under the Cell (16 alert glyph and 13/18·600 $errorText)200%from 1.5 the label sits over the value, 4 apart, the value left-aligned; a second line (a two-line Cell’s line 2, a Locked Cell’s reason) goes 4 under the value, so it still ends the Cell as it does at 100% and the value stays next to its label; the trailing element (chevron, lock) centres on the Cell, the two-line ruleSpokenStatic a text group "종목, 복식"; Nav a button named by the label with the value; Toggle a switch with a constant label; Edit "장소, 수정"; Locked the label, its value when it has one, then the reason; Consent a checkbox "필수, 이용약관 동의" plus a separate stop "이용약관 보기"; Copy a text group "계좌번호, 123-45-678901" and the icon button as its own stop, "계좌번호 복사"; Busy aria-busy "처리 중"ReplacesFactRow, FactList, FactSegments, the settings and picker uses of ListRow, SettingsRow, AdminNavRow, PickerRow, EditFieldRow (EditCue stays), EloFactRowUseFor an object in a list use a Text row or a PersonRow.

Day header

Names the day above a day-grouped list.

9월 18일 (금)오늘
올림픽공원 테니스장
19:00~21:00
참석
9월 19일 (토)내일
양재 시민의숲 코트
07:00~09:00
호스트
9월 22일 (화)
대치유수지체육공원
20:00~22:00
예비
Rest: the date on the rail, the relative day at the right; no marker
States
9월 19일 (토)내일
올림픽공원 테니스장
19:00~21:00
6/8
양재 시민의숲 코트
07:00~09:00
3/6
Stuck: the edge hairline while content scrolls under it
9월 18일 (금)오늘
200%: the relative day drops under the date
Fri, Sep 18Today
Sat, Sep 19Tomorrow
English: Fri, Sep 18 with Today or Tomorrow
9월 18일 (금)오늘
9월 19일 (토)내일
Dark
Anatomya 22 line box, no fixed height: the date 15/22·600 ink at the rail, the relative day 13/18·500 secondary at the right ("오늘" in ink 600); 24 above, 12 below (ink gaps about 28.5 and 16.5); no mark in or beside it, no leading slot, no today dotStickysticky in day-grouped lists with the edge hairline #D4D4D4 while content scrolls under it (100 ms fade)ContentKorean 9월 18일 (금); English Fri, Sep 18 with Today or Tomorrow; no year within the current yearSpokena heading (h2; h3 inside a section), the relative day first: "오늘, 9월 18일 금요일"; from 1.5 the relative day drops under the dateReplacesSessionDayHeader

Section head

Titles a section and offers its one way onward.

올림픽공원 테니스장
19:00~21:00
6/8
내일 일정
전체 보기
양재 시민의숲 코트
07:00~09:00
3/6
대치유수지체육공원
20:00~22:00
4/8
Rest: 32 above, 12 below, a 20/28 title, its door (a Door pill) at the right
Variants
친구24명
전체 보기
받은 신청2명
Count suffix, 8 apart on the title's baseline; the Door pill is centred on the title's line
취소 규정
환불 안내
The ExpandToggle slot: the section's one chevron
참석
6/82자리 남음예비 2명
전체 보기
Roster head: the count, the seats left, the waitlist
납부 현황
1인당 20,000원매월 5일까지
이서연
9월 17일 입금 완료 신청
박
박지훈
9월 17일 입금 완료 신청
Note: data only (an amount, a date), 4 under the title, then the head's 12
경기 기록47경기
최근 3개월
9월 18일 (금)
승
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
Choice: a filter trails the head, centred on its title line
강남 라켓클럽
티어 안내기간
Door and Choice: the Choice last, 12 after the Door pill
예정매치 찾기테니스장
이번 주
올림픽공원 테니스장
19:00~21:00
6/8
Under Tabs the 24 tab gap replaces the 32
States
경기 기록
최근 3개월
9월 18일 (금)
승
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
9월 16일 (수)
패
이
김민준 (나)이서연
3
정
한
정우진한소희
6
Stuck: the Feed’s head, pinned under the Header, draws the edge hairline on its bottom edge
이번 주말에 올림픽공원에서 열리는 모든 정기 모임과 매치
전체 보기
Long title wraps; the Door pill keeps its line
이번 주말 올림픽공원 모임3개
전체 보기
200%: the title wraps, the Door pill keeps its line
Next sessions3
See all
English
Anatomymin-height 28 · title 20/28·700 ink at the rail · the count shares the title’s baseline (the row aligns to it), 8 after the title · every control rides the title’s first line through the line slot, centred on it: the expand chevron, the door (a Door pill), a Choice and the pager; the 36 pills overflow the 28 line and never grow the head · 32 above and 12 below (the edge rule trims the first row’s top padding); directly under Tabs the 24 tab gap is the seamTrailingthe door, `action`: a Door pill (§ 7), the Choice’s pill with a right chevron: 36 tall, the edge border, 16 of side padding, the label 15/22·500 ink and a 16 chevron 4 after it, so an action cue is a control, never bare text (owner review 48) · an expand chevron 20 · or a `choice`, a node (normally a filter Choice such as 필터 ▾, 36 tall); the filter belongs in the head, never on a row of its own above the list · a head may carry a door and a `choice` together (티어 안내 › + 기간 ▾): in the slot the order is the expand chevron, the door, the Choice, then the Shelf’s pager (two 48 IconButtons from 600 pt), 12 apart, each with a 44 target by slop · a head carries no command: a list’s bulk action does not live in a head (알림’s 모두 읽음 left; a row is read when it is opened), and a page’s is its band’sCounta suffix 15/22·500 secondary, 8 after the title on its baseline, with its unit (24명) or earned out of total (6/20); it wraps under the title only when the title’s longest word and the count do not fit, never onto a line of its ownNotedata only (the owner, 2026-10-20; 1.16): a section’s own figures when no row holds them (“1인당 20,000원 | 매월 5일까지”) or an empty Module’s state line (“일정에 참석하면 신뢰가 쌓여요”), never what a section is, how it is counted or ordered, or who sees it (a measure goes into the title: “최근 20회 출석”); 13/20·500 secondary, at most two lines, 4 under the title, then the head’s 12 bottom padding: a head and its note read as one unit, and a section note is never a separate Caption rowVariantsExpandToggle slot · Shelf head (title, count, 전체 보기; from 600 pt ‹ ›) · Roster head (the count 6/8 and 2자리 남음)Stuckthe Feed’s head of a page with no Panes pins under the Header and is then the lowest pinned layer (§1.14, the pinned stack): it is opaque and draws the one edge hairline (the kit’s sticky edge: 1 px, #D4D4D4, dark white α0.14) on its bottom edge while content scrolls under it, as the Day header’s stuck does; the Header above it draws none. A head that is not the pinned layer draws no lineSpokena heading (h2) with the door as a link (the Door pill) whose name starts with its visible text: "전체 보기, 내일 일정"ReplacesSectionHeader and SectionBlock

ExpandToggle

Expand or collapse content in place: a tonal Button at a list’s end for “show more”, a disclosure Cell for FAQ-style content.

올림픽공원 테니스장
19:00~21:00
6/8
Lone row, closed: a full-width tonal Button, the label states its count
접기
Lone row, open: 접기, the chevron up
참가비는 어떻게 내나요?
계좌로 이체하면 호스트가 확인한 뒤 참석이 확정돼요. 확인까지 보통 한 시간쯤 걸려요.
Disclosure Cell: closed and open; Cells open independently
200%
Lone rowa full-width tonal md Button (44, gray100, r12, the label centred 15/22·600 ink) in a row of 60, 12 above and 4 below, stating its count (“4개 더 보기”); a 16 chevron follows the label by 8, down to open the rest in place and up to fold it (“접기”); aria-expanded; an action cue is a control, never bare text (owner review 48), and never a bare chevronDisclosure Cella Cell whose trailing chevron points down (closed) or up (open); opening reveals the body under the label, 16/24·400 ink, 12 below the label, 16 at the bottom; cells open independentlyMotionchevron 180° in 200 ms; the body reveals in 250 ms sliding 8; reduced motion: a 100–150 ms fadeReplacesExpandToggle, ExpandChevron and ExpandReveal

Roster

Who is coming, on the session page, as one row of faces.

참석
4/84자리 남음
전체 보기
호스트
김민준
3.5
이서연
4.0
박
박지훈
3.5
최유나
3.0
Rest: one row of four, the host first, its role pill on the face
참석
4/84자리 남음
전체 보기
호스트
김민준
3.5
이서연
4.0
박
게스트
박지훈
3.5
최유나
3.0
Club session: a guest wears the pill, members are the default
참석
6/82자리 남음예비 2명
전체 보기
호스트
김민준
3.5
이서연
4.0
박
박지훈
3.5
+3
외 3명
More than four: three faces and a door +N
States
참석
Loading: four circles and a name bar
참석
0/88자리 남음
Empty: the head only; the CTA is the invitation
참석
4/8
호스트
김민준 하늘 라켓
3.5
이서연 시니어 회장
4.0
박
박지훈
3.5
최유나 하늘
3.0
Two-line names grow the row to 136
참석
6/8
호스트
김민준
3.5
이서연
4.0
박
박지훈
3.5
+3
외 3명
200%: two rows of two, the door stays the last cell
참석
4/84자리 남음
전체 보기
호스트
김민준
3.5
이서연
4.0
박
박지훈
3.5
최유나
3.0
Dark
Going
6/82 spots left
See all
Host
Minjun Kim
3.5
Seoyeon Lee
4.0
JP
Jihun Park
3.5
+3
+3 more
English: Host, +N more
Anatomyfour equal cells (content width / 4 = 87.5), content centred: avatar 48 · 16 · name 15/22·600 (two lines, three from 1.5; never cut) · 4 · Level tag (24 circle) alone on its line; the host’s cell adds a 호스트 pill (a sm Tag, 24, 2 ring) centred on the avatar’s bottom edge, overlapping it 12; in a club session a guest’s cell adds the 게스트 pill the same way (members are the default, so never marked; a pickup marks nobody); order: host, the viewer’s friends, the restDoorwith more than four people the row shows three and a door as the fourth cell: a 48 gray100 circle with +N 15/22·600 and the name line "외 N명"; empty slots are not drawnHeightcell min-height 114 with one-line names (pitch 116), 136 with two-line names (pitch 138); the 12 the pill hangs below the face is reserved in every cell, so names start at one y; one row (116) replaces two (216)Headthe Section head "참석" with the count 6/8 and 2자리 남음 (and 예비 2명 when anyone waits); its door (a Door pill) 전체 보기 and the +N cell both open 참석자; each cell opens that person’s profileSpoken"참석, 8명 중 6명, 2자리 남음, 예비 2명"; each cell a button ("김민준, 호스트, NTRP 3.5"; the Level circle is no longer hidden from the reader); the door "외 5명, 전체 보기"Replacesthe PersonRow preview list of ParticipationSection; AvatarStack and EmptySlotRowUseThe full list is one tap away; none of eight peers scrolls people sideways, and the roster is what the join button acts on.

Figure column

Keeps the digits of ranked and scored lists aligned down the page.

4
정
정우진
18승 12패▲40
1,402
5
한소희
21승 19패▼12
1,388
6
오세훈
15승 16패
1,351
7
윤
윤지호
9승 14패▲6
987
8
강하늘
11승 13패▼3
962
Ranks 1–99: a 20 rank column at the rail, Level tag at run starts
104
정
정우진
7승 9패▲8
1,104
105
한소희
6승 10패▼5
1,098
106
오세훈
5승 11패
987
Ranks 100–999: a 28 column; the figures stay aligned
1,004
정
정우진
4승 12패▲3
812
1,005
한소희
3승 9패▼2
806
Ranks 1,000 and up: a 40 column
Anatomya ranked or scored list right-aligns its trailing figure (15/22·700 tabular) in a column as wide as the widest figure on the page; the Level tag sits in a reserved 24 slot, 8 before the figure column, so a row without a Tag keeps the same figure position; the rank column fits the widest rank, measured: 20 (1–99), 28 (100–999), 40 (1,000–9,999), 13/18·600 tabular, left-aligned at the rail, 12 before the avatarContentthe Level tag shows only where a level run starts (BADGE-EXCEPTION); the Podium always shows itSpokenpart of the row’s name, rank firstReplacesthe fixed 28 px rank column of LeaderboardRow

Row trailing control

A row's one trailing element when it is a control: an add-friend button, a remove ×, a menu.

김민준
A조신뢰 84점
이서연
B조
A menu: an IconButton (a 20 glyph in a 48 target), its own stop
정
정우진
송파구
친구 추가
한소희
서초구
친구 추가
An sm tonal Button centred on the row
정
정우진
A조
200%: the control stays centred on the row
Anatomyan IconButton (a 20 glyph in a 48 target) or an sm tonal Button; it centres on the row; the row’s press area excludes the control’s target, and pressing the control never presses the rowSpokentwo stops: the row’s composed label, then the control named for its owner ("정우진, 친구 추가")Replaceshand-placed trailing buttons in friend, applicant and recent-search rows

Leading marker slot

Gives a row's leading element (an unread dot, a checkbox, a rank) a place inside the rail, so nothing enters the side margin and the text edge stays put.

김민준
내일 모임 괜찮으세요?
5분 전
이서연
네, 참석할게요
어제
박
박지훈
코트 예약했어요
어제
최유나
다음 주에 봬요
월요일
Every row keeps the slot: dots on 1 and 3, edges match
강남 라켓클럽
새 공지가 있어요
2
서초 아침 테니스
새 소식이 없어요
잠실 주말 클럽
새 사진이 올라왔어요
Media row: [dot 8][8][thumb 56][12][text], the text edge at 104
새 일정이 등록됐어요
올림픽공원 테니스장, 내일 19:00
참가비 입금이 확인됐어요
어제
클럽 공지가 올라왔어요
월요일
Text row: the dot and the text edge at 36
김민준
내일 모임 괜찮으세요?
5분 전
이서연
네, 참석할게요
어제
박
박지훈
코트 예약했어요
어제
Select mode: the slot is the checkbox slot, no dot
김민준
내일 모임 괜찮으세요?
5분 전
이서연
네, 참석할게요
어제
200%: the dot and its gap stay 8, the dot follows line 1
Slot widths (rail 20)
noneoccupies none; what follows starts at 20marker dot 88 + 8 = 16; what follows starts at 36checkbox 24 (Select mode, consent)24 + 12 = 36; what follows starts at 56rank column 24 / 32 / 40+ 12; the avatar at 56 / 64 / 72avatar 4040 + 12 = 52; the text at 72 (88 with a marker)thumb 5656 + 12 = 68; the text at 88 (104 with a marker)LM1 keep-outonly a full-bleed surface (photo, band, hairline, block fill) enters the margin; no dot, glyph, Tag or textLM3 whole listthe slot is reserved on every row of a list that can show the marker; a list that never shows one has no slot; in Select mode the slot is the checkbox slot and the dot is hiddenLM4 headingsa day header, section head or page title stays on the rail and takes no slotLM5 size and colouran 8 circle for a row marker, unread in $error #A3261F (7.36:1 on white), never a ball dot; a 6 dot with a 1.5 canvas ring rides an icon or a tabLM6 verticalcentred on line 1 through the line slot, not on the row: its top sits (line − 8) / 2 below the text-box top, 7 at 15/22 and 8 at 17/24 (and the same at every text size)LM7 order[marker 8][8][avatar 40][12][text] and [marker][8][thumb 56][12][text]; presence is a 10 dot on the avatar’s corner with a 2 canvas ring; counts stay trailingLM8 spokenthe dot is hidden from assistive tech; the row’s one name begins "읽지 않음, …"; no announcement when the dot clearsCost16 of text width on rows that carry a marker (4.6% of 350)Replacesthe hung unread and today dots (Dot) and DOT_SIZE 7

SwipeAction

A shortcut on a row for its most common action (delete, archive).

김민준
내일 모임 괜찮으세요?
5분 전
삭제
Delete revealed: one 72 action in danger, carrying its verb
이서연
네, 참석할게요
어제
보관
Archive revealed: the same action in ink
삭제
삭제했어요
되돌리기
A full swipe commits and shows an undo Toast (8 s)
김민준
내일 모임 괜찮으세요?
5분 전
Select mode: swiping is off, the row does not move
Anatomya left swipe reveals one 72-wide action carrying its verb: danger fill for delete, ink for archive; a full swipe commits and shows an undo Toast (되돌리기, 8 s)Spokenevery swipe action also exists as a custom accessibility action on the row and in Select mode or the row’s MenuSheet; never the only pathMotionthe row follows the finger; reduced motion: no elastic overshootReplacesnone (new)UseAn accelerator only.

Select mode

Acts on several rows at once: dismiss notifications, confirm dues or fees.

취소
2명 선택됨
전체 선택
이서연
9월 17일 입금 완료 신청
박
박지훈
9월 17일 입금 완료 신청
최유나
9월 18일 입금 완료 신청
정
정우진
9월 18일 입금 완료 신청
9:41
2명 입금 확인
Rest: header actions, a checkbox per row, bulk CTA
취소
0명 선택됨
전체 선택
이서연
9월 17일 입금 완료 신청
박
박지훈
9월 17일 입금 완료 신청
최유나
9월 18일 입금 완료 신청
9:41
입금 확인
Nothing selected: soft-disabled, no helper
Anatomyentered from the ⋯ row 선택 (long-press is an accelerator); the header shows 취소 (sm tonal, left), "n명 선택됨" and 전체 선택 (sm tonal, right); each row gains a leading 24 checkbox in the checkbox slot (24 + 12 = 36, content edge 56): 2px #4F5851 edge, checked = ink fill and a white check; a row tap toggles; the trailing element stays; swipes are disabledBulk actionthe CTA band carries it as an lg primary ("3명 입금 확인"), soft-disabled at zero; dues and fee reconcile screens open in Select mode with only the 확인 대기 rows ticked; a money action asks a Dialog firstSpokeneach row is role="checkbox" with aria-checked; the count is announced politelyReplacesper-row action buttons on dues and notification rows

Team lines

Two teams, each with its players and its games, in every place a match is shown: one team per line, the viewer's team first.

김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
row: 32 faces, names 15/22, games 17/24, lines 32 high, 12 apart
김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
block: on ink, faces ringed in ink, games 24/32 ball, lines 32, 8 apart
김민준 (나)이서연
6
최
박지훈최유나
4
sheet: the same 32 faces in a 48 line, 12 apart
1세트
김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
cells: the same faces, a 48 input per set, a set header above
States
김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
Proposal: both teams equal; a proposed score never looks like a result
김
이
김민준 (나)이서연
637
박
최
박지훈최유나
465
Accepted: the winner's names 600 ink, the loser's 400 secondary
김
이
김민준 (나)이서연
박
최
박지훈최유나
No numerals: names only (upcoming, not counted)
김
이
김민준 (나)이서연
746
박
최
박지훈최유나
6463
Tiebreak: 7-6(4), the 4 a superscript, its slot kept on both lines
김
이
김민준 하늘 라켓 마스터 (나)이서연 시니어 모임 회장
6
박
최
박지훈최유나
4
Long names wrap whole; the games stay on their team's line
M
S
Minjun Kim (You)Seoyeon Lee
6
J
Y
Jihun ParkYuna Choi
4
English: (You), the same order; no word between the teams
김민준 하늘 (나)이서연 시니어
6
박지훈최유나
4
200%: games cap at 1.5 and hold their 32 columns; names wrap
Faces (the default in every context)
김민준 (나)이서연
6
최
박지훈최유나
4
Doubles: two 32 faces overlapping 8 in a 56 slot
김민준 (나)
6
박
박지훈
4
Singles: one 32 face; initials where can_view_face refuses
김민준 (나)이서연
6
박지훈최유나
4
A deliberate text-only specimen: faces={false}, data-faces=off
김민준 (나)이서연
6
박지훈최유나
4
150%: the faces are dropped, the names keep the width
Stopped matches (Korean)
김
이
김민준 (나)이서연
63
박
최
박지훈최유나
41
Retired: the games so far, the other side wins
김
이
김민준 (나)이서연
박
최
박지훈최유나
Walkover: no numerals, the other side wins
김
이
김민준 (나)이서연
63
박
최
박지훈최유나
41
Suspended: the games so far, no winner
Stopped matches (English)
M
S
Minjun Kim (You)Seoyeon Lee
63
J
Y
Jihun ParkYuna Choi
41
Retired: the games so far, the other side wins
M
S
Minjun Kim (You)Seoyeon Lee
J
Y
Jihun ParkYuna Choi
Walkover: no numerals, the other side wins
M
S
Minjun Kim (You)Seoyeon Lee
63
J
Y
Jihun ParkYuna Choi
41
Suspended: the games so far, no winner
Who is reading
김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
The viewer plays on the second team: their team is first, with (나)
김
이
김민준이서연
6
박
최
박지훈최유나
4
A spectator: slot order, no (나)
Anatomyone team per line, two lines 12 apart (8 on a block and in the number pad) · a 32 face (singles) or two overlapping 8 (doubles) in a 56 slot, 12, then the names, then the set columns; the line is max(text, 32) · each name its own node, 15/22·600, a doubles pair joined by the 1px break (12 tall, 8 each side; on ink α0.4), so the break is the only partner separator and the line itself separates the teams · a no-break space keeps “Jihun Park” whole; names wrap whole and are never cut · the games in 32 wide columns, one per set, right-aligned at the rail, tabular 700, centred on their line (on the team block when names wrap) · no word between the teams, never a hue or a glyphContextsrow: names 15/22, games 17/24·700, lines 32 with the face (24 or 22 once the faces drop) — the Match row, ResultRow and the profile history · block (on ink): names 15/22 α0.85 (the winner α1), games 24/32·700, lines 32, faces ringed in the block’s ink, initials white on white α0.2 — the Match state block, still 144 · sheet: names 15/22 beside the same 32 face, games 24/32·700, lines 48, 12 apart — the sheets; the 40 face and the 40 footprint pair are retired · cells: the same 32 faces in the 48 line, names 15/22, a 48 × 48 input per set with 8 between and a 13/18·500 header label above each — ScoreEntry, the review sheet and 직접 입력Viewerthe viewer’s team is first wherever the viewer plays, rows included, and the viewer’s name takes “(나)” (“(You)”), the same suffix as the roster rows; everyone else, a spectator included, reads slot order with no suffix; each game stays on its own team’s line, so a score is never read in an orderWinneron an entered score (an entry under review included; the score stands until the host changes it) and in history: winner names 600 ink, loser names 400 secondary; winner games ink, loser games secondary (7.38:1 on white); on the block the winner’s numeral is ball and the loser’s white α0.7 · a proposed score or a void result shows both teams equal; the Tag and the header carry the state, never a hue or a glyph on the lineTiebreakthe loser’s points as a 12/18·600 secondary superscript beside the losing set’s games, its slot reserved on both lines so the games stay in one column: 7-6(4) is drawnFaceson by default in every context (row, block, sheet, number pad): a singles team gets one 32 face before its name, a doubles team two whole 32 faces overlapping 8 (the shipped AvatarStack overlap fit) with a 2 px ring in the surface colour (canvas, or the block’s ink), in a 56 slot so names start at one x, 12 before the names; each line is max(text, 32), so a row is 128 tall (12 + 24 + 4 + 32 + 12 + 32 + 12) · dropped from 1.5× text so the names keep the width · a face is drawn only where can_view_face allows it, otherwise the initials, and a refused face looks the same as a missing one · faces={false} is a board’s deliberate text-only specimen (data-faces=off), never a surface · each name is its own tap stop to that player’s profile (44 tall, the 44 pitch of 32 + 12), a sibling stop after the row’s press, never nested; the rest of the row opens the match’s page, where the pair’s record lives (a team stat; the backend needs a pair-keyed stats model, noted not built); names stay tappable at 200%Outcomeoutcome: { kind, by }, by = the slot (0 or 1) that retired, did not come or was defaulted, so the winner is the other side · the games so far render as given; a walkover and a cancelled match draw no numerals · the winner is emphasised only where the outcome has one (retired, walkover, defaulted), never for suspended, abandoned, cancelled or not counted · the written score is fvkOutcomeScore: “6-4 3-1 기권” / “6-4 3-1 ret.”, “부전승” / “W/O”; the spoken label appends the outcome wordContentin rows no word sits between the teams; in running text a matchup reads “ vs ” between teams and “ & ” between partners (“김민준 & 이서연 vs 박지훈 & 최유나”); “대” stays only where a score is read aloud (“6 대 4”); one spelling of vs, lower-case, in both languagesSpokenone text group built by fvkTeamLinesLabel, from the viewer’s side: “내 팀 김민준, 이서연 6. 상대 팀 박지훈, 최유나 4.” (a full stop between teams, commas between partners, never 대); sets read “1세트 6, 2세트 3”; a tiebreak “6, 타이브레이크 4”; a spectator hears the teams without the two prefixes; a winner is spoken (“승”, “won”) on an entered score; English “Your team Minjun Kim, Seoyeon Lee 6. Opponents Jihun Park, Yuna Choi 4.”ReplacesMatchScoreboard’s TeamRow and ScoreCell, PLAYER_JOINER (“ & ”), recordDetail.myTeamLabel and opponentTeamLabel, LiveMatchRow, CompletedRow, MatchHistoryRow, and joinNames() as the one place names are joined

ResultRow

One played match in a history: the date and the result, then both teams with their games.

9월 18일 (금)
승
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
9월 11일 (금)
패
이
김민준 (나)이서연
3
정
한
정우진한소희
6
9월 4일 (금)
승
김민준 (나)
7
오
오세훈
5
Rest: date and the 승 / 패 Tag, then your team first (128)
1라운드 2번 코트
검토 중
이
김민준 (나)이서연
4
박
최
박지훈최유나
6
2라운드 1번 코트
검토 중
이
김민준 (나)이서연
6
정
한
정우진한소희
2
Under review: the Tag 검토 중, the entered score stands with its winner emphasised
Loading: a header bar and two team bars
9월 18일 (금)
승
김민준 (나)이서연
6
박지훈최유나
4
200%: the Tag stays beside the date; games cap at 1.5
9월 18일 (금)6-4 3-1 기권
기권승
이
김민준 (나)이서연
63
박
최
박지훈최유나
41
9월 11일 (금)
부전패
이
김민준 (나)이서연
정
한
정우진한소희
1라운드 2번 코트6-4 3-1 일시 중단
일시 중단
김민준 (나)
63
오
오세훈
41
Stopped: 기권승 for the viewer, 부전패, then 일시 중단 with no winner
Fri, Sep 186-4 3-1 ret.
Win by ret.
S
Minjun Kim (You)Seoyeon Lee
63
J
Y
Jihun ParkYuna Choi
41
Fri, Sep 11
Loss by W/O
S
Minjun Kim (You)Seoyeon Lee
W
S
Woojin JungSohee Han
Round 1, Court 26-4 3-1 susp.
Suspended
Minjun Kim (You)
63
OS
Oh Sehun
41
English: the same three stopped matches
9월 18일 (금)
승
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
9월 4일 (금)
승
김민준 (나)
7
오
오세훈
5
Faces: the doubles pair and a singles face
Fri, Sep 18
Win
S
Minjun Kim (You)Seoyeon Lee
6
J
Y
Jihun ParkYuna Choi
4
Fri, Sep 11
Loss
S
Minjun Kim (You)Seoyeon Lee
3
W
S
Woojin JungSohee Han
6
English: (You), Win and Loss
Anatomythe one Match row (FvkMatchShell), header first: the header line holds the date (or the round and court) in 13/18·500 secondary and, as its one trailing element, the 승 / 패 / 무 Tag; under it the two team lines (Team lines, context row) with the viewer’s team first and “(나)”, the winner emphasised (history); 128 tall (12 + 24 + 4 + 32 + 12 + 32 + 12) at 390, with the faces; 170 at 200% where they dropTag sethistory lists entered scores only: 승 (success weak), 패 and 무 (neutral weak) · a session view (the 경기 rows of 일정 상세) keeps the 승 / 패 Tag on an entered score and swaps it for 검토 중 (warning weak) while a review is open, the entered score and its winner standingOutcome wordsa stopped match (D5) takes `outcome: { kind, by }`: the Tag is the outcome, in the viewer’s own words where the viewer is a side and there is a winner: 기권승 / 기권패, 부전승 / 부전패, 실격승 / 실격패 (Win by ret. / Loss by ret., W/O, def.; success weak for the win, neutral weak for the loss); a suspended match reads 일시 중단 (warning), abandoned 미완료, cancelled 취소됨, not counted 기록 제외 (neutral) · a neutral reader sees the outcome Tag itself (기권, 부전승, 실격) · the meta line carries the written score when there are numerals: “9월 18일 (금) | 6-4 3-1 기권” · winner emphasis only where the outcome has a winner · `faces` and `photos` forward to the Team linesSpokenone stop: the header (“9월 18일 (금)”), the Tag (“승”), then the team lines from the viewer’s side: “내 팀 김민준, 이서연 6, 승. 상대 팀 박지훈, 최유나 4.”ReplacesCompletedRow and MatchHistoryRow

Task Cell

An official's pending-work entry in the 할 일 section and the 관리 sheet.

할 일
참가비 관리
3
가입 신청
2
회비 확인
0
Rest: ink label, count Tag before the chevron
참가비 관리
3
회비 확인
0
Dark
Anatomya Cell with an ink 15/22·500 label and a count Tag before the chevron (danger when the work needs action, neutral otherwise)Spoken"참가비 관리, 확인할 항목 3개"ReplacesAdminNavRow

AnswerPair

Answers a request in the row itself (accept or decline, attend or not).

정
정우진
10분 전같이 복식 치실래요?
수락
거절
한소희
1시간 전
수락
거절
Rest: 12 above, 36 tall, 12 below; the row grows by 48
정
정우진
참석
불참
No line 2: the same 12 / 36 / 12, the row is 94
정
정우진
10분 전같이 복식 치실래요?
수락
거절
In flight: both disabled (.5) until the request settles
정
정우진
참석으로 확인할게요
불참으로 처리할게요
Long labels: they stack when a label plus 32 exceeds its half
정
정우진
10분 전같이 복식 치실래요?
수락
거절
200%: stacked, yes on top, 8 between, 12 above and below
WJ
Woojin Jung
10min agoDoubles together?
Accept
Decline
English: Accept and Decline
Anatomytwo sm (36) tonal Buttons in two equal columns of (text column − 8) / 2 (145 at 390), gap 8, left-aligned with the text: 12 under line 2, then the Buttons at their natural 36 (a 44 target by 4 of hit slop above and below), then the row’s own 12; both neutral so the screen’s one coloured action is unaffected; the row grows by 48 (12 + 36): 116 with a line 2, 94 with noneStackedfrom 1.5× text, or when a label plus its 32 of padding does not fit its half, the Buttons stack with 8 between and the yes on top, the same 12 above and below; below the text, never trailing: a trailing pair would be the row’s second trailing element and cut names at 200%Contenta bare row tap never records an answer (for 출석 확인 the explicit pair is the only way); the Result request row is the same component under the team lines, so it takes the same numbersSpokeneach button its own stop after the row’s, named from its visible text first: “수락, 정우진”Replacesinline accept and decline buttons in request rowsUseRequest lists only, and a pending 친구 신청 in 알림.

Tag

A passive label of state, category or exception on a row, hero or Cell.

neutral
총무확인 대기
brand
모집 중
success
입금 완료참석 확정
warning
마감 임박미납
danger
진행 중취소됨
info
안내신규
Rest: six tones, weak in repeated rows, solid for strong attention
neutral
총무확인 대기
brand
모집 중
success
입금 완료참석 확정
warning
마감 임박미납
danger
진행 중취소됨
info
안내신규
Dark: the weak tint is the tone at 16%
Sizes
모집 중모집 중입금 완료입금 완료
sm 24 (default) and md 28 (hero and identity block only)
마감 임박참석
200%: the Tag keeps its floor and grows with its label, one line
English (at most 12 characters, one or two words)
ClosedTo confirmRefund duePart paidWaitlistPending
The six shortened labels
WaitlistedPayment dueClosing soon
PaidCancelled
Already short enough
Match states (D4, D5)
대기기권부전승실격
일시 중단미완료취소됨기록 제외
Held, then the stopped outcomes: neutral weak, suspended warning
HeldRetiredWalkoverDefault
SuspendedUnfinishedCancelledNot counted
English: Held, Retired, Walkover, Default, Suspended
Placement: a Tag, a count or a Level tag never owns a row
강남 라켓클럽
서초구멤버 42명
2
양재 시민의숲 코트
토요일 07:00~09:00
마감 임박
이서연
친구
Trailing on line 1: a count, a Tag or a Level tag, never below
2번 코트
검토 중
김
이
김민준 (나)이서연
6
박
최
박지훈최유나
4
Inline after an eyebrow: the end of a Block's first row
일정 만들기강남 라켓클럽정기 일정에서
A fact in the header subtitle: a page's state is text, not a Tag
Tag
Anatomysm 24 tall, r6, 13/18·600, pad 0 8 (default) · md 28 tall, r8, 15/22·600, pad 0 10 (hero and identity block only); passive: no press, no aria-pressed; at most one per row and two per object; one or two words on one line; never shrinks (the row re-flows around it)Placementa Tag, a count or a Level tag never owns a row: it shares a line with text. In order of preference: the trailing slot of line 1 (rows, Cells, Hero facts, riding the first line through the line slot) · inline after line 1’s first fact (the trailing end of a Block’s eyebrow row: the eyebrow yields first, the Tag never shrinks) · a fact in the header subtitle, for a state of the whole page (a form’s provenance: “강남 라켓클럽 | 정기 일정에서”) · never a bottom row, never a row of its own above the title; exempt: a centred stack (Podium column, Roster cell), where every element is a line by grammarLarge textat 200% the Tag stays beside line 1 while the name’s longest word plus the Tag plus 12 fits the column; otherwise it drops under the text block at the text edge, 4 below the last line: the one documented exception, and it never stands on a line of its own above its textUnder a Tagno line under a Tag (1.16): the Tag is the state; a line that says the same thing is one fact drawn twice, and a consequence that changes the decision is the confirmation Dialog’s bodyTonesneutral gray100 / secondary (solid #4F5851 / white): role, pending, metadata · brand #EFF9B7 / ink: 모집 중, an invitation · success #CBEBE5 / #014B40 (solid #00695C / white): 완납, 참석 확정, a win · warning #F5B301 / ink: 마감 임박, 미납 · danger #A3261F / white (7.36:1): live, cancelled, overdue · info #E8DCFB / #4B0082 (solid #4B0082 / white)Match state Tagsone map for the Match row, the ResultRow and the Match state block (FVK_MATCH_TAGS): 검토 중 (warning weak: a player asked the host to look at the score; the entered score stands), 기록 제외 (neutral); an entered score shows no Tag (H3) · 대기 (neutral weak): a match held behind a player’s earlier match, derived, never stored · the stopped outcomes: 기권 Retired, 부전승 Walkover, 실격 Default, 미완료 Unfinished, 취소됨 Cancelled (all neutral weak) and 일시 중단 Suspended (warning: it needs a resume or an end); the outcome Tag says what happened, the viewer-relative words (기권승, 부전패) appear only in a person’s historyDarksuccess #75D1C6, warning text #E1B75C and fill #E2B13C, danger #FA9B94, info #C9B2F2; weak tints are the tone at 16% over the canvas; the tone is chosen by the domain’s XxxStatusBadge wrapper, never at the call siteEnglishat most 12 characters, 1–2 words, at most 80 px at 13/600, never truncated: Recruitment closed → Closed, Awaiting confirmation → To confirm, Refund pending → Refund due, Partial payment → Part paid, Waitlist open → Waitlist, Awaiting reply → PendingSpokenin a row a Tag has no stop of its own (part of the row’s name); standalone it is text read with its factReplacesBadge, MarkerPill in rows, ReliabilityPill, TierRangeBadge, ClubJoinabilityBadge, ClubRecruitBadge, ChallengeStatusBadge, ClubAlarmBadge, SessionLeadBadge, ContextChip, the hand-drawn pills; the XxxStatusBadge wrappers stay as the canonical domain mapsUseIt is not a control (a selectable chip is a Choice) and not a fact (facts are MetaSegments text).

Level tag

A player's level at a glance: the NTRP band numeral in a ball circle.

Rest: a 24 ball circle with a 1px edge on white; none on ink
100%
130%
150%
200%
The circle grows with its numeral: 24, 32, 36, 36
Dark: ball with an ink numeral, no edge
Anatomya 24 circle, ball #D6F04A, numeral 13/18·700 ink, a 1px #D4D4D4 edge on white (none on ink); diameter = ceil(24 × scale / 4) × 4 with the scale capped at 1.5 (the numeral class): 24 / 32 / 36 / 36 at 100 / 130 / 150 / 200%Whereon each Roster cell, always on the Podium, in the identity block after the name, and on ranking rows only where a level run starts (BADGE-EXCEPTION)Spokenstandalone "NTRP 3.5"; inside a row it is part of the nameReplacesEloTierBadge and TierBadgeChrome as level chrome

Count tag

A count on a row, a tab or a chart readout.

3121,46299+
Rest: danger (unread), neutral (a plain count), ink (a readout)
On a header icon or a tab: 16 tall, a 1.5 canvas ring, at the corner
3121,462
Dark
Anatomy20 tall, min-width 20, r full, numeral 12/16·700; tones danger solid (unread), neutral (a plain count), ink (the chart readout); counts above 99 read "99+"; on the tab bar and as a header icon badge 16 tall with a 1.5 canvas ringContentdigits only; the label class does not apply (chrome cap 1.3)Spokenwith its owner: "읽지 않은 3개"; 99+ is "99개 이상"ReplacesCornerCountBadge

Live tag

Says a session or match is being played now.

진행 중
9월 19일 (토)올림픽공원 테니스장
Rest: in the Live row, a 6 dot (after 5 s the dot rests)
진행 중
9월 19일 (토)올림픽공원 테니스장
Pulse: the 1600 ms ring, drawn at its widest
올림픽공원 테니스장
19:00~21:00
진행 중
In a row's trailing slot (the live state outranks the count)
Live
Sat, Sep 19Olympic Park
English
Anatomya danger solid Tag (sm) with a 6 white pulse dot before the live label (white on #A3261F is 7.36:1); in the Live row and in the trailing slot of rowsMotionpulsing for 5 s per mount (1600 ms loop), then it rests on the static dot (WCAG 2.2.2); the word carries “live” without the pulse; reduced motion: the static dotSpokenpart of the row’s name ("진행 중"); the dot is hiddenReplacesSessionLiveBand on rows, PulseDot

Unread marker

Says “new” on a row of a list that can show it.

새 공지가 있어요
올림픽공원 테니스장, 내일 19:00
참가비 입금이 확인됐어요
어제
Rest: an 8 circle in danger on line 1, in the leading slot
On an icon or a tab it is 6 with a 1.5 ring, never a row marker
Anatomyan 8 circle, danger #A3261F, in the leading marker slot (8 + 8) and riding line 1 through the line slot: its top sits (line − 8) / 2 below the text-box top (7 at 15/22, 8 at 17/24), so it is centred on line 1’s centre at every text size; a 6 dot with a 1.5 canvas ring stays for a dot that rides an icon or a tab (the badged host, at the host’s corner); never the brand ball as a dot fill on whiteSpokenhidden; the row’s name begins “읽지 않음, …”; cleared instantly, no announcementReplacesthe hung 7 px unread dot (DOT_SIZE.XS, Dot)UseCounts are Count tags, not dots.

Avatar

A person, or a group of people, as a circle.

김
김
김
김
Sizes 32, 40 (rows), 48 (Roster), 56 (identity); initials never scale
A photo when present
김이
박최
Group: two members at 0.6×, the front one in a 2 canvas ring
이
Anonymous where privacy hides names; presence on the corner
박
정
+4
Avatar row: 40 × n, gap 8, +N, pressable as a whole
Loading: a gray100 circle
김
김이
Dark
Anatomycircle 40 (rows, default) · 48 (Roster) · 56 (identity block) · 32 only in Tag-sized contexts; initials 15/22·600 (40), 17/24·600 (48), 20/28·700 (56), ink on gray100; a photo when present; initials do not scale with text (the circle is fixed)Variantsavatar row: 40 × n, gap 8, "+N" as a 40 gray100 circle 13/18·600 · group: two members at 0.6× offset diagonally, the front one inside a 2px canvas ring, inner avatars 20 in a 32 box and 24 in a 40 box · anonymous: a gray100 circle with a user glyph in secondary (20 in 40, 16 in 32) · presence: a 10 dot on the bottom-right corner with a 2px canvas ringSpokenin a row decorative (the name beside it says it); group: the member names; anonymous: "참석자"ReplacesAvatarBubble, AvatarStack (overlap −6)

Medal set

One set feeds the glyph tile, the Podium rings and every medal use.

브론즈
실버
골드
플래티넘
잠김
숨김
Light, 56: bronze plain, silver 1 star, gold 2, platinum a double frame and 3; locked and hidden are outlines
브론즈
실버
골드
플래티넘
잠김
숨김
Light, 48 compact: the same ladder
브론즈
실버
골드
플래티넘
잠김
숨김
Dark, 56: the same ladder, platinum lighter
브론즈
실버
골드
플래티넘
잠김
숨김
Dark, 48 compact
첫 우승
2026년 9월 12일 달성
친구 10명 만들기
진행 중
7/10
숨겨진 업적
조건을 달성하면 알려줘요
In a list: earned with its date; locked with progress 7/10
Medal set (dark keeps the same fills, except platinum)
bronzefill #B2580B · white glyph · 4.89:1silverfill #8E8E93 · ink #15181A glyph · 5.47:1goldfill #D9A00F · ink glyph · 7.63:1platinumfill #4A6378 (dark #56738B) · white glyph · 6.27:1 (dark 4.98:1)Laddera higher tier carries more ornament in the glyph colour: silver a frame (inset 4, 1.5) and 1 star, gold the frame and 2, platinum a second 1 line (inset 7) and 3 (middle 1 larger); stars 8 (56) and 6.5 (48); the line breaks 2 outside each starEarned / lockedan earned tile is the solid fill with its glyph; a locked or hidden tile is an outline (1.5 $border, no fill) with the glyph in secondary; no tier word is printedUseEarned and locked never look alike.
Checked in Chromium with scripts/verify-flat-v2-boards.mjs: 228 frames, rail 0, type scale 0, targets 0, shadows 0, middle dots 0, ball actions 0. Measured heights: MediaRow 96 (discovery), 80, 74 (same court), 72 (compact); PersonRow 68, 64 with no line 2, 116 with an AnswerPair (94 with none); ResultRow 128; Text row 68; Cell 48 (68 two-line); Roster 104 (126 with two-line names); Section head 72 (64 first, with a note); Day header 58; Team lines row 56 (52 with no numerals). Leading marker slot: dot at 20, avatar at 36, text at 88 (thumb row 104, text row 36, Select mode 56 and 108).
Spec (grounding, anatomy)

Library board for the rows, cells and labels families of the shared flat v2 kit. Frames only; specs behind the toggle.

grounded in 40 source file(s)
packages/app/src/presentation/components/sessions/session-card-v2.tsxpackages/app/src/presentation/components/sessions/session-card-from-entry.tsxpackages/app/src/presentation/components/sessions/session-media-row.tsxpackages/app/src/presentation/components/sessions/directory-venue-card.tsxpackages/app/src/presentation/components/searched-venue-row.tsxpackages/app/src/presentation/components/venue-media-row.tsxpackages/app/src/presentation/components/person-row.tsxpackages/app/src/presentation/components/leaderboard-row.tsxpackages/features/records/src/leaderboard/leaderboard-parts.tsxpackages/features/records/src/leaderboard/leaderboard-list.tsxpackages/features/clubs/src/club-members/member-row.tsxpackages/features/clubs/src/club-dues/page/dues-person-row.tsxpackages/app/src/presentation/components/dm/dm-thread-row.tsxpackages/ui/src/person-row.tsxpackages/ui/src/cell.tsxpackages/ui/src/picker-cell.tsxpackages/app/src/presentation/utils/identity-block-model.tspackages/app/src/presentation/components/sessions/session-day-header.tsxpackages/ui/src/section-head.tsxpackages/ui/src/expand-toggle.tsxpackages/features/sessions/src/session-detail/page/session-roster-section.tsxpackages/ui/src/avatar-stack.tsxpackages/ui/src/dot.tsxpackages/ui/src/box-sizes.tspackages/features/sessions/src/scorecard-page/schedule-match-row.tsxpackages/ui/src/badge.tsxpackages/ui/src/badge-visual.tspackages/ui/src/marker-pill.tsxpackages/app/src/presentation/components/reliability-pill.tsxpackages/app/src/presentation/components/status/tier-range-badge.tsxpackages/app/src/presentation/components/status/badges/club.tsxpackages/app/src/presentation/components/status/badges/club-alarm.tsxpackages/app/src/presentation/components/sessions/session-strip-ui.tsxpackages/app/src/presentation/components/elo-tier-badge.tsxpackages/app/src/presentation/components/tier-badge-utils.tsxpackages/ui/src/corner-count-badge.tsxpackages/ui/src/pulse-dot.tsxpackages/ui/src/avatar.tsxpackages/ui/src/avatar-visual.tspackages/features/clubs/src/club-detail/club-manage-sheet.tsx