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 또는 Tab 포커스로 실제 힌트를 띄워 보세요:
사용 시점#
아이콘 버튼·축약 라벨에 짧은 보조 설명을 덧붙이면 Tooltip — 링크·버튼 등 상호작용이 필요하면 Popover입니다.
권장 — 이렇게 쓰세요
지양 — 이러지 마세요
쓴다 — 아이콘 버튼·축약 라벨에 hover·포커스 양쪽에서 뜨는 짧은 텍스트 힌트(없어도 흐름 유지)
대신 Popover — 링크·버튼 등 상호작용 콘텐츠가 필요할 때
플레이그라운드#
컨트롤로 props를 조작하면 미리보기와 코드가 실시간 갱신됩니다.
Tooltip를 직접 조작해 보세요
속성·테마·토큰을 바꾸고 React·Flutter 코드를 확인하는 풀스크린 빌더로 엽니다.
플레이그라운드는 넓은 작업 영역이 필요해 웹·태블릿에서 편집할 수 있어요.
변형#
variant로 두 형태를 지원합니다 (ADR-012 B-P1).
- plain(기본) — 짧은 텍스트 힌트(
content한 줄) - rich —
title(제목) +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(긴 문구는 줄바꿈).
상태#
- Hover —
HOVER_SHOW_DELAY_MS(400ms) 지연 후 표시 — 스치는 마우스 과발화 방지 - Focus — 지연 없이 즉시 표시
- 호버 유지 — leave 후
HOVER_HIDE_GRACE_MS(120ms) 유예를 둬, 포인터가 트리거→버블로 넘어가면 버블 진입이 유예를 취소합니다 — 내용 위에 머물 수 있습니다(WCAG 1.4.13) - 숨김 — 트리거·버블 양쪽에서 벗어난 뒤(유예 경과) · blur ·
Escape
Props#
| Prop | 타입 | 기본값 | 설명 |
|---|---|---|---|
children | ReactNode | — | 트리거 요소 — 단일 포커서블 요소 권장(aria-describedby가 주입된다) |
content | ReactNode | — | 툴팁 본문 — 보통 짧은 텍스트. ReactNode도 가능하나 role=tooltip은 *비대화형* 보조 설명용이라 버튼·링크 등 대화형 콘텐츠는 금지(필요 시 Popover). 차트 호버 밴드(aria-hidden·마우스 전용)가 renderTooltipContent 슬롯으로 작은 표현 노드를 넣는 데 쓴다. |
variant | 'plain' | 'rich' | plain | plain(기본): 짧은 힌트 · rich: 제목+본문 구조 — M3 (ADR-012 B-P1). 버블은 hover 가능(WCAG 1.4.13)하지만 role=tooltip은 텍스트 보조 설명용 — 버튼·링크 등 interactive 콘텐츠가 필요하면 Popover 의미론을 쓴다 |
placement | 'top' | 'bottom' | 'left' | 'right' | top | 버블 방향 — 기본 'top'. 가장자리 트리거는 'left'/'right'로 안쪽을 향하게(경계 잘림 회피). |
title | string | — | rich 제목 — 본문 위 헤더 (variant='rich'에서만) |
className | string | — | 래퍼(span)에 적용 |
floating | boolean | false | 버블을 document.body로 포털(position:fixed) — overflow 스크롤 컨테이너(표·사이드바) 안에서 잘림 방지. 앵커 위 중앙에 뜨고 스크롤/리사이즈에 추종. 기본 false(인-플로우, 기존 동작 불변). |
ref | Ref<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가 즉시 계산 |