Groo Design

Help Bubble

트리거를 누르면 옆에 뜨는 짙은 도움말 말풍선 — 화면에 늘 두기에는 길고, 몰라도 일은 할 수 있는 설명(규정 · 계산 방법 · 기능 안내). 마우스를 올리면 뜨는 짧은 설명은 같은 모양의 Tooltip 이고, 화면 안에 늘 보여야 하는 안내는 Callout(그 차례에), 버튼 · 입력이 있는 내용은 Popover 다.

구조는 당근 SEED Help Bubble(Apache-2.0)를 따른다 — 말풍선 · 화살표 · 제목 · 설명 · 닫기 버튼. Tooltip 도 같은 말풍선을 쓴다(SEED 도 두 컴포넌트가 스펙 하나를 쓴다) — 여는 방식만 다르다. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-02 사용자 결정).

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

hr.groo.app
휴가
남은 연차11일
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
9:41
홈
거래를 찾아보세요가맹점 이름 · 메모 · 금액으로 찾을 수 있어요.
국민 주계좌1,250,000원
현대카드 M−352,400원
토스뱅크 통장820,000원
hr.groo.app
휴가
남은 연차11일
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
9:41
홈
거래를 찾아보세요가맹점 이름 · 메모 · 금액으로 찾을 수 있어요.
국민 주계좌1,250,000원
현대카드 M−352,400원
토스뱅크 통장820,000원
연차 사용 규정 · 거래 검색 안내 — 라이트 · 다크

직접 골라 보기

설명 · 닫기 버튼 · 위치를 고르면 스펙대로 그린 말풍선과 그 코드가 바뀐다. 실제로 눌러 열고 닫을 수 있다.

남은 연차 11일
설명
닫기 버튼
위치
브랜드
모드
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

연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
ⓐ Containerⓑ Arrow — 늘 트리거 가운데ⓒ Titleⓓ Descriptionⓔ Close Button — 남겨 둘 안내에만
말풍선은 화살표 · 제목 · 설명 · 닫기 버튼으로
부위설명
ⓐ 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줄이면 넘지 않는다.

알림
금액 가리기가릴 카드는 설정에서 골라요.
금액 가리기가릴 카드는 설정에서 골라요.
금액 가리기
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.

위아래 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)
rootmarginMin0px트리거가 화면 끝에 붙었을 때 — 상단 바 끝 6 의 아이콘 버튼 44 면 8, 화면 끝 0 의 ⓘ 40 이면 0. 누르는 자리가 40 이상이면 말풍선이 화면 밖으로 나가지 않는다
rootannounce제목 · 설명열릴 때 한 번, 초점을 옮기지 않고 — 웹 aria-live polite · 앱 Semantics liveRegion. 처음부터 열린 안내도(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-2)
rootz-index210z-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).

  1. 화살표는 트리거 가운데 — 비켜 그리지 않고, 지우지도 않는다.
  2. 화살표 ↔ 말풍선 모서리 14 — 화살표 가운데가 말풍선 끝에서 20(14 + 화살표 폭의 반 6) 안쪽에 오도록 말풍선을 트리거 쪽으로 민다.
  3. 화면 가장자리 16 — 위 둘을 지키느라 모자라면 16 보다 가장자리에 붙는다. 붙는 만큼에 하한은 없다 — 화면 끝(0)까지 간다. 트리거가 화면 끝에 붙어도 누르는 자리가 40 이상이면 가운데가 끝에서 20 이상이라 말풍선은 화면 밖으로 나가지 않는다.

상단 바 오른쪽 끝의 알림(아이콘 버튼 44 · 화면 끝 6)에서는 말풍선 오른쪽이 화면 끝에서 8, 화면 왼쪽 끝 0 에 붙은 ⓘ 40 에서는 0 이다. 위 · 아래로 뒤집어도 가로 자리는 같으므로 뒤집기로 풀지 않는다.

알림
위(기본)
알림
아래 — 위에 자리가 없으면
알림
왼쪽
알림
오른쪽
홈
알림을 모아 봐요카드 결제 · 예산 알림이 오면 점이 생겨요.
① 상단 바 끝의 알림(44 · 화면 끝 6) — 화살표는 버튼 가운데, 말풍선 끝은 화면 끝에서 8(가장자리 16 보다 붙는다)
예상 환급액지난달까지 받은 급여로 계산해요. 12월에 다시 바뀌어요.
예상 환급액
② 화면 왼쪽 끝 0 에 붙은 ⓘ 40 — 화살표는 ⓘ 가운데, 말풍선은 화면 끝 0 까지
위 · 아래 · 옆 — 화살표는 늘 트리거 가운데, 화면 끝에서는 말풍선이 민다

닫기 버튼

닫기 전까지 남겨 둘 안내(처음 쓰는 기능의 설명처럼 처음부터 열어 두는 말풍선)에만 둔다. 상자 38 · 아이콘 14 이고 누르는 영역은 44 다.

닫기 버튼

조합상태속성값
opens=press + closeButton=shownenabledcloseButton 크기38px — 투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다)
opens=press + closeButton=shownenabledcloseButton 터치 영역44 × 44 — 사방 3 넓힌다(SEED 38)
opens=press + closeButton=shownenabledcloseButton 아이콘 크기14px — lucide x — 위 12 · 오른쪽 12 자리
opens=press + closeButton=shownenabledcloseButton 모서리radius-r3 12px — 바탕이 없어 초점 링에만 보인다(SEED 와 같다)
opens=press + closeButton=shownenabledcloseButton 색color-fg-neutral-inverted #FFFFFF · 다크 #242938
opens=press + closeButton=shownpressedcloseButton 배율2px 거리 축소 — 바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다
opens=press + closeButton=shownpressedcloseButton 축소 시간motion-duration-pressed-scale 150ms
opens=press + closeButton=shownpressedcloseButton 축소 곡선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 · 다크 #2429382px 거리 축소 — 바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다44 × 44 — 사방 3 넓힌다(SEED 38)motion-duration-pressed-scale 150msmotion-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 200msmotion-ease-enter cubic-bezier(0, 0, 0.15, 1)scale 0.9 → 1, opacity 0 → 1화살표 끝을 기준점으로 커진다 — 툴팁이 이어서 열리면 모션 없이 바로
닫힘motion-duration-d4 200msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)opacity → 0크기는 그대로, 투명도만

Guidelines

도움말을 어디에 두나

이런 안내쓰는 것
아이콘 버튼 · 줄인 글의 짧은 설명(마우스 · 키보드)Tooltip
몰라도 일은 할 수 있는 설명 — 규정 · 계산 방법 · 기능 안내Help Bubble(ⓘ 를 눌러서)
일을 하려면 꼭 읽어야 하는 안내화면 안 글 · Callout
버튼 · 입력이 있는 내용Popover
길거나 확인을 받아야 하는 설명Bottom Sheet · Dialog
알림
Tooltip — 마우스 · 키보드아이콘 버튼의 이름 · 줄인 글 — 손가락으로는 열리지 않는다
남은 연차11일
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
Help Bubble — ⓘ 를 눌러서몰라도 일은 할 수 있는 설명 — 규정 · 계산 방법 · 기능 안내
휴가 시작일연차는 하루 전까지 신청해야 해요.
화면 안 글일을 하려면 꼭 읽어야 하는 안내 — 숨기지 않는다
연차 사용 규정

입사 1년 미만은 한 달에 1일씩 생겨요.

Popover — 버튼 · 입력이 있는 내용누를 것이 있으면 말풍선이 아니라 팝오버
도움말의 자리 — 툴팁 · 말풍선 · 화면 안 글 · 팝오버

결과 · 상태 · 오류처럼 알리는 일(Snackbar · Callout · Page Banner · Result Section · Alert Dialog)을 고르는 표는 Snackbar 의 "무엇으로 알리나" 한 벌이다(2026-10-22 사용자 결정 3B — https://claude.ai/artifact/NuEPiLRH2fJidXdKzcDsCX). 이 표는 도움말의 자리만 맡는다.

터치에서도 닿는 도움말

Tooltip 은 손가락으로 누르면 열리지 않는다. 폰에서도 읽어야 하는 설명은 이 말풍선에 둔다 — 트리거는 ⓘ 아이콘 버튼(이름 "{무엇} 안내")이고, 누르면 열고 다시 누르거나 바깥을 누르면 닫는다.

9:41
휴가
남은 연차11일
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
폰 — 손가락으로 눌러서다시 누르거나 바깥을 누르면 닫힌다
hr.groo.app
휴가
남은 연차11일
연차 사용 규정입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요.
데스크톱 — 눌러서(마우스 · 키보드)Enter · Space 로도 열고, Tab 으로 말풍선에 들어간다
ⓘ 를 눌러 여는 말풍선 — 폰 · 데스크톱

짧게

제목 한 줄, 설명 2 ~ 3줄이면 충분하다. 그보다 길면 화면 안 글이나 시트로 옮긴다. 말풍선 안에 링크 · 버튼을 두지 않는다(닫기 버튼만) — 누를 것이 있으면 Popover 다.

글

제목은 무엇의 설명인지 — "연차 사용 규정". 설명은 해요체 문장에 마침표 — "입사 1년 미만은 한 달에 1일씩 생기고, 1년이 지나면 15일이 생겨요."

코드

레시피 recipes/shadcn/components/ui/help-bubble.tsx 를 쓴다(Radix Popover 위). 아래 미리보기는 스펙 값으로 그린 모습이다.

ⓘ 를 눌러 여는 규정 안내

남은 연차
11일
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>

처음부터 열어 두는 안내 — 닫기 버튼

홈
국민 주계좌1,250,000원
현대카드 M−352,400원
토스뱅크 통장820,000원

닫기 버튼으로만 닫혀요 — 바깥을 눌러도 남아 있어요.

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

부위상태속성값
rootenabled최대 너비maxWidth280px여백을 포함한 폭 — 한 줄 20자 안팎, 2 ~ 3줄이면 넘지 않는다. 쓸 수 있는 폭(화면 − 양쪽 16)이 더 좁으면 그만큼(SEED 와 같다)
상하 여백paddingYspacing-x2_510px
좌우 여백paddingXspacing-x312px
바깥 여백marginspacing-x416px화면 가장자리와 16 — 모자라면 반대편으로 뒤집고 옆으로 민다. 화살표를 트리거 가운데 · 모서리 14 에 두느라 모자라면 이 값이 진다 — 하한 없이 화면 끝(0)까지(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-1)
모서리radiusradius-r312px
배경backgroundbg-neutral-inverted#1A1F2E다크 #F5F6FA다크에서는 밝은 말풍선
그림자shadownone
z-indexzIndex210z-tooltip — specs/z-index.md L4
트리거와 거리offsetspacing-x14px화살표 끝 ↔ 트리거 4(말풍선 몸통과는 12)
marginMinmarginMin0px트리거가 화면 끝에 붙었을 때 — 상단 바 끝 6 의 아이콘 버튼 44 면 8, 화면 끝 0 의 ⓘ 40 이면 0. 누르는 자리가 40 이상이면 말풍선이 화면 밖으로 나가지 않는다
announceannounce제목 · 설명열릴 때 한 번, 초점을 옮기지 않고 — 웹 aria-live polite · 앱 Semantics liveRegion. 처음부터 열린 안내도(2026-10-15 사용자 결정 — 구현 세션 질문 Q-004-2)
arrowenabled높이height8px끝 모서리 2 — 말풍선과 같은 색. 트리거와 4 는 이 상자의 끝에서 잰다 — 둥근 끝 때문에 그림 끝은 1 더 떨어져 보인다(SEED 와 같다)
너비width12px
바깥 여백margin14px말풍선 모서리에서 최소 14 — 화살표는 트리거 가운데에서 움직이지 않고 말풍선을 민다(화살표 가운데 ↔ 말풍선 끝 20). 이 값이 화면 가장자리 16 보다 먼저다
자리position트리거 가운데비켜 그리지 않고 지우지 않는다 — 웹 Radix 의 숨김(cannotCenterArrow)을 쓰지 않는다
titleenabled글자·아이콘foregroundfg-neutral-inverted#FFFFFF다크 #242938
글자typographytext-t313px / 18px단어 단위 줄바꿈(v114) · 줄바꿈 문자는 그대로
굵기fontWeight700
descriptionenabled간격gapspacing-x0_52px제목 ↔ 설명
글자·아이콘foregroundfg-neutral-inverted#FFFFFF다크 #242938
글자typographytext-t313px / 18px
굵기fontWeight400
focusRingfocused링 두께width2px
링 색colorfg-neutral-inverted#FFFFFF다크 #242938말풍선 글자색 — 브랜드 링(stroke-focus-ring)은 짙은 말풍선 위에서 Desk 1.96 · HR 2.01 로 3:1 에 못 미친다
링 간격offset-2px닫기 버튼 안쪽
말풍선 링 간격rootOffset2px닫기 버튼이 없는 말풍선에 Tab 으로 들어오면 말풍선 둘레 바깥 2(모서리를 따라)
말풍선 링 색rootColorstroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84페이지 위에 그려지므로 브랜드 링

opens=hover

부위상태속성값
rootenabled열림 지연openDelay200ms마우스 — 키보드 초점은 바로(0). 하나가 열린 뒤 옆 트리거로 옮기면 바로 · 모션 없이
닫힘 지연closeDelay100ms트리거와 말풍선을 모두 벗어난 뒤 — 말풍선 위로 옮겨도 닫히지 않는다(WCAG 1.4.13)
이어 열기 시간skipDelay300ms하나가 닫힌 뒤 이 시간 안에 옆 트리거로 옮기면 기다리지 않고 모션 없이 바로 연다

opens=press, closeButton=shown

부위상태속성값
closeButtonenabled크기size38px투명 상자 — 말풍선 오른쪽 위 모서리에 붙는다(위 0 · 오른쪽 0). 글과 이 상자 사이 4(SEED 와 같다)
아이콘 크기iconSize14pxlucide x — 위 12 · 오른쪽 12 자리
모서리radiusradius-r312px바탕이 없어 초점 링에만 보인다(SEED 와 같다)
색colorfg-neutral-inverted#FFFFFF다크 #242938
터치 영역touchTarget44 × 44사방 3 넓힌다(SEED 38)
closeButtonpressed배율scale2px 거리 축소바탕 없이 아이콘만 — 모션 줄이기면 하지 않는다
축소 시간scaleDurationmotion-duration-pressed-scale150ms
축소 곡선scaleEasingmotion-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-tooltip 210) — 팝오버 · 메뉴 안에서 열어도 그 위에 뜬다. 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.

이 페이지