Help Bubble
트리거를 누르면 옆에 뜨는 짙은 도움말 말풍선 — 화면에 늘 두기에는 길고, 몰라도 일은 할 수 있는 설명(규정 · 계산 방법 · 기능 안내). 마우스를 올리면 뜨는 짧은 설명은 같은 모양의 Tooltip 이고, 화면 안에 늘 보여야 하는 안내는 Callout(그 차례에), 버튼 · 입력이 있는 내용은 Popover 다.
구조는 당근 SEED Help Bubble(Apache-2.0)를 따른다 — 말풍선 · 화살표 · 제목 · 설명 · 닫기 버튼. Tooltip 도 같은 말풍선을 쓴다(SEED 도 두 컴포넌트가 스펙 하나를 쓴다) — 여는 방식만 다르다. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-02 사용자 결정).
수치 원본은 help-bubble.yaml이다(Tooltip 과 같은 파일). 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.
직접 골라 보기
설명 · 닫기 버튼 · 위치를 고르면 스펙대로 그린 말풍선과 그 코드가 바뀐다. 실제로 눌러 열고 닫을 수 있다.
import { HelpBubble, HelpBubbleContent, HelpBubbleTrigger } from "@/components/ui/help-bubble"
<HelpBubble>
<HelpBubbleTrigger asChild>
<Button variant="ghost" ghostColor="neutralSubtle" layout="iconOnly" aria-label="연차 사용 규정 안내">
<Info />
</Button>
</HelpBubbleTrigger>
<HelpBubbleContent
title="연차 사용 규정"
description="입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요."
/>
</HelpBubble>Anatomy
| 부위 | 설명 |
|---|---|
| ⓐ Container | 말풍선 — 짙은 바탕(다크에서는 밝은 바탕), 최대 280. |
| ⓑ Arrow | 화살표 — 늘 트리거 가운데를 가리킨다(화면 끝에서도 비키지 않는다 — 말풍선이 민다). 화살표 끝과 트리거 사이 4. |
| ⓒ Title | 제목 — 13 · 700. 한 줄로 끝나면 이것만. |
| ⓓ Description | 설명 — 13 · 400. 제목을 풀어 줄 때만. |
| ⓔ Close Button | 닫기 — 오른쪽 위 모서리. 닫기 전까지 남겨 둘 안내에만. |
부위
| 부위 | 설명 |
|---|---|
root | 말풍선 — 짙은 바탕, 트리거 쪽에 화살표 |
arrow | 화살표 — 늘 트리거 가운데를 가리킨다(화면 끝에서도 — 말풍선이 민다) |
title | 제목 — 툴팁은 이것 하나 |
description | 설명 — Help Bubble 에서 제목을 풀어 줄 때만 |
closeButton | 닫기 — Help Bubble 에서만, 오른쪽 위 모서리. 이름 "닫기" |
focusRing | 키보드 포커스 링(웹) |
Properties
말풍선
위아래 10 · 좌우 12, 모서리 12, 그림자 없음. 제목 13 / 18 · 700, 설명 13 / 18 · 400, 제목 ↔ 설명 2 — 한 줄이면 38, 설명이 있으면 58. 폭은 내용만큼이고 최대 280(여백 포함)이다 — 한 줄에 20자 안팎, 2 ~ 3줄이면 넘지 않는다.
위아래 10 · 좌우 12 · 모서리 12 · 그림자 없음 — 제목 13 / 18 · 700, 설명 13 / 18 · 400, 사이 2 → 한 줄 38 · 설명이 있으면 58
폭은 내용만큼 · 최대 280(여백 포함, 화면이 좁으면 화면 − 양쪽 16) — 화살표 12 × 8, 화살표 상자 끝과 트리거 4(몸통과 12) · 닫기 상자 38(위 0 · 오른쪽 0 · 모서리 12, 점선은 누르는 영역 44) · 아이콘 14 · 글과 상자 사이 4
키보드 초점 — 닫기 버튼은 안쪽 2 링(말풍선 글자색), 닫기 버튼이 없는 말풍선에 Tab 으로 들어오면 둘레 바깥 2 에 2 링(브랜드 링)
공통
| 부위 | 속성 | 값 | 비고 |
|---|---|---|---|
root | 최대 너비 | 280px | 여백을 포함한 폭 — 한 줄 20자 안팎, 2 ~ 3줄이면 넘지 않는다. 쓸 수 있는 폭(화면 − 양쪽 16)이 더 좁으면 그만큼(SEED 와 같다) |
root | 상하 여백 | spacing-x2_5 10px | |
root | 좌우 여백 | spacing-x3 12px | |
root | 모서리 | radius-r3 12px | |
root | 배경 | color-bg-neutral-inverted #1A1F2E · 다크 #F5F6FA | 다크에서는 밝은 말풍선 |
root | 그림자 | none | |
root | 트리거와 거리 | spacing-x1 4px | 화살표 끝 ↔ 트리거 4(말풍선 몸통과는 12) |
root | 바깥 여백 | spacing-x4 16px | 화면 가장자리와 16 — 모자라면 반대편으로 뒤집고 옆으로 민다. 화살표를 트리거 가운데 · 모서리 14 에 두느라 모자라면 이 값이 진다 — 하한 없이 화면 끝(0)까지(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-1) |
root | marginMin | 0px | 트리거가 화면 끝에 붙었을 때 — 상단 바 끝 6 의 아이콘 버튼 44 면 8, 화면 끝 0 의 ⓘ 40 이면 0. 누르는 자리가 40 이상이면 말풍선이 화면 밖으로 나가지 않는다 |
root | announce | 제목 · 설명 | 열릴 때 한 번, 초점을 옮기지 않고 — 웹 aria-live polite · 앱 Semantics liveRegion. 처음부터 열린 안내도(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-2) |
root | z-index | 210 | z-tooltip — specs/z-index.md L4 |
arrow | 너비 | 12px | |
arrow | 높이 | 8px | 끝 모서리 2 — 말풍선과 같은 색. 트리거와 4 는 이 상자의 끝에서 잰다 — 둥근 끝 때문에 그림 끝은 1 더 떨어져 보인다(SEED 와 같다) |
arrow | 바깥 여백 | 14px | 말풍선 모서리에서 최소 14 — 화살표는 트리거 가운데에서 움직이지 않고 말풍선을 민다(화살표 가운데 ↔ 말풍선 끝 20). 이 값이 화면 가장자리 16 보다 먼저다 |
arrow | 자리 | 트리거 가운데 | 비켜 그리지 않고 지우지 않는다 — 웹 Radix 의 숨김(cannotCenterArrow)을 쓰지 않는다 |
title | 글자 | text-t3 13px / 18px | 단어 단위 줄바꿈(v114) · 줄바꿈 문자는 그대로 |
title | 굵기 | 700 | |
title | 글자·아이콘 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 | |
description | 글자 | text-t3 13px / 18px | |
description | 굵기 | 400 | |
description | 글자·아이콘 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 | |
description | 간격 | spacing-x0_5 2px | 제목 ↔ 설명 |
위치
기본은 트리거 위다. 자리가 모자라면 반대편으로 뒤집고 옆으로 민다 — 화면 가장자리와 16 을 남긴다. 화살표는 늘 트리거 가운데를 가리키고 말풍선 모서리와 14 를 남긴다.
셋이 부딪히면 순서는 이렇다(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-1).
- 화살표는 트리거 가운데 — 비켜 그리지 않고, 지우지도 않는다.
- 화살표 ↔ 말풍선 모서리 14 — 화살표 가운데가 말풍선 끝에서 20(14 + 화살표 폭의 반 6) 안쪽에 오도록 말풍선을 트리거 쪽으로 민다.
- 화면 가장자리 16 — 위 둘을 지키느라 모자라면 16 보다 가장자리에 붙는다. 붙는 만큼에 하한은 없다 — 화면 끝(0)까지 간다. 트리거가 화면 끝에 붙어도 누르는 자리가 40 이상이면 가운데가 끝에서 20 이상이라 말풍선은 화면 밖으로 나가지 않는다.
상단 바 오른쪽 끝의 알림(아이콘 버튼 44 · 화면 끝 6)에서는 말풍선 오른쪽이 화면 끝에서 8, 화면 왼쪽 끝 0 에 붙은 ⓘ 40 에서는 0 이다. 위 · 아래로 뒤집어도 가로 자리는 같으므로 뒤집기로 풀지 않는다.
닫기 버튼
닫기 전까지 남겨 둘 안내(처음 쓰는 기능의 설명처럼 처음부터 열어 두는 말풍선)에만 둔다. 상자 38 · 아이콘 14 이고 누르는 영역은 44 다.
닫기 버튼
| 조합 | 상태 | 속성 | 값 |
|---|---|---|---|
opens=press + closeButton=shown | enabled | closeButton 크기 | 38px — 투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다) |
opens=press + closeButton=shown | enabled | closeButton 터치 영역 | 44 × 44 — 사방 3 넓힌다(SEED 38) |
opens=press + closeButton=shown | enabled | closeButton 아이콘 크기 | 14px — lucide x — 위 12 · 오른쪽 12 자리 |
opens=press + closeButton=shown | enabled | closeButton 모서리 | radius-r3 12px — 바탕이 없어 초점 링에만 보인다(SEED 와 같다) |
opens=press + closeButton=shown | enabled | closeButton 색 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 |
opens=press + closeButton=shown | pressed | closeButton 배율 | 2px 거리 축소 — 바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다 |
opens=press + closeButton=shown | pressed | closeButton 축소 시간 | motion-duration-pressed-scale 150ms |
opens=press + closeButton=shown | pressed | closeButton 축소 곡선 | motion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1) |
State
| 상태 | 모습 |
|---|---|
enabled | 열림 |
pressed | 닫기 버튼 — 아이콘만 2px 거리 축소(바탕 없음) |
focused | 웹 — 닫기 버튼 안쪽 2px 링, 말풍선 글자색 |
상태
| 상태 | closeButton 크기 | closeButton 아이콘 크기 | closeButton 모서리 | closeButton 색 | closeButton 배율 | closeButton 터치 영역 | closeButton 축소 시간 | closeButton 축소 곡선 | 링 두께 | 링 간격 | 링 색 | 말풍선 링 간격 | 말풍선 링 색 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
enabled 열림 | 38px — 투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다) | 14px — lucide x — 위 12 · 오른쪽 12 자리 | radius-r3 12px — 바탕이 없어 초점 링에만 보인다(SEED 와 같다) | color-fg-neutral-inverted #FFFFFF · 다크 #242938 | — | 44 × 44 — 사방 3 넓힌다(SEED 38) | — | — | — | — | — | — | — |
pressed 닫기 버튼 누름 — 2px 거리 축소(바탕 없음) | 38px — 투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다) | 14px — lucide x — 위 12 · 오른쪽 12 자리 | radius-r3 12px — 바탕이 없어 초점 링에만 보인다(SEED 와 같다) | color-fg-neutral-inverted #FFFFFF · 다크 #242938 | 2px 거리 축소 — 바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다 | 44 × 44 — 사방 3 넓힌다(SEED 38) | motion-duration-pressed-scale 150ms | motion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1) | — | — | — | — | — |
focused 웹 — 키보드 포커스에만 링(닫기 버튼 안쪽) | 38px — 투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다) | 14px — lucide x — 위 12 · 오른쪽 12 자리 | radius-r3 12px — 바탕이 없어 초점 링에만 보인다(SEED 와 같다) | color-fg-neutral-inverted #FFFFFF · 다크 #242938 | — | 44 × 44 — 사방 3 넓힌다(SEED 38) | — | — | 2px | -2px — 닫기 버튼 안쪽 | color-fg-neutral-inverted #FFFFFF · 다크 #242938 — 말풍선 글자색 — 브랜드 링(stroke-focus-ring)은 짙은 말풍선 위에서 Desk 1.96 · HR 2.01 로 3:1 에 못 미친다 | 2px — 닫기 버튼이 없는 말풍선에 Tab 으로 들어오면 말풍선 둘레 바깥 2(모서리를 따라) | color-stroke-focus-ring #1A1F2E · 다크 #F5F6FA — 페이지 위에 그려지므로 브랜드 링 |
모션
| 전환 | 시간 | 곡선 | 대상 | 비고 |
|---|---|---|---|---|
열림 | motion-duration-d4 200ms | motion-ease-enter cubic-bezier(0, 0, 0.15, 1) | scale 0.9 → 1, opacity 0 → 1 | 화살표 끝을 기준점으로 커진다 — 툴팁이 이어서 열리면 모션 없이 바로 |
닫힘 | motion-duration-d4 200ms | motion-ease-easing cubic-bezier(0.35, 0, 0.35, 1) | opacity → 0 | 크기는 그대로, 투명도만 |
Guidelines
도움말을 어디에 두나
| 이런 안내 | 쓰는 것 |
|---|---|
| 아이콘 버튼 · 줄인 글의 짧은 설명(마우스 · 키보드) | Tooltip |
| 몰라도 일은 할 수 있는 설명 — 규정 · 계산 방법 · 기능 안내 | Help Bubble(ⓘ 를 눌러서) |
| 일을 하려면 꼭 읽어야 하는 안내 | 화면 안 글 · Callout |
| 버튼 · 입력이 있는 내용 | Popover |
| 길거나 확인을 받아야 하는 설명 | Bottom Sheet · Dialog |
결과 · 상태 · 오류처럼 알리는 일(Snackbar · Callout · Page Banner · Result Section · Alert Dialog)을 고르는 표는 Snackbar 의 "무엇으로 알리나" 한 벌이다(2026-10-22 사용자 결정 3B — https://claude.ai/artifact/NuEPiLRH2fJidXdKzcDsCX). 이 표는 도움말의 자리만 맡는다.
터치에서도 닿는 도움말
Tooltip 은 손가락으로 누르면 열리지 않는다. 폰에서도 읽어야 하는 설명은 이 말풍선에 둔다 — 트리거는 ⓘ 아이콘 버튼(이름 "{무엇} 안내")이고, 누르면 열고 다시 누르거나 바깥을 누르면 닫는다.
짧게
제목 한 줄, 설명 2 ~ 3줄이면 충분하다. 그보다 길면 화면 안 글이나 시트로 옮긴다. 말풍선 안에 링크 · 버튼을 두지 않는다(닫기 버튼만) — 누를 것이 있으면 Popover 다.
글
제목은 무엇의 설명인지 — "연차 사용 규정". 설명은 해요체 문장에 마침표 — "입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요."
코드
레시피 recipes/shadcn/components/ui/help-bubble.tsx 를 쓴다(Radix Popover 위). 아래 미리보기는 스펙 값으로 그린 모습이다.
ⓘ 를 눌러 여는 규정 안내
import { HelpBubble, HelpBubbleContent, HelpBubbleTrigger } from "@/components/ui/help-bubble"
<HelpBubble>
<HelpBubbleTrigger asChild>
<Button variant="ghost" ghostColor="neutralSubtle" layout="iconOnly" aria-label="연차 사용 규정 안내">
<Info />
</Button>
</HelpBubbleTrigger>
<HelpBubbleContent
title="연차 사용 규정"
description="입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요."
/>
</HelpBubble>처음부터 열어 두는 안내 — 닫기 버튼
닫기 버튼으로만 닫혀요 — 바깥을 눌러도 남아 있어요.
import { Search } from "lucide-react"
import { HelpBubble, HelpBubbleAnchor, HelpBubbleContent } from "@/components/ui/help-bubble"
import { TopNavigationIconButton } from "@/components/ui/top-navigation"
{/* 처음 쓰는 사람에게 한 번 — 닫으면 다시 열지 않는다. Anchor 는 자리만 잡는다(누르면 원래 동작 — 홈 상단 바의 검색).
closeOnInteractOutside={false} — 바깥 누르기 · 바깥으로 간 초점(Tab)에 닫히지 않는다. 닫기 버튼 · Esc · 말풍선에서 Tab 으로 나가기로 닫는다 */}
<HelpBubble defaultOpen={!seen} onOpenChange={(open) => !open && markSeen()}>
<HelpBubbleAnchor asChild>
<TopNavigationIconButton aria-label="검색" onClick={openSearch}><Search /></TopNavigationIconButton>
</HelpBubbleAnchor>
<HelpBubbleContent title="거래를 찾아보세요" description="가맹점 이름 · 메모 · 금액으로 찾을 수 있어요." showCloseButton closeOnInteractOutside={false} side="bottom" />
</HelpBubble>Behavior
| 인터랙션 | 동작 |
|---|---|
트리거 누르기 · Enter · Space | 연다 · 열려 있으면 닫는다. 초점은 트리거에 남는다 — 열릴 때 제목 · 설명을 한 번 알린다(아래 Accessibility) |
Tab(열린 동안) | 말풍선으로 들어간다 — 닫기 버튼이 있으면 그리로, 없으면 말풍선 자체에 초점(둘레 바깥 2 링). 다시 Tab 으로 나가면 닫힌다 |
Esc | 닫는다. 초점이 말풍선 안에 있었으면 트리거로 |
| 바깥 누르기 | 닫는다 — 닫기 버튼이 있는 말풍선은 닫기 버튼으로만 닫을 수도 있다(남겨 둘 안내). 그때는 초점이 바깥으로 나가도 닫지 않는다 — Tab 만으로 처음 쓰는 사람용 안내가 사라지지 않게 |
| 닫기 버튼 | 닫고 초점은 트리거로 |
| 처음부터 열린 안내 | 초점을 옮기지 않는다 — 입력 칸의 초점 · 화면 키보드가 그대로다. 제목 · 설명은 열림 알림으로 한 번 읽힌다 |
| 열린 동안 | 비모달 — 뒤 화면을 숨기지 않고 스크롤도 잠그지 않는다. 스크롤하면 트리거를 따라간다 |
Accessibility
| 기준 | 검증 |
|---|---|
| WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1) | 제목 · 설명 fg-neutral-inverted 말풍선(bg-neutral-inverted) 위 16.41 · 다크 13.42 ✓ |
| WCAG 1.4.11 Non-text contrast(≥ 3:1) | 말풍선 면 페이지 위 16.41 · 다크 13.42 ✓. 닫기 버튼 초점 링은 말풍선 글자색이라 16.41 · 13.42 ✓ — 브랜드 링은 이 위에서 Desk 1.96 · HR 2.01 라 쓰지 않는다 |
| WCAG 2.1.1 Keyboard | 트리거 · 닫기 버튼 모두 키보드로 닿는다 |
| WCAG 2.4.7 Focus Visible | 닫기 버튼은 안쪽 링(말풍선 글자색), 닫기 버튼이 없는 말풍선은 둘레 바깥 링(stroke-focus-ring) ✓ |
| WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24) | 닫기 버튼 44 ✓ · ⓘ 트리거는 Button 규칙(보이는 40 · 누르는 영역 44) ✓ |
| WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44) | 닫기 버튼 44 ✓ |
| WCAG 4.1.3 Status messages | 열릴 때 제목 · 설명을 초점을 옮기지 않고 알린다(웹 aria-live="polite" 자리 — 트리거 옆에 늘 두고 열릴 때 글을 넣는다 · 앱 Semantics(liveRegion: true)). 누르거나 처음부터 열려도 같다 — 스크린 리더 사용자는 손가락 · 초점이 트리거에 머문 채 내용을 듣는다. 2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-2 |
| ARIA | 트리거 aria-haspopup="dialog" · aria-expanded · aria-controls, 말풍선 role="dialog"(aria-modal 없음) + 제목 aria-labelledby · 설명 aria-describedby. 닫기 버튼 이름 "닫기". 화살표는 장식 |
Do / Don't
✅ Do
- 폰에서도 읽어야 하는 설명은 ⓘ 를 눌러 여는 말풍선으로.
- 제목 한 줄 · 설명 2 ~ 3줄.
- 처음부터 열어 두는 안내에만 닫기 버튼.
❌ Don't
- 말풍선 안에 링크 · 버튼(닫기 버튼 말고) — 누를 것이 있으면 Popover.
- 일을 하려면 꼭 읽어야 하는 안내를 말풍선 뒤에 숨기기.
- 한 화면에 처음부터 열린 말풍선 여럿.
Specification
help-bubble.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Help Bubble · Tooltip 을 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다. 상태는 enabled 에서 바뀌는 값만 적었다.
Base
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 최대 너비maxWidth | 280px여백을 포함한 폭 — 한 줄 20자 안팎, 2 ~ 3줄이면 넘지 않는다. 쓸 수 있는 폭(화면 − 양쪽 16)이 더 좁으면 그만큼(SEED 와 같다) |
| 상하 여백paddingY | spacing-x2_510px | ||
| 좌우 여백paddingX | spacing-x312px | ||
| 바깥 여백margin | spacing-x416px화면 가장자리와 16 — 모자라면 반대편으로 뒤집고 옆으로 민다. 화살표를 트리거 가운데 · 모서리 14 에 두느라 모자라면 이 값이 진다 — 하한 없이 화면 끝(0)까지(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-1) | ||
| 모서리radius | radius-r312px | ||
| 배경background | bg-neutral-inverted#1A1F2E다크 #F5F6FA다크에서는 밝은 말풍선 | ||
| 그림자shadow | none | ||
| z-indexzIndex | 210z-tooltip — specs/z-index.md L4 | ||
| 트리거와 거리offset | spacing-x14px화살표 끝 ↔ 트리거 4(말풍선 몸통과는 12) | ||
| marginMinmarginMin | 0px트리거가 화면 끝에 붙었을 때 — 상단 바 끝 6 의 아이콘 버튼 44 면 8, 화면 끝 0 의 ⓘ 40 이면 0. 누르는 자리가 40 이상이면 말풍선이 화면 밖으로 나가지 않는다 | ||
| announceannounce | 제목 · 설명열릴 때 한 번, 초점을 옮기지 않고 — 웹 aria-live polite · 앱 Semantics liveRegion. 처음부터 열린 안내도(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-2) | ||
arrow | enabled | 높이height | 8px끝 모서리 2 — 말풍선과 같은 색. 트리거와 4 는 이 상자의 끝에서 잰다 — 둥근 끝 때문에 그림 끝은 1 더 떨어져 보인다(SEED 와 같다) |
| 너비width | 12px | ||
| 바깥 여백margin | 14px말풍선 모서리에서 최소 14 — 화살표는 트리거 가운데에서 움직이지 않고 말풍선을 민다(화살표 가운데 ↔ 말풍선 끝 20). 이 값이 화면 가장자리 16 보다 먼저다 | ||
| 자리position | 트리거 가운데비켜 그리지 않고 지우지 않는다 — 웹 Radix 의 숨김(cannotCenterArrow)을 쓰지 않는다 | ||
title | enabled | 글자·아이콘foreground | fg-neutral-inverted#FFFFFF다크 #242938 |
| 글자typography | text-t313px / 18px단어 단위 줄바꿈(v114) · 줄바꿈 문자는 그대로 | ||
| 굵기fontWeight | 700 | ||
description | enabled | 간격gap | spacing-x0_52px제목 ↔ 설명 |
| 글자·아이콘foreground | fg-neutral-inverted#FFFFFF다크 #242938 | ||
| 글자typography | text-t313px / 18px | ||
| 굵기fontWeight | 400 | ||
focusRing | focused | 링 두께width | 2px |
| 링 색color | fg-neutral-inverted#FFFFFF다크 #242938말풍선 글자색 — 브랜드 링(stroke-focus-ring)은 짙은 말풍선 위에서 Desk 1.96 · HR 2.01 로 3:1 에 못 미친다 | ||
| 링 간격offset | -2px닫기 버튼 안쪽 | ||
| 말풍선 링 간격rootOffset | 2px닫기 버튼이 없는 말풍선에 Tab 으로 들어오면 말풍선 둘레 바깥 2(모서리를 따라) | ||
| 말풍선 링 색rootColor | stroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84페이지 위에 그려지므로 브랜드 링 |
opens=hover
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
root | enabled | 열림 지연openDelay | 200ms마우스 — 키보드 초점은 바로(0). 하나가 열린 뒤 옆 트리거로 옮기면 바로 · 모션 없이 |
| 닫힘 지연closeDelay | 100ms트리거와 말풍선을 모두 벗어난 뒤 — 말풍선 위로 옮겨도 닫히지 않는다(WCAG 1.4.13) | ||
| 이어 열기 시간skipDelay | 300ms하나가 닫힌 뒤 이 시간 안에 옆 트리거로 옮기면 기다리지 않고 모션 없이 바로 연다 |
opens=press, closeButton=shown
| 부위 | 상태 | 속성 | 값 |
|---|---|---|---|
closeButton | enabled | 크기size | 38px투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다) |
| 아이콘 크기iconSize | 14pxlucide x — 위 12 · 오른쪽 12 자리 | ||
| 모서리radius | radius-r312px바탕이 없어 초점 링에만 보인다(SEED 와 같다) | ||
| 색color | fg-neutral-inverted#FFFFFF다크 #242938 | ||
| 터치 영역touchTarget | 44 × 44사방 3 넓힌다(SEED 38) | ||
closeButton | pressed | 배율scale | 2px 거리 축소바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다 |
| 축소 시간scaleDuration | motion-duration-pressed-scale150ms | ||
| 축소 곡선scaleEasing | motion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1) |
SEED 와 다른 점
- 바탕은 groo
bg-neutral-inverted(SEED neutral-solid 의 역할 짝) — 다크에서는 밝은 말풍선에 짙은 글자(SEED 와 같은 방향). - 닫기 버튼의 누르는 영역은 44 — SEED 38(기초의 "누르는 영역 44").
- 닫기 버튼의 초점 링은 말풍선 글자색 — groo 브랜드 링은 짙은 말풍선 위에서 3:1 에 못 미친다(SEED 링은 파랑이라 닿는다).
- 화면 끝에서 화살표는 트리거 가운데에 남고 말풍선이 16 보다 가장자리에 붙는다(사용자 결정 2026-10-15) — SEED 는 16 을 지키고 화살표를 옮긴다("조정시 최소 14px").
- z-index 는 specs/z-index.md 의 L4(
z-tooltip210) — 팝오버 · 메뉴 안에서 열어도 그 위에 뜬다. SEED 는 포털 없이 99 로 그려 둘레 상자가 자를 수 있다.
Migration notes
2026-10-22 — 알림 고르는 표는 한 벌
알리는 일을 고르는 표는 Snackbar 문서 한 벌로 링크하고, 이 문서의 표는 도움말의 자리만 맡는다(사용자 결정 3B — https://claude.ai/artifact/NuEPiLRH2fJidXdKzcDsCX). 값 변경 없음.
2026-10-16 — 예시의 트리거를 검색 · 알림으로
상단 바에서 금액 가리기 눈을 뺐다(2026-10-16 사용자 결정 — 구현 세션 질문 Q-017-2b A · Q-017-3c = Q-018-3 B — 그 눈은 켜고 끄지 않고 설정으로 가는 버튼이었다). 처음부터 열어 두는 안내의 예시를 홈 상단 바의 검색(Q-017-2a A 로 더해진 자리)으로, 화면 끝 자리의 예시를 오른쪽 끝 알림으로 바꿨다. 규칙 · 수치는 그대로다.
2026-10-15 — 화면 끝 화살표 · 열림 알림
구현 세션 질문 두 가지를 사용자가 정했다.
- 화면 끝의 트리거 — 화살표는 가운데에 남고 말풍선이 가장자리 16 을 넘는다(Q-004-1). "위치" 절의 순서(가운데 → 모서리 14 → 가장자리 16). 앱은 화살표를 비켜 그렸고(16 · 14 를 지킴), 웹은 Radix 가 가운데를 못 가리키면 화살표를 지웠다(
cannotCenterArrow) — 둘 다 고친다. 레시피는 트리거 자리를 재어 그쪽 가장자리 여백(collisionPadding)을min(16, 트리거 가운데 − 20)로 줄인다. 화살표를 비키는 안 · 옆으로 뒤집는 안 · 지우는 안은 고르지 않았다. - 스크린 리더 — 초점은 트리거에 두고 열릴 때 제목 · 설명을 알린다(Q-004-2). 앱은 이미 그렇다(
liveRegion). 웹은 트리거의 "펼쳐짐" 만 읽고 내용을 읽지 않았다 — 레시피에 열림 알림 자리를 더했다. 초점을 말풍선으로 옮기는 안 · 눌러 열 때만 옮기는 안은 고르지 않았다.
2026-10-08 — "처음부터 열어 두는 안내" 예
코드 예에 closeOnInteractOutside={false} 가 빠져 있었다 — 예대로 쓰면 바깥을 누르거나 Tab 으로 다른 칸에 가는 순간 처음 쓰는 사람용 안내가 사라졌다(Behavior 표와 다르다, desk-front #428). 예에 더했다. 레시피 · 사이트의 살아 있는 그림은 이미 그렇게 동작한다. SEED 의 같은 예(HelpBubbleAnchor + defaultOpen + showCloseButton)도 closeOnInteractOutside={false} 를 준다. 사용자 결정 — 비교 페이지 2.
2026-10-02 — SEED Help Bubble 로 새로 둔다
사용자가 비교 페이지에서 정했다 — 툴팁과 도움말 말풍선은 SEED 모양 하나(짙은 바탕 · 13 · 모서리 12 · 화살표 · 최대 280), 툴팁은 마우스 · 키보드의 보조이고 터치에서 도움말이 필요하면 눌러서 여는 Help Bubble. 전에는 눌러서 여는 도움말이 따로 없었다.
제품은 앱 적용 단계에서 옮긴다(2026-10-02 조사).
- Desk 웹 — 눌러서 여는 도움말 0(ⓘ 는 늘 보이는 안내 상자 4곳뿐). 키보드로 못 닿는 글자 · 배지에 붙은 설명이 네이티브
title에만 4곳("기본 캘린더는 숨길 수 없습니다" · "자동 기록" · "하루 전 알림" · "단종 포함") — 터치 · 키보드에서 안 보인다. - Desk 앱 — 눌러서 여는 도움말 0.
- HR 웹 — 규정 안내 Popover 12곳(→ 화면마다 Help Bubble · Popover 를 고른다), 쓰는 곳이 없는 ⓘ 툴팁 부품 2.
Footer
사이트 맨 아래의 바닥 — 브랜드 · 사이트맵(탐색 영역)과 정책 링크 · 안내 글 · 저작권(안내 영역)을 블록으로 골라 조립한다. 지금은 groo-home(hangroo.io) 맨 아래 하나이고, 나중에 SSO 로그인 · 가입 아래와 설명서 · 문서 사이트의 바닥이 같은 블록을 쓴다. Desk · HR 의 제품 화면에는 두지 않는다 — 정책 링크는 설정 목록의 줄(List)이다.
Icon Picker
카테고리 · 저축 목표에 붙일 아이콘을 고르는 칸 — Input Button 이 고른 세트(148개 · 13 묶음)의 격자를 시트(1280 미만) · 팝오버(1280 이상)로 열고, 한국어 이름 · 찾는 말로 찾는다. 고른 아이콘은 List 의 카테고리 타일(40 · 아이콘 20)에 그린다.