← Cockpit Wireframes Pages by level Navigation map
Foundations — grammar, colour, seams▾
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

Foundations

The rules every screen follows: the frame, rail, type, spacing, seams, colour, medals, radii, icons, targets, the leading marker and inline adornments.

Frame

One reference frame with its safe areas and the chrome that pins to its edges.

경기
예정번개 찾기테니스장
9월 19일 (토)내일
올림픽공원 테니스장
09:00~11:00
6/8
대치유수지체육공원
19:00~21:00
4/4
9월 20일 (일)모레
양재 시민의숲 코트
07:00~09:00
3/6
9:41
일정
홈클럽경기기록프로필
390 × 844 (iPhone 12 to 14 class) the top inset is read at runtime.
status area 44
header 56
content
tab bar 64
inset 34
Frame and safe areas
Reference frame390 × 844 pt (iPhone 12 to 14 class). The iPhone 15 is 393 × 852; the board draws one frame and every inset is read at runtime.Status area44 drawn on the reference frame (an iPhone 12 to 14 reports 47, a 15 reports 59); the real top inset is read at runtime. The header 56 sits below it; a height quoted as "chrome above the title" is measured below the status area.Bottom inset34 on an iPhone (home indicator). Android gesture and 3-button insets differ (24 and 48 are drawn); read at runtime.Paint-once lawThe device inset is painted exactly once, by whatever reaches the physical edge: the shell safe area, the tab bar (64 plus the inset) or the band. A band’s base padding overlaps the inset instead of adding to it: its bottom padding is max(16, inset).OrientationPortrait on phones until the first iOS build decides; the WCAG 1.3.4 departure is recorded. From 600 pt Android ignores the lock, so every layout reflows.ElevationNone. Separation is a scrim, an edge hairline or an ink surface; no shadows anywhere.
Pinned chrome stack (insets read at runtime)
HeaderStatus inset plus 56 (64 with a subtitle).Tab bar64 plus the bottom inset (98 at 34): the icon sits 12 down, so a badge clears the bar’s top by 8.5. The canvas fill continues under the system bar; the bar publishes its height to the chrome store.CTA band16, a helper (22 per line plus 8, when present), 52, then max(16, inset): 102 at the 34 inset, 132 with a one-line helper, 154 with two, 84 with the keyboard up; on screens without a tab bar.FABRight edge on the rail; bottom = tab-bar top + 16 on tab screens (114 from the screen’s bottom), inset + 16 elsewhere (50).ToastCentred; bottom = max(top of the bottom chrome, top of the keyboard) + 16: 114 over a tab bar, 118 over a band, 186 over the FAB (FAB top + 16).SheetA footer takes the CTA band’s geometry (16 above, max(16, inset) below); a Sheet without one ends max(16, inset) above the screen’s bottom.

Rail

One width-aware rail: nothing but a full-bleed surface enters the margin, and a block's inner edge lines up with the page's text edge.

클럽
다음 일정내일, 9월 19일 (토)
일정 보기
09:00
올림픽공원 테니스장
☀️ 18°
올림픽공원 테니스장
09:00~11:00
6/8
9:41
375 pt: rail 16, content 343.
클럽
다음 일정내일, 9월 19일 (토)
일정 보기
09:00
올림픽공원 테니스장
☀️ 18°
올림픽공원 테니스장
09:00~11:00
6/8
9:41
390 pt: rail 20, content 350.
클럽
다음 일정내일, 9월 19일 (토)
일정 보기
09:00
올림픽공원 테니스장
☀️ 18°
올림픽공원 테니스장
09:00~11:00
6/8
9:41
600 pt: rail 24, content 552.
Rail and content width
Under 390 (SE, mini, Android 360)Rail 16; content width − 32 (328 at 360, 343 at 375).390 to 599 (phones top out at 440)Rail 20; content width − 40 (350 at 390, 390 at 430, 400 at 440).600 and up (tablet, web)Rail 24; content width − 48, capped by ContentColumn (LAYOUT_WIDTH: reading 680, wizard 640, shell 1200).One tokenSEAM.rail is width-aware. Block padding equals the rail, so a block’s inner edge lines up with the page’s text edge.GridsDerived from the content width: seven equal day cells, four roster cells, n equal strip columns. Never a fixed 50 or 100.Keep-outNothing but a full-bleed surface (photo, band, hairline, block fill) enters the margin.WhyApple's own margin is 16 up to 375 pt and 20 from 390 pt (measured 20.00 at 414 and 440); Material and 당근 use 16, Toss and the banks 24.

Type

Eleven roles on Pretendard; each has a size, a line, a weight and a scale cap.

Specimen
Role
Size over line, weight
Min
1,482
display
40/48, 700
올림픽공원 테니스장
hero
24/32, 700
내일 일정
title
20/28, 700
대치유수지체육공원
headline
17/24, 600
일정이 바뀌면 알림으로 알려 드려요.
reading
16/24, 400 (500 to emphasise)
16
19:00~21:00 복식 NTRP 3.0–4.0
body
15/22, 400 or 500
15
참석 4/8 마감 임박
footnote
13/18, 500 or 600
13
여러 줄로 이어질 수 있는 설명이에요.
footnote, wrapping
13/20, 500
13
9월 19일 09:41
caption
12/18, 500
12
홈 클럽 경기 기록 프로필
tab label
12/16, 500 or 600
12
12 99+
count
12/16, 700
12
Each role at its real size, with its size, weight and minimum.
Roles
display 40/48, 700Class numeral (cap 1.5). The block figure; never two on a screen.hero 24/32, 700Class hero (cap 1.7). Detail title, identity name, strip figures, wizard step title.title 20/28, 700Class reading (cap 2.0). Tab-root header title, section title (the tab-root header title is chrome, 1.3).headline 17/24, 600Class reading (cap 2.0). Row line 1, dialog and sheet titles, lg button label (the pushed header title is chrome, 1.3).reading 16/24, 400 (500 to emphasise)Class reading (cap 2.0). Comment and post body, message bubbles, dialog and notice body, toast, coachmark, terms, input text, placeholder.body 15/22, 400 or 500Class reading (cap 2.0). Single-line UI text: row line 2, Cell label and value, md and sm button label, tab label, section action, roster names, CTA helper.footnote 13/18, 500 or 600Class label (cap 2.0). Tag, eyebrow, field label, support line, relative day, links row; one line only.footnote, wrapping 13/20, 500Class label (cap 2.0). Helper, caption row, meta that can wrap.caption 12/18, 500Class reading (cap 2.0). Non-essential text only: chart ticks, counters, timestamps, legends.tab label 12/16, 500 or 600Class chrome (cap 1.3). Tab-bar label.count 12/16, 700Class chrome (cap 1.3). Digits in a count Tag only; the Tag grows with them (20, then 28 from 130%).
Minimums
Reading text (anything people must read)16Primary single-line UI text15Informational labels (Tag, eyebrow, action, helper)13Non-essential text12Tab-bar label12Digits inside a badge12, weight 700Any Hangul12
Rules
Weight400 only from 15 up; 500 or heavier at 13 and below. Ladder: 400 body, 500 meta and values, 600 headline and Tags, 700 figures and titles. No bold below line 1 of a row.Line heightAt least 1.5 wherever small text can wrap (16/24, 13/20, 12/18). 15/22 (1.47) is the body size and counts as met; 13/18 is a one-line role.Colour of textInk for primary; secondary for meta from 13 up; tertiary only at 16 and up or for non-essential strings; $errorText for red at 14 and below.HangulThe advance is 0.864 em: a 350 column holds 27 syllables at 15, 25 at 16.Scale capsReading 2.0, label 2.0, hero 1.7, numeral 1.5, chrome 1.3 (tab-root and pushed header title, header mode controls, scope-tab label, FAB label, tab-bar label, count Tag, chart labels).

Spacing ladder

Every box size, gap and position is a multiple of 4; the ladder names the eight steps.

4
line 1 to line 2 in a row; numeral to unit; field to support line
8
icon to text; Tag padding; CTA helper to button
12
row padding; thumb to text; title to first row
16
tab row to a row; block gap; CTA band padding
20
rail; block and sheet padding
24
block to the next section head; band above and below
32
section seam above a section head
40
scroll tail above a bottom CTA band
Each step drawn as a square of its own size, at 1:1.
Spacing ladder
4line 1 to line 2 in a row; numeral to unit; field to support line8icon to text; Tag padding; eyebrow to figure in a block; CTA helper to button; gap inside an answer pair; Choice wrap gap12row vertical padding; thumb to text; section title to first row; day header to first row; CTA pair gap; wizard header buttons to the status area and to the progress bar16tab row to a row; chart inset; block internal gap; CTA band top padding, and its bottom padding where there is no inset20rail; block padding; sheet padding; FAB offset from the right edge24block or hero to the next section head; hero top; tab row to a title or day header; day header above; band above and below; step title under the progress bar32section seam (above a section head); hero to first section40scroll tail above a bottom CTA band
Every box size, gap and position is a multiple of 4; line heights are multiples of 2 that stack onto 4. Exempt, and listed per component: a height set by text lines (n times 22) and a computed media size (photo-grid tiles, composer tiles, equal-pitch columns). Pads, gaps and seams are never exempt.

Heading spacing

The space above a heading is about twice the space below, so the title belongs to its own rows.

올림픽공원 테니스장
09:00~11:00
6/8
내일 일정
전체 보기
대치유수지체육공원
19:00~21:00
4/4
양재 시민의숲 코트
07:00~09:00
3/6
Section head: 32 above, 12 below.
올림픽공원 테니스장
09:00~11:00
6/8
9월 20일 (일)모레
대치유수지체육공원
19:00~21:00
4/4
양재 시민의숲 코트
07:00~09:00
3/6
Day header: 24 above, 12 below.
Heading spacing
Section headMin-height 28; title 20/28 700 ink; action 15/22 500 secondary with a 16 chevron, 44 target; 32 above, 12 below to the first row.Day headerA 22 line box, no fixed height; date 15/22 600 ink; relative day 13/18 500 secondary at the right; 24 above, 12 below; no marker on the line.Step title (wizard)24/32 700, 24 under the progress bar.First heading under tabs24; the heading’s own space above is replaced by the tab seam, never added to it.WhyThe space above a heading is about twice the space below. Peers measure 33.8 above and 16.8 below, ink to ink; this ladder gives 37 and 17.

Seams

Two hairline tiers and one band: nothing else draws a line.

올림픽공원 테니스장
09:00~11:00
6/8
대치유수지체육공원
19:00~21:00
4/4
양재 시민의숲 코트
07:00~09:00
3/6
Row to row: no line; the 12 padding is the rhythm.
종목
복식
시간
09:00~11:00
참가비
10,000원
Cell to cell: a quiet hairline inset to the rail, none after the last.
올림픽공원 테니스장
09:00~11:00
6/8
모레 일정
전체 보기
대치유수지체육공원
19:00~21:00
4/4
Section to section: whitespace and the title, no line.
올림픽공원 테니스장
09:00~11:00
6/8
댓글
3개
Zone change: one band, 12 tall, 24 above and below.
종목
복식
시간
09:00~11:00
참가비
10,000원
Dark: the cell tier is white at 9%, the edge tier at 14%.
Seams
Row to row (media 80, person 68)No line; the 12 padding is the rhythm.Cell to cell (single-line 48 cells)A quiet hairline, inset to the rail on both sides, none after the last cell: cell tier #E5E5E5, 1 px.Section to sectionWhitespace and the section title, no line; the last row’s bottom padding is trimmed; 32 above the next section head.Zone change (hero to content, content to comments)One full-bleed band, at most one per screen: #F2F2F2, 12 tall, 24 above and 24 below.Block or hero to contentSpacing only: 24.Tab row to contentSpacing: 24 before a title or day header, 16 before a row.Sticky header or tab rowA hairline only while content scrolls under it: edge tier #D4D4D4, full-bleed.Tab bar and CTA bandA hairline only while content scrolls under it; no shadow; edge tier #D4D4D4.Dark modeEdge white 14%, cell white 9%; the band is black, darker than the canvas.The testDelete the line and keep the gap; if the two things still read as separate groups, there is no line. A line is allowed at a sticky or tab edge, between single-line cells of one group, and as the one band.

Colour

Scheme S2, Ball and Ink: one ball action, ink and grey everywhere else, and colour for state only.

RoleLightDark
Canvas
#FFFFFF
#0F1211
Surface
#FFFFFF
#1A201B
Ink
#0D100E
#DFE4DC
Secondary
#4F5851
#A9B3AB
Tertiary
#626C64
#8F968F
gray100
#F2F2F2
#363E38
Cell hairline
#E5E5E5
white 9%
Edge hairline
#D4D4D4
white 14%
Control boundary
#8E8E93
white 40%
Ball
#D6F04A
#D6F04A
Brand-weak
#EFF9B7
#3A4220
Block
#15181A
#2A302B
Brand mark
#006D37
#006D37
Success fill
#00695C
#00796A
Success text
#014B40
#75D1C6
Series 1 to 5
RoleLightDark
Success weak
#CBEBE5
#234340
Warning fill
#F5B301
#E2B13C
Warning text
#6B4A00
#E1B75C
Danger
#A3261F
#FA9B94
Error text
#A3261F
#FA9B94
Info
#4B0082
#C9B2F2
Info weak
#E8DCFB
#40365F
Court hard
#089AC3
#67D3FC
Court clay
#8D3D00
#DA875A
Court grass
#83971F
#BBD068
Backdrop
ink 40%
black 60%
Photo controls
ink 60%
ink 60%
Inverse surface
#0D100E
#DFE4DC
On inverse
#FFFFFF
#0D100E
Usage rules
1Ball is the screen’s one coloured action (FAB or CTA), plus the block figure and the level accent. Every control state is ink or grey; the focus ring is ink.2At most one Block per hub. The tab bar and scope tabs never carry brand colour.3Every state has a non-colour second cue (weight, fill, glyph, chevron), and every colour code has a glyph or a label (WCAG 1.4.1).4Inline links are ink and underlined.5At most seven hue families per viewport. Brand is never a status; a status is never a category.6Text is at least 4.5:1 on its real ground, and 6.5:1 at 14 and below. A control boundary, a switch track and a state-bearing fill are at least 3:1 (WCAG 1.4.11).
Roles and use
Canvas ($background)#FFFFFF light, #0F1211 dark. Page ground; cards and sheets use it too.Surface ($card)#FFFFFF light, #1A201B dark. Dark card and sheet.Ink ($text)#0D100E light, #DFE4DC dark. Text, controls, focus ring; the label on ball in both themes.Secondary ($textSecondary)#4F5851 light, #A9B3AB dark. Meta, labels from 13 up, inactive tab-bar items.Tertiary ($textTertiary)#626C64 light, #8F968F dark. Text at 16 and up (placeholder), chevron, pencil and lock glyphs, non-essential strings.gray100#F2F2F2 light, #363E38 dark. Tonal buttons, search and track fills, skeleton, empty-state disc, avatar ground.Cell hairline#E5E5E5 light, white 9% dark. Single-line cell groups.Edge hairline#D4D4D4 light, white 14% dark. Sticky edges, tab rows.Control boundary ($borderControl)#8E8E93 light, white 40% dark. Input, textarea and picker-field boundary; Switch off track.Ball#D6F04A light, #D6F04A dark. The one action (FAB, CTA, primary button), block figure, level accent.Brand-weak#EFF9B7 light, #3A4220 dark. 모집 중 Tag tint (ball at 40% over white).Block#15181A light, #2A302B dark. The ink block.Brand mark#006D37 light, #006D37 dark. The mark and the grass court tile only.Success fill ($success)#00695C light, #00796A dark. Paid, confirmed, win: dot, glyph and the solid Tag in light (white text on it).Success text ($successText)#014B40 light, #75D1C6 dark. Success text.Success weak#CBEBE5 light, #234340 dark. Success weak fill.Warning fill ($warningFill)#F5B301 light, #E2B13C dark. Deadline, unpaid, caution (with ink text).Warning text ($warningText)#6B4A00 light, #E1B75C dark. Warning text.Danger ($error)#A3261F light, #FA9B94 dark. Cancelled, overdue, live, destructive: fills, borders and text, one red (white text on it in light, ink in dark).Error text ($errorText)#A3261F light, #FA9B94 dark. The same red as a text role: field error, asterisk, danger counter, danger CTA helper.Info#4B0082 light, #C9B2F2 dark. Informational only.Info weak#E8DCFB light, #40365F dark. Informational weak fill.Court hard ($courtHard)#089AC3 light, #67D3FC dark. Court dot and tile: a category code; the venue name is always present.Court clay ($courtClay)#8D3D00 light, #DA875A dark. Court dot and tile.Court grass ($courtGrass)#83971F light, #BBD068 dark. Court dot and tile.Backdropink 40% light, black 60% dark. Behind a sheet or dialog.Photo controlsink 60% light, ink 60% dark. MediaBand overlay: circle ink 50% (70% under Reduce Transparency); top scrim ink 35% to 0 over the first 100.Inverse surface#0D100E light, #DFE4DC dark. Toast, coachmark, tooltip: ink in light; in dark it flips to a light surface, as Material’s does.On inverse#FFFFFF light, #0D100E dark. Text and glyphs on the inverse surface: white in light, ink in dark; a text action on it is ball in light, ink in dark.
Contrast, computed from the swatches
Secondary on white7.38:1Tertiary on white, on gray1005.46:1, 4.87:1Error text on white, on gray1007.36:1, 6.57:1Control boundary on white3.26:1White on the danger fill, on the success solid (Tag fills, light)7.36:1, 6.61:1Ink on ball, ball on white14.96:1, 1.28:1 (a ball control relies on its label)Ball on the block13.95:1Secondary on the dark canvas8.72:1Tertiary on the dark card5.47:1Text on the inverse surface, light and dark19.13:1, 14.82:1The dark inverse surface against the dark canvas14.59:1
S1 Court Green, lifted: the backup scheme (the brand green stays the primary)
Primary and block
#0F8446
Level accent (optic)
#C6E84B
Neutral fill
#F0F5F1
Hairline
#CAD4CC
White label on the primary 4.76:1; links are the primary, underlined; the semantic set is unchanged.

Medal set

One set feeds the glyph tile, the Podium rings and every medal use; dark mode keeps the same fills.

bronze
silver
gold
platinum
Earned: the solid fill with its glyph.
bronze
silver
gold
platinum
Locked: gray100 with the glyph in secondary.
bronze
silver
gold
platinum
Dark: the same fills.
Medal set
bronzeFill #B2580B, glyph white, 4.89:1; distance from gray100 (CIE76) 79silverFill #8E8E93, glyph ink #15181A, 5.47:1; distance from gray100 (CIE76) 36goldFill #D9A00F, glyph ink #15181A, 7.63:1; distance from gray100 (CIE76) 77platinumFill #4A6378, glyph white, 6.27:1; distance from gray100 (CIE76) 57RuleAn earned tile is the solid fill with its glyph; a locked tile is gray100 with the glyph in secondary. Earned and locked never look alike (CIE76 distance of at least 36 between any fill and gray100). Labels never carry the tier by colour alone: the tier is in the name.

Radii

Five radii: 6, 8, 12, 16 and full.

6
Tag
8
thumb, photo tile
12
button, club logo, notice, menu, toast, input, map face, Kakao button
16
block, sheet, dialog
full
avatar, pill, Choice, FAB
Each radius on a 96 square, with what uses it.
Radii
6Tag.8Thumb and photo tile.12Button, club logo, notice, menu, toast, input, map face, Kakao button.16Block, sheet, dialog.fullAvatar, pill, Choice, FAB.

Icons

Lucide at stroke 2, in three sizes by role, in the colour of the label beside them.

24
Actions: header, tab bar, IconButton, the map pin
20
Hero facts and inline glyphs: FAB icon, notice glyph, leading Button glyph
16
Chevrons, edit and lock cues, the alert glyph in a field error or a danger helper
24, 20 and 16 at 1:1.
Icons
24Actions: header, tab bar, IconButton; the map pin.20Hero facts and inline glyphs: FAB icon, notice glyph, leading Button glyph.16Chevrons, edit and lock cues, the alert glyph in a field error or a danger helper.RulesLucide, stroke 2, in the colour of the label beside it; header actions are ink (white over a photo or block). Inline glyphs beside text grow with it up to 1.5×; header glyphs, tab-bar icons and chevrons do not scale.

Targets

Every control has a target of at least 44, icon buttons 48; a smaller visual gets the rest by hit slop.

icon button 48
취소
sm Button 36, target 44
전체
Choice 36, target 44
Switch 52 by 32, target 48
일정
FAB 56
참석하기
primary full-width button 52
The visual in solid, its target dashed.
Targets
Icon button (header, IconButton, tab-bar item)48Primary full-width button52 tallFAB56Switch52 by 32 track inside a 48 targetSmaller visual (sm Button 36, Choice 36, Tag, text action)44 floor by hit slop, (44 − visual) / 2 per sideRulesAdjacent 48 targets sit with no gap (pitch 48); a trailing control never shares its row press area. The WCAG 2.5.8 minimum of 24 is the absolute floor; a visual under 24 (a 12 heatmap cell) needs an equivalent control.

Leading marker

A leading marker takes the first slot of the row, starting on the rail; nothing enters the margin and the text edge stays put.

김
김민준
토요일 경기 참석할게요
방금
이
이서연
코트 예약 완료했어요
어제
박
박지훈
비 오면 어떻게 할까요?
어제
최
최유나
다음 주 일정 올렸어요
월요일
The slot is reserved on every row, so all text edges match.
김
김민준
토요일 경기 참석할게요
방금
이
이서연
코트 예약 완료했어요
어제
박
박지훈
비 오면 어떻게 할까요?
어제
최
최유나
다음 주 일정 올렸어요
월요일
RETIRED
Retired: the hung dot enters the margin and the text edge jumps.
Leading-marker rules
LM1 Keep-outOnly a full-bleed surface (photo, band, hairline, block fill) enters the margin. No dot, glyph, Tag or text enters the margin on either side.LM2 SlotA leading marker takes the first slot of the row, starting on the rail. Slot = marker + gap: dot 8 + 8 = 16 (content edge x 36); checkbox 24 + 12 = 36; rank column 24, 32 or 40 + 12.LM3 Whole listThe slot is reserved on every row of a list that can show the marker, so all text edges match. A list that never shows one has no slot. In Select mode every row slot is the checkbox slot and the dot is hidden.LM4 HeadingsHeadings take no slot. Day header, section head and page title stay on the rail; a mark, if ever wanted, follows the date by 8.LM5 Size and colourA row marker is an 8 circle, unread in $error. A dot that rides an icon or a tab (tab bar, header badge) is 6. Never a ball dot.LM6 VerticalThe marker centres on line 1, not on the row, through the line slot (IA1): its top sits (line − 8) / 2 below the text-box top (7 for 15/22, 8 for 17/24), so a three-line row keeps it beside line 1.LM7 Order[marker 8][8][avatar 40][12][text] (text edge 88) and [marker][8][thumb 56][12][text] (text edge 104). Presence is a different marker: a 10 dot on the avatar’s bottom-right corner with a 2 canvas ring. Counts stay trailing.LM8 AccessibilityThe dot is hidden from assistive tech; the row’s one name begins "읽지 않음, …". Under text scaling the dot and gap stay 8 and follow line 1’s centre. No announcement when the dot clears.Cost16 of text width on rows that carry a marker (4.6% of 350).
Where the text starts (rail 20)
No leading element20Marker dot 8occupies 8 + 8 = 16; what follows starts at 36Checkbox 24 (Select mode, consent)occupies 24 + 12 = 36; what follows starts at 56Rank column 24, 32 or 40plus 12; the avatar starts at 56, 64 or 72Avatar 40occupies 40 + 12 = 52; the text starts at 72 (88 with a marker)Thumb 56occupies 56 + 12 = 68; the text starts at 88 (104 with a marker)

Inline adornments

A Tag, count, glyph or dot beside text is centred on the text's first line, at every text size.

Count Tag after a label
예정번개 찾기12대기2
100% centred on the first line: a 20 pill in a 22 line
예정번개 찾기12대기2
130% centred on the first line: a 28 pill in a 29 line
예정번개 찾기12대기2
200% centred on the first line: a 28 pill in a 29 line
Tag, dot and glyph
강남 라켓클럽 시니어 토요일 정기 모임 신입 환영모집 중
100% centred on the first line: the Tag stays on line 1.
이서연 시니어 클럽 회장 겸 총무
코트 예약 완료했어요
방금
200% centred on the first line: the dot never scales.
결제에 실패했어요. 카드 정보를 확인하고 다시 시도해 주세요.
130% centred on the first line: the glyph grows to 21.
Inline adornments (IA1 to IA6)
IA1 SlotAn adornment beside a label (Tag, count Tag, glyph, dot, spinner) attaches through one primitive, the line slot: a box exactly as tall as the label’s first line, with the adornment flex-centred in it and the slot anchored to the label’s top. The row aligns its children to the start, never to the centre, and no site carries its own margin.IA2 Formulaslot height = the line height of the label’s own role and scale class: 15/22 reading 22, 29, 44 at 100, 130 and 200%; 13/18 label 18, 23, 36; the 15/22 chrome label of a tab 22, 29, 29 (cap 1.3). The adornment’s top is (slot − adornment) / 2 below the label’s top. It is negative for a taller adornment, which overflows the slot and never grows the row (a 24 Tag beside a 22 line pokes out 1 above and below); a row that must hold it sets its own minHeight.IA3 First lineFor a label that wraps the slot stays at the top: a Tag after a name that wraps to two lines sits beside line 1, and a dot on a three-line row sits beside its first line.IA4 Sizes by scaleA glyph beside text grows by min(scale, 1.5). The count Tag grows with its numeral, box = ceil(20 × min(scale, 1.3) / 4) × 4: 20, 28, 28 at 100, 130 and 200%. The Level tag grows to ceil(24 × min(scale, 1.5) / 4) × 4. A dot never scales. The slot follows the label, so none of them needs an offset.IA5 Corner marksA badge on an icon or a tab is not inline: it anchors to its host’s corner with fixed offsets (the ring’s corner 3.5 above and beyond the 24 icon box) and is marked data-adorn="corner".IA6 ExemptionsAn adornment that centres on its container by design (a trailing glyph on a row that centres its trailing control) is marked data-adorn="box", and the check asserts it centred on its parent’s box. A name never earns an exemption.Text beside textText beside text of another size shares a baseline (a Section head’s title and count); it is not an adornment.Worked: the unread dottop = (line − 8) / 2: 7 beside a 15/22 line, 8 beside a 17/24 line, 10.5 beside the 29 line of 130% text.
Checked with the shared DOM verifier (yarn verify:flat-v2-boards): 27 frames, rail 0, type 0, targets 0, shadows 0, middle dots 0, ball actions 0.
Spec (grounding, anatomy)

The foundations of the flat v2 library (frame, rail, type, spacing, heading spacing, seams, S2 colour, medal set, radii, icons, targets, leading marker, inline adornments), drawn by the shared kit.

route · docs/design/flat-v2-component-library-2026-10-09.md §1 grounded in 8 source file(s)
docs/twomore_design_system/wireframes/flat-v2-kit.jsxpackages/ui/src/tokens.tspackages/app/src/config/themes/classic-grass.theme.tspackages/app/src/config/themes/index.tspackages/app/src/config/themes/shared-semantics.tspackages/app/src/config/themes/status-badge-palette.tspackages/app/src/config/themes/tamagui.tspackages/app/src/config/themes/theme.types.ts