mbtdm 공통 UI 표준mbtdm UI Standard

모든 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.

0. 개요0. Overview

0.2

단계 구분Levels

필수REQUIRED1부 · 모든 서비스Part 1 · every service

항상 지킵니다. 회전, 안전영역, 키보드, 접근성 등.Always. Rotation, safe areas, keyboard, accessibility…

사용 시 필수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.

1.1

Viewport

필수REQUIRED
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
  • 페이지 폭을 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.

조건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).
  • 컨트롤 높이: 터치 40px 이상, 포인터 36px 이상.Control height: touch ≥40px, pointer ≥36px.
1.3

가로·세로 회전 대응Rotation

필수REQUIRED

회전은 “폭이 바뀐 것”으로 처리합니다. 구간을 넘으면 열린 메뉴를 닫고, 높이는 실제 보이는 영역으로 다시 잽니다.Rotation is “the width changed.” Crossing a switch point closes open menus; height is re-measured from the visible area.

세로: 드로어 열림Portrait: drawer open

회전 → 900px 이상: 드로어 닫힘, 사이드바 표시Rotate → ≥900px: drawer closes, sidebar shows

const vv = window.visualViewport;
const h = Math.round(vv ? vv.height : innerHeight);
document.documentElement.style.setProperty("--app-height", h + "px");
// on resize · orientationchange · visualViewport.resize, once per frame
  • 전체 높이는 100vh 대신 --app-height.Full height uses --app-height, not 100vh.
  • 연속 이벤트는 프레임당 한 번. 주소창 높이 변화는 무시.One update per frame; ignore address-bar-only height changes.
  • 회전 후 강제 맨 위 이동, 고정 px 위치 보정 금지. 화면 방향 잠금 금지.No forced scroll-to-top or fixed-px offsets after rotation. No orientation lock.
1.4

안전영역Safe areas

필수REQUIRED

빗금 부분이 안전영역입니다. 가장자리에 닿는 요소는 이 영역만큼 안쪽으로 여백을 둡니다.Hatched areas are safe-area insets. Edge-touching elements pad inward by them.

세로: 위·아래Portrait: top & bottom

가로: 좌·우 (자주 빠뜨림)Landscape: left & right (often missed)

padding-left: max(16px, env(safe-area-inset-left));
padding-bottom: max(16px, env(safe-area-inset-bottom));
1.5

키보드와 입력Keyboard and text input

필수REQUIRED

✓ 입력 칸과 버튼이 키보드 위Field and button above keyboard

✗ 키보드에 가려짐Hidden by keyboard

  • 입력 글자 16px 이상 (iOS는 16px 미만이면 포커스 시 화면 확대).Input text ≥16px (iOS zooms on focus below 16px).
  • type, inputmode, autocomplete, enterkeyhint 지정.Set type, inputmode, autocomplete, enterkeyhint.
1.6

로딩·빈 상태·에러Loading, empty and error states

필수REQUIRED

로딩Loading — 실제 크기의 자리표시real-size placeholders

빈 상태Empty — 한 줄 + 버튼 하나one line + one action

에러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
  • 버튼: aria-label, aria-expanded, aria-controls, 44px 대상.Button: aria-label, aria-expanded, aria-controls, 44px target.
  • 열면 맨 위부터, 포커스는 안으로 이동하고 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.
2.5

하단 탭바Bottom tab bar

사용 시 필수REQUIRED IF USED

3–5개, 아이콘+글자, 하단 안전영역 포함3–5 items, icon + label, bottom safe area

  • compact에서만 표시, 900px 이상에서는 펼친 내비로 대체. 키보드가 열리면 숨김.Compact only; replaced by expanded nav at ≥900px; hidden while the keyboard is open.
  • 드로어와 같은 항목을 중복해 넣지 않음.Doesn't duplicate drawer items.
2.6

팝업Popups

사용 시 필수REQUIRED IF USED

다섯 종류만 씁니다. 아래 버튼으로 실제 동작을 확인해 보세요 (닫기 버튼, 바깥 누르기, Esc).Only five types. Try them below (close button, outside press, Esc).

확인창Confirmation — [취소Cancel] [삭제Delete]

바텀시트Bottom sheet

팝오버·메뉴Popover / menu — 화면 안 8px8px inside viewport

토스트Toast — 안전영역 위above safe area

  • 닫기 버튼·스크림·Esc 모두 지원. 단, 입력 중이거나 처리 중이면 스크림·Esc로 닫지 않음.Close button, scrim and Esc — except while input is unsaved or work is in progress.
  • role="dialog", aria-modal, 포커스 이동·가둠·복귀, 배경 스크롤 잠금.role="dialog", aria-modal, focus move/trap/return, background scroll lock.
  • 팝업 위 팝업 금지 (확인창 한 단계만 허용). 위험 동작은 동사 버튼 (“확인” 아님).No popup on a popup (one confirmation allowed). Destructive actions use a verb (“Delete”, not “OK”).
  • 토스트는 role="status", 한 번에 하나.Toast: role="status", one at a time.
2.7

폼Forms

사용 시 필수REQUIRED IF USED
  • 레이블은 칸 위에 항상 표시. placeholder를 레이블 대신 쓰지 않음.Visible label above each field; placeholder is never the label.
  • 오류는 칸 아래 한 줄 (aria-describedby), 제출 시 첫 오류 칸으로 포커스.One-line error under the field (aria-describedby); focus first invalid field on submit.
  • 제출 중 비활성 + 진행 표시, 결과는 role="status". 실패와 임시 저장 구분.Disabled with progress while submitting; result via role="status"; failure ≠ draft saved.
  • 작성 중 이탈 시 확인 또는 자동 저장.Confirm or auto-save when leaving with unsaved input.
2.8

다크 모드Dark mode

사용 시 필수REQUIRED IF USED

적용 대상: 다크 테마를 제공하는 서비스. 제공 여부는 선택입니다 (3.9).Applies when the service offers a dark theme. Offering one is optional (3.9).

  • 라이트·다크·시스템 3가지, 기본은 시스템.Light, Dark, System; default System.
  • 사용자 선택은 첫 화면 그리기 전에 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 · language56 / 44 / 64px
3.5C 반투명 헤더Translucentblur 배경, 투명도 줄이기에서 불투명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
종류Typecompactexpanded
확인창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.8

간격 체계Spacing scale

선택OPTIONAL
4
8
12
16
20
24
32
48
  • 좌우 여백 clamp(16px, 3vw, 24px) + 안전영역, wide 본문 최대폭 1200–1320px.Side padding clamp(16px, 3vw, 24px) + safe areas; wide content max 1200–1320px.
3.9

테마 모드Theme modes

선택OPTIONAL

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

  1. 세로 진입 → 가로 회전 → 새로고침Open portrait → rotate landscape → reload
  2. 가로 진입 → 세로 회전Open landscape → rotate portrait
  3. 드로어·모달을 연 채로 회전Rotate with a drawer or modal open
  4. 키보드를 연 채로 회전Rotate with the keyboard open
  5. iPad 분할 화면·떠 있는 창iPad Split View and floating window
  6. 문서 폭·표시 폭·배율이 같은지 (메뉴 모양만 보고 판단하지 않기)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×810iPad 세로 / 가로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.

mbtdm · 2026-11-14 · 규칙 원문Full rules: UI-STANDARD.md