Divider
내용 사이를 나누는 1px 선. 같은 묶음 안은 들인 선, 묶음 사이는 끝까지 선이고, 크게 다른 내용 사이는 선이 아니라 8 간격(회색 바탕 위 흰 층 사이)이다. 반복되는 목록 줄 사이는 List 의 줄 사이 선(필요할 때만)이다.
구조는 당근 SEED Divider(Apache-2.0)를 따른다 — 1px 선 · 가로 · 세로 · 들임(16), 나누는 세기 셋(들인 선 · 끝까지 선 · 8 간격). 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-03 사용자 결정). 옛 Separator 를 대신한다 — 이름도 SEED 대로 Divider 다.
수치 원본은 divider.yaml이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.
- 계정
- 기본 통화대한민국 원
- 결제 알림
- 예산 알림
결제 수단생활비 카드
할부일시불
카테고리카페
수입320만원
지출148만원
남은 돈172만원
- 스타벅스 강남역점−5,600원
- 점심 식사−12,000원
- 계정
- 기본 통화대한민국 원
- 결제 알림
- 예산 알림
결제 수단생활비 카드
할부일시불
카테고리카페
수입320만원
지출148만원
남은 돈172만원
- 스타벅스 강남역점−5,600원
- 점심 식사−12,000원
직접 골라 보기
방향 · 들임 · 장식 여부를 고르면 스펙대로 그린 선과 그 코드, 보조 기술이 읽는지가 바뀐다.
결제 수단신한카드
할부3개월
import { Divider } from "@/components/ui/divider"
<Divider />Anatomy
| 부위 | 설명 |
|---|---|
| ⓐ Line | 선 — 1px. 바깥 여백이 없다. |
부위
| 부위 | 설명 |
|---|---|
root | 1px 선 — 바깥 여백이 없다(사이 간격은 쓰는 자리가 정한다) |
Properties
색 · 두께
선은 하나다 — 1px stroke-neutral-subtle(흰 바탕 1.15 · 다크 1.30). SEED 의 기본 선(neutral-muted, 1.15)과 같은 진하기라 새 토큰 없이 둔다. 굵은 선 · 짙은 선 · 점선을 두지 않는다 — 더 세게 나눠야 하면 선이 아니라 간격이다(아래 "세 가지 나누기").
공통
| 속성 | 값 | 비고 |
|---|---|---|
| 두께 | 1px | 모든 방향 · 모든 자리 1 — 굵은 선을 두지 않는다 |
| 배경 | color-stroke-neutral-subtle #EDEFF3 · 다크 #353B4D | 흰 바탕 1.15 · 다크 1.30(SEED 기본 neutral-muted 1.15 와 같은 진하기) — 장식이라 3:1 대상이 아니다 |
| 바깥 여백 | 0px | 선 위아래 · 좌우 간격은 쓰는 자리가 정한다(들임만 Divider 가 갖는다) |
Orientation
horizontal (기본) 은 세로로 쌓인 내용 사이 — 부모 폭 전체. vertical 은 가로로 놓인 칸 사이(통계 세 칸 · 버튼 묶음) — 높이는 부모가 정한다.
결제 수단생활비 카드
할부일시불
수입320만원
지출148만원
남은 돈172만원
방향
| orientation | 높이 | 너비 | 설명 |
|---|---|---|---|
horizontal (기본) | — | 100% — 부모 폭 — 높이 1 | 가로 — 세로로 쌓인 내용 사이(기본) |
vertical | 부모 높이 — 부모가 높이를 정한다(flex 안에서 늘어난다 — 부모 높이가 없으면 선이 0 이 된다). 폭 1 | — | 세로 — 가로로 놓인 칸 사이(통계 세 칸 · 버튼 묶음) |
Inset
full (기본) 은 끝까지, inset 은 양끝 16 을 들인다(세로선은 위아래 16). 같은 묶음 안을 나눌 때 들인다 — 묶음 사이 · 액션 영역 위는 끝까지다. 화면 여백(24)에 붙은 목록 줄 사이는 Divider 가 아니라 List 의 줄 사이 선(들임 24 — 줄 글과 맞는다)이다.
결제 수단생활비 카드
할부일시불
결제 수단생활비 카드
할부일시불
화면 여백(24)에 붙은 목록 줄 사이는 Divider 가 아니라 List 의 줄 사이 선(들임 24 — 줄 글과 맞는다)이다
들임
| 조합 | 상태 | 속성 | 값 |
|---|---|---|---|
orientation=horizontal + inset=inset | enabled | 좌우 바깥 여백 | spacing-x4 16px — 양끝 16(SEED inset) — 선 폭은 부모 폭 − 32(100% 에 여백을 더하지 않는다). 화면 여백 24 안의 내용에 맞출 때는 쓰는 자리가 여백을 더한다 |
orientation=vertical + inset=inset | enabled | 상하 바깥 여백 | spacing-x4 16px — 위아래 16 |
State
상태가 없다 — 정적인 선이다(누르기 · 포커스 없음).
Guidelines
세 가지 나누기
| 세기 | 쓰는 것 | 자리 |
|---|---|---|
| 약함 | 들인 선(inset) | 같은 묶음 안 — 상세의 키-값 줄 묶음 · 카드 안 위아래 |
| 중간 | 끝까지 선(full) | 묶음 사이 · 액션 영역(바닥 버튼) 위 · 스크롤되는 본문 위 머리 |
| 강함 | 8 간격 — 선이 아니다 | 크게 다른 내용 사이 — 회색 바탕(bg-layer-basement) 위에 흰 층(bg-layer-default) 묶음을 8 띄워 놓는다 |
"8px 구분선" 은 없다 — 두꺼운 회색 막대를 그리지 않고 바탕 층 사이 간격으로 만든다(SEED).
세기는 상황에 맞게 고른다(SEED "각 방식은 사용 목적과 맥락이 다르므로, 상황에 맞게 적절한 방식을 선택") — 이 표는 고르는 참고이고 화면 규칙이 아니다. 어느 화면이 띠(8 간격)로 나뉘는지는 화면 이관 때 화면마다 고르고, 화면 이름은 DESIGN.md Layout 의 "화면 바탕" 한 곳에 적는다. 상황 → 고를 것 · 띠 · 카드 · 흰 화면까지 견준 표는 DESIGN.md Layout 의 "화면을 나누는 법"(2026-10-22 사용자 결정 — https://claude.ai/artifact/KrXqAymDPz1JKL5AWqdwKS).
결제 수단생활비 카드
할부일시불
카테고리카페
- 스타벅스 강남역점−5,600원
결제 수단생활비 카드
할부일시불
카테고리카페
- 스타벅스 강남역점−5,600원
꼭 필요할 때만
선을 두기 전에 여백 · 제목 · 바탕 층으로 갈리는지 먼저 본다(SEED "Divider를 사용하기 전에 반드시 필요한지 검토해주세요"). 반복되는 목록 줄은 줄의 위아래 여백이 줄을 가르므로 선이 없는 것이 기본이다 — 촘촘한 목록에만 List 의 줄 사이 선(같은 1px stroke-neutral-subtle). 메뉴 묶음 사이 · 대화상자 머리 아래(스크롤될 때)의 선도 같은 값이다. 8 간격도 같다 — 같은 성격의 묶음이 이어지면 띠를 끊지 않고 목록 제목으로 가른다.
- 스타벅스 강남역점−5,600원
- 점심 식사−12,000원
- −62,000원
- 스타벅스 강남역점−5,600원
- 점심 식사−12,000원
- −62,000원
마지막에는 두지 않는다
선은 내용 사이에만 둔다 — 화면 · 묶음의 마지막 요소 아래, 카드 맨 위 · 맨 아래에는 두지 않는다. 8 간격도 같다 — 첫 띠 위 · 마지막 띠 아래에는 틈 · 선 · 빈 띠를 두지 않는다. 첫 띠는 머리(상단 바 · 가계부 묶음 탭) 바로 아래에 붙고, 띠가 끝난 아래 회색은 바닥이지 구분선이 아니다(SEED "화면의 마지막 섹션이나 요소 하단에는 Divider를 표시하지 않습니다" — 2026-10-22 사용자 결정 4B · 시작 쪽도 같은 까닭으로 2026-10-23 사용자 결정 — https://claude.ai/artifact/W8PJv3at8BMv1ypCQd7vGB 결정 1 · https://claude.ai/artifact/WRqqZhbQYdBCcnyEKhzeVW Q2). 8 간격은 띠와 띠 사이에만 있다.
결제 수단생활비 카드
할부일시불
결제 수단생활비 카드
할부일시불
장식이 기본
선은 눈으로 묶음을 가르는 장식이라 보조 기술에 숨긴다 — 묶음은 제목 · 목록 구조로 알린다. 문서의 장처럼 보조 기술도 "구분선" 을 알아야 하는 자리만 의미 있는 구분선(role="separator")으로 둔다.
코드
레시피 recipes/shadcn/components/ui/divider.tsx 를 쓴다 — Divider. orientation("horizontal" 기본 · "vertical") · inset(기본 false — YAML 의 full, true 면 inset) · decorative(기본 true — 보조 기술에 숨긴다, false 면 role="separator")를 받는다. <hr> 이 아니라 <div> 로 그린다. 위아래 · 좌우 간격은 쓰는 자리가 정한다. 아래 미리보기는 스펙 값으로 그린 모습이다.
묶음 사이 · 같은 묶음 안
결제 수단생활비 카드
할부3개월
import { Divider } from "@/components/ui/divider"
<div>
<p className="flex justify-between py-x3">결제 수단<span>생활비 카드</span></p>
<Divider inset />
<p className="flex justify-between py-x3">할부<span>3개월</span></p>
</div>
<Divider />
<section aria-labelledby="memo-title">…</section>세로 — 칸 사이
수입
3,200,000원
지출
1,486,200원
남은 돈
1,713,800원
<div className="flex items-stretch">
<p className="flex-1 py-x4 text-center">수입<br />{formatWon(income)}</p>
<Divider orientation="vertical" inset />
<p className="flex-1 py-x4 text-center">지출<br />{formatWon(expense)}</p>
<Divider orientation="vertical" inset />
<p className="flex-1 py-x4 text-center">남은 돈<br />{formatWon(rest)}</p>
</div>Behavior
| 인터랙션 | 동작 |
|---|---|
| 모든 인터랙션 | 없다 — 정적인 선. 포커스가 서지 않는다 |
| 세로선의 부모에 높이가 없음 | 선이 0 이 된다 — 부모(flex)가 높이를 정해야 한다 |
Accessibility
| 기준 | 검증 |
|---|---|
| WCAG 1.4.11 Non-text contrast(≥ 3:1) | 선은 장식이다(흰 바탕 1.15 · 다크 1.30) — 묶음은 여백 · 제목 · 구조가 알린다. 선만으로 정보를 나르지 않는다 |
| WCAG 1.3.1 Info and Relationships | 묶음은 제목(h2 …) · 목록(ul) · section 으로 — 선에 기대지 않는다 |
| WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24) | 해당 없음 — 누르지 않는다 |
| WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44) | 해당 없음 — 누르지 않는다 |
| ARIA | 기본 <div aria-hidden="true">(장식 — 읽지 않는다). decorative={false} 면 role="separator" · 세로선은 aria-orientation="vertical" |
Do / Don't
✅ Do
- 같은 묶음 안은 들인 선, 묶음 사이는 끝까지 선.
- 크게 다른 내용은 선 대신 8 간격(바탕 층).
- 선은 꼭 필요할 때만, 내용 사이에만.
❌ Don't
- 두꺼운 선 · 짙은 선 · 8px 회색 막대.
- 목록 줄마다 선 + 여백을 함께.
- 화면 · 묶음 마지막 아래의 선.
- 선 색을 자리마다 다르게(
border-default·border-subtle…).
Specification
divider.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Divider 를 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다.
Base
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 바깥 여백margin | 0px선 위아래 · 좌우 간격은 쓰는 자리가 정한다(들임만 Divider 가 갖는다) |
| 배경background | stroke-neutral-subtle#EDEFF3다크 #353B4D흰 바탕 1.15 · 다크 1.30(SEED 기본 neutral-muted 1.15 와 같은 진하기) — 장식이라 3:1 대상이 아니다 | ||
| 두께thickness | 1px모든 방향 · 모든 자리 1 — 굵은 선을 두지 않는다 |
orientation=horizontal
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 너비width | 100%부모 폭 — 높이 1 |
orientation=vertical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 높이height | 부모 높이부모가 높이를 정한다(flex 안에서 늘어난다 — 부모 높이가 없으면 선이 0 이 된다). 폭 1 |
orientation=horizontal, inset=inset
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 좌우 바깥 여백marginX | spacing-x416px양끝 16(SEED inset) — 선 폭은 부모 폭 − 32(100% 에 여백을 더하지 않는다). 화면 여백 24 안의 내용에 맞출 때는 쓰는 자리가 여백을 더한다 |
orientation=vertical, inset=inset
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 상하 바깥 여백marginY | spacing-x416px위아래 16 |
SEED 와 다른 점
- 색은
stroke-neutral-subtle하나 — SEED 는 기본 neutral-muted(투명도 있는 검정 6.3%) · 반복 항목용 neutral-subtle(4.7%) 둘이다. groo 의stroke-neutral-subtle(#EDEFF3)이 SEED 기본과 같은 진하기(흰 바탕 1.15)라 새 토큰 없이 한 색으로 둔다. - 기본이 장식 — SEED 는
<hr>(보조 기술이 "구분선" 으로 읽는다)가 기본이고 장식은as="div"로 바꿔야 한다. groo 는 장식이 기본이고 의미 있는 구분선만role="separator"다(SEED 포용적 디자인의 "장식 요소는 숨긴다" 를 기본으로). - 들임(inset)은 코드에 있다 — SEED 디자인 문서는 "Figma 에서만" 이라 쓰지만 React · Lynx 에 있다. groo 도 둔다(16).
Migration notes
2026-10-23 — 첫 띠 위에도 틈을 두지 않는다
"마지막 띠 아래 틈 없음" 에 시작 쪽을 더했다 — 머리(상단 바 · 가계부 묶음 탭) 바로 아래 첫 띠 위 8 을 두지 않는다. 사용자: "SEED 가 마지막 gap 은 빼라고 하듯 머리와 시작 사이 gap 도 빼는 게 맞다, 저것 때문에 다 이상해 보인다"(홈 https://claude.ai/artifact/W8PJv3at8BMv1ypCQd7vGB 결정 1) · "시작과 끝에 gap 이 들어가면 이상해 보인다"(I-05 https://claude.ai/artifact/WRqqZhbQYdBCcnyEKhzeVW Q2). DESIGN 세 파일 Layout "화면 바탕" 의 옛 "맨 위 8" 을 걷었다. 값 변경 없음.
2026-10-22 — 세기 표는 고르는 참고, 화면 이름은 한 곳에
"강함" 줄에 붙어 있던 화면 규칙("Desk 폰 화면은 묶음 · 구역마다 화면 폭 흰 띠")을 걷고 b1dfc58(10-03) 판의 "크게 다른 내용 사이" 로 되돌렸다 — SEED 의 세기 셋 가운데 강함 하나가 화면 규칙으로 번져 폰이 띠로 도배됐다. 폰 화면을 어떻게 나눌지는 화면 이관 때 화면마다 비교 페이지로 고른다(사용자 결정 — https://claude.ai/artifact/KrXqAymDPz1JKL5AWqdwKS 결정 1 · 3B). "꼭 필요할 때만" · "마지막에는 두지 않는다" 를 8 간격(띠)에도 건다(결정 4B). 코드 예시의 실제 카드사 이름을 지어낸 이름("생활비 카드")으로 바꿨다.
2026-10-03 — SEED Divider 로(옛 Separator 를 대신)
사용자가 비교 페이지의 "따라오는 것" 으로 정했다 — 선 하나 stroke-neutral-subtle(SEED 기본과 같은 진하기 — 새 토큰 없이), 반복 줄 사이는 List 규칙, 크게 다른 내용 사이는 선이 아니라 8 간격, 들임 16, 기본은 장식. 옛 Separator(border-default 1px · Radix · decorative 기본)와 DESIGN.md Divider 절(divider-light · divider-dark 1px border-default)을 대신한다 — 옛 스펙은 separator.history/v-pre-seed-display.*. 레시피 이름도 Separator → Divider 로 바꾼다(부르는 곳은 레시피 차례에 옮긴다).
제품은 앱 적용 단계에서 옮긴다(2026-10-03 조사).
subtle과default가 같은 값 — 웹index.css:68-69 · 288-289, 앱app/theme/tokens.dart:230-231 · 324-325에서 둘 다#E5E8EF· 다크#353B4D라LedgerDivider subtle(shared/ui/groo/ledger.tsx:103)이 아무것도 바꾸지 않는다. 구분선은stroke-neutral-subtle하나로(라이트 1.23 → 1.15).- 나누는 방법이 제각각 — 웹:
Separator6 ·LedgerDivider5 · 인라인borderTop/Bottom48 ·border-t/b52 ·divide-y10 · 1px 높이 div 8 ·groo.css6. 앱:PDivider26 · 날Divider9 ·Border(top/bottom)48 · 세로 1px 6. HR:Separator10 · 메뉴 구분선 10(#eeeeee 1.16 · 다크 #353535 1.33). 모두 Divider · List 줄 사이 선으로. - 같은 줄이 화면마다 다르게 나뉜다 — 웹
LedgerRow가 가계부에서는 선이 없고 할 일 · 메모에서는 들인 선이다(List 규칙으로 맞춘다). - 스펙끼리 어긋났다 — 옛 separator.md · DESIGN.md 는
border-default(1.23), list.md 의 줄 사이 선은stroke-neutral-subtle(1.15)이었다. 이제 하나다.
Dialog
1280 이상에서 화면 정중앙에 뜨는 대화상자. 입력 폼 · 상세처럼 지금 화면을 떠나지 않고 할 일을 띄운다 — 같은 내용을 1280 미만에서는 Bottom Sheet 로 띄운다(한 부품이 폭으로 바꾼다 — Responsive Dialog). 되돌릴 수 없는 확인은 Alert Dialog, 트리거에 붙는 짧은 내용은 Popover, 화면 높이를 넘는 긴 내용은 페이지다.
Field
입력 하나를 감싸는 둘레 — 칸 이름(라벨) · 필수 또는 선택 표시 · 설명 · 오류 · 글자 수를 한 모양으로 붙인다. Text Input · Textarea 와 Checkbox · Radio · Select Box 묶음을 감싼다.