Skip to main content
ENKO

간격

간격은 콘텐츠를 읽기 쉽게 하고, 어떤 요소끼리 한 묶음인지 보여 준다. 모든 값은 토큰에서 가져온다. 임의의 숫자는 쓰지 않는다.

빽빽한 금융 화면을 읽기 쉽게 만드는 가장 싼 방법이 간격이다. 동시에 가장 쉽게 어긋나는 부분이기도 하다. 예외 하나하나는 별문제 없어 보이기 때문이다. 아래 스케일은 닫혀 있다. 스케일에 없는 값은 쓸 수 없다.

간격 스케일

4px을 기본 단위로 한다. 컴포넌트와 레이아웃은 이 스케일에 있는 값만 쓴다.

TokenValuepx
space-000
--ds-space-10.25rem4
--ds-space-20.5rem8
--ds-space-30.75rem12
--ds-space-41rem16
--ds-space-51.5rem24
--ds-space-62rem32
--ds-space-72.5rem40
--ds-space-83rem48
--ds-space-94rem64
--ds-space-106rem96

5단계부터 간격이 크게 벌어지는 이유

1–4단계는 4px씩 늘어나고, 5단계부터는 24, 32, 40, 48, 64, 96으로 크게 뛴다. 일부러 그렇게 했다. 작은 간격은 한 요소 안의 부분을 나누는 데 쓰여서 세밀하게 조정할 수 있어야 하고, 큰 간격은 서로 다른 요소를 떼어 놓는 데 쓰여서 차이가 확실해야 한다. 28px과 32px은 보는 사람이 구분하지 못하니 둘 다 둘 필요가 없다.

그래서 20px은 없다. 20px을 쓰고 싶은 자리는 사실 16px 관계이거나 24px 관계다. 둘 중 하나를 고르게 하는 것이 이 스케일의 목적이다.

값은 px이 아니라 rem으로

모든 단계를 rem으로 정의해서, 브라우저나 OS의 글자 크기를 바꾸면 레이아웃 전체가 함께 커진다. 글자 크기를 125%로 쓰는 사용자는 간격도 125%가 된다. 커진 글자를 고정된 간격에 억지로 밀어 넣지 않고, 리듬을 그대로 유지한다.

Do / Don't
Do
Send request
Cancel

12px gap between stacked buttons. Each action is visually distinct.

Don't
Send request
Cancel

0px gap merges buttons together. Hard to distinguish separate actions.

Spacing scale
space-1
4px / 0.25rem
space-2
8px / 0.5rem
space-3
12px / 0.75rem
space-4
16px / 1rem
space-5
24px / 1.5rem
space-6
32px / 2rem
space-7
40px / 2.5rem
space-8
48px / 3rem
space-9
64px / 4rem
space-10
96px / 6rem

토큰별 용도

간격 토큰마다 맡은 역할이 있다. 프리뷰에는 레드라인 주석을 쓴다. 정확한 간격 값만큼 붉은 영역을 칠하고 경계선을 그어 표시하는 방식이다.

TokenPxUsage in Senco
space-14배지 점과 라벨 사이, 촘촘한 컴포넌트 안의 아이콘 간격
space-28나란히 놓인 버튼 그룹 간격(Money/Crypto 탭), FormField 내부 간격(라벨 → 입력 → 도움말)
space-312거래 행 내부 패딩, 촘촘한 목록 항목 패딩
space-416세로로 쌓인 폼 필드 사이, 기본 컴포넌트 패딩, 화면 가장자리 여백(모바일)
space-524카드 패딩(모든 면), 콘텐츠 영역 패딩, 그리드 거터(태블릿)
space-632페이지 섹션 사이, 화면 여백(데스크톱), 그리드 거터(데스크톱)
space-740큰 섹션 구분
space-848페이지 섹션 사이 세로 간격, 히어로와 콘텐츠 사이
space-964큰 섹션 사이를 크게 끊을 때
space-1096페이지 위아래 패딩, 빈 상태를 세로 가운데에 놓을 때

이름으로 기억하는 간격

자주 나오는 관계 세 가지는 숫자보다 이름으로 기억해 두는 게 낫다.

RelationshipValueAppears in
아이콘과 라벨space-2 (8)버튼, 상태 칩, 내비 항목, 목록 행
필드와 필드space-4 (16)제품의 모든 폼
섹션과 섹션space-6 (32)대시보드, 설정, 송금 검토

새 컴포넌트에 이 셋 중 하나가 필요하면 따로 고민하지 않고 표의 값을 쓴다. 이 값이 제각각이 되면 폼마다 다른 제품처럼 보이기 시작한다.

송금 플로우의 세로 리듬

핵심 플로우는 시스템에서 규칙이 가장 엄격한 곳이다. 모든 단계가 서로 다른 화면 네 개가 아니라, 한 화면이 다음으로 넘어가는 것처럼 보여야 하기 때문이다.

RegionSpacing
화면 가장자리 → 콘텐츠모바일 space-4 (16), 데스크톱 space-6 (32)
단계 제목 → 본문space-2 (8)
본문 → 첫 필드space-5 (24)
필드 → 필드space-4 (16)
마지막 필드 → 액션 바space-6 (32)
액션 바 내부 패딩space-4 (16)
Where to use each token
space-1 — Icon / dot to label
4px
Completed
space-2 — Inline button group gap
8px
space-3 — List item internal padding
12px
12px
Adaeze O.
-250 USD
Kwame M.
-120 USD
space-4 — Form field vertical gap
Devon
16px
Kim
space-5 — Card padding
24px
24px
From
Devon Kim
Canada
To
Min-ji Kim
South Korea
space-6 / space-8 — Section vertical spacing
32px
48px

원칙

PrincipleRule
묶기관련된 요소 사이는 좁게(8px)
나누기서로 다른 섹션 사이는 넓게(32px 이상)
세로 리듬블록 사이 세로 간격을 일정하게 유지한다
컴포넌트 내부컴포넌트 안쪽 패딩은 스케일 값을 쓴다
컴포넌트 외부컴포넌트 사이 margin은 스케일 값을 쓴다

장식보다 근접성

두 요소가 한 묶음이라면 테두리, 배경, 구분선을 넣기 전에 먼저 둘 사이 간격을 줄인다. 묶음을 보여 주려고 테두리가 필요한 카드는 대개 안쪽 간격이 잘못돼 있다. 이 원칙을 지키면 필드 아홉 개짜리 주소 폼이나 거래 목록 같은 빽빽한 화면도 상자만 잔뜩 쌓인 모습이 되지 않는다.

간격은 부모가 정한다

컴포넌트는 스스로 바깥 margin을 주지 않는다. 자기 패딩만 갖고, 간격은 컨테이너가 정한다. margin-bottom이 내장된 컴포넌트는 다른 간격이 필요한 레이아웃에서는 쓸 수 없다. 디자인 시스템에서 space-4와 space-4가 겹쳐 아무도 의도하지 않은 32px이 생기는 가장 흔한 원인이기도 하다.

레이아웃의 간격은 자식의 margin이 아니라 gap으로 준다.

권장과 금지

DoDon't
Use space-4 between every form fieldUse space-4 here and space-3 there because a field "looks tall"
Let the container set the gap with gapGive a component its own margin-bottom
Tighten spacing to show groupingAdd a border to show grouping that spacing could carry
Use space-5 for all card paddingUse 20px because 24 "felt like a lot"
Scale spacing with remMix a px margin into a rem layout
Grouping vs. separation
Related — 8px gaps
8px
8px
Distinct — 32px gaps
32px
32px

간격 유틸리티

간격 유틸리티 클래스는 RTL/LTR을 지원하도록 논리 속성을 쓴다.

ClassPropertyAvailable values
snc-m-{n}margin (모든 면)0–6
snc-mt-{n}margin-block-start0, 2, 4, 6
snc-mb-{n}margin-block-end0, 2, 4, 6
snc-my-{n}margin-block4, 6
snc-mx-automargin-inline: auto—
snc-p-{n}padding (모든 면)0, 2, 3, 4, 5, 6
snc-px-{n}padding-inline4
snc-py-{n}padding-block2, 3, 4

유틸리티는 일부러 일부만 만들었다. 여러 화면에서 반복되는 단계만 유틸리티로 열어 두고, 나머지는 컴포넌트 토큰으로 적용한다. 스케일의 모든 단계에 유틸리티가 있으면 컴포넌트 대신 유틸리티를 조합해 레이아웃을 만들게 된다.

물리 속성 대신 논리 속성

margin-top 대신 margin-block-start를, padding-left/right 대신 padding-inline을 쓴다. Senco는 오른쪽에서 왼쪽으로 쓰는 문자권 시장에도 출시되는데, 논리 속성을 쓰면 스타일시트를 따로 만들지 않아도 RTL 레이아웃이 좌우로 뒤집힌다.

알려진 공백

ItemStatus
space-0값으로는 쓰지만 --ds- 변수로 정의하지 않음
시맨틱 간격 규칙(인라인 간격, 필드 간격, 섹션 간격)Tokens에 관례로 문서화함. ds.css에는 선언하지 않음
snc-px-* / snc-py-* 범위일부만 있음. 위에 적은 값만 존재한다