Get Started
Components
- Alert
- Avatar
- Badge
- Breadcrumb
- Button
- Button Group
- Calendar
- Card
- Carousel
- Chart
- Checkbox
- Checkbox Group
- ComboBox
- Command
- Data Table
- Date Field
- Date Picker
- Date Range Picker
- Dialog
- Disclosure
- Disclosure Group
- Drawer
- Empty
- Field
- File Trigger
- Form
- Grid List
- Hover Card
- Input
- Input Group
- Input OTP
- Item
- Kbd
- Label
- ListBox
- Menu
- Number Field
- Pagination
- Popover
- Progress Bar
- Radio Group
- Range Calendar
- Resizable
- Search Field
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Sonner
- Spinner
- Switch
- Table
- Tabs
- Tag Group
- Text Field
- Textarea
- Time Field
- Toast
- Toggle Button
- Toggle Button Group
- Tooltip
- Tree
- Typography
AI Elements
A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"
export function TooltipDemo() {
return (
<TooltipTrigger>
<Button variant="outline">Hover</Button>
<Tooltip>Add to library</Tooltip>
</TooltipTrigger>
)
}
Installation
CLI
Manual
pnpmnpmyarnbunpnpm dlx shadcn@latest add tooltip
Usage
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"<TooltipTrigger>
<Button>Hover</Button>
<Tooltip>Add to library</Tooltip>
</TooltipTrigger>Examples
Default
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"
export function TooltipDemo() {
return (
<TooltipTrigger>
<Button variant="outline">Hover</Button>
<Tooltip>Add to library</Tooltip>
</TooltipTrigger>
)
}
<TooltipTrigger>
<Button variant="outline">Hover</Button>
<Tooltip>Add to library</Tooltip>
</TooltipTrigger>With Icon Button
import { InfoIcon } from "lucide-react"
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"
export function TooltipIcon() {
return (
<TooltipTrigger>
<Button size="icon" variant="outline" aria-label="Information">
<InfoIcon className="size-4" />
</Button>
<Tooltip>Get more information</Tooltip>
</TooltipTrigger>
)
}
import { InfoIcon } from "lucide-react"
<TooltipTrigger>
<Button size="icon" variant="outline" aria-label="Information">
<InfoIcon className="size-4" />
</Button>
<Tooltip>Get more information</Tooltip>
</TooltipTrigger>Placement
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"
export function TooltipPlacement() {
return (
<div className="flex flex-wrap items-center justify-center gap-4">
<TooltipTrigger>
<Button variant="outline">Top</Button>
<Tooltip placement="top">Tooltip on top</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Bottom</Button>
<Tooltip placement="bottom">Tooltip on bottom</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Left</Button>
<Tooltip placement="left">Tooltip on left</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Right</Button>
<Tooltip placement="right">Tooltip on right</Tooltip>
</TooltipTrigger>
</div>
)
}
You can control the placement of the tooltip using the placement prop.
<TooltipTrigger>
<Button variant="outline">Top</Button>
<Tooltip placement="top">Tooltip on top</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Bottom</Button>
<Tooltip placement="bottom">Tooltip on bottom</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Left</Button>
<Tooltip placement="left">Tooltip on left</Tooltip>
</TooltipTrigger>
<TooltipTrigger>
<Button variant="outline">Right</Button>
<Tooltip placement="right">Tooltip on right</Tooltip>
</TooltipTrigger>Custom Delay
import { Button } from "@/components/ui/button"
import { Tooltip, TooltipTrigger } from "@/components/ui/tooltip"
export function TooltipDelay() {
return (
<div className="flex flex-wrap items-center justify-center gap-4">
<TooltipTrigger delay={0}>
<Button variant="outline">No delay</Button>
<Tooltip>Appears immediately</Tooltip>
</TooltipTrigger>
<TooltipTrigger delay={500}>
<Button variant="outline">500ms delay</Button>
<Tooltip>Appears after 500ms</Tooltip>
</TooltipTrigger>
<TooltipTrigger delay={1000}>
<Button variant="outline">1000ms delay</Button>
<Tooltip>Appears after 1 second</Tooltip>
</TooltipTrigger>
</div>
)
}
Control when the tooltip appears using the delay and closeDelay props.
<TooltipTrigger delay={0}>
<Button variant="outline">No delay</Button>
<Tooltip>Appears immediately</Tooltip>
</TooltipTrigger>
<TooltipTrigger delay={500}>
<Button variant="outline">500ms delay</Button>
<Tooltip>Appears after 500ms</Tooltip>
</TooltipTrigger>
<TooltipTrigger delay={1000}>
<Button variant="outline">1000ms delay</Button>
<Tooltip>Appears after 1 second</Tooltip>
</TooltipTrigger>API Reference
TooltipTrigger
TooltipTrigger wraps the element that triggers the tooltip and the tooltip itself.
| Prop | Type | Default | Description |
|---|---|---|---|
delay | number | 500 | The delay time for the tooltip to show up in milliseconds |
closeDelay | number | 0 | The delay time for the tooltip to close in milliseconds |
isDisabled | boolean | false | Whether the tooltip is disabled |
trigger | 'focus' | null | By default, opens for both focus and hover. Can be set to "focus" to only open on focus |
Tooltip
Tooltip is the content component that displays the tooltip message.
| Prop | Type | Default | Description |
|---|---|---|---|
placement | Placement | 'top' | The placement of the tooltip relative to the trigger |
offset | number | 10 | The offset of the tooltip from the trigger |
containerPadding | number | 12 | The padding between the tooltip and the edge of the viewport |
Changelog
2025-10-26 Migrate to React Aria Components
We've migrated the tooltip component from Radix UI to React Aria Components for better accessibility and animation support.
Breaking Changes:
- Component Structure: The component structure has changed:
Old (Radix UI):
<Tooltip>
<TooltipTrigger>Hover</TooltipTrigger>
<TooltipContent>
<p>Add to library</p>
</TooltipContent>
</Tooltip>New (React Aria):
<TooltipTrigger>
<Button>Hover</Button>
<Tooltip>Add to library</Tooltip>
</TooltipTrigger>-
Props: Some prop names have changed:
sideOffset→offsetside→placement- No need for
asChildprop anymore
-
Dependencies: Update your dependencies:
- Remove:
@radix-ui/react-tooltip - Add:
react-aria-componentsandtailwind-variants
- Remove: