Groo Design

Notification Badge

안 읽은 알림 · 확인하지 않은 새 것이 있다는 신호 — 점(있음)과 숫자(몇 개). 아이콘 버튼 · 탭 글에 붙고, 보면 사라진다. 대상의 상태 · 분류를 글로 보이는 것은 Badge 다.

구조는 당근 SEED Notification Badge(Apache-2.0)를 따른다 — 점(Small) · 숫자 알약(Large), 아이콘 · 글에 붙는 자리, 크기 · 자리는 고정. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-03 사용자 결정). groo 에 처음 두는 컴포넌트다 — Tabs · Chip Tabs · Segmented Control 의 알림 점도 이 점이다.

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

9:41
가계부
내역통계예산자산
10월 1일 (목)
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
9:41
할 일
오늘예정새 소식완료
  • 관리비 이체오늘 · 매달
  • 장보기오늘
9:41
휴가 신청
내 신청승인 내역새 소식
2026년
  • 연차10월 12일 (월) · 1일
  • 반차(오전)9월 25일 (목) · 0.5일
9:41
가계부
내역통계예산자산
10월 1일 (목)
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
9:41
할 일
오늘예정새 소식완료
  • 관리비 이체오늘 · 매달
  • 장보기오늘
9:41
휴가 신청
내 신청승인 내역새 소식
2026년
  • 연차10월 12일 (월) · 1일
  • 반차(오전)9월 25일 (목) · 0.5일
Desk 상단 바 알림 · 탭 · Segmented 의 알림 점 — 라이트 · 다크

직접 골라 보기

크기(점 · 숫자) · 붙는 자리(아이콘 · 글) · 숫자를 고르면 스펙대로 그린 배지와 그 코드, 보조 기술이 읽는 이름이 바뀐다. 0 이면 사라지고 100 이상이면 "99+" 다.

groo desk
보조 기술이 읽는 이름: “알림, 새 알림 있음” — 보이는 것: 점
크기 size
붙는 자리 attach
새 알림 수(점은 있음 · 없음만)
모드
브랜드
import { Bell } from "lucide-react"
import { Button } from "@/components/ui/button"
import { NotificationBadge } from "@/components/ui/notification-badge"

<Button variant="ghost" layout="iconOnly" aria-label={hasUnread ? "알림, 새 알림 있음" : "알림"} onClick={openNotifications}>
  <NotificationBadge visible={hasUnread}>
    <Bell />
  </NotificationBadge>
</Button>

Anatomy

ⓐ Dotⓑ Count Containerⓒ Count Label
4배로 그렸다 — 24 아이콘 상자 위에 겹쳐 놓인다(아이콘 크기 · 버튼 높이를 바꾸지 않는다)
점(small)과 숫자 알약(large) — 아이콘 상자 위에 겹쳐 놓인다
부위설명
ⓐ Dot점 — 6, 새 것이 있는지만.
ⓑ Count Container숫자 알약 — 높이 18, 폭은 숫자만큼.
ⓒ Count Label숫자 — 1 ~ 99, 100 이상은 "99+".

부위

부위설명
root점(small) · 숫자 알약(large) — 붙는 대상의 상자 위에 겹쳐 놓인다(자리를 차지하지 않는다)
label숫자 — large 만. 0 이면 배지가 없고, 100 이상이면 "99+"

Properties

Size

small(점 6) (기본) 은 새 것이 있는지만 중요할 때 — 탭 · Segmented · 상단 바. large(숫자 18)는 몇 개인지가 판단에 필요할 때만 쓴다 — 하단 탭 바의 칸처럼(2칸까지). 상단 바(Top Navigation)에는 점만 둔다 — 숫자 알약은 아이콘 오른쪽으로 자라 맨 오른쪽 버튼에서 "99+" 가 화면 밖으로 8.5 나간다(2026-10-04). 숫자는 11 / 15 · 700 이고 글자 크기 설정을 따르지 않는다(커지면 아이콘을 덮는다 — SEED 와 같다).

점은 브랜드 글자색(fg-brand — 다크에서 밝은 짝)이고, 숫자 알약은 브랜드 채움(bg-brand-solid) + 흰 숫자다. Desk 는 파랑, HR 은 초록이다. 알림은 오류가 아니다 — 빨강은 오류 · 위험에 남긴다.

small 611299+
Desk
HR
라이트점은 fg-brand, 숫자는 bg-brand-solid + 흰 숫자
small 611299+
Desk
HR
다크다크 — 점은 밝은 짝(fg-brand), 숫자 알약은 같은 채움

점 6 · 숫자 알약 높이 18 · 최소 폭 18 · 좌우 4 · 숫자 11 / 15 · 700 · 숫자 폭 같게(tabular-nums) — 100 이상은 99+, 0 이면 없다. 숫자는 글자 크기 설정을 따르지 않는다

크기 — 점 6 · 숫자 1 · 12 · 99+, Desk · HR — 라이트 · 다크

크기

size최소 높이최소 너비크기좌우 여백배경숫자 글자숫자 색숫자 폭설명
small (기본)——6px—color-fg-brand HR #075B3C · Desk #0147AD — 브랜드 글자색 — 다크에서 밝은 짝(표면 위 Desk 8.38 · 6.10 · HR 8.17 · 6.07). bg-brand-solid 는 다크 표면과 Desk · HR 1.73 이라 쓰지 않는다———점 6 — 새 것이 있는지만(탭 · Segmented · 상단 바)
large18px — 글자가 커지지 않아 늘 18 — 폭만 숫자를 따른다(1 · 8 은 18 × 18, 12 는 약 22, 99+ 는 약 32)18px—spacing-x1 4pxcolor-bg-brand-solid HR #075B3C · Desk #0147AD — 알약 면은 다크 표면과 Desk · HR 1.73 — 흰 숫자가 정보를 들고 있다(다크 Desk · HR 8.36)text-t1-static 11px / 15px — 11 / 15 — 글자 크기 설정을 따르지 않는 px(웹 text-t1-static, 앱 TextScaler.noScaling — SEED t1-static). 커지면 아이콘을 덮는다color-static-white #FFFFFF — Desk 8.38 · 다크 8.36 · HR 8.17 · 8.36tabular-nums — 숫자 폭을 같게 — 수가 바뀌어도 흔들리지 않는다숫자 18 — 몇 개인지가 중요할 때(상단 바 알림)

공통

부위속성값비고
root모서리radius-full 9999px
label숫자 굵기700숫자(large)에만 있다

Attach

자리는 붙는 대상의 상자에서 잰다 — 아이콘이면 아이콘 상자(버튼 상자가 아니다), 글이면 글 상자다. 위치 · 크기는 고정이다 — 화면마다 옮기지 않는다(SEED).

  • 아이콘 · 점 — 아이콘 상자 오른쪽 위 안쪽 1. 24 아이콘이면 x 17 ~ 23 · y 1 ~ 7(아이콘 크기가 달라도 같은 식 — 18 아이콘이면 x 11 ~ 17).
  • 아이콘 · 숫자 — 알약의 왼쪽 아래 꼭짓점이 (아이콘 폭 − 8, 14). 24 아이콘이면 (16, 14) — 위로 4, 오른쪽으로 튀어나오고 숫자가 길수록 오른쪽으로 자란다. 본문의 아이콘 버튼(Button iconOnly medium 40 · 아이콘 18)이면 (10, 14)다. 두 자리 · "99+" 는 버튼 오른쪽 밖으로 나갈 수 있다.
  • 상단 바 — Top Navigation 의 아이콘 버튼은 상자 44 · 아이콘 24 다(2026-10-04) — 점은 x 17 ~ 23 · y 1 ~ 7. 상단 바에는 점만 둔다.
  • 글 — 마지막 글자 뒤 2, 위는 글 줄 상자의 위 끝. 탭 · 칸 폭과 줄 높이를 바꾸지 않는다. Chip Tabs 만 칩 안 글 뒤 6 · 세로 가운데에 흐름으로 놓는다(SEED Chip Tabs — 값은 Tabs).
아이콘 · 점(small)오른쪽 위 안쪽 1 — 아이콘 크기가 달라도 같은 식
아이콘 · 숫자(large)왼쪽 아래 꼭짓점 = (아이콘 폭 − 8, 14) — 위로 4 튀어나오고 숫자가 길수록 오른쪽으로 자란다
승인 내역
글 · 점마지막 글자 뒤 2 · 위는 글 줄 상자의 위 끝 — 탭 폭 · 줄 높이를 바꾸지 않는다(3배)

분홍 테두리 — 24 아이콘 상자(6배, 눈금 1px). 자리는 버튼 상자가 아니라 붙는 대상의 상자에서 잰다

붙는 자리 — 24 아이콘의 점 · 숫자 좌표와 글 끝 2

붙는 대상

attach글 끝과 사이자리설명
icon (기본)—absolute — 아이콘 상자 기준 — 버튼 상자가 아니라 아이콘(24 · 20)의 상자에서 잰다 — 아이콘 크기 · 버튼 높이를 바꾸지 않는다. 점 · 숫자의 자리는 크기마다 아래 조합 규칙아이콘에 붙는다 — 상단 바 · 탭 바의 아이콘 버튼
text2px — 글 끝 ↔ 점 · 알약absolute — 글 끝 + 2 · 줄 상자 위 끝 — 글 상자 기준 — 마지막 글자 뒤 2, 위는 글 줄 상자의 위 끝(글자 상자보다 1 위). 탭 · 칸 폭과 줄 높이를 바꾸지 않는다(SEED: right −2 + translate(100%, 0)). Chip Tabs 만 칩 안 글 뒤 6 · 세로 가운데 흐름(chip-tabs.yaml)글에 붙는다 — 탭 · Segmented 의 글 오른쪽 위

아이콘에 붙을 때 — 크기마다

조합상태속성값
size=small + attach=iconenabled위 거리1px — 아이콘 상자 위에서 1 — 24 아이콘이면 y 1 ~ 7
size=small + attach=iconenabled오른쪽 거리1px — 아이콘 상자 오른쪽에서 1 — 24 아이콘이면 x 17 ~ 23. 아이콘 안쪽에 놓인다(SEED: top 7 · right 7 + translate(100%, −100%))
size=large + attach=iconenabled자리absolute — 왼쪽 아래 꼭짓점 = (아이콘 폭 − 8, 14) — 24 아이콘이면 (16, 14) — left 16 · top −4. 위 · 오른쪽으로 튀어나와 숫자가 길수록 오른쪽으로 자란다(SEED: top 14 · right 8 + translate(100%, −100%)). 한 자리면 아이콘 버튼 44 안, 두 자리 · 99+ 는 버튼 밖으로 나간다

숫자

개수보이는 것
0배지가 없다(점도 숫자도)
1 ~ 99그 숫자
100 이상"99+"

숫자의 상한은 SEED 의 두 문서 가운데 Bottom Navigation 의 "99+" 다(Notification Badge 문서의 "최대 4자 · 999+" 가 아니다). 보조 기술이 읽는 이름에는 줄이지 않은 수를 넣는다("새 알림 128개").

State

상태는 enabled 하나다 — 배지는 누르지 않는다(붙은 버튼 · 탭이 누른다). 나타나고 사라질 때 모션이 없다(SEED).

Guidelines

핵심 상태에만 — 보면 사라진다

안 읽은 알림 · 승인할 결재처럼 사용자가 확인해야 할 새 것이 있을 때만 단다. 사용자가 그 내용을 보면(알림 목록을 열면 · 그 탭을 고르면) 바로 사라진다 — "확인했다" 는 신호다. 늘 있는 상태 · 개수(거래 3건 · 걸린 필터 2개)는 알림 배지가 아니다.

가계부
알림 목록을 열었다가 돌아오면
가계부
이렇게 — 안 읽은 알림이 있을 때만 — 알림 목록을 열면(보면) 바로 사라진다
가계부
필터를 보고 돌아와도
가계부
이렇게 하지 않는다 — 걸린 필터 수 · 거래 수처럼 늘 있는 개수를 알림 숫자로 — 새 것이 아니라 보아도 사라지지 않는다
새 알림이 있을 때만 — 목록을 열면 사라진다

한 화면에 아껴서

강한 색이라 여럿이면 눈이 피로하고 무엇이 중요한지 흐려진다. 한 화면에는 되도록 적게 — 가장 급한 알림에만 단다(SEED "화면 내 Badge 수는 최소화하고, 우선순위가 높은 알림에만 사용하는 것을 권장"). 탭은 여러 탭에 동시에 달지 않고, 하단 탭 바는 셋 이상에 달지 않는다(SEED).

9:41
가계부
내역통계예산자산
10월 1일 (목)
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
이렇게 — 한 화면에 하나 — 상단 바의 알림만
9:41
가계부
내역통계새 소식예산새 소식자산새 소식
10월 1일 (목)
  • 점심 식사식비, 신한카드, 오후 12:40−12,000원
  • 스타벅스 강남역점카페, 현대카드 M, 오후 2:10−5,600원
  • 교통 정기권연체 3교통, 국민 체크카드, 3/12회−62,000원
이렇게 하지 않는다 — 탭마다 점 — 무엇이 중요한지 흐려진다. 탭은 여러 탭에 동시에 달지 않는다
상단 바 하나 · 탭마다 점

점이 기본, 숫자는 필요할 때

몇 개인지가 판단에 필요할 때만 숫자를 쓴다 — 대부분은 점이면 된다. 개수가 아닌 말("연결됨" · "새로")을 알림 배지 자리에 얹지 않는다 — 말은 버튼 글이나 Badge 다.

가계부
이렇게 — 대부분은 점 — 새 것이 있는지만
결재
이렇게 — 몇 개인지가 판단에 필요할 때만 숫자
거래 상세
이렇게 하지 않는다 — 개수가 아닌 말("연결됨")을 알림 자리에 — 버튼 글 · Badge 다
점 · 숫자 · 알림 자리에 얹은 말

알림은 브랜드 색

점 · 숫자는 브랜드 색이다(Desk 파랑 · HR 초록). 빨강(위험 색)은 오류 · 넘침 · 위험에 남긴다 — 알림을 빨강으로 칠하면 오류 표시와 같은 색이 된다.

groo desk
groo hr
이렇게 — 브랜드 색 — Desk 파랑 · HR 초록. 알림은 오류가 아니다
groo desk
이렇게 하지 않는다 — 빨간 점 · 숫자 — 오류 · 넘침 표시와 같은 색이 된다
브랜드 색 점 · 빨간 점

이름에 넣는다

점 · 숫자는 보조 기술에 숨기고, 붙은 버튼 · 탭의 이름에 넣는다.

붙은 곳이름
아이콘 버튼 · 점"알림, 새 알림 있음"
아이콘 버튼 · 숫자"알림, 새 알림 3개"(줄이지 않은 수 — "새 알림 128개")
탭 · 점탭 글 뒤 "새 소식"(Tabs · Segmented Control — 하나로, 2026-10-15 Q-010-4)
글 · 숫자글 뒤 "새 소식 N개" — "승인 내역, 새 소식 3개"(줄이지 않은 수)

수가 바뀌어도 소리로 알리지 않는다(라이브 영역 없음) — 버튼에 초점이 오면 새 이름을 읽는다. 꼭 바로 알려야 하는 새 알림은 Snackbar 다.

가계부
보조 기술이 읽는 글: “알림, 새 알림 3개, 버튼”
가계부
보조 기술이 읽는 글: “알림, 새 알림 128개, 버튼”
이렇게 — 점 · 숫자는 숨기고 붙은 버튼의 이름에 — 줄이지 않은 수로
가계부
보조 기술이 읽는 글: “알림, 버튼”보조 기술이 읽는 글: “3, 알림, 버튼”
이렇게 하지 않는다 — 이름이 "알림" 뿐 — 새 알림이 있는지 소리로 알 수 없다. 숫자만 읽히는 "3" 도 무엇인지 모른다
보조 기술이 읽는 이름 — "알림, 새 알림 3개"

쓰는 자리

자리크기 · 붙는 곳
Desk 상단 바 알림(웹 · 앱)small · 아이콘(24) — 상단 바는 점만(Top Navigation)
하단 탭 바의 칸small · large · 아이콘(24) — 2칸까지(Bottom Navigation). 지금 다는 칸은 없다
탭 · Chip Tabs · Segmented Control 의 새 소식small · 글(값은 Tabs · Segmented Control 스펙)
HR알림 기능이 아직 없다 — 생기면 같은 규칙

필터 칩 줄의 개수("필터 2")는 두지 않는다 — 걸린 조건 칩의 글이 곧 조건이다(Chip 의 필터 바).

코드

레시피 recipes/shadcn/components/ui/notification-badge.tsx 를 쓴다 — NotificationBadge 가 붙을 대상(아이콘 · 글)을 감싸고 그 상자 위에 점 · 숫자를 놓는다. size("small" 기본 · "large") · attach("icon" 기본 · "text") · visible(small — 점을 보일지, 기본 true) · count(large — 0 이하면 숨김, 100 이상이면 "99+"). 점 · 숫자는 aria-hidden 이라 이름은 붙은 버튼에 직접 단다. 숫자 표기는 formatNotificationCount(count)(0 이하 null · 100 이상 "99+")로 앱과 맞춘다. 아래 미리보기는 스펙 값으로 그린 모습이다.

상단 바 알림 — 점

Desk 상단 바 — 알림 점
import { Bell } from "lucide-react"
import { TopNavigationIconButton } from "@/components/ui/top-navigation"

{/* 상단 바는 Top Navigation 의 아이콘 버튼(44 · 24) — notification 이 이 점(small)을 붙인다 */}
<TopNavigationIconButton notification={hasUnread} aria-label={hasUnread ? "알림, 새 알림 있음" : "알림"} onClick={openNotifications}>
  <Bell />
</TopNavigationIconButton>

숫자 — 몇 개인지 보여야 할 때

상단 바가 아닌 자리(본문의 아이콘 버튼 · 하단 탭 바의 칸)에서만 — 상단 바는 점만 둔다.

알림 3 · 99+
import { Bell } from "lucide-react"
import { Button } from "@/components/ui/button"
import { NotificationBadge } from "@/components/ui/notification-badge"

<Button variant="ghost" layout="iconOnly" aria-label={unread > 0 ? `알림, 새 알림 ${unread}개` : "알림"} onClick={openNotifications}>
  <NotificationBadge size="large" count={unread}>
    <Bell />
  </NotificationBadge>
</Button>

Behavior

인터랙션동작
새 것이 생김모션 없이 나타난다. 반복 모션(깜빡임 · 퍼짐)을 걸지 않는다
사용자가 봄(목록을 엶 · 탭을 고름)바로 사라진다
수가 바뀜숫자만 바뀐다(폭은 숫자를 따른다). 소리로 알리지 않는다
누르기배지는 누르지 않는다 — 붙은 버튼 · 탭의 동작이다
글자 크기 설정숫자는 커지지 않는다(아이콘을 덮지 않게)

Accessibility

기준검증
WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1)숫자 흰 글자 on bg-brand-solid — Desk 8.38 · 다크 8.36 · HR 8.17 · 8.36 ✓
WCAG 1.4.11 Non-text contrast(≥ 3:1)점 fg-brand 흰 표면 위 Desk 8.38 · 다크 6.10 · HR 8.17 · 6.07 ✓(SEED 의 채움 색이면 다크 Desk · HR 1.73 으로 묻힌다). 숫자 알약 면은 다크 표면과 Desk · HR 1.73 — 흰 숫자가 알린다
WCAG 1.4.1 Use of color점 · 숫자는 소리로는 이름에 들어간다("새 알림 있음") — 색만으로 알리지 않는다
WCAG 4.1.2 Name, Role, Value붙은 버튼 · 탭의 이름에 알림이 있다 ✓ — 점 · 숫자 자신은 aria-hidden
WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24)해당 없음 — 배지는 누르지 않는다. 붙은 아이콘 버튼은 40(누르는 영역 44) ✓
WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44)해당 없음 — 붙은 아이콘 버튼의 누르는 영역 44 ✓
ARIA점 · 숫자 aria-hidden="true". 아이콘 버튼 이름 "알림, 새 알림 3개" · "알림, 새 알림 있음", 탭은 글 뒤 숨은 글 "새 소식". 라이브 영역 없음

Do / Don't

✅ Do

  • 확인해야 할 새 것이 있을 때만, 보면 바로 지운다.
  • 대부분은 점 — 숫자는 몇 개인지가 필요할 때만.
  • 점 · 숫자를 붙은 버튼 · 탭의 이름에 넣는다.
  • 브랜드 색으로.

❌ Don't

  • 0 을 보이기 · "999+".
  • 여러 탭에 동시에 · 하단 탭 바 셋 이상에.
  • 걸린 필터 수 · 항목 수 같은 늘 있는 개수를 알림 배지로.
  • 말("연결됨")을 알림 배지 자리에.
  • 빨간 점 — 빨강은 오류다.

Specification

notification-badge.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Notification Badge 를 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다.

Base

부위상태속성값
rootenabled모서리radiusradius-full9999px(알약)
labelenabled숫자 굵기fontWeight700숫자(large)에만 있다

size=small

부위상태속성값
rootenabled크기size6px
배경backgroundfg-brandDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84브랜드 글자색 — 다크에서 밝은 짝(표면 위 Desk 8.38 · 6.10 · HR 8.17 · 6.07). bg-brand-solid 는 다크 표면과 Desk · HR 1.73 이라 쓰지 않는다

size=large

부위상태속성값
rootenabled최소 높이minHeight18px글자가 커지지 않아 늘 18 — 폭만 숫자를 따른다(1 · 8 은 18 × 18, 12 는 약 22, 99+ 는 약 32)
최소 너비minWidth18px
좌우 여백paddingXspacing-x14px
배경backgroundbg-brand-solidDesk#0147AD다크 #1049A4HR#075B3C다크 #1B583E알약 면은 다크 표면과 Desk · HR 1.73 — 흰 숫자가 정보를 들고 있다(다크 Desk · HR 8.36)
labelenabled숫자 색foregroundstatic-white#FFFFFFDesk 8.38 · 다크 8.36 · HR 8.17 · 8.36
숫자 글자typographytext-t1-static11 / 15 — 글자 크기 설정을 따르지 않는 px(웹 text-t1-static, 앱 TextScaler.noScaling — SEED t1-static). 커지면 아이콘을 덮는다
숫자 폭numeralstabular-nums숫자 폭을 같게 — 수가 바뀌어도 흔들리지 않는다

attach=icon

부위상태속성값
rootenabled자리positionabsolute — 아이콘 상자 기준버튼 상자가 아니라 아이콘(24 · 20)의 상자에서 잰다 — 아이콘 크기 · 버튼 높이를 바꾸지 않는다. 점 · 숫자의 자리는 크기마다 아래 조합 규칙

size=small, attach=icon

부위상태속성값
rootenabled위 거리top1px아이콘 상자 위에서 1 — 24 아이콘이면 y 1 ~ 7
오른쪽 거리right1px아이콘 상자 오른쪽에서 1 — 24 아이콘이면 x 17 ~ 23. 아이콘 안쪽에 놓인다(SEED: top 7 · right 7 + translate(100%, −100%))

size=large, attach=icon

부위상태속성값
rootenabled자리positionabsolute — 왼쪽 아래 꼭짓점 = (아이콘 폭 − 8, 14)24 아이콘이면 (16, 14) — left 16 · top −4. 위 · 오른쪽으로 튀어나와 숫자가 길수록 오른쪽으로 자란다(SEED: top 14 · right 8 + translate(100%, −100%)). 한 자리면 아이콘 버튼 44 안, 두 자리 · 99+ 는 버튼 밖으로 나간다

attach=text

부위상태속성값
rootenabled글 끝과 사이gap2px글 끝 ↔ 점 · 알약
자리positionabsolute — 글 끝 + 2 · 줄 상자 위 끝글 상자 기준 — 마지막 글자 뒤 2, 위는 글 줄 상자의 위 끝(글자 상자보다 1 위). 탭 · 칸 폭과 줄 높이를 바꾸지 않는다(SEED: right −2 + translate(100%, 0)). Chip Tabs 만 칩 안 글 뒤 6 · 세로 가운데 흐름(chip-tabs.yaml)

SEED 와 다른 점

  • 점은 브랜드 글자색(fg-brand — 다크에서 밝은 짝) — SEED 는 점도 채움 색(bg.brand-solid)이다. groo 다크에서 채움 색 점은 표면과 Desk · HR 1.73:1 로 묻힌다. 숫자 알약은 SEED 대로 채움 색 + 흰 숫자다.
  • 숫자 상한은 "99+" — SEED Bottom Navigation 문서를 따른다(Notification Badge 문서는 "최대 4자 · 999+" 로 두 문서가 다르다).
  • 이름에 넣는다 — SEED 는 점 · 숫자에 이름이 없고 붙은 탭 · 버튼의 이름도 그대로라 소리로 알 수 없다. groo 는 붙은 버튼 · 탭의 이름에 "새 알림 3개" · "새 소식" 을 넣는다.
  • 점 둘레 링이 없다 — SEED Top Navigation 그림의 바탕색 링(3)은 CSS 에 없다. groo 도 두지 않는다(6 전체가 색).
  • 크기 · 자리 · 숫자 글자(글자 크기 설정을 따르지 않음) · 모션 없음은 SEED 와 같다.

Migration notes

2026-10-22 — 한 화면에는 되도록 적게

"한 화면에 하나 둘만"(b1dfc58 — 10-03 은 색(4A)만 골랐다)을 SEED 의 "최소화" 대로 "되도록 적게 — 가장 급한 알림에만" 으로 낮췄다(남은 규칙 R3). 탭 · 하단 탭 바 규칙(SEED "지양" · "주의")은 그대로다. 사용자 결정 — https://claude.ai/artifact/Mag1tEv51MdQHdy1o8hY3L. 값 변경 없음.

2026-10-08 — 글자 값을 고정 px 토큰으로

YAML 의 숫자(large) 글자가 rem 토큰($text-t1)을 가리키고 "글자 크기 설정을 따르지 않는 px" 는 비고에만 있었다 — YAML 대로 만들면 글자 크기 200% 에서 숫자가 22 / 30 으로 커져 알약이 37 × 30 이 되고 아이콘보다 커진다. 레시피 · 제품(웹 -static 클래스 · 앱 TextScaler.noScaling) · SEED rootage 와 같게 값 자리를 -static 토큰($text-t1-static)으로 고쳤다. 크기 · 모습은 그대로다. -static 은 같은 글자 토큰의 px 판이다(Typography v104 — 내보낼 때 생긴다). 사용자 결정 — 비교 페이지 3.

2026-10-04 — 상단 바는 점만, 아이콘 24

Top Navigation 을 정하며 상단 바의 아이콘 버튼이 상자 44 · 아이콘 24 가 됐다(화면 틀 · 이동 결정 1A) — 점 자리는 위 식 그대로 x 17 ~ 23 · y 1 ~ 7 이다. 상단 바에는 점만 둔다(따라오는 것 — 숫자 "99+" 는 맨 오른쪽 버튼에서 화면 밖으로 나간다). 숫자는 하단 탭 바의 칸처럼 몇 개인지가 판단에 필요한 자리에 남긴다.

2026-10-03 — 새로 둔다(SEED Notification Badge)

사용자가 비교 페이지에서 정했다 — 점 · 숫자의 색은 브랜드(4A — 점 fg-brand, 숫자 bg-brand-solid + 흰 글자), 크기 · 자리는 SEED(점 6 · 숫자 18 · 0 은 안 보임 · 99+), 이름은 버튼에(따라오는 것). 옛 DESIGN.md Badge 절의 "동적 count badge 는 aria-live" 규칙은 걷었다(수는 버튼 이름에, 소리로 알리지 않는다).

제품은 앱 적용 단계에서 옮긴다(2026-10-03 조사).

  • Desk 웹 상단 바 — 점 7 × 7 에 2px 표면 테두리를 둘러 빨강이 3 × 3 이다(widgets/layout/ui/GrooTopBar.tsx:54-68 · :65). 모바일 머리는 6 × 6(MobileHeader.tsx:47-61). 둘 다 aria-hidden 이고 버튼 이름은 "알림" 뿐 — 새 알림이 있는지 소리로 알 수 없다. 빨강(--fg-expense)을 브랜드 점 6 으로.
  • Desk 앱 상단 바 — 7 × 7 빨강 · 의미 노드 없음(shared/widgets/mobile_header.dart:82-118), 버튼은 툴팁 "알림" 뿐.
  • 필터 개수 — 웹 16 알약 · aria-hidden(pages/expense/ui/ExpensePage.tsx:1916-1929), 앱 PBadge 23 × 17 · 버튼 이름 없이 "3" 으로만 읽힘(features/expense/presentation/expense_screen.dart:874-901 · 929-936, features/todo/presentation/todo_screen.dart:699-707), HR 버튼 안 "필터 3"(work-report/ui/ReportHeader.tsx:43-58). 필터 바는 Chip 결정대로 개수를 걷는다.
  • 상세 빠른 동작 위의 말 — 44 원 버튼 위 브랜드 알약에 "2개" · "연결됨" · "1건" 을 얹어 버튼 이름 앞에 붙어 "2개 내역 분할" · "연결됨 반복 설정" 으로 읽힌다(웹 shared/ui/groo/detail.tsx:211-215 ← TxDetailDialog.tsx:318-357, 앱 shared/widgets/p_detail.dart:292). 알림이 아니다 — 버튼 글 · 설명으로 옮긴다.
  • 죽은 코드 — 웹 features/notification/ui/NotificationBell.tsx:78-82("99+" 10px · 빨강, 쓰는 곳 0) · shared/ui/sidebar.tsx:628-647 SidebarMenuBadge · groo.css:121 · 190 .side__item .count.
  • HR — 알림 기능이 없다. 생기면 같은 규칙(초록 점).

이 페이지