← Cockpit Wireframes Pages by level Navigation map
Panel Placement · 하단 고정▾
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 · 하단 고정
Archived — superseded by Library — controls, overlays, states, forms
Interactive kit · grounded in code

Panel Placement · 하단 고정

Panel placement — bottom-docked pickers, menus, and filtersExternal UI/UX audit: dock pickers, action menus, and filter cascades at the bottom of the screen for one-handed thumb reach (the Toss/KakaoTalk pattern), keeping confirms centered. `ModalPanel` today always centers (modal-panel.tsx: Root's `alignItems="center" justifyContent="center"`) — the same primitive, the same auto- height-capped-at-88% layout contract, the same hardware-back and dismiss-on-overlay semantics either way. STYLE-3 (docs/canon/styling.md, "Bottom sheets are RETIRED") retired the bottom-sheet LIBRARIES — Tamagui `Sheet` portal bugs, `@gorhom` crashing the web bundle — and forbids a drag handle + snap points; a bottom PLACEMENT of the same native-`Modal` `ModalPanel` reintroduces none of that. Phones A/B compare the shipped `ReactionPickerModal` (post-row.tsx) as-is vs. docked; Phone C docks `HeaderActionsMenu` with club-detail's real 공유/나가기 rows; Phone D shows what does NOT move — the leave confirm stays centered. Open question: should `ModalPanel.Frame` gain a `placement` prop, defaulted to bottom for pickers/menus/filters, centered kept for confirms?
박준호3시간 전자유게시판
다음 주 토요일 정모 있어요! 참석 여부 남겨주세요 🎾
12
💬4
👍8
👏
🔥3
❤️
😂
Now — shipped`ReactionPickerModal` (post-row.tsx:80-127) — centered `ModalPanel`, the built-in X close button, 5 reaction pills in a wrapped row. Same primitive as every other `ModalPanel` consumer in the app; no bottom-sheet library, no handle, no snap points.
박준호3시간 전자유게시판
다음 주 토요일 정모 있어요! 참석 여부 남겨주세요 🎾
12
💬4
👍8
👏
🔥3
❤️
😂
ProposalSame picker, docked at the bottom — full width, top corners `$4` (16px), bottom corners square against the screen edge, no handle. Overlay stays above it; the Frame's own `paddingBottom` becomes `base + inset` (resolveBandPaddingBottom, bottom-cta-band- visual.ts) exactly the way `BottomCtaBand` already computes it — the device's bottom inset painted once, not stacked with a second reservation. Closes by overlay tap or hardware back, unchanged from today.
양재 테니스 클럽142명 · 강남구
홈일정채팅랭킹멤버회비
클럽 공유
🚪클럽 나가기
Proposal — action menu`HeaderActionsMenu` (club-detail-screen.tsx's real `clubActions`: 공유 default tone, 나가기 destructive tone, member-and-not-owner only), docked at the bottom. Rows keep their real 44pt `minHeight`; the destructive row stays last, after the one `Divider` the menu anatomy law requires (docs/canon/components.md).
양재 테니스 클럽142명 · 강남구
홈일정채팅랭킹멤버회비
이 클럽을 나가시겠어요?나가면 다시 초대 코드로 가입해야 해요
취소
나가기
UnchangedThe real 나가기 confirm (`ConfirmSheet`, club-detail-screen.tsx's `handleLeaveClub`) — title "이 클럽을 나가시겠어요?", message "나가면 다시 초대 코드로 가입해야 해요", 취소 / 나가기 buttons. Stays centered — a confirmation is an interruption, not a reach task.
Claude recommends: YESBottom placement for pickers, menus, and chip option lists (thumb reach, the Toss/Kakao grammar the audience knows), centered for confirms and anything that must interrupt; one prop on `ModalPanel.Frame`, no new primitive, no handle, no snap points.Rejected: reintroducing a `Sheet`/`@gorhom` library (STYLE-3); a drag handle or snap points (the no-scroll-drag law and STYLE-3); a bottom position for confirms (interruptions read centered).
Spec (grounding, anatomy)

PROPOSAL (2026-09-17) — an external UI/UX audit recommending `ModalPanel placement="bottom"` for pickers, action menus, and filter cascades (Toss/KakaoTalk one-handed thumb reach), keeping confirms centered. Phones A/B compare the shipped `ReactionPickerModal` centered vs. docked; Phone C docks `HeaderActionsMenu` with club-detail's real rows; Phone D shows the leave confirm staying centered, unchanged. One open question: should `ModalPanel.Frame` gain a `placement` prop?

grounded in 13 source file(s)
packages/ui/src/modal-panel.tsxpackages/ui/src/header-menu.tsxpackages/ui/src/confirm-sheet.tsxpackages/features/clubs/src/shared/post-row.tsxpackages/features/clubs/src/club-detail-screen.tsxpackages/features/clubs/src/shared/discover-filters.tsxpackages/ui/src/dropdown-chip.tsxpackages/ui/src/range-chip.tsxpackages/ui/src/chip-picker-panel.tsxpackages/ui/src/bottom-cta-band-visual.tspackages/app/src/config/i18n/ko/common.tspackages/app/src/config/i18n/ko/clubs.tsdocs/canon/styling.md