Tooltip.
A tooltip is a short, user-triggered label that explains the control it points at — most often an icon with no visible text. It appears on hover and on keyboard focus, and it disappears, which decides everything else about it: nothing a person needs in order to finish a task can live only in a tooltip. Field requirements, error text and instructions belong on the page. If a tooltip would only repeat a label that is already visible, leave it out.
Location
Four sides. The default is Top; the other three cover the edges where a tooltip above would run off-screen or hide what it describes.
The four variants are the design surface, not the behaviour. The component does not know where the viewport edge is, so flipping from Top to Bottom when there is no room above is a runtime job — see the collision note in the props draft. Pick a location per placement in the design, and let the implementation flip it when it has to.
Placement
Location decides which side; Placement decides where along that side.
Tip near the leading edge. For a trigger at the start of its row.
The default. Tip centred under the bubble.
Tip near the trailing edge. For a trigger at the end of its row.
Placement moves the tip along the edge without moving the bubble, which is what keeps a tooltip inside the container when its trigger sits near a corner.
Tip
Keep the tip on wherever controls sit close together — a toolbar, a row of icon buttons, a table row action column.
The default. The arrow says which control the text belongs to.
No arrow. Only safe when the trigger is isolated.
Without it, a floating bubble between two icons belongs to neither of them, which is the failure NN/g documents in the PowerPoint example.
Anatomy
Do & don't
Accessibility
Props (React) — draft
// DRAFT. Derived from the Figma properties plus the WAI-ARIA tooltip pattern
// and the MUI Tooltip accessibility notes.
// Anything marked (proposed) does not exist in the Figma component yet.
type TooltipProps = {
content: string; // Figma: the bubble label
location?: "top" | "right" | "bottom" | "left"; // Figma: Location, default "top"
placement?: "start" | "middle" | "end"; // Figma: Placement, default "middle"
tip?: boolean; // Figma: Tip, default true
children: ReactNode; // (proposed) the trigger it wraps
describesTrigger?: boolean; // (proposed) describedby vs labelledby
open?: boolean; // (proposed) controlled
enterDelay?: number; // (proposed) ms
leaveDelay?: number; // (proposed) ms
maxWidth?: number; // (proposed) 300; component sets none
offset?: number; // (proposed) 8, measured from the tip
flip?: boolean; // (proposed) collision detection, default true
disabled?: boolean; // (proposed)
};
// Escape must close it even when open is controlled - WCAG 1.4.13.
// The bubble is hoverable by default: leaveDelay has to be long enough for the
// pointer to travel from trigger to bubble, or the same criterion fails.
// location is a starting preference, not a guarantee. With flip on, the runtime
// may render the opposite side; the four Figma variants document the options,
// not the final position.