Groo Design

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 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.

9:41
카드
현대카드 M신용단종결제일 14일, 연회비 2만원, 포인트형
10월 거래
  • 스타벅스 강남역점카페, 오후 2:10−5,600원
  • 넷플릭스예정구독, 10월 18일−17,000원
  • 쿠팡환불됨쇼핑, 10월 2일−32,000원
9:41
캘린더 공유
‘우리 집’ 캘린더를 함께 보는 사람이에요.
함께 보는 사람 3명
  • 김민수나소유자
  • 이서연편집 가능
  • 박지훈읽기 전용
9:41
카드
현대카드 M신용단종결제일 14일, 연회비 2만원, 포인트형
10월 거래
  • 스타벅스 강남역점카페, 오후 2:10−5,600원
  • 넷플릭스예정구독, 10월 18일−17,000원
  • 쿠팡환불됨쇼핑, 10월 2일−32,000원
9:41
캘린더 공유
‘우리 집’ 캘린더를 함께 보는 사람이에요.
함께 보는 사람 3명
  • 김민수나소유자
  • 이서연편집 가능
  • 박지훈읽기 전용
가계부 줄의 상태 · 카드 상세 머리 · 캘린더 공유 권한 — 라이트 · 다크

직접 골라 보기

변형 · 톤 · 크기 · 앞 아이콘 · 글 길이를 고르면 스펙대로 그린 배지와 그 코드가 바뀐다. 줄 안 · 상세 머리 두 자리에 놓아 본다.

줄 안 — 제목 옆
  • 넷플릭스예정구독, 현대카드 M, 10월 18일−17,000원
상세 머리 — 이름 아래
현대카드 M예정
변형 variant
톤 tone
크기 size
앞 아이콘 prefixIcon
글 길이
모드
브랜드
import { Badge } from "@/components/ui/badge"

<Badge>예정</Badge>

Anatomy

편집 가능신용단종
ⓐ Containerⓑ Prefix Iconⓒ Label
왼쪽은 outline 앞 아이콘 배지(large, 3배), 오른쪽은 한 대상의 배지 둘(medium, 2배) — 사이 4
배지는 상자 · 앞 아이콘 · 글로, 여럿이면 사이 4
부위설명
ⓐ 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.

weak (기본)outlinesolid중립 neutral예정예정예정브랜드 brandProProPro안내 informative읽기 전용읽기 전용읽기 전용긍정 positive달성달성달성주의 warning만료 임박만료 임박만료 임박위험 critical연체연체연체
라이트같은 톤이면 weak → outline → solid 순으로 강해진다
weak (기본)outlinesolid중립 neutral예정예정예정브랜드 brandProProPro안내 informative읽기 전용읽기 전용읽기 전용긍정 positive달성달성달성주의 warning만료 임박만료 임박만료 임박위험 critical연체연체연체
다크같은 톤이면 weak → outline → solid 순으로 강해진다
변형 셋 × 톤 여섯 — 라이트 · 다크

변형 — 굵기 · 테두리

variant배경테두리 두께굵기설명
weak (기본)——500옅은 바탕 + 진한 글자 — 기본. 반복되는 목록 · 분류 · 부가 정보
solid——700채움 + 흰 글자 — 눈에 띄어야 할 상태 하나 · 사진 위
outlinetransparent1px — 안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED)700테두리 + 의미 색 글자 — 상세 · 본문의 중간 강조

Tone

톤쓰는 자리groo 예
neutral (기본)상태가 따로 없거나 분명하지 않은 것 · 분류예정 · 환불됨 · 기록만 · 일시정지 · 단종 · 기본 · 신용 · 체크
informative안내 · 권한 제한 · 베타읽기 전용 · 새로
positive완료 · 승인 · 연결달성 · 승인 · 연결됨 · 정상 속도
warning곧 문제가 될 것 · 빠진 것만료 임박 · 빠른 속도 · 투자 주의
critical거절 · 실패 · 넘침 · 제재반려 · 연체 · 한도 초과
brand브랜드와 닿는 자리만 — 아껴 쓴다요금제(Pro) · 본인 표시(나)

weak — 옅은 바탕

속성neutral (기본)brandinformativepositivewarningcritical
배경color-bg-neutral-weak #F5F6FA · 다크 #353B4D — 회색 바탕(bg-layer-basement)과 같은 색 — 흰 표면 위에서만 쓴다color-bg-brand-weak HR #E8F3EC · Desk #E8F1FEcolor-bg-informative-weak #EAF3FE · 다크 #21344Dcolor-bg-positive-weak #EAF5EC · 다크 #223927color-bg-warning-weak #FFEFE8 · 다크 #4B2B1Fcolor-bg-critical-weak #FFEFEC · 다크 #532722
글자·아이콘color-fg-neutral-muted #535866 · 다크 #B7BDCC — 6.58 · 다크 5.93color-fg-brand-contrast HR #064F33 · Desk #013D96 — Desk 8.74 · 다크 5.48 · HR 8.49 · 5.47color-fg-informative-contrast #0F5FB3 · 다크 #ACCEFB — 5.67 · 7.80color-fg-positive-contrast #026E33 · 다크 #AED6B6 — 5.72 · 7.78color-fg-warning-contrast #A53E0A · 다크 #F9BFA9 — 5.70 · 7.84color-fg-critical-contrast #C01016 · 다크 #FFBCB3 — 5.65 · 7.79
굵기500500500500500500

solid — 채움

속성neutral (기본)brandinformativepositivewarningcritical
배경color-bg-neutral-inverted #1A1F2E · 다크 #F5F6FA — 다크는 밝은 면 + 짙은 글자로 뒤집힌다(SEED 와 같은 방식)color-bg-brand-solid HR #075B3C · Desk #0147ADcolor-bg-informative-solid #1D6EC9 · 다크 #0F65BFcolor-bg-positive-solid #167F3F · 다크 #117539color-bg-warning-solid #BE490D · 다크 #B04209 — 주황 — SEED 의 노랑 + 검정 글자가 아니다(groo 주의 색은 주황, Page Banner 와 같다)color-bg-critical-solid #D72323 · 다크 #CC0E17
글자·아이콘color-fg-neutral-inverted #FFFFFF · 다크 #242938 — 16.41 · 13.42color-static-white #FFFFFF — Desk 8.38 · 8.36 · HR 8.17 · 8.36color-static-white #FFFFFF — 5.09 · 5.78color-static-white #FFFFFF — 5.07 · 5.79color-static-white #FFFFFF — 5.06 · 5.79color-static-white #FFFFFF — 5.06 · 5.77
굵기700700700700700700

outline — 옅은 선

속성neutral (기본)brandinformativepositivewarningcritical
배경transparenttransparenttransparenttransparenttransparenttransparent
글자·아이콘color-fg-neutral-muted #535866 · 다크 #B7BDCC — 7.11 · 7.70color-fg-brand HR #075B3C · Desk #0147AD — Desk 8.38 · 6.10 · HR 8.17 · 6.07color-fg-informative #1D6EC9 · 다크 #69ABFF — 5.09 · 6.12color-fg-positive #167F3F · 다크 #25C062 — 5.07 · 6.07color-fg-warning #BE490D · 다크 #FF8758 — 5.06 · 6.11color-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.71color-stroke-warning-weak #F5C7B6 · 다크 #833615 — v117 — 1.53 · 1.73color-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)
굵기700700700700700700

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. 글은 글자 크기 설정을 따르고(최소 높이는 그대로 두고 상자가 글을 따라 커진다), 줄을 바꾸지 않는다.

medium 20 (기본)목록 줄 · 표 · 이름 옆
예정최소 높이 20 · 위아래 2 · 좌우 6 · 모서리 4 · 글자 11 / 15 · 앞 아이콘 12 · 아이콘과 글 사이 2
  • 넷플릭스예정구독, 현대카드 M, 10월 18일−17,000원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
줄 안 — 제목 옆, 사이 6
large 24상세 머리 · 카드 제목 옆
예정최소 높이 24 · 위아래 4 · 좌우 8 · 모서리 6 · 글자 12 / 16 · 앞 아이콘 14 · 아이콘과 글 사이 2
현대카드 M신용단종결제일 14일, 연회비 2만원, 포인트형
상세 머리 — 이름 아래 둘

분홍 띠 — 높이 · 좌우 여백 · 위 여백 · 아이콘과 글 사이(3배). 글이 커지면(글자 크기 설정) 최소 높이는 그대로 두고 상자가 글을 따라 커진다

크기 — medium 20 은 줄 안, large 24 는 상세 머리

크기

size최소 높이상하 여백좌우 여백모서리앞 아이콘글자설명
medium (기본)20pxspacing-x0_5 2pxspacing-x1_5 6pxradius-r1 4px12pxtext-t1 11px / 15px — 11 / 15 — 글자 크기 설정을 따른다(SEED rem). 최소 높이는 그대로, 글이 커지면 상자가 따라 커진다20 — 목록 줄 · 표 · 이름 옆(기본)
large24pxspacing-x1 4pxspacing-x2 8pxradius-r1_5 6px14pxtext-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
가계부
이번 달카테고리
  • 넷플릭스예정구독, 현대카드 M, 10월 18일−17,000원
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
ⓐ Chip 고르기 · 거르기(누른다)ⓑ Badge 상태 · 분류(누르지 않는다)ⓒ Tag Group 메타 — 분류 · 자산 · 시각
상태는 배지, 메타는 Tag Group, 고르기는 Chip — 한 줄에 함께

누르지 않는다

배지는 누르는 것처럼 생기지 않았고, 누르는 동작이 없다. 누르면 무언가 되는 라벨이 필요하면 Chip(고르기 · 거르기 — 알약) 또는 Button 이다. 배지의 뜻을 더 설명해야 하면 배지 옆에 ⓘ Help Bubble 을 둔다 — 배지 안에 버튼을 넣지 않는다.

식비결제 수단넷플릭스예정교통 정기권연체 3
이렇게 — 거르기는 알약 Chip(누르면 걸리고 풀린다) · 상태는 둥근 사각 Badge(누르지 않는다)
식비카페넷플릭스예정교통 정기권연체 3
이렇게 하지 않는다 — 배지에 지우기 × 를 달아 거르기에 썼다 — 누르는 것은 Chip(입력값 칩 · 필터 칩)이다
누르는 것은 알약 Chip — 둥근 사각 배지는 누르지 않는다

반복되는 줄은 weak

목록처럼 같은 모양이 되풀이되는 자리는 weak 다 — 줄마다 채운 배지가 있으면 화면이 무거워지고 정작 눈에 띄어야 할 것이 묻힌다. solid 는 드물게 쓴다 — 사진 위, 그리고 강하게 알려야 할 상태(연체 · 해지됨)(SEED Solid — "이미지 위 … 또한 강한 주목도가 필요한 경우 사용할 수 있습니다"). outline 은 상세 · 본문의 중간 강조에 쓴다. 한 목록 안에서는 한 변형으로 맞추고 뜻은 톤으로 가른다.

  • 넷플릭스예정구독, 현대카드 M, 10월 18일−17,000원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
  • 여행 자금달성저축, 목표 2,000,000원+200,000원
  • 쿠팡환불됨쇼핑, 현대카드 M, 10월 2일−32,000원
이렇게 — 목록은 weak — 줄마다 있어도 무겁지 않고, 뜻은 톤으로 가른다
  • 넷플릭스예정구독, 현대카드 M, 10월 18일−17,000원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
  • 여행 자금달성저축, 목표 2,000,000원+200,000원
  • 쿠팡환불됨쇼핑, 현대카드 M, 10월 2일−32,000원
이렇게 하지 않는다 — 줄마다 solid — 화면이 무거워지고 정작 눈에 띄어야 할 연체가 묻힌다
목록은 weak — 줄마다 solid 인 목록

흰 표면 위에서

중립 weak 의 바탕(bg-neutral-weak)은 회색 바탕(bg-layer-basement)과 같은 색이라 거기서는 상자가 사라진다 — 배지는 흰 표면(bg-layer-default) · 시트 위에 둔다. 회색 바탕 위에 둬야 하면 outline 을 쓴다.

흰 표면(bg-layer-default) — weak예정기록만일시정지
회색 바탕(bg-layer-basement) — outline예정기록만일시정지
이렇게 — 흰 표면(카드 · 시트) 위 weak · 회색 바탕 위는 outline
회색 바탕(bg-layer-basement) — weak예정기록만일시정지
이렇게 하지 않는다 — 회색 바탕 위 중립 weak — 바탕과 같은 색이라 상자가 사라진다
흰 표면 위 weak · 회색 바탕 위 weak

한 대상에 둘까지

한 대상(한 줄 · 한 카드)에는 배지를 둘까지 둔다(SEED). 셋 이상 필요하면 중요한 것만 남기고 나머지는 상세에서 보인다. 둘이면 사이 4 — 줄바꿈하지 않는다.

  • 현대카드 M신용단종결제일 14일, 포인트형
이렇게 — 한 줄에 둘까지 — 사이 4, 줄바꿈하지 않는다
  • 현대카드 M신용단종포인트형연회비 없음결제일 14일, 포인트형
이렇게 하지 않는다 — 배지 넷 — 제목이 밀려 잘리고 무엇이 중요한지 흐려진다. 나머지는 상세에서
줄 하나에 배지 둘까지 · 배지 넷

색은 뜻으로, 브랜드는 아껴서

톤은 뜻을 나타낸다 — 완료는 positive, 거절 · 넘침은 critical 처럼 위 표대로 고른다. 뜻이 없는 분류(카드 종류 · 시장)는 neutral 이다. brand 는 요금제 · 본인 표시처럼 브랜드와 닿는 자리에만 쓴다 — 브랜드 색 배지가 흔해지면 브랜드 버튼(주요 동작)과 다툰다. 같은 뜻은 어느 화면에서나 같은 변형 · 톤이다("달성" 이 웹은 브랜드 · 앱은 초록이면 안 된다).

  • 여행 자금달성저축, 목표 2,000,000원+200,000원
  • 증권 연동Pro
이렇게 — "달성" 은 완료라 positive — 브랜드는 요금제처럼 브랜드와 닿는 자리에만
  • 여행 자금달성저축, 목표 2,000,000원+200,000원
  • 증권 연동Pro
이렇게 하지 않는다 — "달성" 을 브랜드 색으로 — 같은 뜻이 화면마다 다른 색이 되고 브랜드 버튼과 다툰다
달성은 positive — 브랜드 색으로 칠한 "달성"

합계에 안 드는 줄

예정 · 환불 거래처럼 합계에 들지 않는 줄은 줄 전체를 흐리지 않는다 — 그 줄을 가르는 단서가 배지이므로 배지는 보통 대비 그대로 두고, 제목 · 금액만 옅게(환불은 금액에 취소선) 한다. 규칙은 List — 합계에 안 드는 줄에 있다.

글

  • 한두 낱말 · 명사로 짧게 — "예정" · "연체 3" · "한도 초과". 문장이 되면 배지가 아니다.
  • 상태는 "~됨" · "~중" 처럼 지금 상태를 말하고, 같은 뜻은 같은 말로("달성" · "달성!" 을 섞지 않는다).
  • 영어 · 코드값을 그대로 내지 않는다 — "NEW" 는 "새로", ROLE_ADMIN 은 "관리자", 정책 코드는 정책 이름(Writing v106). 요금제 이름 Pro · Free 는 이름이라 그대로 둔다.
  • 대문자 · 자간을 따로 주지 않는다.
예정연체 3한도 초과새로
이렇게 — 명사로 짧게 — "예정" · "연체 3" · "한도 초과"
결제가 예정되어 있어요
이렇게 하지 않는다 — 문장이 된 배지 — 글로 쓰거나 Callout 이다
NEWROLE_ADMIN
이렇게 하지 않는다 — 영어 대문자 · 코드값 — "새로" · "관리자" 로 바꾼다
글 — 한두 낱말 · 코드값 · 영어 대문자

코드

레시피 recipes/shadcn/components/ui/badge.tsx 를 쓴다 — Badge · BadgeGroup. 기본은 variant="weak" · tone="neutral" · size="medium" 이고, 글은 children, 앞 아이콘은 prefixIcon(lucide, 크기는 배지가 정한다)이다. <span> 으로 그려 글 안 · 줄 안 어디에나 놓인다. 아래 미리보기는 스펙 값으로 그린 모습이다.

목록 줄의 상태 — weak

넷플릭스예정연체 3
가계부 줄 — 예정 · 연체
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

부위상태속성값
rootenabled최대 너비maxWidthnone최대 폭이 없다(SEED 3.0 — 옛 108 · 120 을 걷었다). 부모가 좁거나 따로 막을 때만 글이 한 줄 말줄임(min-width 0 · overflow hidden)
앞 아이콘과 글 사이gapspacing-x0_52px앞 아이콘 ↔ 글
세로 맞춤alignItemscenter
커서cursordefault누르지 않는다 — 누르는 자리 · 포커스가 없다
prefixIconenabled앞 아이콘 색colorcurrentColor글자색을 따른다 — 보조 기술에는 숨긴다(aria-hidden)
labelenabled넘칠 때overflowX말줄임한 줄(nowrap · text-overflow ellipsis) — 줄바꿈하지 않는다. 글 전체는 DOM 에 남아 보조 기술이 다 읽는다
groupenabled배지 사이gapspacing-x14px배지 사이 4(SEED 그림) — 한 대상에 둘까지. 넘치면 줄바꿈하지 않고 줄인다(배지를 고른다)

size=medium

부위상태속성값
rootenabled최소 높이minHeight20px
상하 여백paddingYspacing-x0_52px
좌우 여백paddingXspacing-x1_56px
모서리radiusradius-r14px
prefixIconenabled앞 아이콘size12px
labelenabled글자typographytext-t111px / 15px11 / 15 — 글자 크기 설정을 따른다(SEED rem). 최소 높이는 그대로, 글이 커지면 상자가 따라 커진다

size=large

부위상태속성값
rootenabled최소 높이minHeight24px
상하 여백paddingYspacing-x14px
좌우 여백paddingXspacing-x28px
모서리radiusradius-r1_56px
prefixIconenabled앞 아이콘size14px
labelenabled글자typographytext-t212px / 16px12 / 16 — 글자 크기 설정을 따른다(SEED rem)

variant=weak

부위상태속성값
labelenabled굵기fontWeight500

variant=solid

부위상태속성값
labelenabled굵기fontWeight700

variant=outline

부위상태속성값
rootenabled배경backgroundtransparent
테두리 두께borderWidth1px안쪽 1px(inset box-shadow) — 상자 크기가 변하지 않는다(SEED)
labelenabled굵기fontWeight700

variant=weak, tone=neutral

부위상태속성값
rootenabled배경backgroundbg-neutral-weak#F5F6FA다크 #353B4D회색 바탕(bg-layer-basement)과 같은 색 — 흰 표면 위에서만 쓴다
글자·아이콘foregroundfg-neutral-muted#535866다크 #B7BDCC6.58 · 다크 5.93

variant=weak, tone=brand

부위상태속성값
rootenabled배경backgroundbg-brand-weakDesk#E8F1FE다크 #20314EHR#E8F3EC다크 #21352B
글자·아이콘foregroundfg-brand-contrastDesk#013D96다크 #7AA9F6HR#064F33다크 #2ABE84Desk 8.74 · 다크 5.48 · HR 8.49 · 5.47

variant=weak, tone=informative

부위상태속성값
rootenabled배경backgroundbg-informative-weak#EAF3FE다크 #21344D
글자·아이콘foregroundfg-informative-contrast#0F5FB3다크 #ACCEFB5.67 · 7.80

variant=weak, tone=positive

부위상태속성값
rootenabled배경backgroundbg-positive-weak#EAF5EC다크 #223927
글자·아이콘foregroundfg-positive-contrast#026E33다크 #AED6B65.72 · 7.78

variant=weak, tone=warning

부위상태속성값
rootenabled배경backgroundbg-warning-weak#FFEFE8다크 #4B2B1F
글자·아이콘foregroundfg-warning-contrast#A53E0A다크 #F9BFA95.70 · 7.84

variant=weak, tone=critical

부위상태속성값
rootenabled배경backgroundbg-critical-weak#FFEFEC다크 #532722
글자·아이콘foregroundfg-critical-contrast#C01016다크 #FFBCB35.65 · 7.79

variant=solid, tone=neutral

부위상태속성값
rootenabled배경backgroundbg-neutral-inverted#1A1F2E다크 #F5F6FA다크는 밝은 면 + 짙은 글자로 뒤집힌다(SEED 와 같은 방식)
글자·아이콘foregroundfg-neutral-inverted#FFFFFF다크 #24293816.41 · 13.42

variant=solid, tone=brand

부위상태속성값
rootenabled배경backgroundbg-brand-solidDesk#0147AD다크 #1049A4HR#075B3C다크 #1B583E
글자·아이콘foregroundstatic-white#FFFFFFDesk 8.38 · 8.36 · HR 8.17 · 8.36

variant=solid, tone=informative

부위상태속성값
rootenabled배경backgroundbg-informative-solid#1D6EC9다크 #0F65BF
글자·아이콘foregroundstatic-white#FFFFFF5.09 · 5.78

variant=solid, tone=positive

부위상태속성값
rootenabled배경backgroundbg-positive-solid#167F3F다크 #117539
글자·아이콘foregroundstatic-white#FFFFFF5.07 · 5.79

variant=solid, tone=warning

부위상태속성값
rootenabled배경backgroundbg-warning-solid#BE490D다크 #B04209주황 — SEED 의 노랑 + 검정 글자가 아니다(groo 주의 색은 주황, Page Banner 와 같다)
글자·아이콘foregroundstatic-white#FFFFFF5.06 · 5.79

variant=solid, tone=critical

부위상태속성값
rootenabled배경backgroundbg-critical-solid#D72323다크 #CC0E17
글자·아이콘foregroundstatic-white#FFFFFF5.06 · 5.77

variant=outline, tone=neutral

부위상태속성값
rootenabled글자·아이콘foregroundfg-neutral-muted#535866다크 #B7BDCC7.11 · 7.70
테두리borderColorstroke-neutral-weak#E5E8EF다크 #4047571.23 · 1.56 — 글이 배지를 알린다(선은 장식)

variant=outline, tone=brand

부위상태속성값
rootenabled글자·아이콘foregroundfg-brandDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84Desk 8.38 · 6.10 · HR 8.17 · 6.07
테두리borderColorstroke-brand-weakDesk#79A6F3다크 #4C83DCHR#77B193다크 #1D9567Desk 2.45 · 3.86 · HR 2.47 · 3.83 — 의미 색 넷보다 짙다(v109 값 그대로 · HR 은 v121 그루 초록)

variant=outline, tone=informative

부위상태속성값
rootenabled글자·아이콘foregroundfg-informative#1D6EC9다크 #69ABFF5.09 · 6.12
테두리borderColorstroke-informative-weak#B9D4F6다크 #1C4E8Av117 — 1.52 · 1.73(시트 위 1.50)

variant=outline, tone=positive

부위상태속성값
rootenabled글자·아이콘foregroundfg-positive#167F3F다크 #25C0625.07 · 6.07
테두리borderColorstroke-positive-weak#BBDAC1다크 #1A582Fv117 — 1.51 · 1.71

variant=outline, tone=warning

부위상태속성값
rootenabled글자·아이콘foregroundfg-warning#BE490D다크 #FF87585.06 · 6.11
테두리borderColorstroke-warning-weak#F5C7B6다크 #833615v117 — 1.53 · 1.73

variant=outline, tone=critical

부위상태속성값
rootenabled글자·아이콘foregroundfg-critical#D72323다크 #FF84775.06 · 6.08
테두리borderColorstroke-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 defaultsolid + brand(브랜드와 닿는 자리만 — 아니면 solid neutral)
secondaryweak neutral
destructive · dangersolid critical
soft — info · success · warning · error(웹) · softInfo · softSuccess · softWarning · softError(앱)weak informative · positive · warning · critical
softBrand(앱)weak brand
outlineoutline neutral
outline-info · -success · -warning · -error · outlineSuccess …outline informative · positive · warning · critical

제품은 앱 적용 단계에서 옮긴다(2026-10-03 조사 — Desk 웹 · HR 은 크로미움에 띄워 쟀고, Desk 앱은 위젯 테스트로 쟀다).

  • 세 벌 — 웹 Badge 19.2 · 알약 · 11/600(shared/ui/badge.tsx:17-71, 호출 23), 앱 PBadge 17(테두리 있으면 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 규칙, 말은 버튼 글로.

이 페이지