Tooltip

Tooltips display brief, informative text when a user hovers over or focuses on an element.

Examples

Basic

Sides

Alignment

Wrapping other components

Delay

Rich content

Overview

Tooltip provides contextual information for UI elements. Built on Base UI for full accessibility and composability, with a styled dark appearance that works across all backgrounds.

tsx
import { Tooltip, TooltipTrigger, TooltipContent } from "@rogo-technologies/ui/tooltip";

<Tooltip>
  <TooltipTrigger>Hover me</TooltipTrigger>
  <TooltipContent>Helpful information</TooltipContent>
</Tooltip>;

Usage

Sides

Use the side prop on TooltipContent to position the tooltip. It automatically flips to the opposite side if there isn't enough space.

tsx
<Tooltip>
  <TooltipTrigger>Bottom</TooltipTrigger>
  <TooltipContent side="bottom">Appears below</TooltipContent>
</Tooltip>

Wrapping other components

Use asChild on TooltipTrigger to merge tooltip behavior into an existing interactive element.

tsx
<Tooltip>
  <TooltipTrigger asChild>
    <Button variant="outline" iconOnly aria-label="Copy">
      <IconSquareBehindSquare1 />
    </Button>
  </TooltipTrigger>
  <TooltipContent>Copy to clipboard</TooltipContent>
</Tooltip>

Delay

tsx
<TooltipTrigger delay={400}>Hover me</TooltipTrigger>

<TooltipProvider delay={200}>
  {/* All tooltips inherit 200ms delay */}
</TooltipProvider>

Rich content

Tooltips accept any React content. Use className for custom sizing and layout.

tsx
<TooltipContent className="flex max-w-xs flex-col gap-1 px-3 py-2">
  <span className="font-semibold">Keyboard shortcuts</span>
  <span className="text-secondary-inverted text-[11px]">Press ⌘K to open the command palette.</span>
</TooltipContent>

Composition

For advanced cases, compose the lower-level primitives directly instead of using TooltipContent.

tsx
import {
  Tooltip,
  TooltipTrigger,
  TooltipPortal,
  TooltipPositioner,
  TooltipPopup,
} from "@rogo-technologies/ui/tooltip";

<Tooltip>
  <TooltipTrigger>Hover me</TooltipTrigger>
  <TooltipPortal>
    <TooltipPositioner side="top" sideOffset={8}>
      <TooltipPopup>Custom tooltip</TooltipPopup>
    </TooltipPositioner>
  </TooltipPortal>
</Tooltip>;

API

Tooltip (Root)

PropTypeDefaultDescription
openbooleanControlled open state.
defaultOpenbooleanfalseInitial open state (uncontrolled).
onOpenChange(open: boolean) => voidCallback when open state changes.
delayDurationnumberRadix compat — forwarded as delay to trigger.

TooltipTrigger

PropTypeDefaultDescription
delaynumber600Milliseconds before tooltip appears.
closeDelaynumber0Milliseconds before tooltip hides.
asChildbooleanfalseMerges props onto child element instead of wrapping.
disabledbooleanfalsePrevents the tooltip from appearing.

TooltipContent

TooltipContent composes TooltipPortal, TooltipPositioner, and TooltipPopup into a single component.

PropTypeDefaultDescription
side"top" | "right" | "bottom" | "left""top"Which side of the trigger to position on.
sideOffsetnumber4Distance from the trigger in pixels.
align"start" | "center" | "end""center"Alignment along the cross axis.
alignOffsetnumber0Offset along the alignment axis.
hiddenbooleanfalseWhen true, content is not rendered.
classNamestringAdditional CSS classes for the popup.

TooltipProvider

PropTypeDefaultDescription
delaynumber600Default delay for all nested tooltips.
closeDelaynumber0Default close delay.
delayDurationnumberRadix compat — alias for delay.

All components accept standard HTML attributes for their underlying elements.

Guidelines

Do

  • Use tooltips for supplementary information that isn't essential to the task
  • Keep tooltip text concise — ideally under 80 characters
  • Add tooltips to icon-only buttons to clarify their purpose
  • Use TooltipProvider at the app root for consistent delay behavior
  • Use asChild when wrapping interactive elements like buttons

Don't

  • Don't put essential information only in a tooltip — users may never see it
  • Don't use tooltips for complex interactive content (use a popover instead)
  • Don't add tooltips to elements that already have clear labels
  • Don't set delay to 0 globally — it creates a noisy experience
  • Don't use tooltips on touch-only interfaces — hover isn't available
PreviousToast
Made in NYC© 2026 Rogo Technologies Inc.