Badge
대상의 상태 · 분류를 한두 낱말로 보이는 작은 라벨("예정" · "연체" · "승인"). 누르지 않는다 — 고르고 거르는 것은 Chip, 실행은 Button, 시간 · 개수 · 길이 같은 메타 정보는 Tag Group, 안 읽은 알림은 Notification Badge 다.
구조는 당근 SEED Badge(Apache-2.0)를 따른다 — 둥근 사각 상자 · 앞 아이콘 · 글, 변형 셋(weak · solid · outline) × 톤 여섯, 크기 둘. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-03 사용자 결정). 옛 Badge(알약 · 11 / 600 · solid · soft · outline 12변형 · 누르는 배지)를 대신한다.
수치 원본은 badge.yaml이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.
- 스타벅스 강남역점−5,600원
- −17,000원
- −32,000원
- 이서연
- 박지훈
- 스타벅스 강남역점−5,600원
- −17,000원
- −32,000원
- 이서연
- 박지훈
직접 골라 보기
변형 · 톤 · 크기 · 앞 아이콘 · 글 길이를 고르면 스펙대로 그린 배지와 그 코드가 바뀐다. 줄 안 · 상세 머리 두 자리에 놓아 본다.
- −17,000원
import { Badge } from "@/components/ui/badge"
<Badge>예정</Badge>Anatomy
| 부위 | 설명 |
|---|---|
| ⓐ Container | 상자 — 둥근 사각(4 · 6). 글만큼 넓어지고 최대 폭이 없다. |
| ⓑ Prefix Icon | 앞 아이콘 — 글자색을 따른다. 없어도 된다. |
| ⓒ Label | 글 — 한두 낱말, 한 줄. |
부위
| 부위 | 설명 |
|---|---|
root | 상자 — 둥근 사각. 글만큼 넓어지고 최대 폭이 없다(부모가 좁을 때만 글이 말줄임) |
prefixIcon | 앞 아이콘 — 글자색을 따른다. 없어도 된다 |
label | 글 — 한 줄 |
group | 배지 여럿 — 한 대상에 둘까지, 사이 4 |
Properties
Variant
세 가지다. 같은 톤이면 weak → outline → solid 순으로 강해진다.
| 변형 | 모양 | 쓰는 자리 |
|---|---|---|
weak (기본) | 옅은 바탕(bg-{톤}-weak) + 진한 글자(fg-{톤}-contrast) · 500 | 반복되는 목록 · 분류 · 부가 정보 — 줄마다 있어도 무겁지 않다 |
outline | 투명 + 안쪽 1px 옅은 선(stroke-{톤}-weak) + 의미 색 글자(fg-{톤}) · 700 | 상세 · 본문의 중간 강조 — 권한 · 카드 종류처럼 한 화면에 몇 개 |
solid | 채움(bg-{톤}-solid) + 흰 글자 · 700 | 드물게 — 사진 위, 강하게 알려야 할 상태 |
중립(neutral)만 짝이 다르다 — weak 는 bg-neutral-weak + fg-neutral-muted, solid 는 bg-neutral-inverted + fg-neutral-inverted(다크에서 밝은 면 + 짙은 글자), outline 은 stroke-neutral-weak + fg-neutral-muted.
변형 — 굵기 · 테두리
| variant | 배경 | 테두리 두께 | 굵기 | 설명 |
|---|---|---|---|---|
weak (기본) | — | — | 500 | 옅은 바탕 + 진한 글자 — 기본. 반복되는 목록 · 분류 · 부가 정보 |
solid | — | — | 700 | 채움 + 흰 글자 — 눈에 띄어야 할 상태 하나 · 사진 위 |
outline | transparent | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 700 | 테두리 + 의미 색 글자 — 상세 · 본문의 중간 강조 |
Tone
| 톤 | 쓰는 자리 | groo 예 |
|---|---|---|
neutral (기본) | 상태가 따로 없거나 분명하지 않은 것 · 분류 | 예정 · 환불됨 · 기록만 · 일시정지 · 단종 · 기본 · 신용 · 체크 |
informative | 안내 · 권한 제한 · 베타 | 읽기 전용 · 새로 |
positive | 완료 · 승인 · 연결 | 달성 · 승인 · 연결됨 · 정상 속도 |
warning | 곧 문제가 될 것 · 빠진 것 | 만료 임박 · 빠른 속도 · 투자 주의 |
critical | 거절 · 실패 · 넘침 · 제재 | 반려 · 연체 · 한도 초과 |
brand | 브랜드와 닿는 자리만 — 아껴 쓴다 | 요금제(Pro) · 본인 표시(나) |
weak — 옅은 바탕
| 속성 | neutral (기본) | brand | informative | positive | warning | critical |
|---|---|---|---|---|---|---|
| 배경 | color-bg-neutral-weak #F5F6FA · 다크 #353B4D — 회색 바탕(bg-layer-basement)과 같은 색 — 흰 표면 위에서만 쓴다 | color-bg-brand-weak HR #E8F3EC · Desk #E8F1FE | color-bg-informative-weak #EAF3FE · 다크 #21344D | color-bg-positive-weak #EAF5EC · 다크 #223927 | color-bg-warning-weak #FFEFE8 · 다크 #4B2B1F | color-bg-critical-weak #FFEFEC · 다크 #532722 |
| 글자·아이콘 | color-fg-neutral-muted #535866 · 다크 #B7BDCC — 6.58 · 다크 5.93 | color-fg-brand-contrast HR #064F33 · Desk #013D96 — Desk 8.74 · 다크 5.48 · HR 8.49 · 5.47 | color-fg-informative-contrast #0F5FB3 · 다크 #ACCEFB — 5.67 · 7.80 | color-fg-positive-contrast #026E33 · 다크 #AED6B6 — 5.72 · 7.78 | color-fg-warning-contrast #A53E0A · 다크 #F9BFA9 — 5.70 · 7.84 | color-fg-critical-contrast #C01016 · 다크 #FFBCB3 — 5.65 · 7.79 |
| 굵기 | 500 | 500 | 500 | 500 | 500 | 500 |
solid — 채움
| 속성 | neutral (기본) | brand | informative | positive | warning | critical |
|---|---|---|---|---|---|---|
| 배경 | color-bg-neutral-inverted #1A1F2E · 다크 #F5F6FA — 다크는 밝은 면 + 짙은 글자로 뒤집힌다(SEED 와 같은 방식) | color-bg-brand-solid HR #075B3C · Desk #0147AD | color-bg-informative-solid #1D6EC9 · 다크 #0F65BF | color-bg-positive-solid #167F3F · 다크 #117539 | color-bg-warning-solid #BE490D · 다크 #B04209 — 주황 — SEED 의 노랑 + 검정 글자가 아니다(groo 주의 색은 주황, Page Banner 와 같다) | color-bg-critical-solid #D72323 · 다크 #CC0E17 |
| 글자·아이콘 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 — 16.41 · 13.42 | color-static-white #FFFFFF — Desk 8.38 · 8.36 · HR 8.17 · 8.36 | color-static-white #FFFFFF — 5.09 · 5.78 | color-static-white #FFFFFF — 5.07 · 5.79 | color-static-white #FFFFFF — 5.06 · 5.79 | color-static-white #FFFFFF — 5.06 · 5.77 |
| 굵기 | 700 | 700 | 700 | 700 | 700 | 700 |
outline — 옅은 선
| 속성 | neutral (기본) | brand | informative | positive | warning | critical |
|---|---|---|---|---|---|---|
| 배경 | transparent | transparent | transparent | transparent | transparent | transparent |
| 글자·아이콘 | color-fg-neutral-muted #535866 · 다크 #B7BDCC — 7.11 · 7.70 | color-fg-brand HR #075B3C · Desk #0147AD — Desk 8.38 · 6.10 · HR 8.17 · 6.07 | color-fg-informative #1D6EC9 · 다크 #69ABFF — 5.09 · 6.12 | color-fg-positive #167F3F · 다크 #25C062 — 5.07 · 6.07 | color-fg-warning #BE490D · 다크 #FF8758 — 5.06 · 6.11 | color-fg-critical #D72323 · 다크 #FF8477 — 5.06 · 6.08 |
| 테두리 | color-stroke-neutral-weak #E5E8EF · 다크 #404757 — 1.23 · 1.56 — 글이 배지를 알린다(선은 장식) | color-stroke-brand-weak HR #77B193 · Desk #79A6F3 — Desk 2.45 · 3.86 · HR 2.47 · 3.83 — 의미 색 넷보다 짙다(v109 값 그대로 · HR 은 v121 그루 초록) | color-stroke-informative-weak #B9D4F6 · 다크 #1C4E8A — v117 — 1.52 · 1.73(시트 위 1.50) | color-stroke-positive-weak #BBDAC1 · 다크 #1A582F — v117 — 1.51 · 1.71 | color-stroke-warning-weak #F5C7B6 · 다크 #833615 — v117 — 1.53 · 1.73 | color-stroke-critical-weak #FEC4BC · 다크 #93231F — v117 — 1.52 · 1.73 |
| 테두리 두께 | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | 1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) |
| 굵기 | 700 | 700 | 700 | 700 | 700 | 700 |
outline 의 의미 색 테두리 넷(stroke-informative-weak · -positive-weak · -warning-weak · -critical-weak)은 이 결정으로 새로 둔 역할 색이다(v117 — 팔레트 300 · 다크 400).
Size
medium 20 (기본) · large 24. medium 은 목록 줄 · 표 · 이름 옆, large 는 상세 머리 · 카드 제목 옆이다. 글은 medium t1 11 / 15 · large t2 12 / 16, 앞 아이콘 12 · 14 와 글 사이 2. 글은 글자 크기 설정을 따르고(최소 높이는 그대로 두고 상자가 글을 따라 커진다), 줄을 바꾸지 않는다.
- −17,000원
- −62,000원
분홍 띠 — 높이 · 좌우 여백 · 위 여백 · 아이콘과 글 사이(3배). 글이 커지면(글자 크기 설정) 최소 높이는 그대로 두고 상자가 글을 따라 커진다
크기
| size | 최소 높이 | 상하 여백 | 좌우 여백 | 모서리 | 앞 아이콘 | 글자 | 설명 |
|---|---|---|---|---|---|---|---|
medium (기본) | 20px | spacing-x0_5 2px | spacing-x1_5 6px | radius-r1 4px | 12px | text-t1 11px / 15px — 11 / 15 — 글자 크기 설정을 따른다(SEED rem). 최소 높이는 그대로, 글이 커지면 상자가 따라 커진다 | 20 — 목록 줄 · 표 · 이름 옆(기본) |
large | 24px | spacing-x1 4px | spacing-x2 8px | radius-r1_5 6px | 14px | text-t2 12px / 16px — 12 / 16 — 글자 크기 설정을 따른다(SEED rem) | 24 — 상세 머리 · 카드 제목 옆 |
공통
| 부위 | 속성 | 값 | 비고 |
|---|---|---|---|
root | 세로 맞춤 | center | |
root | 앞 아이콘과 글 사이 | spacing-x0_5 2px | 앞 아이콘 ↔ 글 |
root | 최대 너비 | none | 최대 폭이 없다(SEED 3.0 — 옛 108 · 120 을 걷었다). 부모가 좁거나 따로 막을 때만 글이 한 줄 말줄임(min-width 0 · overflow hidden) |
root | 커서 | default | 누르지 않는다 — 누르는 자리 · 포커스가 없다 |
prefixIcon | 앞 아이콘 색 | currentColor | 글자색을 따른다 — 보조 기술에는 숨긴다(aria-hidden) |
label | 넘칠 때 | 말줄임 | 한 줄(nowrap · text-overflow ellipsis) — 줄바꿈하지 않는다. 글 전체는 DOM 에 남아 보조 기술이 다 읽는다 |
group | 배지 사이 | spacing-x1 4px | 배지 사이 4(SEED 그림) — 한 대상에 둘까지. 넘치면 줄바꿈하지 않고 줄인다(배지를 고른다) |
State
상태는 enabled 하나다 — 배지는 누르지 않아 호버 · 누름 · 포커스가 없다(SEED).
끝낸 항목 안 배지는 꺼진 모양 — 끝낸 할 일 줄처럼 항목이 끝나 줄 전체를 흐린 색으로 둘 때, 그 안의 배지도 꺼진 모양이다 — 바탕 bg-disabled · 글 fg-disabled(List 막힌 줄의 타일과 같은 짝)로, 변형 · 톤과 상관없이 같다. 불투명도로 흐리지 않는다(v106). 배지만 진한 색으로 남으면 끝낸 줄에서 배지가 가장 먼저 읽힌다(2026-10-25 I-10 앱 — 앱 PBadge.disabled, 웹은 화면 className 으로 덮던 것을 같은 이름의 prop 으로 옮긴다).
Guidelines
상태 · 분류만 배지로
배지는 대상이 어떤 상태인지 · 무엇으로 분류되는지를 한두 낱말로 보인다. 시간 · 개수 · 길이 · 금액 같은 메타 정보는 배지가 아니라 Tag Group(" · " 로 이은 회색 줄)이다(SEED Image Frame — "Badge 는 상태나 분류를 표현할 때만").
| 보이려는 것 | 쓰는 것 |
|---|---|
| 상태 한 낱말(예정 · 승인 · 연체) | Badge |
| 대상의 종류를 앞세우는 분류 라벨(신용 · 체크 · 할인형) | Badge neutral weak |
| 설명 줄의 메타 — 카테고리 이름 · 자산 · 시각 · 거리 · 개수 · 금액 | Tag Group |
| 안 읽은 알림이 있음 · 몇 개 | Notification Badge |
| 고르기 · 거르기 · 넣은 값 빼기 | Chip |
| 실행 | Button |
| 문장이 되는 안내 | 그냥 글 · Callout |
- −17,000원
- 스타벅스 강남역점−5,600원
- −62,000원
누르지 않는다
배지는 누르는 것처럼 생기지 않았고, 누르는 동작이 없다. 누르면 무언가 되는 라벨이 필요하면 Chip(고르기 · 거르기 — 알약) 또는 Button 이다. 배지의 뜻을 더 설명해야 하면 배지 옆에 ⓘ Help Bubble 을 둔다 — 배지 안에 버튼을 넣지 않는다.
반복되는 줄은 weak
목록처럼 같은 모양이 되풀이되는 자리는 weak 다 — 줄마다 채운 배지가 있으면 화면이 무거워지고 정작 눈에 띄어야 할 것이 묻힌다. solid 는 드물게 쓴다 — 사진 위, 그리고 강하게 알려야 할 상태(연체 · 해지됨)(SEED Solid — "이미지 위 … 또한 강한 주목도가 필요한 경우 사용할 수 있습니다"). outline 은 상세 · 본문의 중간 강조에 쓴다. 한 목록 안에서는 한 변형으로 맞추고 뜻은 톤으로 가른다.
- −17,000원
- −62,000원
- +200,000원
- −32,000원
- −17,000원
- −62,000원
- +200,000원
- −32,000원
흰 표면 위에서
중립 weak 의 바탕(bg-neutral-weak)은 회색 바탕(bg-layer-basement)과 같은 색이라 거기서는 상자가 사라진다 — 배지는 흰 표면(bg-layer-default) · 시트 위에 둔다. 회색 바탕 위에 둬야 하면 outline 을 쓴다.
한 대상에 둘까지
한 대상(한 줄 · 한 카드)에는 배지를 둘까지 둔다(SEED). 셋 이상 필요하면 중요한 것만 남기고 나머지는 상세에서 보인다. 둘이면 사이 4 — 줄바꿈하지 않는다.
색은 뜻으로, 브랜드는 아껴서
톤은 뜻을 나타낸다 — 완료는 positive, 거절 · 넘침은 critical 처럼 위 표대로 고른다. 뜻이 없는 분류(카드 종류 · 시장)는 neutral 이다. brand 는 요금제 · 본인 표시처럼 브랜드와 닿는 자리에만 쓴다 — 브랜드 색 배지가 흔해지면 브랜드 버튼(주요 동작)과 다툰다. 같은 뜻은 어느 화면에서나 같은 변형 · 톤이다("달성" 이 웹은 브랜드 · 앱은 초록이면 안 된다).
- +200,000원
- +200,000원
합계에 안 드는 줄
예정 · 환불 거래처럼 합계에 들지 않는 줄은 줄 전체를 흐리지 않는다 — 그 줄을 가르는 단서가 배지이므로 배지는 보통 대비 그대로 두고, 제목 · 금액만 옅게(환불은 금액에 취소선) 한다. 규칙은 List — 합계에 안 드는 줄에 있다.
글
- 한두 낱말 · 명사로 짧게 — "예정" · "연체 3" · "한도 초과". 문장이 되면 배지가 아니다.
- 상태는 "~됨" · "~중" 처럼 지금 상태를 말하고, 같은 뜻은 같은 말로("달성" · "달성!" 을 섞지 않는다).
- 영어 · 코드값을 그대로 내지 않는다 — "NEW" 는 "새로",
ROLE_ADMIN은 "관리자", 정책 코드는 정책 이름(Writing v106). 요금제 이름 Pro · Free 는 이름이라 그대로 둔다. - 대문자 · 자간을 따로 주지 않는다.
코드
레시피 recipes/shadcn/components/ui/badge.tsx 를 쓴다 — Badge · BadgeGroup. 기본은 variant="weak" · tone="neutral" · size="medium" 이고, 글은 children, 앞 아이콘은 prefixIcon(lucide, 크기는 배지가 정한다)이다. <span> 으로 그려 글 안 · 줄 안 어디에나 놓인다. 아래 미리보기는 스펙 값으로 그린 모습이다.
목록 줄의 상태 — weak
import { Badge } from "@/components/ui/badge"
<span className="flex items-center gap-x1_5">
<span className="truncate">넷플릭스</span>
<Badge className="shrink-0">예정</Badge>
</span>
<Badge tone="critical">연체 3</Badge>상세 머리 — large · 둘
import { Badge, BadgeGroup } from "@/components/ui/badge"
<BadgeGroup>
<Badge size="large">신용</Badge>
<Badge size="large" variant="solid">단종</Badge>
</BadgeGroup>권한 — outline · 앞 아이콘
import { Eye, Pencil } from "lucide-react"
import { Badge } from "@/components/ui/badge"
<Badge variant="outline" tone="positive" prefixIcon={<Pencil />}>편집 가능</Badge>
<Badge variant="outline" tone="informative" prefixIcon={<Eye />}>읽기 전용</Badge>Behavior
| 인터랙션 | 동작 |
|---|---|
| 누르기 · 호버 · 키보드 | 없다 — 포커스가 서지 않는다. 배지가 놓인 줄 · 카드가 눌리면 그 동작이다 |
| 글이 길 때 | 줄을 바꾸지 않는다. 부모가 폭을 막을 때(flex 줄 안 · 폭이 정해진 칸)만 글이 한 줄 말줄임(…) — 글 전체는 보조 기술이 읽는다 |
| 글자 크기 설정 | 글이 커지면 상자가 따라 커진다(최소 높이 20 · 24 는 그대로) |
| 상태가 바뀜 | 배지 글 · 색이 바로 바뀐다(모션 없음) |
Accessibility
| 기준 | 검증 |
|---|---|
| WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1) | weak — 중립 6.58 · 다크 5.93, 의미 색 5.65 ~ 5.72 · 7.78 ~ 7.84, 브랜드 Desk 8.74 · 5.48 · HR 8.49 · 5.47. solid — 흰 글자 5.06 ~ 5.09 · 5.77 ~ 5.79, 브랜드 Desk 8.38 · 8.36 · HR 8.17 · 8.36, 중립 16.41 · 13.42. outline(흰 표면 위) — 의미 색 5.06 ~ 5.09 · 6.07 ~ 6.12, 중립 7.11 · 7.70, 브랜드 Desk 8.38 · 6.10 · HR 8.17 · 6.07 ✓ — 11 · 12px 라 큰 글자 기준을 쓰지 않는다 |
| WCAG 1.4.11 Non-text contrast(≥ 3:1) | 상자 바탕(weak 1.08 ~ 1.30) · 옅은 선(1.51 ~ 1.73, 중립 1.23 · 1.56)은 배지를 알리는 유일한 표시가 아니다 — 글이 알린다(SEED 와 같다) |
| WCAG 1.4.1 Use of color | 뜻은 글에 있다 — 색(톤)은 거드는 것이다. "연체" 를 빨간 점만으로 알리지 않는다 |
| WCAG 1.4.4 Resize text | 글이 글자 크기 설정을 따라 커지고 상자가 함께 커진다 ✓ |
| WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24) | 해당 없음 — 누르지 않는다 |
| WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44) | 해당 없음 — 누르지 않는다 |
| ARIA | <span> · 역할 없음 — 글이 앞뒤 글(줄 이름)과 이어 읽힌다("넷플릭스 예정 구독 현대카드"). 앞 아이콘은 aria-hidden. 말줄임해도 글 전체를 읽는다 |
Do / Don't
✅ Do
- 상태 · 분류를 한두 낱말로.
- 반복되는 목록은 weak, 한 목록 안은 한 변형으로.
- 뜻에 맞는 톤 — 브랜드는 아껴서.
- 흰 표면 위에, 한 대상에 둘까지.
❌ Don't
- 배지를 누르게 하기 · 지우기 버튼 달기 — Chip 이다.
- 시간 · 개수 · 길이를 배지로 — Tag Group 이다.
- 알약 모양 배지 — 알약은 누르는 Chip 의 모양이다.
- 배지가 든 줄을 불투명도로 흐리기 — 배지까지 흐려진다.
- 영어 대문자 · 코드값 배지("NEW" ·
ROLE_ADMIN).
Specification
badge.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Badge 를 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다.
Base
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 최대 너비maxWidth | none최대 폭이 없다(SEED 3.0 — 옛 108 · 120 을 걷었다). 부모가 좁거나 따로 막을 때만 글이 한 줄 말줄임(min-width 0 · overflow hidden) |
| 앞 아이콘과 글 사이gap | spacing-x0_52px앞 아이콘 ↔ 글 | ||
| 세로 맞춤alignItems | center | ||
| 커서cursor | default누르지 않는다 — 누르는 자리 · 포커스가 없다 | ||
prefixIcon | enabled | 앞 아이콘 색color | currentColor글자색을 따른다 — 보조 기술에는 숨긴다(aria-hidden) |
label | enabled | 넘칠 때overflowX | 말줄임한 줄(nowrap · text-overflow ellipsis) — 줄바꿈하지 않는다. 글 전체는 DOM 에 남아 보조 기술이 다 읽는다 |
group | enabled | 배지 사이gap | spacing-x14px배지 사이 4(SEED 그림) — 한 대상에 둘까지. 넘치면 줄바꿈하지 않고 줄인다(배지를 고른다) |
size=medium
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 최소 높이minHeight | 20px |
| 상하 여백paddingY | spacing-x0_52px | ||
| 좌우 여백paddingX | spacing-x1_56px | ||
| 모서리radius | radius-r14px | ||
prefixIcon | enabled | 앞 아이콘size | 12px |
label | enabled | 글자typography | text-t111px / 15px11 / 15 — 글자 크기 설정을 따른다(SEED rem). 최소 높이는 그대로, 글이 커지면 상자가 따라 커진다 |
size=large
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 최소 높이minHeight | 24px |
| 상하 여백paddingY | spacing-x14px | ||
| 좌우 여백paddingX | spacing-x28px | ||
| 모서리radius | radius-r1_56px | ||
prefixIcon | enabled | 앞 아이콘size | 14px |
label | enabled | 글자typography | text-t212px / 16px12 / 16 — 글자 크기 설정을 따른다(SEED rem) |
variant=weak
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
label | enabled | 굵기fontWeight | 500 |
variant=solid
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
label | enabled | 굵기fontWeight | 700 |
variant=outline
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | transparent |
| 테두리 두께borderWidth | 1px안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED) | ||
label | enabled | 굵기fontWeight | 700 |
variant=weak, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-neutral-weak#F5F6FA다크 #353B4D회색 바탕(bg-layer-basement)과 같은 색 — 흰 표면 위에서만 쓴다 |
| 글자·아이콘foreground | fg-neutral-muted#535866다크 #B7BDCC6.58 · 다크 5.93 |
variant=weak, tone=brand
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-brand-weakDesk#E8F1FE다크 #20314EHR#E8F3EC다크 #21352B |
| 글자·아이콘foreground | fg-brand-contrastDesk#013D96다크 #7AA9F6HR#064F33다크 #2ABE84Desk 8.74 · 다크 5.48 · HR 8.49 · 5.47 |
variant=weak, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-informative-weak#EAF3FE다크 #21344D |
| 글자·아이콘foreground | fg-informative-contrast#0F5FB3다크 #ACCEFB5.67 · 7.80 |
variant=weak, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-positive-weak#EAF5EC다크 #223927 |
| 글자·아이콘foreground | fg-positive-contrast#026E33다크 #AED6B65.72 · 7.78 |
variant=weak, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-warning-weak#FFEFE8다크 #4B2B1F |
| 글자·아이콘foreground | fg-warning-contrast#A53E0A다크 #F9BFA95.70 · 7.84 |
variant=weak, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-critical-weak#FFEFEC다크 #532722 |
| 글자·아이콘foreground | fg-critical-contrast#C01016다크 #FFBCB35.65 · 7.79 |
variant=solid, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-neutral-inverted#1A1F2E다크 #F5F6FA다크는 밝은 면 + 짙은 글자로 뒤집힌다(SEED 와 같은 방식) |
| 글자·아이콘foreground | fg-neutral-inverted#FFFFFF다크 #24293816.41 · 13.42 |
variant=solid, tone=brand
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-brand-solidDesk#0147AD다크 #1049A4HR#075B3C다크 #1B583E |
| 글자·아이콘foreground | static-white#FFFFFFDesk 8.38 · 8.36 · HR 8.17 · 8.36 |
variant=solid, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-informative-solid#1D6EC9다크 #0F65BF |
| 글자·아이콘foreground | static-white#FFFFFF5.09 · 5.78 |
variant=solid, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-positive-solid#167F3F다크 #117539 |
| 글자·아이콘foreground | static-white#FFFFFF5.07 · 5.79 |
variant=solid, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-warning-solid#BE490D다크 #B04209주황 — SEED 의 노랑 + 검정 글자가 아니다(groo 주의 색은 주황, Page Banner 와 같다) |
| 글자·아이콘foreground | static-white#FFFFFF5.06 · 5.79 |
variant=solid, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-critical-solid#D72323다크 #CC0E17 |
| 글자·아이콘foreground | static-white#FFFFFF5.06 · 5.77 |
variant=outline, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-neutral-muted#535866다크 #B7BDCC7.11 · 7.70 |
| 테두리borderColor | stroke-neutral-weak#E5E8EF다크 #4047571.23 · 1.56 — 글이 배지를 알린다(선은 장식) |
variant=outline, tone=brand
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-brandDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84Desk 8.38 · 6.10 · HR 8.17 · 6.07 |
| 테두리borderColor | stroke-brand-weakDesk#79A6F3다크 #4C83DCHR#77B193다크 #1D9567Desk 2.45 · 3.86 · HR 2.47 · 3.83 — 의미 색 넷보다 짙다(v109 값 그대로 · HR 은 v121 그루 초록) |
variant=outline, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-informative#1D6EC9다크 #69ABFF5.09 · 6.12 |
| 테두리borderColor | stroke-informative-weak#B9D4F6다크 #1C4E8Av117 — 1.52 · 1.73(시트 위 1.50) |
variant=outline, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-positive#167F3F다크 #25C0625.07 · 6.07 |
| 테두리borderColor | stroke-positive-weak#BBDAC1다크 #1A582Fv117 — 1.51 · 1.71 |
variant=outline, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-warning#BE490D다크 #FF87585.06 · 6.11 |
| 테두리borderColor | stroke-warning-weak#F5C7B6다크 #833615v117 — 1.53 · 1.73 |
variant=outline, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 글자·아이콘foreground | fg-critical#D72323다크 #FF84775.06 · 6.08 |
| 테두리borderColor | stroke-critical-weak#FEC4BC다크 #93231Fv117 — 1.52 · 1.73 |
SEED 와 다른 점
- 기본은 weak · neutral · medium — SEED React 기본은 solid · neutral · medium 이다. SEED 디자인 문서가 반복 목록 · 분류 · 부가 정보에 weak 를 권하므로 그쪽을 기본으로 둔다.
- 중립 solid 는 역할 색 —
bg-neutral-inverted+fg-neutral-inverted(SEED 는 palette gray-800 + fg.on-neutral-solid). - warning solid 는 주황 + 흰 글자 — SEED 는 노랑 + 검정 81.6% 글자. groo 의 주의 색은 주황(v108)이고, 흰 글자가 5.06 · 5.79:1 이다(Page Banner 와 같다).
- 의미 색 옅은 선의 다크는 팔레트 400 — SEED 는 300. groo 다크 표면은 SEED 보다 밝아 300 이 1.38 ~ 1.40:1(시트 위 1.19 ~ 1.21)로 묻힌다. 400 은 1.71 ~ 1.73:1 — SEED 다크(1.77)와 같은 관계다(v117).
- 중립 outline 테두리는
stroke-neutral-weak— SEED stroke.neutral-muted 는 투명도가 있는 색이라 groo 에 없다. - 대비는 WCAG AA — SEED 의 흰 글자 on 주황(2.94) · 의미 색 solid(3.8 ~ 4.0) · 라이트 outline(3.8 ~ 4.1)처럼 4.5:1 에 못 미치는 짝이 없다.
- Action(정보 아이콘 버튼)은 두지 않는다 — SEED React 3(2026-10-01)의 배지 안 정보 버튼은 누르는 영역이 12 · 14 이고, 누르지 않는 배지 안에 따로 눌리는 것이 생긴다. 설명은 배지 옆 ⓘ Help Bubble 이다.
Migration notes
2026-10-30 — 끝낸 항목 안 배지
구현 검수(I-10 할 일 "끝낸 줄")에서 앱 ds 가 먼저 만든 PBadge.disabled(바탕 bg-disabled · 글 fg-disabled · 변형 · 톤 무시)를 State 에 적고, "비활성이 없다" 던 badge.yaml 머리 주석 · states 설명을 고쳤다. YAML 에 상태 disabled 는 아직 두지 않았다 — 사이트 그림 로더(display-look.ts 가 상태를 enabled 하나로 묶는다) · 레시피 · 웹 ds prop 을 함께 옮길 일이라 따로 남았다. 새 토큰 없음. 옛 스펙은 badge.history/v-pre-cleanup-1030.*.
2026-10-22 — solid 는 드물게
"solid 는 한 화면에서 꼭 눈에 띄어야 할 상태 하나 · 사진 위에만"(b1dfc58 — 10-03 비교 페이지에 "하나" 가 없다)을 SEED 말투의 권장 "드물게 — 사진 위, 그리고 강하게 알려야 할 상태(연체 · 해지됨)" 로 낮췄다(남은 규칙 R1). "한 대상에 둘까지"(SEED 와 같은 숫자 · 셋 이상의 대안이 붙어 있다)는 그대로다(R2). 사용자 결정 — https://claude.ai/artifact/Mag1tEv51MdQHdy1o8hY3L. 값 변경 없음.
2026-10-03 — SEED Badge 로 새로 둔다
사용자가 비교 페이지에서 정했다 — 모양은 SEED 둥근 사각(1A — medium 20 · 모서리 4 · 11/15, large 24 · 모서리 6 · 12/16, weak 500 · solid · outline 700, 알약은 Chip 에만), 체계는 SEED variant × tone, outline 테두리는 옅은 선(2A — stroke-*-weak 토큰 넷을 새로, v117), 합계에 안 드는 줄은 배지를 또렷하게(3A — List 규칙). 옛 Badge(알약 · text-badge 11/600 · solid 3 · soft 4 · outline 5 · 누르는 배지 · 지우는 태그)는 걷었다 — 옛 스펙은 badge.history/v-pre-seed-display.*. 누르는 배지 · 지우는 태그는 Chip(ChipToggle · InputChip)이다. DESIGN.md 의 옛 Badge 절(18 · 22 · 28 세 크기 · 채운 의미 색 넷)도 이 스펙으로 바꿨다.
옛 이름(웹 Badge · 앱 PBadge · HR shadcn) | 새 이름 |
|---|---|
| default · primary · HR default | solid + brand(브랜드와 닿는 자리만 — 아니면 solid neutral) |
| secondary | weak neutral |
| destructive · danger | solid critical |
| soft — info · success · warning · error(웹) · softInfo · softSuccess · softWarning · softError(앱) | weak informative · positive · warning · critical |
| softBrand(앱) | weak brand |
| outline | outline neutral |
| outline-info · -success · -warning · -error · outlineSuccess … | outline informative · positive · warning · critical |
제품은 앱 적용 단계에서 옮긴다(2026-10-03 조사 — Desk 웹 · HR 은 크로미움에 띄워 쟀고, Desk 앱은 위젯 테스트로 쟀다).
- 세 벌 — 웹
Badge19.2 · 알약 · 11/600(shared/ui/badge.tsx:17-71, 호출 23), 앱PBadge17(테두리 있으면 19) · 알약 · 11/700(shared/widgets/p_badge.dart:14-163, 호출 31), HR shadcn 22 · 모서리 6 · 12/500(shared/ui/shadcn/badge.tsx:7-46, 호출 49). 손으로 만든 배지가 웹 약 40 · 앱 약 15곳이다(모서리 2 · 4 · 알약, 글자 9.5 ~ 12, 굵기 600 ~ 800) — 모두 이 Badge 로. 9.5 · 10 · 10.5 · 11.5px 글자(웹CardBenefitPage.tsx:214 · 274 · 495"단종" ·groo.css:1454-1462"NEW" ·DutchPayPage.tsx:1860-1910"결제자")는 medium 11 로 올린다. - 흐린 줄 안의 배지 — 예정 · 환불 거래의 "예정" · "환불됨" 이 줄 전체 불투명도 0.6 에 함께 흐려져 웹 2.30 · 다크 2.77, 앱 2.39 · 2.87:1 이다(웹
shared/ui/groo/ledger.tsx:555 · 692-708, 앱features/expense/presentation/widgets/expense_row.dart:84-86 · 124-164). List 의 "합계에 안 드는 줄" 규칙으로 바꾼다. - 옅은 배지가 4.5:1 아래 — 웹 info · success · warning · error 4.03 · 4.04 · 3.71 · 3.75(
badge.tsx:36-42), 앱 soft 3.93 ~ 4.25(p_badge.dart:141-150), 할 일 우선순위 3.83 ~ 4.16(웹TodoPage.tsx:93-117· 앱todo_meta.dart:49-64). weak(fg-*-contrast)는 5.65 이상이다. - 다크 outline 테두리가 라이트 색 그대로 — 2.89 ~ 3.12:1(웹
badge.tsx:46-53· 앱p_badge.dart:153-160). 브랜드 채움 배지는 다크 표면과 1.73:1. - 정의 없는 색 — 웹 "현재 기기"(
widgets/account-settings/ui/DevicesSection.tsx:244-258) · "남은 원금 정리됨"(AssetDetailDialog.tsx:984-990)이 없는 토큰(--border-success·--fg-success)을 불러 테두리 · 색 없는 보통 글자로 보인다. 앱은 outlineSuccess 다. - 같은 뜻 다른 모양 — "달성"(웹 브랜드 옅은 사각 · 앱 초록 알약 "달성!"), 증권 "기본" · "Pro 시작"(웹 solid · 앱 soft), "연체"(웹 안에서도 사각 · 알약 두 모양 —
DashboardPage.tsx:1862-1875 · 2805-2817). - HR 결재 상태에 다크 짝이 없다 —
shared/lib/vacationStatus.tsx:18-43(dark:0개)이라 다크 화면에 밝은 알약이 뜬다(바탕 : 표면 13 ~ 15:1). 입금 · 출금 · 통계 "대기" · 현재 결재자도 같다(culture-dues/ui/DuesTableContent.tsx:181-186·VacationRequestStatsItem.tsx:85-138). 톤으로 옮기면 다크 짝이 생긴다 — 대기neutral· 진행informative· 승인positive· 반려critical· 취소neutral(SEED 톤 표대로 — 앱 적용 때 확인). - HR 흰 글자 미달 — 가입 상태 노랑 1.91 · 초록 2.22 · 빨강 3.81, 근무 시간 2.13 ~ 3.75(
admin-users-management/ui/UserTable.tsx:137-170), destructive 3.76(badge.tsx:17), 증감 초록 글자 2.22(vacation-history/ui/VacationStatsItem.tsx:21). 근무 시간처럼 뜻 없는 분류 색은 톤이 아니라 글(또는 Tag Group)로 가른다. - 영어 · 코드값 — HR 역할 코드
ROLE_ADMIN배지(admin-authority/ui/MobileRoleSelector.tsx:124·UserRoleAssignment.tsx:74) → "관리자", 휴가 정책 코드값 배지(admin-vacation-plan/ui/VacationPlanPolicyDialog.tsx:122-125) → 정책 이름, "3 포함된 정책"(:85-87) → "정책 3개", 웹 "NEW"(widgets/constellation/ui/CollectionCard.tsx:132-148) → "새로", 매수 유의 코드값 폴백(TossStocksPage.tsx:1157) → 이름을 못 찾으면 배지를 빼고 기록. 요금제 이름 Pro · Free 는 그대로. - 누르는 것처럼 보이는 배지 — 웹
Badge의 호버 색(누르지 않는데), 웹AssetFilterBadge(글 + ×,ExpensePage.tsx:1365-1407)는 Chip(입력값)으로, 상세 빠른 동작 위의 "연결됨" · "2개"(shared/ui/groo/detail.tsx:211-215)는 버튼 이름에 붙어 "연결됨 반복 설정" 으로 읽힌다 — 개수는 Notification Badge 규칙, 말은 버튼 글로.
Avatar
사람 한 명을 보이는 원 — 사진이 있으면 사진, 없으면 이름의 첫 글자(이니셜) + 이름 색. 여러 사람은 겹친 묶음(Avatar Stack — 이 문서 아래)이다. 은행 · 증권 · 카드 같은 물건은 Logo Tile(각진 타일 — 같은 첫 글자 · 이름 색 규칙), 사진 · 카드 그림은 Image Frame, 카테고리는 List 의 타일이다 — 아바타가 아니다.
Bottom Navigation
폰 화면 아래에 떠 있는 탭 바(하단 탭 바) — Desk 앱 · Desk 웹 768 미만의 주 메뉴다. 칸은 다섯을 넘지 않고 어느 화면에서나 같다(Desk 는 홈 · 가계부 · + · 캘린더 · 전체 — 아래 "Desk 에서는"). 가운데 + 는 탭이 아니라 그 화면의 추가 동작이다. 다른 이동 부품(Top Navigation · Side Navigation · Side Panel · Tabs)과 고르는 표는 DESIGN.md Layout 의 "이동 부품 고르기" 한 곳이다.