Tooltip

Classic inverted hover/focus tip — dark on light, light on dark. Built on Radix Tooltip. Use it for a short, non-essential label that names or clarifies a control on hover or keyboard focus, most often an icon-only IconButton whose meaning isn't obvious. Keep content to a few words: it is hover-triggered and not reachable on touch, so never put essential information, links, or interactive elements inside. For rich anchored content (forms, multi-line copy, actions) reach for Popover; for persistent inline status use Alert or Badge. One inverted surface only — no tones or sizes; control placement with side and timing with delayDuration (defaults to a snappy 300ms).

Default

<TooltipProvider>
  <Tooltip>
    <TooltipTrigger asChild>
      <Button variant="outline">Hover me</Button>
    </TooltipTrigger>
    <TooltipContent>Copied to clipboard</TooltipContent>
  </Tooltip>
</TooltipProvider>

All four sides

<TooltipContent side="top">Top</TooltipContent>
<TooltipContent side="right">Right</TooltipContent>
<TooltipContent side="bottom">Bottom</TooltipContent>
<TooltipContent side="left">Left</TooltipContent>

On an icon-only control

<Tooltip>
  <TooltipTrigger asChild>
    <IconButton variant="ghost" aria-label="More info"><Info /></IconButton>
  </TooltipTrigger>
  <TooltipContent>Deploys take ~2 minutes on average</TooltipContent>
</Tooltip>

Props

ComponentNotable props
TooltipProviderdelayDuration (default 300ms — snappier than Radix's 700ms default), skipDelayDuration, disableHoverableContent
Tooltipopen, defaultOpen, onOpenChange, delayDuration (override Provider per-tooltip)
TooltipTriggerasChild — wraps your own Button / IconButton / anchor
TooltipContentside ("top" | "right" | "bottom" | "left"), align, sideOffset (default 6), collisionPadding

Source

packages/react/src/components/tooltip.tsx · adapted from shadcn