Tooltips

Tooltips reveal a short label, and optionally one line of supporting text, over a focusable trigger on hover or keyboard focus.

Demo

Change the props and copy the result. Every control except the trigger picker is a real Tooltip prop; isOpen pins the overlay so placements can be compared without hovering.

trigger
placement
import { Tooltip } from "@/components/base/tooltip/tooltip"; <Tooltip arrow isOpen title="This is a tooltip" description="Tooltips carry short helper text." />

The trigger in this demo is fixed

A tooltip wraps one element child as its trigger, which the playground’s copyable snippet cannot carry, so the snippet covers the Tooltip element only and needs a trigger child pasted inside it before it compiles. The trigger picker swaps between the 2 fixtures and never reaches the snippet. Full pasteable examples live on the Code tab.

The family

Two components from one module: the overlay most screens use, and the unstyled focusable wrapper for content that cannot take focus on its own.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
TooltipThe overlay plus trigger wrapper: title, optional description, placement, arrow, and delays around one trigger child.@/​components/​base/​tooltip/​tooltip
TooltipTriggerAn unstyled focusable button for giving icons or text a tooltip. Ships with no focus ring of its own; see Accessibility.@/​components/​base/​tooltip/​tooltip

Placements

The 4 sides and 4 corner alignments, all live and pinned open with the arrow on. The Figma sheet draws only the 2 corners above the trigger; the 2 below are the kit’s, included here because the code supports them. The full react-aria union carries 22 values. Each corner is nudged 12px toward the aligned edge by the kit’s cross-offset logic, negative on the left and positive on the right, so the bubble balances over its trigger; the 4 plain sides get no nudge. That logic also covers the 4 logical corner forms, top start through bottom end, which are not shown here. In production, a placement that runs out of room at a viewport edge flips to the opposite side on its own; this gallery disables the flip so every bubble stays on its labeled side at any scroll position.

top
right
bottom
left
top left
top right
bottom left
bottom right

Corner placements are nudged

The kit shifts every corner alignment 12px along the cross axis so the bubble sits optically balanced against its trigger, a DrumKit-visible behavior of the vendored file rather than a react-aria default. Pass crossOffset yourself to override it; details on the Code tab.

Content forms

Title only is the compact form most tooltips should use; a description switches the bubble to its padded form and caps its width at 320px. The arrow is off by default and works with both forms.

title only
title, arrow
with description
description, arrow

Triggers

Both trigger patterns, live: hover or Tab to either to see its tooltip. Any focusable kit control works as a trigger; TooltipTrigger is the wrapper for content that cannot take focus on its own, like a bare icon.

a kit Button as the trigger
TooltipTrigger around a help icon

TooltipTrigger ships unstyled, focus ring included

It renders a real button, so it is focusable and the tooltip opens on Tab, but its outline-hidden class leaves keyboard focus with no visible indicator, measured on the rendered element, and h-max w-max makes a bare size-4 icon a 16×16 target. Give a custom trigger your own focus style and padding, and give every icon-only trigger an aria-label: the tooltip describes, it does not name. The help-icon triggers on this page do all three, so what you see above is the corrected pattern rather than the bare one.

States

Every state below is a real prop on a live component, not a repainted approximation: isOpen pins the overlay, isDisabled suppresses it, and trigger picks which interactions open it. The overlay itself has one visual treatment; open or closed is the whole state space.

rest
open (isOpen)
isDisabled, hover shows nothing
trigger=focus, only Tab opens it

Hover and focus treatments live on the trigger

The overlay never changes its look; what reacts to the pointer and the keyboard is the trigger element, using whatever states that component already has. There is no loading state and no color variant anywhere in the family.