How every component presses, disables, scales, moves, speaks and sits on the screen: drawn once here, assumed by every page board.
Every pressable answers a touch inside itself: it settles and dims, with no band over it. A pointer dims it, the keyboard rings it.
Three ways a control waits. Disabled is inert. Soft-disabled is grey but still answers. Loading keeps its label.
Text follows the system size from 85% to 200%. Each kind of text stops growing at its own cap, and from 150% the layouts stack so nothing is cut.
Motion has a purpose or it is absent. Effects fade, spatial moves may spring, nothing makes a person wait, and Reduce Motion replaces a move with a short fade.
A screen reader walks the same screen the eye does: one stop per row, one h1, names composed from the row's own data, and focus that goes back where it came from.
| 1 | back | button | 뒤로 |
| 2 | share | button | 공유 |
| 3 | save | button | 저장 |
| header title | heading | hidden until it fades in as the page scrolls | |
| 4 | eyebrow | text | 강남 라켓클럽 |
| 5 | hero title | heading 1 | 올림픽공원 테니스장 (the one visible h1) |
| 6 | fact: when | text | 9월 19일 토요일, 오전 9시부터 11시까지 |
| 7 | fact: where | text | 송파구 올림픽로 424, 하드 4면 |
| 8 | fact: fee | text | 참가비 10,000원 (a Tag is read with its fact) |
| 9 | section head | heading 2 | 참석, 8명 중 6명, 2자리 남음 |
| 10 | section door | link | 전체 보기, 참석 |
| 11 | roster cell | button | 김민준, 호스트 |
| 12 | roster cell | button | 이서연, NTRP 4.0 |
| 13 | roster cell | button | 박지훈, NTRP 3.5 |
| 14 | roster door | button | 외 3명, 전체 보기 |
| 15 | section head | heading 2 | 정보 |
| 16 | Cell | text group | 종목, 복식 |
| 17 | Cell | text group | 대상, NTRP 3.0부터 4.0 |
| 18 | CTA button | button | 참석하기 |
The system owns the edges. The app paints under the bars, adds the real inset to its own bottom chrome, and gives way to the keyboard.
Nothing is drawn for a wait a person cannot feel, a skeleton that appears stays long enough to read, and a toast stays long enough to act on.
Behaviours every component shares, composed from the shared flat v2 kit.
flat-v2-kit.jsx
grounded in 31 source file(s)
packages/ui/src/pressable-visual.tspackages/ui/src/pressable.tsxpackages/ui/src/button.tsxpackages/ui/src/button-visual.tspackages/ui/src/motion.tspackages/ui/src/text.tsxpackages/ui/src/modal-panel.tsxpackages/ui/src/modal-panel-visual.tspackages/ui/src/skeleton.tsxpackages/ui/src/shimmer.tspackages/ui/src/pulse-dot.tsxpackages/ui/src/expand-toggle.tsxpackages/ui/src/reveal-stack.tsxpackages/ui/src/collapsing-header-layer.tsxpackages/ui/src/progress-bar.tsxpackages/app/src/presentation/components/toast-host.tsxpackages/app/src/presentation/stores/toast.store.tspackages/ui/src/accessibility-props-visual.tspackages/ui/src/accessibility-state.tspackages/ui/src/tab-accessibility.tspackages/ui/src/selection-accessibility.tspackages/ui/src/keyboard-navigation.tspackages/ui/src/horizontal-pan-gesture.tspackages/ui/src/stepper.tsxpackages/ui/src/safe-area.tspackages/ui/src/bottom-inset-reservation.tsxpackages/ui/src/wizard-shell.tsxpackages/ui/src/detail-shell.tsxpackages/ui/src/main-tab-shell.tsxpackages/app/src/presentation/hooks/use-leave-guard.tsapps/mobile/app.json