Groo Design

Divider

내용 사이를 나누는 1px 선. 같은 묶음 안은 들인 선, 묶음 사이는 끝까지 선이고, 크게 다른 내용 사이는 선이 아니라 8 간격(회색 바탕 위 흰 층 사이)이다. 반복되는 목록 줄 사이는 List 의 줄 사이 선(필요할 때만)이다.

구조는 당근 SEED Divider(Apache-2.0)를 따른다 — 1px 선 · 가로 · 세로 · 들임(16), 나누는 세기 셋(들인 선 · 끝까지 선 · 8 간격). 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-03 사용자 결정). 옛 Separator 를 대신한다 — 이름도 SEED 대로 Divider 다.

수치 원본은 divider.yaml이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.

9:41
설정
일반
  • 계정
  • 기본 통화대한민국 원
알림
  • 결제 알림
  • 예산 알림
9:41
거래 상세
골목커피 강남역점−5,600원

결제 수단생활비 카드

할부일시불

카테고리카페

메모팀 회의 전에 샀어요.
9:41
10월 통계

수입320만원

지출148만원

남은 돈172만원

많이 쓴 곳
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
9:41
설정
일반
  • 계정
  • 기본 통화대한민국 원
알림
  • 결제 알림
  • 예산 알림
9:41
거래 상세
골목커피 강남역점−5,600원

결제 수단생활비 카드

할부일시불

카테고리카페

메모팀 회의 전에 샀어요.
9:41
10월 통계

수입320만원

지출148만원

남은 돈172만원

많이 쓴 곳
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
설정 묶음 · 거래 상세 · 통계 세 칸 — 라이트 · 다크

직접 골라 보기

방향 · 들임 · 장식 여부를 고르면 스펙대로 그린 선과 그 코드, 보조 기술이 읽는지가 바뀐다.

결제 수단신한카드

할부3개월

보조 기술: 읽지 않는다 — aria-hidden(장식)
방향 orientation
들임 inset — 16
장식 decorative
모드
브랜드
import { Divider } from "@/components/ui/divider"

<Divider />

Anatomy

끝까지(full) — 기본
들임(inset) — 양끝 16
세로(vertical) · 들임 — 위아래 16
ⓐ Line — 1px · stroke-neutral-subtle · 바깥 여백 0(사이 간격은 쓰는 자리가 정한다)
1px 선 — 끝까지 · 양끝 16 들임 · 세로
부위설명
ⓐ Line선 — 1px. 바깥 여백이 없다.

부위

부위설명
root1px 선 — 바깥 여백이 없다(사이 간격은 쓰는 자리가 정한다)

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 은 가로로 놓인 칸 사이(통계 세 칸 · 버튼 묶음) — 높이는 부모가 정한다.

결제 수단생활비 카드

할부일시불

horizontal — 기본세로로 쌓인 내용 사이 — 부모 폭 전체, 높이 1

수입320만원

지출148만원

남은 돈172만원

vertical가로로 놓인 칸 사이 — 높이는 부모(flex)가 정한다, 폭 1
가로 · 세로 — 통계 세 칸 사이의 세로선

방향

orientation높이너비설명
horizontal (기본)—100% — 부모 폭 — 높이 1가로 — 세로로 쌓인 내용 사이(기본)
vertical부모 높이 — 부모가 높이를 정한다(flex 안에서 늘어난다 — 부모 높이가 없으면 선이 0 이 된다). 폭 1—세로 — 가로로 놓인 칸 사이(통계 세 칸 · 버튼 묶음)

Inset

full (기본) 은 끝까지, inset 은 양끝 16 을 들인다(세로선은 위아래 16). 같은 묶음 안을 나눌 때 들인다 — 묶음 사이 · 액션 영역 위는 끝까지다. 화면 여백(24)에 붙은 목록 줄 사이는 Divider 가 아니라 List 의 줄 사이 선(들임 24 — 줄 글과 맞는다)이다.

결제 수단생활비 카드

할부일시불

full — 끝까지(기본)묶음 사이 · 액션 영역 위

결제 수단생활비 카드

할부일시불

inset — 양끝 16같은 묶음 안을 나눌 때

화면 여백(24)에 붙은 목록 줄 사이는 Divider 가 아니라 List 의 줄 사이 선(들임 24 — 줄 글과 맞는다)이다

끝까지 · 들임

들임

조합상태속성값
orientation=horizontal + inset=insetenabled좌우 바깥 여백spacing-x4 16px — 양끝 16(SEED inset) — 선 폭은 부모 폭 − 32(100% 에 여백을 더하지 않는다). 화면 여백 24 안의 내용에 맞출 때는 쓰는 자리가 여백을 더한다
orientation=vertical + inset=insetenabled상하 바깥 여백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원

결제 수단생활비 카드

할부일시불

카테고리카페

메모팀 회의 전에 샀어요.
같은 가게 거래
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
라이트
골목커피 강남역점−5,600원

결제 수단생활비 카드

할부일시불

카테고리카페

메모팀 회의 전에 샀어요.
같은 가게 거래
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
다크
ⓐ 약함 들인 선 — 같은 묶음 안ⓑ 중간 끝까지 선 — 묶음 사이ⓒ 강함 8 간격 — 크게 다른 내용 사이(선이 아니다)
들인 선 · 끝까지 선 · 8 간격 — 한 화면

꼭 필요할 때만

선을 두기 전에 여백 · 제목 · 바탕 층으로 갈리는지 먼저 본다(SEED "Divider를 사용하기 전에 반드시 필요한지 검토해주세요"). 반복되는 목록 줄은 줄의 위아래 여백이 줄을 가르므로 선이 없는 것이 기본이다 — 촘촘한 목록에만 List 의 줄 사이 선(같은 1px stroke-neutral-subtle). 메뉴 묶음 사이 · 대화상자 머리 아래(스크롤될 때)의 선도 같은 값이다. 8 간격도 같다 — 같은 성격의 묶음이 이어지면 띠를 끊지 않고 목록 제목으로 가른다.

  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
이렇게 — 줄의 위아래 여백이 줄을 가른다 — 선이 없는 것이 기본
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−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

부위상태속성값
rootenabled바깥 여백margin0px선 위아래 · 좌우 간격은 쓰는 자리가 정한다(들임만 Divider 가 갖는다)
배경backgroundstroke-neutral-subtle#EDEFF3다크 #353B4D흰 바탕 1.15 · 다크 1.30(SEED 기본 neutral-muted 1.15 와 같은 진하기) — 장식이라 3:1 대상이 아니다
두께thickness1px모든 방향 · 모든 자리 1 — 굵은 선을 두지 않는다

orientation=horizontal

부위상태속성값
rootenabled너비width100%부모 폭 — 높이 1

orientation=vertical

부위상태속성값
rootenabled높이height부모 높이부모가 높이를 정한다(flex 안에서 늘어난다 — 부모 높이가 없으면 선이 0 이 된다). 폭 1

orientation=horizontal, inset=inset

부위상태속성값
rootenabled좌우 바깥 여백marginXspacing-x416px양끝 16(SEED inset) — 선 폭은 부모 폭 − 32(100% 에 여백을 더하지 않는다). 화면 여백 24 안의 내용에 맞출 때는 쓰는 자리가 여백을 더한다

orientation=vertical, inset=inset

부위상태속성값
rootenabled상하 바깥 여백marginYspacing-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).
  • 나누는 방법이 제각각 — 웹: Separator 6 · LedgerDivider 5 · 인라인 borderTop/Bottom 48 · border-t/b 52 · divide-y 10 · 1px 높이 div 8 · groo.css 6. 앱: PDivider 26 · 날 Divider 9 · Border(top/bottom) 48 · 세로 1px 6. HR: Separator 10 · 메뉴 구분선 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)이었다. 이제 하나다.

이 페이지