> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Tooltip

> Show supplementary information when a trigger is hovered or focused.

export const StoryEmbed = ({storyId, title, height = 120}) => <>
    <Tabs>
      <Tab title="Light">
        <iframe title={`${title} (light)`} src={`https://storybook.twenty.com/iframe.html?id=${storyId}&viewMode=story&globals=colorScheme:light`} width="100%" height={height} loading="lazy" allow="clipboard-write" style={{
  border: 0
}} />
      </Tab>
      <Tab title="Dark">
        <iframe title={`${title} (dark)`} src={`https://storybook.twenty.com/iframe.html?id=${storyId}&viewMode=story&globals=colorScheme:dark`} width="100%" height={height} loading="lazy" allow="clipboard-write" style={{
  border: 0
}} />
      </Tab>
    </Tabs>
    <a href={`https://storybook.twenty.com/?path=/story/${storyId}`}>
      Open in Storybook
    </a>
  </>;

Use `Tooltip` for a short explanation of a control or truncated text. Keep essential information visible, give controls an accessible name, and use [Popover](/ui/primitives/surfaces/popover) when the content contains links, buttons, or other controls.

<StoryEmbed storyId="ui-surfaces-tooltip--display" title="Tooltip example" height={180} />

## Usage

```tsx theme={null}
import { Button } from 'twenty-ui/primitives/input';
import { Tooltip } from 'twenty-ui/primitives/surfaces';
import { Text } from 'twenty-ui/primitives/typography';

export const ExportHelp = () => (
  <Tooltip content="Download the visible records as a CSV file" side="top">
    <Text render={<span />}>
      <Button>Export records</Button>
    </Text>
  </Tooltip>
);
```

The convenience component accepts one trigger element as `children`. Native elements receive the trigger attributes, event handlers, and ref directly. Custom trigger components must forward all of them. A wrapper element also works with a component that does not forward every trigger prop.

Hover opens the tooltip after `delay` milliseconds, which defaults to `600`. Keyboard focus opens it immediately. `closeDelay` defaults to `0`; hovering over the popup keeps it open unless `disableHoverablePopup` is set. Escape dismisses it.

## Controlled state

Use `open` and `onOpenChange` together when the application owns visibility. Use `defaultOpen` only to set the initial visibility of an uncontrolled tooltip.

```tsx theme={null}
import { useState } from 'react';
import { Button } from 'twenty-ui/primitives/input';
import { Tooltip } from 'twenty-ui/primitives/surfaces';

export const ControlledExportHelp = () => {
  const [open, setOpen] = useState(false);

  return (
    <Tooltip
      content="Download the visible records as a CSV file"
      open={open}
      onOpenChange={setOpen}
      delay={300}
    >
      <span>
        <Button>Export records</Button>
      </span>
    </Tooltip>
  );
};
```

## Rich content and composition

Shorthand accepts `description` and `startIcon` beside `content`. Custom node content renders as supplied unless a description or icon requests the title layout.

```tsx theme={null}
import { IconInfoCircle } from 'twenty-ui/icon';
import { Button } from 'twenty-ui/primitives/input';
import { Tooltip } from 'twenty-ui/primitives/surfaces';

export const ExportDetails = () => (
  <Tooltip
    content="Export visible records"
    description="Only records matching your current filters are included."
    startIcon={<IconInfoCircle />}
    arrow
  >
    <Button>Export records</Button>
  </Tooltip>
);
```

Compound usage exposes every installed Base UI part and the optional `Tooltip.Body` layout. Assemble the portal, positioning, popup and optional arrow explicitly. Popup renders its children as supplied; Body provides the same title, description and decorative icon layout as shorthand.

```tsx theme={null}
import { Button } from 'twenty-ui/primitives/input';
import { Tooltip } from 'twenty-ui/primitives/surfaces';

export const ComposedExportDetails = () => (
  <Tooltip.Provider delay={300} closeDelay={100} timeout={400}>
    <Tooltip.Root>
      <Tooltip.Trigger render={<Button>Export records</Button>} />
      <Tooltip.Portal>
        <Tooltip.Positioner side="inline-end" sideOffset={10} arrowPadding={8}>
          <Tooltip.Popup>
            <Tooltip.Arrow />
            <Tooltip.Viewport>
              <Tooltip.Body description="Only records matching your current filters are included.">
                Export visible records
              </Tooltip.Body>
            </Tooltip.Viewport>
          </Tooltip.Popup>
        </Tooltip.Positioner>
      </Tooltip.Portal>
    </Tooltip.Root>
  </Tooltip.Provider>
);
```

| Part | Native, prop and ref target |
| - | - |
| `Root` | State and payload coordination. No DOM node, native props or DOM ref. `actionsRef` exposes `close` and `unmount`. |
| `Provider` | Shared `delay`, `closeDelay` and `timeout`. No DOM node or DOM ref. |
| `Trigger` | A button by default. Native props, handlers, `render` and ref target the trigger element. |
| `Portal` | The portal div. Defaults to the theme container, then document body. |
| `Positioner` | The positioning div. Owns anchor, physical/logical side, offsets, collision handling, sticky positioning and arrow padding. |
| `Popup` | The popup div. Owns content, native props, styles, `render` and ref. |
| `Body` | The optional body div inside Popup or Viewport. Native props, styles, `render` and ref target its root. |
| `Arrow` | The arrow div inside Popup. |
| `Viewport` | The optional div for transitions between trigger payloads. |

`Tooltip.Body` accepts optional title children, `description` and `startIcon` nodes. Titles use medium weight; descriptions use the secondary tooltip color, preserve line breaks and wrap long text. Omit title children for a description-only tooltip. The icon is decorative and appears only with a title. Body adds no tooltip role, popup styling, sizing or positioning. Arbitrary Popup content remains supported. Import `TooltipBodyProps` from `twenty-ui/primitives/surfaces` when typing a wrapper.

Every DOM part accepts native props, refs, and element or callback `render` composition. Shorthand's top-level native props, `render` and ref target Popup. Use `triggerProps`, `positionerProps` and `portalProps` to customize the other targets; these override shorthand defaults. Children supply the default trigger render element. Both forms preserve controlled/uncontrolled Root state and Base UI callback event details, including cancellation, reason, original event and active trigger.

`Tooltip.createHandle<TPayload>()` connects detached triggers to either form through `handle`. Compound Root's children or shorthand's `content` can be a function receiving the typed active payload. `Tooltip.Handle` and the public `TooltipHandle` type expose the installed handle contract. Handles support imperative `open(triggerId)` and `close()` while their Root is mounted.

## Migration

Replace `content={<Tooltip.Content description={description} startIcon={icon}>title</Tooltip.Content>}` with `content={title} description={description} startIcon={icon}`. In compound usage, use `Tooltip.Body` for the shared title and description layout or compose your own content. `Tooltip.Content` and `TooltipContentProps` are removed.

Existing compound Popup positioning props move to Positioner. Wrap it in Portal, move `container` and `keepMounted` to Portal, keep `maxWidth` on Popup, and replace `arrow` with an Arrow child. Preserve the former spacing explicitly with `sideOffset={10}` when needed. Compound Positioner keeps Base UI's `sideOffset={0}`. Both forms cap Popup at 300 pixels by default.

## Disabled controls

Native disabled buttons cannot receive keyboard focus. Wrap one in a focusable trigger so users can discover why the action is unavailable.

```tsx theme={null}
import { Button } from 'twenty-ui/primitives/input';
import { Tooltip } from 'twenty-ui/primitives/surfaces';

export const UnavailableExport = () => (
  <Tooltip content="Select at least one record to export">
    <span tabIndex={0} aria-label="Export records unavailable">
      <Button disabled>Export records</Button>
    </span>
  </Tooltip>
);
```

Setting `disabled` on shorthand or Root suppresses the tooltip itself. Trigger `disabled` suppresses that trigger’s tooltip interaction. Disable the native control through its own props or Trigger’s render element.

## Placement and overflowing text

Shorthand defaults to `side="top"`, `align="center"`, and `sideOffset={10}`. Both shorthand and compound tooltips have a maximum width of 300 pixels, capped by the available space beside the anchor. Pass `maxWidth` to shorthand or `Tooltip.Popup` to choose a different maximum, including wider previews. Native popup styles remain available for custom sizing. Placement adjusts to available space. An open tooltip hides while its anchor is scrolled out of view, including out of a scroll container. Use `arrow` for an arrow and `container` to override the theme's portal destination; see [theming](/ui/theming).

Use [OverflowingTextWithTooltip](/ui/primitives/typography/overflowing-text-with-tooltip) when a text label should show its full value only when truncated. Its existing `text`, `tooltipContent`, and `tooltipPlace` props remain available.

## Props

The reference is generated from the public component types. Native popup attributes and event handlers are also accepted.

<ParamField body="actionsRef" type="RefObject<TooltipRootActions | null>">
  A ref to imperative actions.

  * `unmount`: Ends the closing phase of the tooltip after an externally controlled closing animation finishes.
    Call `preventUnmountOnClose()` in `onOpenChange` first, otherwise the tooltip completes closing on its own.
    Whether it leaves the DOM is decided by `keepMounted` on the portal.
  * `close`: Closes the tooltip imperatively when called.
</ParamField>

<ParamField body="align" type="&#x22;center&#x22; | &#x22;end&#x22; | &#x22;start&#x22;" default="center">
  Alignment relative to the trigger. Defaults to center.
</ParamField>

<ParamField body="alignOffset" type="number | OffsetFunction" default="0">
  Offset along the alignment axis in pixels.
</ParamField>

<ParamField body="anchor" type="Element | VirtualElement | RefObject<Element | null> | (() => Element | VirtualElement | null) | null">
  An explicit positioning anchor for the popup.
</ParamField>

<ParamField body="arrow" type="boolean">
  Displays an arrow pointing to the trigger. Defaults to false.
</ParamField>

<ParamField body="arrowPadding" type="number" default="5">
  Minimum distance from the arrow to the popup edges.
</ParamField>

<ParamField body="children" type="ReactElement<unknown, string | JSXElementConstructor<any>>" required>
  A single trigger element. Custom components must forward their ref, native attributes, and event handlers.
</ParamField>

<ParamField body="className" type="string | ((state: TooltipPopupState) => string | undefined)">
  Additional CSS class for the popup.
</ParamField>

<ParamField body="closeDelay" type="number" default="0">
  Delay in milliseconds before closing after hover ends. Defaults to 0.
</ParamField>

<ParamField body="closeOnClick" type="boolean" default="true">
  Whether the tooltip should close when this trigger is clicked.
</ParamField>

<ParamField body="collisionAvoidance" type="CollisionAvoidance">
  Determines how to handle collisions when positioning the popup.

  `side` controls overflow on the preferred placement axis (`top`/`bottom` or `left`/`right`):

  * `'flip'`: keep the requested side when it fits; otherwise try the opposite side
    (`top` and `bottom`, or `left` and `right`).
  * `'shift'`: never change side; keep the requested side and move the popup within
    the clipping boundary so it stays visible.
  * `'none'`: do not correct side-axis overflow.

  `align` controls overflow on the alignment axis (`start`/`center`/`end`):

  * `'flip'`: keep side, but swap `start` and `end` when the requested alignment overflows.
  * `'shift'`: keep side and requested alignment, then nudge the popup along the
    alignment axis to fit.
  * `'none'`: do not correct alignment-axis overflow.

  `fallbackAxisSide` controls fallback behavior on the perpendicular axis when the
  preferred axis cannot fit:

  * `'start'`: allow perpendicular fallback and try the logical start side first
    (`top` before `bottom`, or `left` before `right` in LTR).
  * `'end'`: allow perpendicular fallback and try the logical end side first
    (`bottom` before `top`, or `right` before `left` in LTR).
  * `'none'`: do not fallback to the perpendicular axis.

  When `side` is `'shift'`, explicitly setting `align` only supports `'shift'` or `'none'`.
  If `align` is omitted, it defaults to `'flip'`.
</ParamField>

<ParamField body="collisionBoundary" type="Boundary" default="clipping-ancestors">
  An element or a rectangle that delimits the area that the popup is confined to.
</ParamField>

<ParamField body="collisionPadding" type="Padding" default="5">
  Additional space to maintain from the edge of the collision boundary.
</ParamField>

<ParamField body="container" type="HTMLElement | ShadowRoot | RefObject<HTMLElement | ShadowRoot | null> | null">
  Portal destination. Defaults to the current theme container.
</ParamField>

<ParamField body="content" type="ReactNode | PayloadChildRenderFunction<TPayload>" required>
  Supplementary content, or a function receiving the active trigger payload. Strings and numbers use the shorthand title layout.
</ParamField>

<ParamField body="defaultOpen" type="boolean" default="false">
  Initial visibility when the tooltip manages its own state.
</ParamField>

<ParamField body="defaultTriggerId" type="string | null">
  ID of the trigger that the tooltip is associated with.
  This is useful in conjunction with the `defaultOpen` prop to create an initially open tooltip.
</ParamField>

<ParamField body="delay" type="number" default="600">
  Delay in milliseconds before opening on hover. Defaults to 600.
</ParamField>

<ParamField body="description" type="ReactNode">
  Optional secondary text below the shorthand title.
</ParamField>

<ParamField body="disableAnchorTracking" type="boolean" default="false">
  Whether to disable the popup from tracking any layout shift of its positioning anchor.
</ParamField>

<ParamField body="disabled" type="boolean" default="false">
  Prevents the tooltip from opening.
</ParamField>

<ParamField body="disableHoverablePopup" type="boolean" default="false">
  Prevents hovering over the popup from keeping it open.
</ParamField>

<ParamField body="handle" type="TooltipHandle<TPayload>">
  Connects detached triggers and preserves their typed payloads.
</ParamField>

<ParamField body="keepMounted" type="boolean">
  Keeps the popup mounted while closed.
</ParamField>

<ParamField body="maxWidth" type="MaxWidth<string | number>">
  Maximum popup width. Defaults to 300 pixels and is capped by the space available beside the anchor.
</ParamField>

<ParamField body="onOpenChange" type="((open: boolean, eventDetails: TooltipRootChangeEventDetails) => void)">
  Receives the requested open state and unchanged Base UI event details, including reason, event, trigger and cancel().
</ParamField>

<ParamField body="onOpenChangeComplete" type="((open: boolean) => void)">
  Event handler called after any animations complete when the tooltip is opened or closed.
</ParamField>

<ParamField body="open" type="boolean">
  Controlled visibility of the tooltip.
</ParamField>

<ParamField body="portalProps" type="TooltipPortalProps">
  Full Portal props, including native props, ref and render. Overrides shorthand portal defaults.
</ParamField>

<ParamField body="positionerProps" type="TooltipPositionerProps">
  Full Positioner props, including native props, ref and render. Overrides shorthand placement defaults.
</ParamField>

<ParamField body="positionMethod" type="&#x22;absolute&#x22; | &#x22;fixed&#x22;" default="absolute">
  CSS positioning method for the popup.
</ParamField>

<ParamField body="ref" type="Ref<HTMLDivElement>">
  Ref forwarded to the popup element.
</ParamField>

<ParamField body="render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipPopupState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="side" type="&#x22;bottom&#x22; | &#x22;inline-end&#x22; | &#x22;inline-start&#x22; | &#x22;left&#x22; | &#x22;right&#x22; | &#x22;top&#x22;" default="top">
  Preferred side of the trigger. Defaults to top and may change to avoid collisions.
</ParamField>

<ParamField body="sideOffset" type="number | OffsetFunction" default="10">
  Distance from the trigger in pixels. Defaults to 10.
</ParamField>

<ParamField body="startIcon" type="ReactNode">
  Optional node before the shorthand title.
</ParamField>

<ParamField body="sticky" type="boolean" default="false">
  Whether to maintain the popup in the viewport after
  the anchor element was scrolled out of view.
</ParamField>

<ParamField body="style" type="CSSProperties | ((state: TooltipPopupState) => CSSProperties | undefined)">
  Inline styles for the popup.
</ParamField>

<ParamField body="trackCursorAxis" type="&#x22;both&#x22; | &#x22;none&#x22; | &#x22;x&#x22; | &#x22;y&#x22;" default="none">
  Determines which axis the tooltip should track the cursor on.
</ParamField>

<ParamField body="triggerId" type="string | null">
  ID of the trigger that the tooltip is associated with.
  This is useful in conjunction with the `open` prop to create a controlled tooltip.
  There's no need to specify this prop when the tooltip is uncontrolled (that is, when the `open` prop is not set).
</ParamField>

<ParamField body="triggerProps" type="TooltipTriggerProps<TPayload>">
  Full Trigger props, including native props, ref, render and payload. Overrides the shorthand trigger defaults.
</ParamField>

<ParamField body="withExitAnimation" type="boolean">
  Fades and slides the popup out when it closes instead of hiding it at once.
</ParamField>

### Tooltip.Root

<ParamField body="Root.actionsRef" type="RefObject<TooltipRootActions | null>">
  A ref to imperative actions.

  * `unmount`: Ends the closing phase of the tooltip after an externally controlled closing animation finishes.
    Call `preventUnmountOnClose()` in `onOpenChange` first, otherwise the tooltip completes closing on its own.
    Whether it leaves the DOM is decided by `keepMounted` on the portal.
  * `close`: Closes the tooltip imperatively when called.
</ParamField>

<ParamField body="Root.children" type="ReactNode | PayloadChildRenderFunction<Payload>">
  Parts or a render function receiving the active trigger payload. Root renders no DOM node.
</ParamField>

<ParamField body="Root.defaultOpen" type="boolean" default="false">
  Whether the tooltip is initially open.

  To render a controlled tooltip, use the `open` prop instead.
</ParamField>

<ParamField body="Root.defaultTriggerId" type="string | null">
  ID of the trigger that the tooltip is associated with.
  This is useful in conjunction with the `defaultOpen` prop to create an initially open tooltip.
</ParamField>

<ParamField body="Root.disabled" type="boolean" default="false">
  Whether the tooltip is disabled.
</ParamField>

<ParamField body="Root.disableHoverablePopup" type="boolean" default="false">
  Whether the tooltip contents can be hovered without closing the tooltip.
</ParamField>

<ParamField body="Root.handle" type="TooltipHandle<Payload>">
  Connects detached triggers and imperative open/close actions.
</ParamField>

<ParamField body="Root.onOpenChange" type="((open: boolean, eventDetails: TooltipRootChangeEventDetails) => void)">
  Receives the requested open state and unchanged Base UI event details, including reason, event, trigger and cancel().
</ParamField>

<ParamField body="Root.onOpenChangeComplete" type="((open: boolean) => void)">
  Event handler called after any animations complete when the tooltip is opened or closed.
</ParamField>

<ParamField body="Root.open" type="boolean">
  Whether the tooltip is currently open.
</ParamField>

<ParamField body="Root.trackCursorAxis" type="&#x22;both&#x22; | &#x22;none&#x22; | &#x22;x&#x22; | &#x22;y&#x22;" default="none">
  Determines which axis the tooltip should track the cursor on.
</ParamField>

<ParamField body="Root.triggerId" type="string | null">
  ID of the trigger that the tooltip is associated with.
  This is useful in conjunction with the `open` prop to create a controlled tooltip.
  There's no need to specify this prop when the tooltip is uncontrolled (that is, when the `open` prop is not set).
</ParamField>

### Tooltip.Trigger

<ParamField body="Trigger.className" type="string | ((state: TooltipTriggerState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Trigger.closeDelay" type="number" default="0">
  How long to wait before closing the tooltip. Specified in milliseconds.
</ParamField>

<ParamField body="Trigger.closeOnClick" type="boolean" default="true">
  Whether the tooltip should close when this trigger is clicked.
</ParamField>

<ParamField body="Trigger.delay" type="number" default="600">
  How long to wait before opening the tooltip on hover. Specified in milliseconds.
</ParamField>

<ParamField body="Trigger.disabled" type="boolean" default="false">
  Disables tooltip interaction for this trigger without disabling its native element.
</ParamField>

<ParamField body="Trigger.handle" type="TooltipHandle<Payload>">
  A handle to associate the trigger with a tooltip.
</ParamField>

<ParamField body="Trigger.payload" type="Payload">
  A payload to pass to the tooltip when it is opened.
</ParamField>

<ParamField body="Trigger.ref" type="((((instance: HTMLButtonElement | null) => void | (() => VoidOrUndefinedOnly)) | RefObject<HTMLButtonElement | null>) & (((instance: HTMLElement | null) => void | (() => VoidOrUndefinedOnly)) | RefObject<...>)) | null">
  Ref to the rendered trigger element, a button by default.
</ParamField>

<ParamField body="Trigger.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipTriggerState>">
  Composes a native element or a component that forwards attributes, handlers and ref.
</ParamField>

<ParamField body="Trigger.style" type="CSSProperties | ((state: TooltipTriggerState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

### Tooltip.Portal

<ParamField body="Portal.className" type="string | ((state: TooltipPortalState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Portal.container" type="HTMLElement | ShadowRoot | RefObject<HTMLElement | ShadowRoot | null> | null">
  Portal destination. Defaults to the current theme container, then the document body.
</ParamField>

<ParamField body="Portal.keepMounted" type="boolean" default="false">
  Whether to keep the portal mounted in the DOM while the popup is hidden.
</ParamField>

<ParamField body="Portal.ref" type="Ref<HTMLDivElement>">
  Ref to the portal div.
</ParamField>

<ParamField body="Portal.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipPortalState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="Portal.style" type="CSSProperties | ((state: TooltipPortalState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

### Tooltip.Positioner

<ParamField body="Positioner.align" type="&#x22;center&#x22; | &#x22;end&#x22; | &#x22;start&#x22;" default="center">
  How to align the popup relative to the specified side.
</ParamField>

<ParamField body="Positioner.alignOffset" type="number | OffsetFunction" default="0">
  Additional offset along the alignment axis in pixels.
  Also accepts a function that returns the offset to read the dimensions of the anchor
  and positioner elements, along with its side and alignment.

  The function takes a `data` object parameter with the following properties:

  * `data.anchor`: the dimensions of the anchor element with properties `width` and `height`.
  * `data.positioner`: the dimensions of the positioner element with properties `width` and `height`.
  * `data.side`: which side of the anchor element the positioner is aligned against.
  * `data.align`: how the positioner is aligned relative to the specified side.
</ParamField>

<ParamField body="Positioner.anchor" type="Element | VirtualElement | RefObject<Element | null> | (() => Element | VirtualElement | null) | null">
  An element to position the popup against.
  By default, the popup will be positioned against the trigger.
</ParamField>

<ParamField body="Positioner.arrowPadding" type="number" default="5">
  Minimum distance to maintain between the arrow and the edges of the popup.

  Use it to prevent the arrow element from hanging out of the rounded corners of a popup.
</ParamField>

<ParamField body="Positioner.className" type="string | ((state: TooltipPositionerState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Positioner.collisionAvoidance" type="CollisionAvoidance">
  Determines how to handle collisions when positioning the popup.

  `side` controls overflow on the preferred placement axis (`top`/`bottom` or `left`/`right`):

  * `'flip'`: keep the requested side when it fits; otherwise try the opposite side
    (`top` and `bottom`, or `left` and `right`).
  * `'shift'`: never change side; keep the requested side and move the popup within
    the clipping boundary so it stays visible.
  * `'none'`: do not correct side-axis overflow.

  `align` controls overflow on the alignment axis (`start`/`center`/`end`):

  * `'flip'`: keep side, but swap `start` and `end` when the requested alignment overflows.
  * `'shift'`: keep side and requested alignment, then nudge the popup along the
    alignment axis to fit.
  * `'none'`: do not correct alignment-axis overflow.

  `fallbackAxisSide` controls fallback behavior on the perpendicular axis when the
  preferred axis cannot fit:

  * `'start'`: allow perpendicular fallback and try the logical start side first
    (`top` before `bottom`, or `left` before `right` in LTR).
  * `'end'`: allow perpendicular fallback and try the logical end side first
    (`bottom` before `top`, or `right` before `left` in LTR).
  * `'none'`: do not fallback to the perpendicular axis.

  When `side` is `'shift'`, explicitly setting `align` only supports `'shift'` or `'none'`.
  If `align` is omitted, it defaults to `'flip'`.
</ParamField>

<ParamField body="Positioner.collisionBoundary" type="Boundary" default="clipping-ancestors">
  An element or a rectangle that delimits the area that the popup is confined to.
</ParamField>

<ParamField body="Positioner.collisionPadding" type="Padding" default="5">
  Additional space to maintain from the edge of the collision boundary.
</ParamField>

<ParamField body="Positioner.disableAnchorTracking" type="boolean" default="false">
  Whether to disable the popup from tracking any layout shift of its positioning anchor.
</ParamField>

<ParamField body="Positioner.positionMethod" type="&#x22;absolute&#x22; | &#x22;fixed&#x22;" default="absolute">
  Determines which CSS `position` property to use.
</ParamField>

<ParamField body="Positioner.ref" type="Ref<HTMLDivElement>">
  Ref to the positioning div. Native props, styles and render target this element.
</ParamField>

<ParamField body="Positioner.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipPositionerState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="Positioner.side" type="&#x22;bottom&#x22; | &#x22;inline-end&#x22; | &#x22;inline-start&#x22; | &#x22;left&#x22; | &#x22;right&#x22; | &#x22;top&#x22;" default="top">
  Preferred physical or logical side of the anchor. Defaults to top.
</ParamField>

<ParamField body="Positioner.sideOffset" type="number | OffsetFunction" default="0">
  Distance from the anchor. Defaults to 0 in compound usage. Accepts a number or positioning function.
</ParamField>

<ParamField body="Positioner.sticky" type="boolean" default="false">
  Whether to maintain the popup in the viewport after
  the anchor element was scrolled out of view.
</ParamField>

<ParamField body="Positioner.style" type="CSSProperties | ((state: TooltipPositionerState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

### Tooltip.Popup

<ParamField body="Popup.children" type="ReactNode">
  Content rendered as supplied. Does not create a portal, positioner, title layout or arrow.
</ParamField>

<ParamField body="Popup.className" type="string | ((state: TooltipPopupState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Popup.maxWidth" type="MaxWidth<string | number>">
  Maximum popup width. Defaults to 300 pixels and is capped by the space available beside the anchor.
</ParamField>

<ParamField body="Popup.ref" type="Ref<HTMLDivElement>">
  Ref to the popup div. Native props, styles and render target this element.
</ParamField>

<ParamField body="Popup.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipPopupState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="Popup.style" type="CSSProperties | ((state: TooltipPopupState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

<ParamField body="Popup.withExitAnimation" type="boolean" default="false">
  Enables the optional Twenty exit transition.
</ParamField>

### Tooltip.Body

<ParamField body="Body.children" type="ReactNode">
  Optional title content, displayed with medium weight. Omit it for a description-only tooltip.
</ParamField>

<ParamField body="Body.description" type="ReactNode">
  Optional secondary content. Preserves line breaks and wraps long text.
</ParamField>

<ParamField body="Body.ref" type="Ref<HTMLDivElement>">
  Ref to the body div. Native props, styles and render target this element.
</ParamField>

<ParamField body="Body.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, {}>">
  Composes the body root through an element or render callback while preserving its layout and content.
</ParamField>

<ParamField body="Body.startIcon" type="ReactNode">
  Optional decorative node before the title. Omitted when the title is empty.
</ParamField>

### Tooltip.Arrow

<ParamField body="Arrow.className" type="string | ((state: TooltipArrowState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Arrow.ref" type="Ref<HTMLDivElement>">
  Ref to the arrow div. Compose inside Popup.
</ParamField>

<ParamField body="Arrow.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipArrowState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="Arrow.style" type="CSSProperties | ((state: TooltipArrowState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

### Tooltip.Viewport

<ParamField body="Viewport.children" type="ReactNode">
  The content to render inside the transition container.
</ParamField>

<ParamField body="Viewport.className" type="string | ((state: TooltipViewportState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Viewport.ref" type="Ref<HTMLDivElement>">
  Ref to the content-transition div. Useful when several triggers share changing content.
</ParamField>

<ParamField body="Viewport.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, TooltipViewportState>">
  Allows you to replace the component's HTML element
  with a different tag, or compose it with another component.

  Accepts a `ReactElement` or a function that returns the element to render.
</ParamField>

<ParamField body="Viewport.style" type="CSSProperties | ((state: TooltipViewportState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>

### Tooltip.Provider

<ParamField body="Provider.children" type="ReactNode">
  Tooltips sharing delay, closeDelay and timeout configuration. Provider renders no DOM node.
</ParamField>

<ParamField body="Provider.closeDelay" type="number">
  How long to wait before closing a tooltip. Specified in milliseconds.
</ParamField>

<ParamField body="Provider.delay" type="number">
  How long to wait before opening the tooltip on hover. Specified in milliseconds.
</ParamField>

<ParamField body="Provider.timeout" type="number" default="400">
  Another tooltip will open instantly if the previous tooltip
  is closed within this timeout. Specified in milliseconds.
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.