Page Banner
페이지 맨 위(머리 바로 아래)에 화면 폭 전체로 놓이는 띠 — 그 페이지 전체의 상태를 알린다(증권 연결 끊김 · Pro 만료 예정 · 새 버전). 한 화면에 하나. 그 기능 가까이의 안내는 Callout, 잠깐 알릴 결과는 Snackbar 다.
구조는 당근 SEED Page Banner(Apache-2.0)를 따른다 — 화면 폭 띠 · 아이콘 · 제목 · 본문 · 버튼, 옅은(weak) · 짙은(solid) 바탕, 상호작용 셋. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-02 사용자 결정). groo 에 처음 두는 컴포넌트다.
수치 원본은 page-banner.yaml이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.
직접 골라 보기
톤 · 바탕 · 상호작용 · 제목 · 버튼을 고르면 스펙대로 그린 띠와 그 코드가 바뀐다.
import { PageBanner } from "@/components/ui/page-banner"
<PageBanner tone="critical" title="연결 끊김" button={{ label: "다시 연결", onClick: handle }}>
증권 연결 키가 만료돼 시세를 받지 못해요.
</PageBanner>Anatomy
| 부위 | 설명 |
|---|---|
| ⓐ Container | 띠 — 화면 폭 전체, 모서리 없음. |
| ⓑ Icon | 앞 아이콘 — 첫 줄 가운데. |
| ⓒ Title | 제목 — 상태를 나타내는 짧은 말(연결 끊김 · 곧 만료). 꼭 필요할 때만. |
| ⓓ Description | 본문 — 제목 뒤에 이어진다. |
| ⓔ Button | 버튼 — 하나, 글 버튼. 자리가 모자라면 다음 줄로. |
| ⓕ Chevron · Close | 띠 전체를 누르면 뒤 화살표, 닫을 수 있으면 닫기. |
부위
| 부위 | 설명 |
|---|---|
root | 띠 — 화면 폭 전체, 모서리 없음 |
icon | 앞 아이콘 — 첫 줄 가운데 |
content | 제목 · 본문과 버튼 — 한 줄에 안 들어가면 버튼이 다음 줄로 |
title | 제목 — 상태를 나타내는 짧은 말(연결 끊김 · 곧 만료) |
description | 본문 — 제목을 되풀이하지 않는다 |
button | 버튼 — 하나, 글 버튼 |
suffixIcon | 뒤 화살표 — 띠 전체를 누르는 Actionable 에만 |
closeButton | 닫기 — Dismissible 에만. 이름 "닫기" |
focusRing | 키보드 포커스 링(웹) |
Properties
띠
좌우 화면 여백 24 · 위아래 10 · 최소 40 · 모서리 없음. 아이콘 16(첫 줄 가운데), 제목 14 / 19 · 700, 본문 14 / 19 · 500(사이 띄어쓰기 두 칸), 버튼 13 / 18 · 700(누르는 높이 40). 본문과 버튼이 한 줄에 안 들어가면 버튼이 다음 줄 본문 시작선으로 내려간다.
- 좌우 24(화면 여백) · 위아래 10 · 최소 40 · 모서리 0
- 아이콘 16 · 제목 14 / 19 · 700 · 본문 500 · 버튼 13 / 18 · 700
공통
| 부위 | 속성 | 값 | 비고 |
|---|---|---|---|
root | 너비 | 100% | 화면 폭 전체 — 페이지 머리 바로 아래(위에 사진이 있으면 그 아래), 한 화면에 하나 |
root | 최소 높이 | 40px | |
root | 좌우 여백 | spacing-global-gutter 24px | SEED 16 → 화면 여백 24 |
root | 상하 여백 | spacing-x2_5 10px | |
root | 간격 | spacing-x2 8px | 아이콘 ↔ 글 |
root | 모서리 | 0px | 모서리 없음 |
root | 세로 맞춤 | flex-start | 아이콘은 첫 줄에 붙는다 — 화살표 · 닫기는 띠 가운데 |
icon | 아이콘 | 16px | lucide 선 아이콘 — 위 2(첫 줄 가운데). 톤마다 기본은 Callout 과 같다(info · info · circle-check · triangle-alert · circle-alert) |
icon | 위 바깥 여백 | spacing-x0_5 2px | |
content | 간격 | spacing-x1_5 6px | 본문과 버튼이 한 줄에 안 들어가면 버튼이 다음 줄 본문 시작선으로 |
content | 가로 맞춤 | space-between | 한 줄에 들어가면 버튼은 오른쪽 끝(SEED 와 같다) |
title | 글자 | text-t4 14px / 19px | 본문과 한 문단 — 사이는 띄어쓰기 두 칸 |
title | 굵기 | 700 | |
description | 글자 | text-t4 14px / 19px | 단어 단위 줄바꿈(v114) |
description | 굵기 | 500 | |
button | 글자 | text-t3 13px / 18px | |
button | 굵기 | 700 | |
button | 터치 영역 | 글 + 사방 11 × 40 | 바깥 여백 −11 로 띠 높이를 늘리지 않는다 |
button | 모서리 | radius-r1 4px | 바탕이 없어 포커스 링에만 보인다 |
suffixIcon | 뒤 아이콘 | 16px | chevron-right — 글과 8 |
closeButton | 크기 | 40px | 투명 상자 — 바깥 여백 −12 로 띠 높이를 늘리지 않는다. 아이콘은 오른쪽 끝에서 24, 글과 8 |
closeButton | 아이콘 크기 | 16px | |
closeButton | 모서리 | radius-r2 8px |
Tone · Variant
톤 다섯(neutral · informative · positive · warning · critical) × 바탕 둘. 옅은 바탕(weak, 기본)은 Callout 과 같은 짝(bg-*-weak + fg-*-contrast)이고, 짙은 바탕(solid)은 bg-*-solid + 흰 글이다 — 더 강하게 알려야 할 때(연결 끊김 · 거절 · 편집 불가).
바탕 · 톤
| 조합 | 상태 | 속성 | 값 |
|---|---|---|---|
variant=weak + tone=neutral | enabled | 배경 | color-bg-neutral-weak #F5F6FA · 다크 #353B4D |
variant=weak + tone=neutral | enabled | 글자·아이콘 | color-fg-neutral #1A1F2E · 다크 #F5F6FA |
variant=weak + tone=informative | enabled | 배경 | color-bg-informative-weak #EAF3FE · 다크 #21344D |
variant=weak + tone=informative | enabled | 글자·아이콘 | color-fg-informative-contrast #0F5FB3 · 다크 #ACCEFB — 글 · 아이콘 · 버튼 · 화살표 · 닫기가 모두 이 색 |
variant=weak + tone=positive | enabled | 배경 | color-bg-positive-weak #EAF5EC · 다크 #223927 |
variant=weak + tone=positive | enabled | 글자·아이콘 | color-fg-positive-contrast #026E33 · 다크 #AED6B6 |
variant=weak + tone=warning | enabled | 배경 | color-bg-warning-weak #FFEFE8 · 다크 #4B2B1F |
variant=weak + tone=warning | enabled | 글자·아이콘 | color-fg-warning-contrast #A53E0A · 다크 #F9BFA9 |
variant=weak + tone=critical | enabled | 배경 | color-bg-critical-weak #FFEFEC · 다크 #532722 |
variant=weak + tone=critical | enabled | 글자·아이콘 | color-fg-critical-contrast #C01016 · 다크 #FFBCB3 |
variant=solid + tone=neutral | enabled | 배경 | color-bg-neutral-inverted #1A1F2E · 다크 #F5F6FA |
variant=solid + tone=neutral | enabled | 글자·아이콘 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 |
variant=solid + tone=neutral | focused | 링 색 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 |
variant=solid + tone=informative | enabled | 배경 | color-bg-informative-solid #1D6EC9 · 다크 #0F65BF |
variant=solid + tone=informative | enabled | 글자·아이콘 | color-static-white #FFFFFF — 5.09 · 다크 5.78 |
variant=solid + tone=informative | focused | 링 색 | color-static-white #FFFFFF |
variant=solid + tone=positive | enabled | 배경 | color-bg-positive-solid #167F3F · 다크 #117539 |
variant=solid + tone=positive | enabled | 글자·아이콘 | color-static-white #FFFFFF — 5.07 · 5.79 |
variant=solid + tone=positive | focused | 링 색 | color-static-white #FFFFFF |
variant=solid + tone=warning | enabled | 배경 | color-bg-warning-solid #BE490D · 다크 #B04209 |
variant=solid + tone=warning | enabled | 글자·아이콘 | color-static-white #FFFFFF — 5.06 · 5.79 |
variant=solid + tone=warning | focused | 링 색 | color-static-white #FFFFFF |
variant=solid + tone=critical | enabled | 배경 | color-bg-critical-solid #D72323 · 다크 #CC0E17 |
variant=solid + tone=critical | enabled | 글자·아이콘 | color-static-white #FFFFFF — 5.06 · 5.77 |
variant=solid + tone=critical | focused | 링 색 | color-static-white #FFFFFF |
interaction=actionable + variant=weak + tone=neutral | hovered | 배경 | color-bg-neutral-weak-pressed #EDEFF3 · 다크 #404757 |
interaction=actionable + variant=weak + tone=neutral | pressed | 배경 | color-bg-neutral-weak-pressed #EDEFF3 · 다크 #404757 |
interaction=actionable + variant=weak + tone=informative | hovered | 배경 | color-bg-informative-weak-pressed #D7E6FB · 다크 #204069 |
interaction=actionable + variant=weak + tone=informative | pressed | 배경 | color-bg-informative-weak-pressed #D7E6FB · 다크 #204069 |
interaction=actionable + variant=weak + tone=positive | hovered | 배경 | color-bg-positive-weak-pressed #D8EADB · 다크 #20482B |
interaction=actionable + variant=weak + tone=positive | pressed | 배경 | color-bg-positive-weak-pressed #D8EADB · 다크 #20482B |
interaction=actionable + variant=weak + tone=warning | hovered | 배경 | color-bg-warning-weak-pressed #FAE0D5 · 다크 #65321D |
interaction=actionable + variant=weak + tone=warning | pressed | 배경 | color-bg-warning-weak-pressed #FAE0D5 · 다크 #65321D |
interaction=actionable + variant=weak + tone=critical | hovered | 배경 | color-bg-critical-weak-pressed #FFDEDA · 다크 #722722 |
interaction=actionable + variant=weak + tone=critical | pressed | 배경 | color-bg-critical-weak-pressed #FFDEDA · 다크 #722722 |
interaction=actionable + variant=solid + tone=neutral | hovered | 배경 | color-bg-neutral-inverted-pressed #535866 · 다크 #B7BDCC |
interaction=actionable + variant=solid + tone=neutral | pressed | 배경 | color-bg-neutral-inverted-pressed #535866 · 다크 #B7BDCC |
interaction=actionable + variant=solid + tone=informative | hovered | 배경 | color-bg-informative-solid-pressed #0F5FB3 · 다크 #1F70CB |
interaction=actionable + variant=solid + tone=informative | pressed | 배경 | color-bg-informative-solid-pressed #0F5FB3 · 다크 #1F70CB |
interaction=actionable + variant=solid + tone=positive | hovered | 배경 | color-bg-positive-solid-pressed #026E33 · 다크 #198140 |
interaction=actionable + variant=solid + tone=positive | pressed | 배경 | color-bg-positive-solid-pressed #026E33 · 다크 #198140 |
interaction=actionable + variant=solid + tone=warning | hovered | 배경 | color-bg-warning-solid-pressed #A53E0A · 다크 #BF4A10 |
interaction=actionable + variant=solid + tone=warning | pressed | 배경 | color-bg-warning-solid-pressed #A53E0A · 다크 #BF4A10 |
interaction=actionable + variant=solid + tone=critical | hovered | 배경 | color-bg-critical-solid-pressed #C01016 · 다크 #D82424 |
interaction=actionable + variant=solid + tone=critical | pressed | 배경 | color-bg-critical-solid-pressed #C01016 · 다크 #D82424 |
Interaction
display(보이기만 — 버튼 하나를 둘 수 있다) · actionable(띠 전체가 버튼 — 뒤 화살표) · dismissible(닫기 — 한 번 보면 되는 안내에만).
상호작용
| interaction | 설명 |
|---|---|
display (기본) | 보이기만 — 버튼 하나를 둘 수 있다 |
actionable | 띠 전체가 버튼 — 뒤 화살표, 버튼은 두지 않는다 |
dismissible | 닫기 버튼 — 한 번 보면 되는 안내에만(경고 · 오류는 닫지 못한다) |
State
| 상태 | 모습 |
|---|---|
enabled | 기본 |
hovered | 웹 — Actionable 은 누름 바탕 |
pressed | Actionable 은 누름 바탕 + 안의 내용만 2px 거리 축소(바탕은 그대로), 버튼 · 닫기는 각자 축소 |
focused | 웹 — 키보드 포커스에만 안쪽 링(화면 끝까지 차는 띠라 바깥 링이 잘린다). 짙은 바탕에서는 링을 띠 글자색으로 — 브랜드 링은 짙은 띠 위에서 1.61 ~ 2.44 라 보이지 않는다 |
상태
| 상태 | button 배율 | button 축소 시간 | button 축소 곡선 | 링 두께 | 링 간격 | 링 색 |
|---|---|---|---|---|---|---|
enabled 기본 | — | — | — | — | — | — |
hovered 웹 — Actionable 은 누름 바탕 | — | — | — | — | — | — |
pressed Actionable 은 누름 바탕 + 안의 내용만 2px 거리 축소, 버튼 · 닫기는 각자 축소 | 2px 거리 축소 — 글 버튼만 — 바탕 없음 | motion-duration-pressed-scale 150ms | motion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1) | — | — | — |
focused 웹 — 키보드 포커스에만 안쪽 링 | — | — | — | 2px | -2px — 화면 끝까지 차는 띠라 안쪽에 — 버튼 · 닫기도 같다 | color-stroke-focus-ring #1A1F2E · 다크 #F5F6FA — 옅은 바탕 위 3.90 이상. 짙은 바탕은 띠 글자색(아래 solid 규칙) — 브랜드 링은 짙은 띠 위 1.61 ~ 2.44 다 |
모션
| 전환 | 시간 | 곡선 | 대상 | 비고 |
|---|---|---|---|---|
누름 | motion-duration-pressed-scale 150ms | motion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1) | scale | |
바탕 | motion-duration-color-transition 150ms | motion-ease-easing cubic-bezier(0.35, 0, 0.35, 1) | background-color | |
닫힘 | 0ms | — | 바로 사라짐 | 닫으면 바로 걷고 다시 띄우지 않는다(닫음을 기억한다) — 초점은 다음 요소로 |
Guidelines
페이지 맨 위에 하나
페이지 머리 바로 아래(위에 사진이 있으면 그 아래)에 하나만 둔다. 그 페이지 전체에 걸린 상태만 — 증권 연결이 끊긴 증권 페이지, Pro 만료가 다가온 설정, 새 버전이 나온 웹. 그 기능 가까이의 안내는 Callout 이다. 스크롤해도 맨 위에 붙여 둘 수 있다(붙일 때는 화면마다 정한다).
자리가 머리 바로 아래 화면 폭이라 Desk 폰 · 데스크톱 모두 회색 바닥(bg-layer-basement) 위에 놓인다. 옅은 neutral(weak · neutral)은 bg-neutral-weak 그대로 둔다 — 라이트에서 바닥과 같은 gray-200 이라 띠 모양이 보이지 않고 아이콘 · 글 · 버튼만 보인다(다크는 1.47:1 로 갈린다). 이것을 받아들인다(2026-10-17 사용자 결정 — 03-F 결정 3 — "지금 구현 그대로", https://claude.ai/artifact/F5SKUbGEWDG82F7B5RRjQB). 투명 짝 · 흰 띠 · 아래 선은 고르지 않았다. 띠가 보여야 하는 안내라면 neutral 이 아닌 톤(informative · warning …)을 쓴다.
| Page Banner | Callout | |
|---|---|---|
| 자리 | 페이지 맨 위 | 본문 안, 그 내용 바로 위 |
| 폭 | 화면 폭 전체 | 콘텐츠 폭 |
| 용도 | 페이지 상태 · 제재 · 기능 켜짐 안내(연결 끊김 · 만료 예정 · 새 버전) | 팁 · 기능 설명 · 위험 주의 |
| 범위 | 페이지 전체 | 그 기능 · 내용 |
| 수 | 한 화면에 하나 | 필요한 만큼(쌓지 않는다) |
| 스크롤(Sticky) | 맨 위에 붙일 수 있다(화면마다 정한다) | 없다 — 내용과 함께 움직인다 |
"용도" · "Sticky" 두 줄은 SEED Page Banner 문서의 "Page Banner, Callout 비교" 에서 옮겼다(2026-10-22 사용자 결정 3B — https://claude.ai/artifact/NuEPiLRH2fJidXdKzcDsCX). 다른 알림과 고르는 표는 Snackbar 의 "무엇으로 알리나" 한 벌이다.
국내 주식은 15분 늦은 시세예요.
짙은 바탕은 더 강하게 알릴 때
기본은 옅은 바탕이다. 짙은 바탕은 더 강하게 알려야 할 때 쓴다 — 예: 연결 끊김 · 거절 · 편집 불가처럼 지금 그 페이지를 제대로 쓸 수 없는 상태(SEED 는 Tone 마다 Weak · Solid 를 두고 쓰임을 제한하지 않는다).
닫기는 한 번 보면 되는 안내에만
새 기능 · 새 버전처럼 한 번 보면 되는 안내만 닫을 수 있게 한다 — 닫은 것을 기억해 다시 띄우지 않는다. 경고 · 오류 배너는 닫지 못한다.
글
제목은 상태를 나타내는 짧은 말 — "연결 끊김" · "곧 만료". 본문은 제목을 되풀이하지 않고 해요체 문장에 마침표. 버튼은 동작 이름 — "다시 연결" · "업데이트" · "구독 보기".
코드
레시피 recipes/shadcn/components/ui/page-banner.tsx 를 쓴다. 아래 미리보기는 스펙 값으로 그린 모습이다.
연결 끊김 — 버튼 하나
띠는 페이지 머리 바로 아래 화면 폭 전체다. 다시 연결하면 띠를 걷고 결과는 스낵바로 알린다.
import { PageBanner } from "@/components/ui/page-banner"
<PageBanner tone="critical" title="연결 끊김" button={{ label: "다시 연결", onClick: reconnect }}>
증권 연결 키가 만료돼 시세를 받지 못해요.
</PageBanner>새 기능 · 곧 만료
닫으면 바로 사라지고 다시 띄우지 않는다(닫음을 기억한다) — 초점은 다음 요소로. 짙은 바탕은 무거운 상태에만 쓴다.
{/* 한 번 보면 되는 안내 — 닫으면 다시 띄우지 않는다 */}
<PageBanner tone="informative" title="새 기능" interaction="dismissible" open={!seen} onDismiss={markSeen}>
반복 거래를 자동으로 기록할 수 있어요.
</PageBanner>
<PageBanner tone="warning" variant="solid" title="곧 만료" button={{ label: "구독 보기", onClick: openSubscription }}>
Pro 이용이 10월 31일에 끝나요.
</PageBanner>Behavior
| 인터랙션 | 동작 |
|---|---|
| 버튼 · Actionable 누르기 | 그 동작을 한다 |
| 닫기 | 바로 사라진다 — 닫은 것을 기억해 다시 띄우지 않는다. 초점은 다음 요소로 |
| 스크롤 | 기본은 같이 올라간다. 맨 위에 붙일 때는 머리 아래에 붙는다 |
| 나중에 나타남(연결이 끊김) | 경고 · 위험이면 보조 기술에 알린다(role="alert") |
Accessibility
| 기준 | 검증 |
|---|---|
| WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1) | 옅은 바탕 fg-*-contrast 5.65 ~ 5.72 · 7.78 ~ 7.84, 짙은 바탕 흰 글 5.06 ~ 5.09 · 5.77 ~ 5.79, neutral 짙음 16.41 · 13.42 ✓ |
| WCAG 1.4.11 Non-text contrast(≥ 3:1) | 포커스 링(안쪽) — 옅은 바탕은 stroke-focus-ring 3.91 이상 ✓, 짙은 바탕은 띠 글자색 4.93 이상 ✓(누름 바탕 포함). 띠 면은 장식 |
| WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24) | 버튼 높이 40 · 닫기 40 ✓ |
| ARIA | 띠는 문단(role 없음), Actionable 은 <button type="button">. 나중에 나타나는 경고 · 위험은 role="alert". 닫기 이름 "닫기" |
Do / Don't
✅ Do
- 페이지 맨 위에 하나, 그 페이지 전체의 상태만.
- 기본은 옅은 바탕, 짙은 바탕은 더 강하게 알릴 때.
- 버튼은 동작 이름 하나.
❌ Don't
- 한 화면에 배너 둘 이상.
- 그 기능의 팁을 배너로 — Callout.
- 경고 · 오류 배너를 닫을 수 있게.
Specification
page-banner.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Page Banner 를 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다. 상태는 enabled 에서 바뀌는 값만 적었다.
Base
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 최소 높이minHeight | 40px |
| 너비width | 100%화면 폭 전체 — 페이지 머리 바로 아래(위에 사진이 있으면 그 아래), 한 화면에 하나 | ||
| 상하 여백paddingY | spacing-x2_510px | ||
| 좌우 여백paddingX | spacing-global-gutter24pxSEED 16 → 화면 여백 24 | ||
| 간격gap | spacing-x28px아이콘 ↔ 글 | ||
| 세로 맞춤alignItems | flex-start아이콘은 첫 줄에 붙는다 — 화살표 · 닫기는 띠 가운데 | ||
| 모서리radius | 0px모서리 없음 | ||
icon | enabled | 아이콘size | 16pxlucide 선 아이콘 — 위 2(첫 줄 가운데). 톤마다 기본은 Callout 과 같다(info · info · circle-check · triangle-alert · circle-alert) |
| 위 바깥 여백marginTop | spacing-x0_52px | ||
content | enabled | 간격gap | spacing-x1_56px본문과 버튼이 한 줄에 안 들어가면 버튼이 다음 줄 본문 시작선으로 |
| 가로 맞춤justifyContent | space-between한 줄에 들어가면 버튼은 오른쪽 끝(SEED 와 같다) | ||
title | enabled | 글자typography | text-t414px / 19px본문과 한 문단 — 사이는 띄어쓰기 두 칸 |
| 굵기fontWeight | 700 | ||
description | enabled | 글자typography | text-t414px / 19px단어 단위 줄바꿈(v114) |
| 굵기fontWeight | 500 | ||
button | enabled | 모서리radius | radius-r14px바탕이 없어 포커스 링에만 보인다 |
| 글자typography | text-t313px / 18px | ||
| 굵기fontWeight | 700 | ||
| 터치 영역touchTarget | 글 + 사방 11 × 40바깥 여백 −11 로 띠 높이를 늘리지 않는다 | ||
suffixIcon | enabled | 뒤 아이콘size | 16pxchevron-right — 글과 8 |
closeButton | enabled | 크기size | 40px투명 상자 — 바깥 여백 −12 로 띠 높이를 늘리지 않는다. 아이콘은 오른쪽 끝에서 24, 글과 8 |
| 아이콘 크기iconSize | 16px | ||
| 모서리radius | radius-r28px | ||
focusRing | focused | 링 두께width | 2px |
| 링 색color | stroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84옅은 바탕 위 3.90 이상. 짙은 바탕은 띠 글자색(아래 solid 규칙) — 브랜드 링은 짙은 띠 위 1.61 ~ 2.44 다 | ||
| 링 간격offset | -2px화면 끝까지 차는 띠라 안쪽에 — 버튼 · 닫기도 같다 |
variant=weak, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-neutral-weak#F5F6FA다크 #353B4D |
| 글자·아이콘foreground | fg-neutral#1A1F2E다크 #F5F6FA |
variant=weak, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-informative-weak#EAF3FE다크 #21344D |
| 글자·아이콘foreground | fg-informative-contrast#0F5FB3다크 #ACCEFB글 · 아이콘 · 버튼 · 화살표 · 닫기가 모두 이 색 |
variant=weak, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-positive-weak#EAF5EC다크 #223927 |
| 글자·아이콘foreground | fg-positive-contrast#026E33다크 #AED6B6 |
variant=weak, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-warning-weak#FFEFE8다크 #4B2B1F |
| 글자·아이콘foreground | fg-warning-contrast#A53E0A다크 #F9BFA9 |
variant=weak, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-critical-weak#FFEFEC다크 #532722 |
| 글자·아이콘foreground | fg-critical-contrast#C01016다크 #FFBCB3 |
variant=solid, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-neutral-inverted#1A1F2E다크 #F5F6FA |
| 글자·아이콘foreground | fg-neutral-inverted#FFFFFF다크 #242938 | ||
focusRing | focused | 링 색color | fg-neutral-inverted#FFFFFF다크 #242938 |
variant=solid, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-informative-solid#1D6EC9다크 #0F65BF |
| 글자·아이콘foreground | static-white#FFFFFF5.09 · 다크 5.78 | ||
focusRing | focused | 링 색color | static-white#FFFFFF |
variant=solid, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-positive-solid#167F3F다크 #117539 |
| 글자·아이콘foreground | static-white#FFFFFF5.07 · 5.79 | ||
focusRing | focused | 링 색color | static-white#FFFFFF |
variant=solid, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-warning-solid#BE490D다크 #B04209 |
| 글자·아이콘foreground | static-white#FFFFFF5.06 · 5.79 | ||
focusRing | focused | 링 색color | static-white#FFFFFF |
variant=solid, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 배경background | bg-critical-solid#D72323다크 #CC0E17 |
| 글자·아이콘foreground | static-white#FFFFFF5.06 · 5.77 | ||
focusRing | focused | 링 색color | static-white#FFFFFF |
interaction=actionable
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
content | pressed | 배율scale | 2px 거리 축소안의 내용만(SEED scaleScope: content) — 바탕은 그대로. 모션 줄이기면 하지 않는다 |
| 축소 시간scaleDuration | motion-duration-pressed-scale150ms | ||
| 축소 곡선scaleEasing | motion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1) |
interaction=actionable, variant=weak, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-neutral-weak-pressed#EDEFF3다크 #404757 |
root | pressed | 배경background | bg-neutral-weak-pressed#EDEFF3다크 #404757 |
interaction=actionable, variant=weak, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-informative-weak-pressed#D7E6FB다크 #204069 |
root | pressed | 배경background | bg-informative-weak-pressed#D7E6FB다크 #204069 |
interaction=actionable, variant=weak, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-positive-weak-pressed#D8EADB다크 #20482B |
root | pressed | 배경background | bg-positive-weak-pressed#D8EADB다크 #20482B |
interaction=actionable, variant=weak, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-warning-weak-pressed#FAE0D5다크 #65321D |
root | pressed | 배경background | bg-warning-weak-pressed#FAE0D5다크 #65321D |
interaction=actionable, variant=weak, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-critical-weak-pressed#FFDEDA다크 #722722 |
root | pressed | 배경background | bg-critical-weak-pressed#FFDEDA다크 #722722 |
interaction=actionable, variant=solid, tone=neutral
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-neutral-inverted-pressed#535866다크 #B7BDCC |
root | pressed | 배경background | bg-neutral-inverted-pressed#535866다크 #B7BDCC |
interaction=actionable, variant=solid, tone=informative
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-informative-solid-pressed#0F5FB3다크 #1F70CB |
root | pressed | 배경background | bg-informative-solid-pressed#0F5FB3다크 #1F70CB |
interaction=actionable, variant=solid, tone=positive
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-positive-solid-pressed#026E33다크 #198140 |
root | pressed | 배경background | bg-positive-solid-pressed#026E33다크 #198140 |
interaction=actionable, variant=solid, tone=warning
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-warning-solid-pressed#A53E0A다크 #BF4A10 |
root | pressed | 배경background | bg-warning-solid-pressed#A53E0A다크 #BF4A10 |
interaction=actionable, variant=solid, tone=critical
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | hovered | 배경background | bg-critical-solid-pressed#C01016다크 #D82424 |
root | pressed | 배경background | bg-critical-solid-pressed#C01016다크 #D82424 |
interaction=display
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
button | pressed | 배율scale | 2px 거리 축소글 버튼만 — 바탕 없음 |
| 축소 시간scaleDuration | motion-duration-pressed-scale150ms | ||
| 축소 곡선scaleEasing | motion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1) |
interaction=dismissible
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
closeButton | pressed | 배율scale | 2px 거리 축소기준 40 — 바탕 없음 |
| 축소 시간scaleDuration | motion-duration-pressed-scale150ms | ||
| 축소 곡선scaleEasing | motion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1) |
SEED 와 다른 점
- 좌우 여백은 화면 여백 24 — SEED 16. 띠 안 글이 페이지 글과 같은 선에서 시작한다.
- 톤은 다섯 — magic(AI)은 두지 않는다.
- 짙은 바탕의 글은 흰색 — groo
bg-*-solid위 5.06 이상(SEED warning 은 노랑 위 검정 글). - 아이콘은 lucide 선 아이콘(v106).
- 나중에 나타나는 경고 · 위험은
role="alert", 버튼은 모두type="button".
Migration notes
2026-10-22 — 짙은 바탕은 더 강하게 알릴 때
"짙은 바탕은 무거운 상태에만" 은 10-02 알림 비교 페이지의 그림 꼬리표("짙음(solid) — 무거운 상태에만")가 규칙이 된 것이다 — 같은 페이지 글은 "짙은 바탕을 고르는 기준 문장은 없다" 였다. 예시(연결 끊김 · 거절 · 편집 불가)는 그대로 두고 금지를 권장으로 낮췄다(남은 규칙 R14). 사용자 결정 — https://claude.ai/artifact/Mag1tEv51MdQHdy1o8hY3L. 값 변경 없음.
2026-10-22 — Callout 견주기에 용도 · Sticky
Page Banner ↔ Callout 표에 SEED 의 "용도" · "Sticky" 두 줄을 더하고, 다른 알림과 고르는 표는 Snackbar 문서 한 벌로 링크한다(사용자 결정 3B — https://claude.ai/artifact/NuEPiLRH2fJidXdKzcDsCX). 코드 예시 · 사이트 그림 · 레시피 예제 · 미리보기의 실제 증권사 이름을 걷었다("증권 연결 키가 만료돼 …"). 값 변경 없음.
2026-10-02 — 새로 둔다(SEED Page Banner)
사용자가 비교 페이지에서 Page Banner 를 두기로 정했다. 세 제품에는 지금 페이지 배너가 없다 — 앱 적용 때 화면마다 정할 자리:
- Desk 웹 · 앱 증권 — 불러오기에 실패해도 "증권 계정을 연결해 주세요" 화면이 페이지를 대신한다(연결돼 있는데도). 연결 끊김은 Page Banner + 지난 값, 연결이 없을 때만 Result Section.
- Desk 앱 업데이트 — 업데이트는 화면 전체, 결제 문자 안내는 홈 맨 위 PAlert(iOS 만).
- HR 공지 — 로그인할 때마다 공지 대화상자가 차례로 뜬다("오늘 하루 보지 않기" 는 모든 공지를 하루 숨긴다).
- 환경 표시(DEVELOPMENT 워터마크 · DEV 배지) — 배너가 아니다. 보조 기술에 숨긴다(
aria-hidden).
Notification Badge
안 읽은 알림 · 확인하지 않은 새 것이 있다는 신호 — 점(있음)과 숫자(몇 개). 아이콘 버튼 · 탭 글에 붙고, 보면 사라진다. 대상의 상태 · 분류를 글로 보이는 것은 Badge 다.
Pagination
여러 쪽으로 나뉜 목록의 쪽을 오가는 줄 — 쪽 단위로 훑는 목록(주로 데스크톱 768 이상) 아래 가운데에 둔다. 몇 쪽인지 한눈에 보이고, 쪽이 바뀌어도 칸 자리가 흔들리지 않는다. 폰(768 미만)의 긴 목록은 쪽을 나누지 않고 끝없이 불러온다(아래 "폰은 끝없이 불러오기"). 데이터 표는 Table Pagination 이다.