Tally UI
UI

Tooltip

A small label that appears on hover or focus to provide additional context for an element.

Import

import { Tooltip, TooltipTrigger, TooltipContent } from '@tallyui/components';

Usage

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline" size="icon">
      <Icon><Plus /></Icon>
    </Button>
  </TooltipTrigger>
  <TooltipContent>
    <Text>Add to library</Text>
  </TooltipContent>
</Tooltip>

Tooltip is a styled wrapper around the Tooltip primitive. It provides a compact, styled popover that appears on hover (web) or long-press (native). Content text is styled through TextClassContext so descendant Text components pick up text-sm text-popover-foreground automatically. For full accessibility and behavior details, see the primitive docs.

Components

TooltipContent

The floating label that appears near the trigger. Renders through a portal automatically.

Default classes: z-50 overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md

PropTypeDefaultDescription
sideOffsetnumber4Distance in pixels between the trigger and the tooltip
side'top' | 'bottom' | 'left' | 'right''top'Which side of the trigger to position the tooltip
classNamestring--Additional NativeWind classes merged via cn()

Plus all props from the Tooltip primitive's Content component.

Props

PropTypeDefaultDescription
openboolean--Controlled open state
defaultOpenboolean--Uncontrolled initial open state
onOpenChange(open: boolean) => void--Called when the open state changes
delayDurationnumber--How long to wait before showing the tooltip (ms)

TooltipTrigger accepts asChild to merge props onto a custom child element.

Examples

Basic tooltip

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="ghost" size="icon">
      <Icon><Settings /></Icon>
    </Button>
  </TooltipTrigger>
  <TooltipContent>
    <Text>Settings</Text>
  </TooltipContent>
</Tooltip>

Different positions

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline"><Text>Top (default)</Text></Button>
  </TooltipTrigger>
  <TooltipContent side="top">
    <Text>Tooltip on top</Text>
  </TooltipContent>
</Tooltip>

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline"><Text>Bottom</Text></Button>
  </TooltipTrigger>
  <TooltipContent side="bottom">
    <Text>Tooltip on bottom</Text>
  </TooltipContent>
</Tooltip>

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline"><Text>Left</Text></Button>
  </TooltipTrigger>
  <TooltipContent side="left">
    <Text>Tooltip on left</Text>
  </TooltipContent>
</Tooltip>

<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline"><Text>Right</Text></Button>
  </TooltipTrigger>
  <TooltipContent side="right">
    <Text>Tooltip on right</Text>
  </TooltipContent>
</Tooltip>

Controlled tooltip

const [open, setOpen] = useState(false);

<Tooltip open={open} onOpenChange={setOpen}>
  <TooltipTrigger asChild>
    <Button><Text>Hover me</Text></Button>
  </TooltipTrigger>
  <TooltipContent>
    <Text>Controlled: {open ? 'visible' : 'hidden'}</Text>
  </TooltipContent>
</Tooltip>

On this page