Tooltip
An overlay component that displays supplemental information when hovering or focusing an element — ideal for button labels, icon hints, and keyboard shortcuts.
Playground
<Tooltip>
<Tooltip.Trigger asChild>
<Button variant="outline">Hover me</Button>
</Tooltip.Trigger>
<Tooltip.Content>
Tooltip text
</Tooltip.Content>
</Tooltip>Variants
Sizes
smdefault| Size | Font | Padding | Usage | Preview |
|---|---|---|---|---|
sm | 12px (text-xs) | 4px 10px | Compact supplemental info | |
default | 13px (text-sm) | 6px 12px | Standard (default) |
Features
Side Placement
Renders in 4 directions — top, right, bottom, left. Defaults to top.
<Tooltip.Content side="top">Top</Tooltip.Content>
<Tooltip.Content side="right">Right</Tooltip.Content>
<Tooltip.Content side="bottom">Bottom</Tooltip.Content>
<Tooltip.Content side="left">Left</Tooltip.Content>Arrow
showArrow controls the pointer arrow toward the trigger. Shown by default.
{/* With arrow (default) */}
<Tooltip.Content>With arrow</Tooltip.Content>
{/* Without arrow */}
<Tooltip.Content showArrow={false}>No arrow</Tooltip.Content>Alignment
align adjusts alignment relative to the trigger.
<Tooltip.Content align="start">Start</Tooltip.Content>
<Tooltip.Content align="center">Center</Tooltip.Content>
<Tooltip.Content align="end">End</Tooltip.Content>Provider
Tooltip.Provider manages global delay settings. With skipDelayDuration, subsequent tooltips appear instantly on continuous hover.
<Tooltip.Provider delayDuration={400} skipDelayDuration={200}>
{/* All tooltips inside share these delay settings */}
<Tooltip>
<Tooltip.Trigger asChild>
<Button>First</Button>
</Tooltip.Trigger>
<Tooltip.Content>First tooltip</Tooltip.Content>
</Tooltip>
</Tooltip.Provider>API
Component Structure
Tooltip— Radix Tooltip.TriggerHover/focus target.ContentPropsTooltip body (variant, size, side, arrow).ArrowArrow indicator (built into Content).PortalPortal (built into Content).ProviderPropsGlobal delay configurationProps
Tooltip (Root)
openundefinedbooleanTooltip visibility state (controlled mode)
defaultOpenfalsebooleanInitial visibility state (uncontrolled mode)
onOpenChangeundefined(open: boolean) => voidCallback when visibility state changes
delayDuration200numberDelay from hover to show (ms)
disableHoverableContentfalsebooleanDon't maintain visibility on content hover
| Name | Type | Default | Description |
|---|---|---|---|
open | boolean | undefined | Tooltip visibility state (controlled mode) |
defaultOpen | boolean | false | Initial visibility state (uncontrolled mode) |
onOpenChange | (open: boolean) => void | undefined | Callback when visibility state changes |
delayDuration | number | 200 | Delay from hover to show (ms) |
disableHoverableContent | boolean | false | Don't maintain visibility on content hover |
Tooltip.Content
variant"default""default" | "inverted"Visual style — default: dark background + shadow; inverted: glassmorphism
size"default""sm" | "default"Text size
side"top""top" | "right" | "bottom" | "left"Placement direction
sideOffset6numberDistance from trigger (px)
align"center""start" | "center" | "end"Alignment relative to trigger
showArrowtruebooleanShow the pointer arrow
| Name | Type | Default | Description |
|---|---|---|---|
variant | "default" | "inverted" | "default" | Visual style — default: dark background + shadow; inverted: glassmorphism |
size | "sm" | "default" | "default" | Text size |
side | "top" | "right" | "bottom" | "left" | "top" | Placement direction |
sideOffset | number | 6 | Distance from trigger (px) |
align | "start" | "center" | "end" | "center" | Alignment relative to trigger |
showArrow | boolean | true | Show the pointer arrow |
Tooltip.Provider
delayDuration700numberGlobal hover delay (ms)
skipDelayDuration300numberDelay skip duration for continuous hover (ms)
disableHoverableContentfalsebooleanGlobally disable content hover persistence
| Name | Type | Default | Description |
|---|---|---|---|
delayDuration | number | 700 | Global hover delay (ms) |
skipDelayDuration | number | 300 | Delay skip duration for continuous hover (ms) |
disableHoverableContent | boolean | false | Globally disable content hover persistence |
Anatomy
Best Practices
Recommended
- ✓Use Tooltip for supplemental labels on icon buttons and actions
- ✓Keep text short and concise — 1–2 lines max
- ✓Use Tooltip to display keyboard shortcuts
- ✓Use Tooltip to show truncated text in full
Don't
- ✕Don't put critical information only in a Tooltip — always write it in visible text
- ✕Don't place interactive content (links, buttons) inside a Tooltip — use Popover instead
- ✕Don't put long paragraphs or rich content in a Tooltip
- ✕Don't use Tooltip for information touch-only users need
Tooltip vs Popover
Similar floating UI, but different purpose and interaction.
Trigger
Tooltip: Hover / Focus
Popover: Click
Content
Tooltip: Text only (short supplement)
Popover: Rich (forms, buttons, links)
Interaction
Tooltip: None (read only)
Popover: Yes (interactive)
Default direction
Tooltip: top (doesn't interrupt reading flow)
Popover: bottom (natural top-to-bottom flow)
Dismiss
Tooltip: Auto on hover end
Popover: Outside click / Esc / Close button
ARIA
Tooltip: role="tooltip"
Popover: aria-expanded + aria-controls
| Feature | Tooltip | Popover |
|---|---|---|
| Trigger | Hover / Focus | Click |
| Content | Text only (short supplement) | Rich (forms, buttons, links) |
| Interaction | None (read only) | Yes (interactive) |
| Default direction | top (doesn't interrupt reading flow) | bottom (natural top-to-bottom flow) |
| Dismiss | Auto on hover end | Outside click / Esc / Close button |
| ARIA | role="tooltip" | aria-expanded + aria-controls |
Use Tooltip for short supplemental text shown on hover. Use Popover when interactive content like links or buttons is needed.
Accessibility
Keyboard
ARIA / WCAG
role="tooltip"Assigned by Radix automaticallyaria-describedbyLinked automatically- WCAG 1.4.13 — content stays on hover
- Auto collision avoidance (prevents overflow)