본문으로 건너뛰기
오버레이 / tooltip

Tooltip

hover/focus 로 뜨는 가벼운 힌트 — 인터랙티브 컨텐츠는 담지 않는다 (Radix Tooltip 기반).
오버레이tooltipStatic specimentooltip툴팁hint힌트
01 · Specimen

먼저 보고, 그다음 계약을 읽습니다

hover/focus 로 뜨는 가벼운 힌트 — 인터랙티브 컨텐츠는 담지 않는다 (Radix Tooltip 기반).

Workbench 불러오는 중…
Component intent의도와 경계 읽기

단일 라인~2·3줄 짧은 설명용. 반전 색(어두운 bg·밝은 텍스트) 표면에 pointer-events:none 이라 마우스로 잡을 수 없다(그 자리는 Popover/HoverCard). 키보드 focus 로도 등장해 접근성을 지키고, 기본 portal 이라 overflow:hidden 부모에 갇히지 않는다. TooltipProvider(앱 루트 1회, delay 글로벌 공유)·Tooltip(Root)·TooltipTrigger·TooltipContent 를 조합한다.

02 · Use

예제

SSOT에 등록된 실제 API 기준 snippet입니다. standalone 배지만 독립 실행 단위이며, fragment는 주변 state·handler 문맥을 생략합니다.

01기본 (Provider + Tooltip)tsxfragment
기본 (Provider + Tooltip)
import {  TooltipProvider,  Tooltip,  TooltipTrigger,  TooltipContent,} from "@axe/ui";import { Button } from "@axe/ui";// Provider 는 앱 루트에 1회 두는 것을 권장<TooltipProvider>  <Tooltip>    <TooltipTrigger asChild>      <Button variant="ghost">?</Button>    </TooltipTrigger>    <TooltipContent side="top">이 값은 자동 계산됩니다</TooltipContent>  </Tooltip></TooltipProvider>
02아이콘 버튼 (aria-label 병행) · 화살표 없음tsxfragment
아이콘 버튼 (aria-label 병행) · 화살표 없음
import {  Tooltip,  TooltipTrigger,  TooltipContent,} from "@axe/ui";import { Button } from "@axe/ui";<Tooltip>  <TooltipTrigger asChild>    <Button aria-label="삭제" variant="ghost">      <TrashIcon />    </Button>  </TooltipTrigger>  <TooltipContent side="bottom" withArrow={false}>삭제</TooltipContent></Tooltip>
03 · React

Props

TSX 소스가 진실입니다. 주요 export 컴포넌트의 public API만 노출합니다.

이름타입필수기본값설명
delayDurationnumber200TooltipProvider — hover 후 등장까지 지연(ms). 개별 Tooltip(Root) 에서 override 가능.
skipDelayDurationnumber200TooltipProvider — 한 툴팁을 닫은 뒤 이 시간 내 다른 트리거로 이동하면 지연 없이 즉시 등장.
openboolean열림 상태 (controlled). Tooltip(Root) prop.
onOpenChange(open: boolean) => void열림/닫힘 콜백 (Root).
sideOffsetnumber6TooltipContent 와 트리거 사이 간격(px).
withPortalbooleantrueTooltipContent 를 portal 로 띄울지 — overflow:hidden 부모 탈출.
withArrowbooleantrue트리거를 가리키는 화살표 표시 여부.
...rest각 Radix Tooltip.* propsProvider(disableHoverableContent)·Trigger(asChild)·Content(side/align/collisionPadding) 등 각 파트는 대응 Radix 컴포넌트 props 를 그대로 전파.
04 · Any stack

.axe-* 클래스 계약

React 밖에서도 같은 표면을 그리는 공개 계약입니다. stable은 minor 버전 안에서 이름을 바꾸지 않습니다.

클래스안정성용도
.axe-tooltip__contentstable툴팁 표면(반전 색·pointer-events:none·small radius).
.axe-tooltip__arrowstable트리거를 가리키는 화살표(Radix Arrow).
비-React 소비 노트
hover/focus 등장·delay·위치 계산이 Radix 런타임(data-state)에 의존해 CSS-only 로는 재현할 수 없다. .axe-tooltip__* 토큰은 정적 표면에 노출되나 실제 소비는 React 컴포넌트를 통해서 한다.
05 · Inclusive

접근성

키보드, ARIA, 구현 노트를 함께 검토합니다.

Keyboard
  • 트리거로 Tab 이동(키보드 focus)만으로도 툴팁 등장
  • Esc 로 닫기
ARIA

Radix 가 트리거에 aria-describedby 로 툴팁 컨텐츠를 연결하고 컨텐츠에 role=tooltip 을 부여. hover 와 키보드 focus 두 경로로 등장한다. content 는 pointer-events:none 이라 마우스로 잡을 수 없다.

Notes

TooltipProvider 로 delay 를 글로벌 공유한다. 첫 툴팁은 짧게 진입하고, 연속 툴팁은 skipDelayDuration 안에서 delay와 재등장 애니메이션을 모두 생략해 즉시 전환한다. 네이티브 disabled 버튼은 이벤트를 안 내보내 툴팁이 안 뜨니, 필요하면 트리거를 감싸는 span 등에 씌운다. prefers-reduced-motion 시 애니메이션 제거.

06 · Judgment

권장 · 지양

권장
  • 짧은 힌트만 — 한 줄~2·3줄. 긴 설명은 본문/Popover 로.
  • 아이콘 전용 버튼엔 aria-label 도 함께(툴팁은 hover 전용이라 스크린리더 이름을 대체하지 않음).
  • TooltipProvider 를 앱 루트에 1회 두어 delay 를 일관되게.
지양
  • 링크·버튼 등 인터랙티브 컨텐츠를 넣지 말 것 — content 는 pointer-events:none 이다.
  • 필수 정보를 툴팁에만 두지 말 것 — 터치 환경에서 뜨지 않는다.
검색창을 열면 컴포넌트 인덱스를 불러옵니다.