Skip to content
View as Markdown

Tooltip

The Tooltip component displays contextual information on hover or focus. It is backed by Base UI's Tooltip primitive.

Live preview in the UI Catalogue →

Import

tsx
import { Tooltip } from "@tailor-platform/app-shell";

Basic Usage

tsx
<Tooltip.Root>
  <Tooltip.Trigger render={<Button variant="outline" />}>Hover me</Tooltip.Trigger>
  <Tooltip.Content>Helpful information</Tooltip.Content>
</Tooltip.Root>

Sub-components

Sub-componentDescription
Tooltip.ProviderProvides shared delay configuration for all nested tooltips
Tooltip.RootManages tooltip open/close state
Tooltip.TriggerElement that shows the tooltip on hover or focus
Tooltip.ContentThe tooltip popup containing the help text

Props

Tooltip.Provider Props

Wrap a section of your UI (e.g. a toolbar) with Tooltip.Provider to share delay settings across multiple tooltips.

PropTypeDefaultDescription
delaynumber0Delay in ms before the tooltip opens (milliseconds)
closeDelaynumber-Delay in ms before the tooltip closes
timeoutnumber-Timeout in ms after which the tooltip auto-closes
childrenReact.ReactNode-Nested tooltip components

Tooltip.Root Props

PropTypeDefaultDescription
openboolean-Controlled open state
defaultOpenbooleanfalseInitial open state (uncontrolled)
onOpenChange(open: boolean) => void-Callback when open state changes
childrenReact.ReactNode-Tooltip sub-components

Tooltip.Content Props

PropTypeDefaultDescription
side"top" | "right" | "bottom" | "left""top"Preferred placement of the tooltip
align"start" | "center" | "end""center"Alignment along the placement axis
sideOffsetnumber5Distance in px from the trigger
noArrowbooleanfalseWhen true, suppresses the arrow indicator on the popup
classNamestring-Additional CSS classes
childrenReact.ReactNode-Tooltip text or content

Placement

tsx
<Tooltip.Root>
  <Tooltip.Trigger render={<Button />}>Trigger</Tooltip.Trigger>
  <Tooltip.Content side="right" align="start">
    Appears on the right
  </Tooltip.Content>
</Tooltip.Root>

Shared Delay with Provider

Use Tooltip.Provider to avoid tooltips opening immediately in dense UIs like toolbars:

tsx
<Tooltip.Provider delay={300}>
  <Toolbar>
    <Tooltip.Root>
      <Tooltip.Trigger render={<Button size="icon" />}>
        <BoldIcon />
      </Tooltip.Trigger>
      <Tooltip.Content>Bold</Tooltip.Content>
    </Tooltip.Root>
    <Tooltip.Root>
      <Tooltip.Trigger render={<Button size="icon" />}>
        <ItalicIcon />
      </Tooltip.Trigger>
      <Tooltip.Content>Italic</Tooltip.Content>
    </Tooltip.Root>
  </Toolbar>
</Tooltip.Provider>

Examples

Icon Button with Tooltip

tsx
import { PencilIcon } from "lucide-react";

<Tooltip.Root>
  <Tooltip.Trigger render={<Button size="icon" variant="ghost" />}>
    <PencilIcon />
    <span className="astw:sr-only">Edit</span>
  </Tooltip.Trigger>
  <Tooltip.Content>Edit order</Tooltip.Content>
</Tooltip.Root>;

Controlled Tooltip

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

<Tooltip.Root open={open} onOpenChange={setOpen}>
  <Tooltip.Trigger render={<Button />}>Info</Tooltip.Trigger>
  <Tooltip.Content>Additional details here</Tooltip.Content>
</Tooltip.Root>;

Accessibility

  • Tooltip content is rendered in a portal
  • Trigger receives focus and keyboard activation support
  • sr-only text on icon-only triggers is recommended for screen readers
  • Button - Common trigger element for tooltips