모든 mbtdm 앱·웹이 같은 방식으로 동작하게 하는 기준How every mbtdm app and site behaves
이 표준은 동작과 구조를 맞춥니다. 색, 글꼴, 모서리 같은 시각 스타일은 서비스마다 정합니다. 항목 번호는 고정되어 있어 “3.2B 적용해줘”처럼 명령으로 쓸 수 있습니다. 전체 규칙 원문은 UI-STANDARD.md에 있습니다.This standard aligns behavior and structure. Visual style — color, type, radius — is each service's choice. Item numbers are stable, so they work as commands like “apply 3.2B”. The full rule text lives in UI-STANDARD.md.
사용 시 필수REQUIRED IF USED2부 · 쓰고 있다면Part 2 · if you have it
요소를 쓸지는 자유지만, 쓴다면 이 규칙대로 동작해야 합니다.Adopting the element is optional; if present, it must behave this way.
선택OPTIONAL3부 · 새로 넣을 때Part 3 · when adding
권장 프리셋입니다. A/B/C 중 고르거나 건너뜁니다.Recommended presets. Pick A/B/C or skip.
검수VERIFY4부 · 출시 전Part 4 · before release
회전 시나리오, 체크리스트, 테스트 크기.Rotation scenarios, checklist, test sizes.
0.3
항목 적용하기 (매크로처럼 쓰기)Applying an item (use it like a macro)
다른 프로젝트에서 번호로 요청하면, 해당 항목의 Rules를 구현하고 Check를 통과시킨 뒤 docs/UI-DECISIONS.md에 기록합니다. 선택 항목에 옵션을 적지 않으면 Default를 씁니다.Ask by number in any project: the item's Rules are implemented, its Check passed, and the result recorded in docs/UI-DECISIONS.md. Without an option letter, the Default is used.
› 선택 3.1 적용해줘 › apply 3.2B › 2.1 기준으로 점검해줘 › apply all of Part 1
드로어나 탭바처럼 요소를 새로 넣는 3부 항목을 적용하면, 그 요소의 2부 규칙도 함께 적용됩니다. 예: 3.3A 적용 → 2.1 포함.Applying a Part 3 item that adds an element also brings in that element's Part 2 rules. e.g. apply 3.3A → includes 2.1.
1. 필수 — 모든 서비스1. Required — every service필수REQUIRED
어떤 서비스든 예외 없이 지킵니다. 벗어나려면 이유와 테스트 결과를 기록해야 합니다.Every service, no exceptions without a written reason and test result.
페이지 폭을 px로 고정하지 않고, 전체 확대 금지(user-scalable=no, maximum-scale=1)를 쓰지 않습니다.Never fix width in px; never disable zoom globally (user-scalable=no, maximum-scale=1).
html, body는 width:100%. 100vw로 덮어쓰지 않습니다.html, body are width:100%; never override with 100vw.
어떤 폭에서도 페이지 가로 스크롤이 없어야 합니다. 긴 도구줄만 자체 가로 스크롤.No horizontal page scroll at any width; only long toolbars scroll on their own.
✓폭에 맞게 흐름Content follows width
✗가로로 넘침Horizontal overflow
1.2
화면 구간과 전환점Ranges and switch points
필수REQUIRED
내비게이션 전환점은 어디서나 900px입니다. 지금 창 크기를 조절하면 빨간 선이 움직입니다.The navigation switch point is 900px everywhere. Resize this window to move the red line.
compact
medium
expanded
wide
070090012801680+
조건Condition
내비 형태Navigation
< 900px
접힘 (드로어 / 모바일 메뉴)Collapsed (drawer / mobile menu)
≥ 900px
펼침 (고정 사이드바 / 상단 메뉴)Expanded (sidebar / top menu)
(max-height:520px) and (orientation:landscape)
폭과 관계없이 접힘 (폰 가로)Collapsed regardless of width (phone landscape)
(pointer:coarse) ≤ 1100px
접힘 (iPad 가로 포함)Collapsed (incl. iPad landscape)
호버 스타일은 (hover:hover) and (pointer:fine) 안에만.Hover styles only inside (hover:hover) and (pointer:fine).
회전은 “폭이 바뀐 것”으로 처리합니다. 구간을 넘으면 열린 메뉴를 닫고, 높이는 실제 보이는 영역으로 다시 잽니다.Rotation is “the width changed.” Crossing a switch point closes open menus; height is re-measured from the visible area.
에러Error — 원인 + 다시 시도, 입력 유지cause + retry, input kept
1.7
접근성Accessibility
필수REQUIRED
터치 대상 44×44px 이상 (아이콘은 더 작아도 됨).Touch targets ≥44×44px (the icon itself may be smaller).
텍스트 대비 4.5:1 이상. 상태를 색만으로 구분하지 않음.Text contrast ≥4.5:1; never convey state by color alone.
키보드만으로 모두 사용 가능, :focus-visible 윤곽선 유지. Tab 키로 이 페이지를 직접 확인해 보세요.Fully keyboard-operable with a visible :focus-visible outline. Try Tab on this page.
아이콘 버튼에 aria-label, html lang을 내용 언어와 일치.Icon buttons get aria-label; html lang matches content.
1.8
사용자 설정 존중User preferences
필수REQUIRED
OS 설정OS setting
대응Response
prefers-reduced-motion
이동·크기 애니메이션 끄고 페이드만, 부드러운 스크롤 끔No movement/scale animation, fades only, no smooth scroll
prefers-reduced-transparency
반투명·blur 면을 불투명으로Translucent/blurred surfaces become opaque
1.9
레이아웃 복원력Layout resilience
필수REQUIRED
테스트 크기에서만이 아니라 모든 폭에서 깨지지 않아야 합니다. 아래 상자의 오른쪽 아래 모서리를 끌어 폭을 바꿔 보세요.The layout must hold at every width, not just the test sizes. Drag the bottom-right corner of the box below.
카드 제목이 길어도 줄바꿈됩니다Long card titles wrap instead of overflowing2026-11-14
짧은 제목Short title2026-11-13
https://example.com/a/very/long/unbroken/pathURL
320–2560px에서 천천히 늘이고 줄여도 겹침·잘림·가로 넘침 없음.320–2560px, resized slowly either way: no overlap, clipping or overflow.
flex-wrap, minmax(), clamp() 사용. flex·grid 자식에 min-width:0.Use flex-wrap, minmax(), clamp(); give flex/grid children min-width:0.
글자가 들어가는 요소의 높이를 고정하지 않음. 이미지·영상은 max-width:100%.Never fix the height of text containers; media use max-width:100%.
브라우저 확대 200%, OS 글자 크기 최대에서도 모든 내용·동작에 닿을 수 있음.At 200% zoom and largest OS text size, all content and actions stay reachable.
1.10
다국어 레이아웃Localized layout
필수REQUIRED
어떤 언어를 보여줘도 레이아웃이 틀어지지 않아야 합니다. 같은 버튼을 세 언어로 놓은 예입니다.Whatever language is shown, the layout must not shift or break. The same buttons in three languages:
✓폭이 글자에 맞춰 늘고, 모자라면 줄바꿈Width follows text; wraps when short of room
✗한 언어에 맞춘 고정 폭 → 잘림Fixed width sized for one language → clipped
영어보다 30–40% 긴 문구(독일어 등)를 견디도록. 버튼·탭·메뉴에 글자 폭 고정 금지.Allow 30–40% longer text (German etc.); no fixed text widths on buttons, tabs, menus.
넘칠 때 줄바꿈인지 말줄임(…)인지 요소마다 정하고, 말줄임이면 전체 문구를 툴팁·접근 이름으로 제공.Decide wrap or ellipsis per element; if truncated, expose the full text via tooltip / accessible name.
한국어는 word-break:keep-all, 긴 URL·합성어는 overflow-wrap:anywhere.Korean uses word-break:keep-all; long URLs and compounds use overflow-wrap:anywhere.
날짜·숫자·통화·복수형은 Intl로. 문자열 이어 붙이기 금지.Dates, numbers, currency, plurals via Intl; no string concatenation.
논리 속성(margin-inline-start)을 써서 오른쪽→왼쪽 언어도 추가 가능하게.Logical properties (margin-inline-start) so right-to-left languages can be added.
언어를 바꿔도 스크롤 위치·열린 패널·입력 내용 유지. 위의 KO/EN 버튼으로 확인해 보세요.Switching language keeps scroll position, open panels and input. Try the KO/EN switch above.
2. 사용 시 필수2. Required if used사용 시 필수REQUIRED IF USED
해당 요소를 쓸지는 서비스가 정합니다. 다만 쓰고 있다면 아래처럼 동작해야 합니다.Whether to have the element is the service's call. If it's there, it must behave like this.
2.1
햄버거 버튼과 드로어Hamburger button and drawer
사용 시 필수REQUIRED IF USED
적용 대상: 가장자리에서 본문 위로 미끄러져 나오는 패널.Applies when a panel slides over content from an edge.
이 페이지의 목차가 실제 예시입니다. 창을 900px 미만으로 줄이고 왼쪽 위 버튼으로 열어 보세요.This page's contents panel is a live example. Narrow the window below 900px and open it from the top-left button.
닫는 방법 (6가지 모두)Close on (all six)
스크림 터치 · 닫기 버튼 · Esc · 항목 선택 · 경로 변경 · 900px 전환Scrim tap · close button · Esc · item chosen · route change · crossing 900px
열면 맨 위부터, 포커스는 안으로 이동하고 Tab은 안에 가둠. 닫으면 버튼으로 복귀.Opens at top; focus moves in and is trapped; returns to the button on close.
스크림은 pointerdown에 닫고, 같은 터치가 아래를 누르지 않게 삼킴.Scrim closes on pointerdown and swallows the rest of that press.
배경 잠금은 html{overflow:hidden}. body{position:fixed} 금지.Lock with html{overflow:hidden}; never body{position:fixed}.
숨김 상태는 visibility:hidden + pointer-events:none.Hidden state is visibility:hidden + pointer-events:none.
2.2
고정 사이드바Persistent sidebar
사용 시 필수REQUIRED IF USED
≥ 900px
< 900px — 같은 항목, 같은 순서same items, same order
접힘 조건(1.2)에서는 드로어(2.1)로 바뀝니다.Becomes a drawer (2.1) under the collapsed conditions of 1.2.
접기 상태 저장, 현재 위치 표시 + aria-current, 독립 스크롤.Remember collapse state; mark current location + aria-current; scrolls independently.
2.3
Sticky 헤더Sticky header
사용 시 필수REQUIRED IF USED
position:sticky; top:0. position:fixed + body 상단 여백 방식 금지 (iPad Chrome 위치 오류).position:sticky; top:0. No position:fixed with reserved body padding (iPad Chrome bug).
구간별 높이 하나, 낮은 가로 화면에서는 줄임. 좌우 안전영역 반영, 배경 있음.One height per range, reduced in short landscape; side safe areas; has a background.
앵커 이동 시 제목이 가리지 않게 scroll-margin-top.scroll-margin-top so anchors aren't hidden under it.
2.4
메가메뉴·전체 화면 모바일 메뉴Mega menu / full-screen mobile menu
사용 시 필수REQUIRED IF USED
메가메뉴는 900px 이상에서만. 미만에서는 같은 항목을 전체 화면 메뉴로(2.1 규칙 적용).Mega menu only at ≥900px; below, the same items in a full-screen menu (2.1 applies).
열린 메뉴 높이는 보이는 영역 높이에 맞춰 폰 가로에서도 마지막 항목에 닿게.Menu height follows the visible viewport so the last item is reachable in phone landscape.
호버로 열리는 메뉴도 클릭·키보드로 열 수 있어야 함.Hover-opened menus also open by click/tap and keyboard.
사용자 선택은 첫 화면 그리기 전에 html[data-theme]로 적용 (깜빡임 없음). 오른쪽 위 시스템·라이트·다크 선택이 예시입니다.Apply the stored choice via html[data-theme] before first paint (no flash). The System/Light/Dark switch above is an example.
색은 토큰 파일 하나에서, 다크 값을 짝으로.Colors come from one token file, each with a dark value.
2.9
기기별 보정Device-specific workarounds
사용 시 필수REQUIRED IF USED
측정된 가장 좁은 조건(브라우저 + 기기 + 최상위 페이지)에만 적용. 나머지는 표준 동작 유지.Target the narrowest measured condition (browser + device + top-level); everything else stays standard.
공통 모듈 한 곳에, 설명 문서 링크와 “다른 환경에서는 실행 안 됨” 테스트를 함께.One shared module, linked write-up, and a test that it stays off elsewhere.
알려진 사례: iPad Chrome은 회전 후에도 innerWidth·100vw가 이전 폭에 남음 → iPad + CriOS + 최상위 페이지에서만 outerWidth 기준으로 viewport를 다시 씀. sticky 헤더 위치와 오른쪽 깜빡임은 미해결.Known case: iPad Chrome keeps the old innerWidth/100vw after rotation → rewrite the viewport from outerWidth only on iPad + CriOS + top-level. Sticky-header offset and right-edge flicker remain open.
3. 선택 — 새로 넣을 때의 권장안3. Optional — presets for adding something new선택OPTIONAL
옵션 글자로 고릅니다 (예: 3.2B). 글자를 적지 않으면 Default를 씁니다.Pick by option letter (e.g. 3.2B). Without a letter, the Default applies.
3.1
내비게이션 방식 고르기Choosing a navigation pattern
선택OPTIONAL
3.1A · 사이드바Sidebar 앱 기본값 · 섹션이 많거나 사용자 목록App default · many sections, user lists
3.1B · 상단 메뉴Top menu 사이트 기본값 · 섹션 7개 미만Site default · fewer than ~7 sections
3.1C · 하단 탭Bottom tabs 모바일 우선 · 동등한 목적지 3–5개Mobile-first · 3–5 equal destinations
고른 방식에 딸린 2부 규칙이 함께 적용됩니다: A → 2.1·2.2, B → 2.3·2.4, C → 2.5.The chosen pattern brings its Part 2 rules: A → 2.1, 2.2 · B → 2.3, 2.4 · C → 2.5.
3.2
햄버거 버튼 위치Hamburger placement
선택OPTIONAL
3.2A · 왼쪽 (Default)Left (Default) 드로어가 주 내비게이션일 때When the drawer is the main navigation
3.2B · 오른쪽Right 왼쪽이 로고인 사이트 (3.1B)Logo-led sites (3.1B)
아이콘 20–24px, 대상 44px, 열리면 ✕로 바뀌어도 됨. 한 화면에 하나만.Icon 20–24px in a 44px target; may morph to ✕ when open; one per screen.
3.3
드로어 방향과 폭Drawer side and width
선택OPTIONAL
3.3A · 왼쪽 내비Left nav min(290px, 86vw)
3.3B · 오른쪽 상세 패널Right detail panel min(360px, 92vw)
3.3C · 전체 화면 메뉴Full-screen menu 100%
3.4
사이드바 구성Sidebar layout
선택OPTIONAL
폭 240–280px. 아이콘만 있는 64px “레일”로 접기 가능.Width 240–280px; optional 64px icon “rail” when collapsed.
위에서부터: 주요 목적지 → 즐겨찾기 → 사용자 분류 → 맨 아래 설정·계정.From top: primary destinations → favorites → user groups → settings & account at bottom.
행 32–36px(포인터) / 44px(터치). 3.4B: 섹션 순서를 사용자가 바꾸고 계정에 저장.Rows 32–36px (pointer) / 44px (touch). 3.4B: user-reorderable sections saved to account.
3.5
헤더 구성Header layout
선택OPTIONAL
옵션Option
구성Contents
높이 compact / 낮은 가로 / expandedHeight compact / short ls / expanded
3.5A앱 헤더App header
햄버거 · 제목 · 동작 1–2개 · 넓으면 검색(최대 480px)Hamburger · title · 1–2 actions · search when wide (max 480px)
52 / 40 / 56px
3.5B사이트 헤더Site header
로고 · 메뉴 · CTA · 언어Logo · menu · CTA · language
56 / 44 / 64px
3.5C반투명 헤더Translucent
blur 배경, 투명도 줄이기에서 불투명Blurred background; opaque under reduced transparency
—
이 페이지 헤더는 3.5A + 3.5C 예시입니다.This page's header is 3.5A + 3.5C.
3.6
팝업 배치 프리셋Popup placement presets
선택OPTIONAL
종류Type
compact
expanded
확인창Confirmation
가운데Center, min(400px, 100% − 32px)
가운데Center, 400px
모달Modal
바텀시트 또는 전체 화면Bottom sheet or full screen
가운데Center, 480–640px
바텀시트Bottom sheet
하단 전체 폭Bottom, full width
팝오버로 바뀜Becomes a popover
팝오버Popover
바텀시트 또는 앵커Sheet or anchored
누른 요소 옆Next to trigger
토스트Toast
하단 가운데, 탭바 위Bottom center, above tab bar
하단 가운데 또는 끝Bottom center or end
위 2.6의 바텀시트 예시는 900px 이상에서 가운데 패널로 바뀝니다.The bottom-sheet demo in 2.6 becomes a centered panel at ≥900px.
3.7
토스트 표시 시간Toast timing
선택OPTIONAL
일반 4초, 실행 취소 포함 6초, 마우스를 올리거나 포커스하면 멈춤. 새 토스트가 기존 것을 대체.4s plain, 6s with Undo, paused on hover/focus; a new toast replaces the current one.
3.9A · 단일 테마 (Default)Single theme (Default) 라이트 또는 다크 하나, color-scheme 일치Light or dark, matching color-scheme
3.9B · 라이트 + 다크 + 시스템Light + Dark + System 2.8 규칙 함께 적용Brings in 2.8
3.9B 첫 진입(저장된 선택 없음)은 시스템 설정을 따름.3.9B: first visit with no stored choice follows the system.
선택지는 시스템·라이트·다크 3가지. 언제든 “시스템 따르기”로 돌아갈 수 있어야 함. 오른쪽 위 선택이 예시입니다.Offer all three — System, Light, Dark — so users can always return to System. The switch at top right is an example.
저장된 선택은 다음 방문 때 시스템보다 우선, 첫 화면 그리기 전에 적용.A stored choice wins on later visits and is applied before first paint.
3.10
언어 선택Language selection
선택OPTIONAL
옵션Option
동작Behavior
3.10A단일 언어 (Default)Single language (Default)
한 언어, html lang 지정. 1.10은 그 언어에 적용One language, html lang set; 1.10 still applies
3.10B다국어Multilingual
사용자가 언어 전환 가능User can switch languages
첫 진입은 navigator.languages에서 지원하는 첫 언어, 없으면 서비스 기본 언어. 이 페이지도 시스템 언어가 한국어면 한국어로, 아니면 영어로 시작합니다.First visit picks the first supported language in navigator.languages, else the default. This page starts in Korean if your system language is Korean, English otherwise.
사용자가 고른 언어는 저장(계정 우선)하고 다음 방문 때 시스템 언어보다 우선.A chosen language is stored (account first) and wins over the system language later.
첫 화면 그리기 전에 적용, 바꿀 때마다 html lang 갱신.Apply before first paint; update html lang on every switch.
웹사이트는 URL에 언어를 넣음(/ko/…, /en/…). 선택지는 국기가 아닌 각 언어 이름(한국어, English)으로.Websites put the language in the URL (/ko/…, /en/…). Show each language by its own name (한국어, English), never a flag.
4. 검수4. Verify검수VERIFY
4.1
회전 검수 시나리오Rotation scenarios
세로 진입 → 가로 회전 → 새로고침Open portrait → rotate landscape → reload
가로 진입 → 세로 회전Open landscape → rotate portrait
드로어·모달을 연 채로 회전Rotate with a drawer or modal open
키보드를 연 채로 회전Rotate with the keyboard open
iPad 분할 화면·떠 있는 창iPad Split View and floating window
문서 폭·표시 폭·배율이 같은지 (메뉴 모양만 보고 판단하지 않기)Document width, visible width and scale match (don't judge by menu shape alone)
4.2
출시 전 체크리스트Pre-release checklist
1부 1.1–1.10 Check 통과Part 1 items 1.1–1.10 checks pass
320 → 2560px 연속 크기 조절, 확대 200%, OS 글자 크기 최대 확인 (1.9)Continuous resize 320 → 2560px, 200% zoom, largest OS text (1.9)
가장 긴 언어로 390px·900px 확인 + 가짜 번역(문구 40% 늘림) 테스트 (1.10)Longest language at 390px and 900px + pseudo-localization (+40%) pass (1.10)
사용 중인 2부 항목 Check 통과Every Part 2 item in use passes
라이트·다크(있다면) 확인Light and dark (if offered) reviewed
docs/UI-DECISIONS.md에 적용 항목·옵션·예외 기록docs/UI-DECISIONS.md lists applied items, options, exceptions
4.3
테스트 기기와 크기Devices and sizes
크기Size
의미Represents
320×568
가장 작은 폰Smallest phone
390×844
폰 세로Phone portrait
844×390
폰 가로 (낮은 가로)Phone landscape (short)
810×1080 / 1080×810
iPad 세로 / 가로iPad portrait / landscape
899 · 900
전환점Switch point
1440×960
데스크톱Desktop
2560
대형 모니터 (본문 최대폭 유지)Large monitor (content cap holds)
브라우저: Safari(iOS·macOS), Chrome(iOS·Android·데스크톱), 앱 WebView. 크기는 Playwright로 자동화하고, 회전·키보드는 실기기로 확인합니다.Browsers: Safari (iOS, macOS), Chrome (iOS, Android, desktop), app WebView. Automate sizes with Playwright; check rotation and keyboard on real devices.