ComponentsP3 본문

Tooltip

트리거 상단 중앙의 짧은 텍스트 힌트 — hover는 400ms 지연, focus는 즉시 표시. role="tooltip" + aria-describedby 연결(WAI-ARIA tooltip 패턴).

마지막 업데이트 2026-06-30

한눈에#

트리거 위에 뜨는 짧은 텍스트 힌트입니다 — hover는 400ms 지연, focus는 즉시 표시하며 role="tooltip" + aria-describedby로 연결됩니다.

클립보드에 복사합니다
  • 짧은 텍스트 힌트
  • hover 400ms · focus 즉시
  • role=tooltip + aria-describedby
  • Escape 닫기·Hoverable
열린 상태 재현 — 트리거 위에 힌트 버블이 뜹니다(실제로는 hover/포커스 시, 아래에서 확인)

hover 또는 Tab 포커스로 실제 힌트를 띄워 보세요:

사용 시점#

아이콘 버튼·축약 라벨에 짧은 보조 설명을 덧붙이면 Tooltip — 링크·버튼 등 상호작용이 필요하면 Popover입니다.

권장 — 이렇게 쓰세요

지양 — 이러지 마세요

쓴다아이콘 버튼·축약 라벨에 hover·포커스 양쪽에서 뜨는 짧은 텍스트 힌트(없어도 흐름 유지)

대신 Popover링크·버튼 등 상호작용 콘텐츠가 필요할 때

플레이그라운드#

컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.

Tooltip를 직접 조작해 보세요

속성·테마·토큰을 바꾸고 React·Flutter 코드를 확인하는 풀스크린 빌더로 엽니다.

빌더 열기

플레이그라운드는 넓은 작업 영역이 필요해 웹·태블릿에서 편집할 수 있어요.

변형#

variant로 두 형태를 지원합니다 (ADR-012 B-P1).

  • plain(기본) — 짧은 텍스트 힌트(content 한 줄)
  • richtitle(제목) + content(본문) 구조 카드. 더 넓고 좌측 정렬

색은 텍스트/배경 토큰을 반전해(color.text 배경 + color.bg 글자) 라이트/다크 모두 대비를 확보합니다. 버블은 hover 가능(pointer-events: auto)하지만 role="tooltip"텍스트 보조 설명 용도이므로, 버튼·링크 등 인터랙티브 콘텐츠가 필요하면 Popover를 쓰세요(rich도 텍스트 전용).

floating(기본 false)은 버블을 document.body로 포털(position: fixed)해 오버플로 스크롤 컨테이너(표·사이드바 등) 안에서 잘리지 않게 합니다. 공통 geometry solver가 앵커·버블·뷰포트 크기를 재서 top/bottom/left/right를 자동 배치하고, 가장자리에서는 버블을 안쪽으로 shift하면서 화살표는 앵커를 가리키도록 clamp합니다. 인-플로우가 기본이라 평상시엔 끌 필요가 없고, 클리핑되는 컨테이너 안에서만 켜세요(기본값이라 기존 사용처는 영향 없음).

크기#

단일 크기입니다 — caption 타이포 + 최대 폭 16rem(긴 문구는 줄바꿈).

상태#

  • HoverHOVER_SHOW_DELAY_MS(400ms) 지연 후 표시 — 스치는 마우스 과발화 방지
  • Focus — 지연 없이 즉시 표시
  • 호버 유지 — leave 후 HOVER_HIDE_GRACE_MS(120ms) 유예를 둬, 포인터가 트리거→버블로 넘어가면 버블 진입이 유예를 취소합니다 — 내용 위에 머물 수 있습니다(WCAG 1.4.13)
  • 숨김 — 트리거·버블 양쪽에서 벗어난 뒤(유예 경과) · blur · Escape

Props#

Prop타입기본값설명
childrenReactNode트리거 요소 — 단일 포커서블 요소 권장(aria-describedby가 주입된다)
contentReactNode툴팁 본문 — 보통 짧은 텍스트. ReactNode도 가능하나 role=tooltip은 *비대화형* 보조 설명용이라 버튼·링크 등 대화형 콘텐츠는 금지(필요 시 Popover). 차트 호버 밴드(aria-hidden·마우스 전용)가 renderTooltipContent 슬롯으로 작은 표현 노드를 넣는 데 쓴다.
variant'plain' | 'rich'plainplain(기본): 짧은 힌트 · rich: 제목+본문 구조 — M3 (ADR-012 B-P1). 버블은 hover 가능(WCAG 1.4.13)하지만 role=tooltip은 텍스트 보조 설명용 — 버튼·링크 등 interactive 콘텐츠가 필요하면 Popover 의미론을 쓴다
placement'top' | 'bottom' | 'left' | 'right'top버블 방향 — 기본 'top'. 가장자리 트리거는 'left'/'right'로 안쪽을 향하게(경계 잘림 회피).
titlestringrich 제목 — 본문 위 헤더 (variant='rich'에서만)
classNamestring래퍼(span)에 적용
floatingbooleanfalse버블을 document.body로 포털(position:fixed) — overflow 스크롤 컨테이너(표·사이드바) 안에서 잘림 방지. 앵커 위 중앙에 뜨고 스크롤/리사이즈에 추종. 기본 false(인-플로우, 기존 동작 불변).
refRef<HTMLSpanElement>최외곽 호버 앵커 <span> 요소로 전달되는 ref (React 19 ref-as-prop)

접근성#

  • role="tooltip" + 표시 중 트리거에 aria-describedby 주입 — 트리거가 단일 요소일 때만 가능하므로 단일 포커서블 요소를 권장합니다
  • 키보드 사용자는 포커스만으로 즉시 볼 수 있습니다(지연 없음)
  • Escape로 닫기 — 포커스/호버 위치 무관(WCAG 1.4.13 Dismissable)
  • Hoverable(WCAG 1.4.13) — 버블은 pointer-events: auto라, 트리거에서 버블로 포인터를 옮겨도 사라지지 않습니다(leave는 짧은 유예 후 숨김)
  • 툴팁은 이름이 아니라 설명입니다 — 아이콘 버튼의 접근성 이름은 aria-label로 따로 부여하세요
  • 등장 모션은 prefers-reduced-motion 존중

토큰#

component 토큰 없이 semantic을 직접 소비합니다(신설 기준 §4 미충족).

속성토큰
배경/글자color.text(배경) + color.bg(글자) — 반전 쌍
타이포font.size-caption · font.weight-medium · line-height.tight
라운드/그림자radius.sm · shadow.md
레이어z.tooltip
간격space.1 · space.2
모션spring.effect.fast(opacity) · floating 위치는 geometry solver가 즉시 계산