Elevation
층 · 쌓임 맥락 · 표면 색 · 그림자 · 선 · 딤
고도(Elevation)는 UI 요소 사이의 깊이와 층을 눈으로 보여 주는 원칙이다.
원칙
bg-layer-basementbg-layer-defaultz-modalz-alert물리적인 세계의 높낮이를 빌려, 무엇이 무엇 위에 놓였는지 보여 준다. 사용자는 층을 보고 지금 다루는 것이 화면인지, 화면을 잠시 덮은 것인지를 안다.
층 번호는 화면 구조의 약속이고, 실제 앞뒤 순서(z-index)는 z-index 의 z-* 값이 정한다. 아직 두 웹 · 앱에 층 이름으로 들어가지는 않았다 — 앱 적용 단계에서 옮긴다.
쌓임 맥락 — Global · Local
층은 Global 과 Local 두 가지로 나눠 정한다.
- Global — 화면 전체의 구조적 층. 제품 화면 자체와, 그 위를 덮는 시트 · 경고창 같은 컨테이너다.
- Local — 한 층 안에서 콘텐츠끼리의 깊이. 늘 자기가 속한 Global 층 위에 놓인다.
Global 층
bg-layer-basementbg-layer-defaultz-modalz-alert| Global 층 | 무엇 | groo |
|---|---|---|
| 0 | 바닥 — 스크롤되는 모든 콘텐츠 뒤 | bg-layer-basement |
| 1 | 기본 — 카드 · 목록 · 입력칸 · 상단 내비게이션 | bg-layer-default |
| 2 | 시트 · 메뉴 시트 · 서랍 — 화면을 덮는 새 쌓임 맥락 | z-modal |
| 3 | 경고창 — 가장 급한 정보, 다른 모달보다도 위 | z-alert |
- 0 · 바닥 — 화면 맨 아래의 배경. 스크롤되는 모든 콘텐츠 뒤에 깔려 가장 깊은 곳이 된다.
- 1 · 기본 — 페이지의 기본 짜임. 카드 · 목록 · 입력칸 같은 콘텐츠 덩어리와 상단 내비게이션이 여기 있다.
- 2 · 시트 — 화면을 덮으며 새 쌓임 맥락을 만든다. 시트는 그 자체로 새 Global 층이 되어, 그 위의 목록은 시트를 바닥으로 한 Local 콘텐츠가 된다.
- 3 · 경고창 — 가장 급한 정보를 다루는 맨 위의 모달이다. 사용자의 즉각적이고 온전한 주의를 요구하므로, 이미 열린 시트를 포함해 모든 요소보다 위에 온다.
화면 바탕
폰 화면(Desk 앱 · 768 미만 웹)의 바닥은 늘 0 층 bg-layer-basement 다. 셸이 바닥을 칠하고, 화면은 그 위에 1 층(bg-layer-default)을 화면 종류대로 놓는다.
- 띠 화면 — 화면 폭 흰 띠를 쌓고, 띠 사이는 바닥이 보이는 틈으로 가른다(Divider 의 "강함"). 띠는 모서리 · 테두리 · 그림자가 없다. 틈은 띠 사이에만 있다 — 첫 띠는 머리 바로 아래에 붙고, 마지막 띠 아래에도 틈을 두지 않는다.
- 셸 밖 화면(로그인 · 스플래시 · 해지 완료 · 업데이트 게이트) — 회색 바닥 없이 흰 면 하나다.
- 흰 화면 — 화면 전체가 흰 층 하나이고, 묶음 · 구역은 목록 제목 · 구역 제목 · 여백으로 가른다.
어느 화면을 어느 모양으로 나눌지는 화면 이관 때 화면마다 비교 페이지로 고르고, 지금 그리는 화면의 이름은 Layout 의 "화면 바탕" 한 곳에 적는다. 상황 → 고를 것 표는 Layout 의 "화면을 나누는 법" 이다.
구역 띠 안의 머리 · 여백은 카드 안과 같은 값이다. 순자산도 폰에서는 모서리 없는 화면 폭 띠다. 데스크톱(768 이상)은 이 규칙 밖이다 — 같은 구역을 회색 바닥 위 Card 로 쌓는다.
띠 · 흰 화면 위에는 테두리 카드를 두지 않는다 — 흰 위 흰이라 테두리만 남는다. 목록은 바닥에 바로 두지 않는다 — 누른 줄의 바탕이 회색 위에서는 보이지 않는다. 띠 사이 틈은 옅어서(그림 아래 숫자) 띠가 하나로 붙어 보일 수 있다 — 묶음은 목록 제목이, 구역은 머리 글이 가른다. 값은 Layout 의 "화면 바탕" 이 정한다.
페이지 위 페이지
- 페이지 — Global 1
- 시트 — Global 2 · 새 쌓임 맥락
- 시트 안의 목록(Select) — 시트를 바닥으로 한 Local
Global 과 Local 의 구분이 페이지 위에 페이지가 쌓이는 짜임을 만든다. 새로 덮인 층은 곧 새 기준이 되므로, 그 안의 말풍선 · 목록도 그 층을 바닥으로 삼아 제대로 쌓인다. 목록 · 메뉴 · 팝오버는 z-floating, 말풍선 · 툴팁은 z-tooltip 하나씩이라 어느 층에서 열어도 그 층 위에 뜬다.
Local 층
목록 · 탭 · 버튼처럼 콘텐츠를 나타내는 요소는 자기가 놓인 표면(Global)의 층을 그대로 물려받는다. 그 안에서 위계와 중요도를 나누려고 1 ~ 3 으로 가른다.
| Local 층 | 무엇 | groo |
|---|---|---|
| 1 | 기본 콘텐츠 — 목록 · 탭 · 알림 띠 · 상단 내비게이션 | 층의 표면 |
| 2 | 떠 있는 동작 — 플로팅 버튼 | z-sticky |
| 3 | 잠깐 뜨는 알림 — 스낵바 | z-snackbar |
- 1 · 기본 콘텐츠 — 목록 · 알림 띠 · 탭 · 상단 내비게이션처럼 페이지의 뼈대를 이루는 요소.
- 2 · 떠 있는 동작 — 기본 짜임보다 위에 떠 있는 표면. 떠 있는 버튼(Floating Action Button)이 여기 든다.
- 3 · 잠깐 뜨는 알림 — 흐름을 막지 않으면서 바로 확인해야 하는 일시적 알림. 스낵바가 여기 든다.
같은 층 안에서 구분하기
stroke-neutral-subtle층이 같아도 그 안에서 쌓이는 순서를 나눌 수 있다. 상단 내비게이션과 목록은 둘 다 Local 1 이지만, 스크롤하면 목록이 내비게이션 아래로 들어가야 한다. 이때 내비게이션의 층을 올리지 않고, 선 · 그림자도 긋지 않는다 — Top Navigation 은 스크롤해도 바와 목록이 한 면이다(SEED Top Navigation 의 "고정된 영역과 스크롤되는 영역을 구분하기 위해 별도의 시각적인 장치를 표시하지 않습니다"). 데스크톱 머리 아래의 선도 긋지 않는다. 한 표면 안에서 머리와 본문이 따로 스크롤되는 대화상자 · Side Panel · Side Navigation 은 그 부품의 규칙대로 본문이 위로 스크롤되면 머리 아래에 얇은 선(stroke-neutral-subtle)을 긋는다. 높낮이 자체는 아래 세 방법으로 드러낸다.
고도를 드러내는 세 가지
표면 색
배경색의 밝기나 채도를 바꿔 나타낸다. 스낵바 · 떠 있는 버튼이 대표적이다. 특정 맥락에서는 톤 차이가 아닌 전혀 다른 색을 배경으로 써서 층을 나타내기도 한다. 다크 모드에서는 높은 층일수록 밝다.
그림자
가장 전통적이고 직관적인 방법이다. 빛이 있다고 보고, 얼마나 높이 떠 있는지를 그림자의 크기 · 퍼짐 · 투명도로 나타낸다.
shadow-s1shadow-s2shadow-s3shadow-s4shadow-s1shadow-s2shadow-s3shadow-s4| 토큰 | 값 | 쓰는 곳 |
|---|---|---|
shadow-s1 | 0 1px 2px 0 rgba(15, 18, 28, 0.05) | 옛 shadow-sm — 슬라이더 손잡이(2026-10-09) · 카드(2026-10-08)는 그림자를 걷었다 |
shadow-s2 | 0 2px 8px -1px rgba(15, 18, 28, 0.08), 0 1px 3px -1px rgba(15, 18, 28, 0.04) | 드롭다운 · 툴팁 · 떠 있는 버튼(옛 shadow-md) |
shadow-s3 | 0 8px 24px -4px rgba(15, 18, 28, 0.10), 0 2px 6px -2px rgba(15, 18, 28, 0.05) | 팝오버 · 작은 모달(옛 shadow-lg) |
shadow-s4 | 0 24px 48px -8px rgba(15, 18, 28, 0.16), 0 8px 16px -4px rgba(15, 18, 28, 0.08) | 큰 모달 · 서랍(옛 shadow-xl) |
shadow-s1-dark | 0 1px 2px 0 rgba(0, 0, 0, 0.30), inset 0 1px 0 0 rgba(255, 255, 255, 0.05) | 다크 — s1 |
shadow-s2-dark | 0 2px 8px -1px rgba(0, 0, 0, 0.40), 0 1px 3px -1px rgba(0, 0, 0, 0.20), inset 0 1px 0 0 rgba(255, 255, 255, 0.06) | 다크 — s2 |
shadow-s3-dark | 0 8px 24px -4px rgba(0, 0, 0, 0.50), 0 2px 6px -2px rgba(0, 0, 0, 0.25), inset 0 1px 0 0 rgba(255, 255, 255, 0.08) | 다크 — s3 |
shadow-s4-dark | 0 24px 48px -8px rgba(0, 0, 0, 0.60), 0 8px 16px -4px rgba(0, 0, 0, 0.30), inset 0 1px 0 0 rgba(255, 255, 255, 0.10) | 다크 — s4 |
그림자는 다크 모드에서 잘 보이지 않는다. 그래서 화면에서 주목도가 높은 몇 안 되는 요소 — 떠 있는 탭 바 · 떠 있는 버튼 · 메뉴 · 팝오버 — 에만 쓴다. groo 는 1차 수단으로 표면 색 차이를, 그림자는 보조로 쓴다.
선
표면의 가장자리에 테두리를 둬 영역을 나누고 높낮이를 암시한다. 사이드바의 오른쪽 선, 떠 있는 탭 바의 안쪽 테두리가 그 예다.
색 — 층 토큰
층 토큰은 콘텐츠를 담는 그릇의 표면 색이다. 글자나 아이콘 같은 개별 요소가 아니라 화면의 바탕과 층을 만드는 데에만 쓴다. 다크 모드에서는 높을수록 밝아진다.
| 토큰 | 라이트 | 다크 | 옛 이름 |
|---|---|---|---|
bg-layer-basement | #F5F6FA | #1A1F2E | bg-page |
bg-layer-default | #FFFFFF | #242938 | surface-default |
bg-layer-default-pressed | #F7F8FD | #353B4D | — |
bg-layer-floating | #FFFFFF | #2D3346 | — |
bg-layer-floating-pressed | #F7F8FD | #353B4D | — |
bg-layer-basement 와 bg-neutral-weak
bg-layer-basement — 바닥bg-neutral-weak — 카드 안 채움bg-layer-basement — 바닥bg-neutral-weak — 카드 안 채움두 토큰은 라이트 모드에서 비슷해 보이지만 다크 모드에서 다르게 움직인다.
bg-layer-basement— 다크에서 가장 낮은 0 층의 바닥색이다. 기본 화면의 배경으로 쓴다.bg-neutral-weak— 라이트의 밝기 톤에 맞춰 다크에서도 대응하는 톤으로 보인다. 카드 안의 입력칸 · 칩처럼 배경이 놓인 층에 맞춰 조정돼야 할 때 쓴다.
바닥 위의 채움
라이트에서 바닥 · 약한 배경(bg-neutral-weak) · 비활성(bg-disabled)은 같은 단계라, 회색 바닥 위에 바로 놓인 채움은 바닥에 묻힌다.
- 약한 배경 · 비활성으로 칠하는 것 — neutralWeak 버튼 · 안내 상자 · 스켈레톤 · 막힌 칸의 바탕 — 은 흰 표면(
bg-layer-default·bg-layer-floating) 위에만 둔다. - 회색 바닥 위에 바로 놓이는 버튼은 neutralOutline 이다. 입력칸은 테두리가 모양을 맡아 바닥 위에서도 보인다.
- 바닥 위에 자주 놓이는 Chip
solid바탕과 Segmented Control 트랙은 투명한bg-neutral-weak-alpha(누름bg-neutral-weak-alpha-pressed)로 칠한다 — 놓인 바탕에 섞여 어느 바탕에서나 보인다.
딤
모달 · 시트가 페이지 위에 뜰 때 뒤를 어둡게 덮는다.
| 토큰 | 값 | 주 용도 |
|---|---|---|
overlay-dim-light | rgba(0, 0, 0, 0.50) | 라이트 모드 modal/sheet 배경 dim |
overlay-dim-dark | rgba(0, 0, 0, 0.65) | 다크 모드 modal/sheet 배경 dim — 다크 표면 위 분리감 강화 |
구성과 일부 설명은 당근 SEED Design 의 Foundations 문서(Apache-2.0)를 바탕으로 했다. 값과 그림은 groo 것이다.