# Tooltip
A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
## Import
```
Copyts
import { Tooltip } from "@kobalte/core/tooltip";
// or
import { Root, Trigger, ... } from "@kobalte/core/tooltip";
// or (deprecated)
import { Tooltip } from "@kobalte/core";
```
```
Copyts
import { Tooltip } from "@kobalte/core/tooltip";
// or
import { Root, Trigger, ... } from "@kobalte/core/tooltip";
// or (deprecated)
import { Tooltip } from "@kobalte/core";
```
## Features
- Exposed as a tooltip to assistive technology via ARIA.
- Opens when the trigger is focused or hovered.
- Closes when the trigger is activated or when pressing escape.
- Only one tooltip shows at a time.
- Labeling support for screen readers via `aria-describedby`.
- Custom show and hide delay support.
- Matches native tooltip behavior with delay on hover of first tooltip and no delay on subsequent tooltips.
## Anatomy
The tooltip consists of:
- **Tooltip:** The root container for a tooltip.
- **Tooltip.Trigger:** The button that toggles the tooltip.
- **Tooltip.Portal:** Portals its children into the `body` when the tooltip is open.
- **Tooltip.Content:** Contains the content to be rendered when the tooltip is open.
- **Tooltip.Arrow:** An optional arrow element to render alongside the tooltip.
```
Copytsx
```
```
Copytsx
```
## Example
Trigger
index.tsxstyle.css
```
Copytsx
import { Tooltip } from "@kobalte/core/tooltip";
import "./style.css";
function App() {
return (
Trigger
Tooltip content
);
}
```
```
Copytsx
import { Tooltip } from "@kobalte/core/tooltip";
import "./style.css";
function App() {
return (
Trigger
Tooltip content
);
}
```
## Usage
### Default open
An initial, uncontrolled open value can be provided using the `defaultOpen` prop.
```
Copytsx
...
```
```
Copytsx
...
```
### Controlled open
The `open` prop can be used to make the open state controlled. The `onOpenChange` event is fired when the user presses the trigger, close button or interact outside, and receives the new value.
Tooltip is not showing.
Trigger
```
Copytsx
import { createSignal } from "solid-js";
function ControlledExample() {
const [open, setOpen] = createSignal(false);
return (
<>
Tooltip is {open() ? "showing" : "not showing"}.
Trigger
Tooltip content
>
);
}
```
```
Copytsx
import { createSignal } from "solid-js";
function ControlledExample() {
const [open, setOpen] = createSignal(false);
return (
<>
Tooltip is {open() ? "showing" : "not showing"}.
Trigger
Tooltip content
>
);
}
```
### Origin-aware animations
We expose a CSS custom property `--kb-tooltip-content-transform-origin` which can be used to animate the content from its computed origin.
```
Copycss
/* style.css */
.tooltip__content {
transform-origin: var(--kb-tooltip-content-transform-origin);
animation: contentHide 250ms ease-in forwards;
}
.tooltip__content[data-expanded] {
animation: contentShow 250ms ease-out;
}
@keyframes contentShow {
from {
opacity: 0;
transform: scale(0.96);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes contentHide {
from {
opacity: 1;
transform: scale(1);
}
to {
opacity: 0;
transform: scale(0.96);
}
}
```
```
Copycss
/* style.css */
.tooltip__content {
transform-origin: var(--kb-tooltip-content-transform-origin);
animation: contentHide 250ms ease-in forwards;
}
.tooltip__content[data-expanded] {
animation: contentShow 250ms ease-out;
}
@keyframes contentShow {
from {
opacity: 0;
transform: scale(0.96);
}
to {
opacity: 1;
transform: scale(1);
}
}
@keyframes contentHide {
from {
opacity: 1;
transform: scale(1);
}
to {
opacity: 0;
transform: scale(0.96);
}
}
```
## API Reference
### Tooltip
`Tooltip` is equivalent to the `Root` import from `@kobalte/core/tooltip` (and deprecated `Tooltip.Root`).
| Prop | Description |
| --- | --- |
| open | `boolean`
The controlled open state of the tooltip. |
| defaultOpen | `boolean`
The default open state when initially rendered. Useful when you do not need to control the open state. |
| onOpenChange | `(open: boolean) => void`
Event handler called when the open state of the tooltip changes. |
| triggerOnFocusOnly | `boolean`
Whether to open the tooltip only when the trigger is focused. By default, opens for both focus and hover. |
| openDelay | `number`
The duration from when the mouse enters the trigger until the tooltip opens. |
| skipDelayDuration | `number`
The duration from when the mouse leaves the trigger or content and moves to another tooltip trigger or content without incurring another openDelay |
| closeDelay | `number`
The duration from when the mouse leaves the trigger or content until the tooltip closes. |
| ignoreSafeArea | `boolean`
Whether to close the tooltip even if the user cursor is inside the safe area between the trigger and tooltip. |
| id | `string`
A unique identifier for the component. The id is used to generate id attributes for nested components. If no id prop is provided, a generated id will be used. |
| forceMount | `boolean`
Used to force mounting the tooltip (portal and content) when more control is needed. Useful when controlling animation with SolidJS animation libraries. |
`Tooltip` also accepts the following props to customize the placement of the `Tooltip.Content`.
| Prop | Description |
| --- | --- |
| getAnchorRect | `(anchor?: HTMLElement) => AnchorRect | undefined`
Function that returns the anchor element's DOMRect. |
| placement | `Placement`
The placement of the tooltip. |
| gutter | `number`
The distance between the tooltip and the trigger/anchor element. By default, it's 0 plus half of the arrow offset, if it exists. |
| shift | `number`
The skidding of the tooltip along the anchor element. |
| flip | `boolean | string`
Controls the behavior of the tooltip when it overflows the viewport:
\- If a `boolean`, specifies whether the tooltip should flip to the opposite side when it overflows.
\- If a `string`, indicates the preferred fallback placements when it overflows.
The placements must be spaced-delimited, e.g. "top left". |
| slide | `boolean`
Whether the tooltip should slide when it overflows. |
| overlap | `boolean`
Whether the tooltip can overlap the anchor element when it overflows. |
| sameWidth | `boolean`
Whether the tooltip should have the same width as the anchor element. This will be exposed to CSS as `--kb-popper-anchor-width`. |
| fitViewport | `boolean`
Whether the tooltip should fit the viewport. If this is set to true, the tooltip content will have `maxWidth` and `maxHeight` set to the viewport size. This will be exposed to CSS as `--kb-popper-available-width` and `--kb-popper-available-height`. |
| hideWhenDetached | `boolean`
Whether to hide the tooltip when the anchor element becomes occluded. |
| detachedPadding | `number`
The minimum padding in order to consider the anchor element occluded. |
| arrowPadding | `number`
The minimum padding between the arrow and the tooltip corner. |
| overflowPadding | `number`
The minimum padding between the tooltip and the viewport edge. This will be exposed to CSS as `--kb-popper-overflow-padding`. |
### Tooltip.Trigger
| Data attribute | Description |
| --- | --- |
| data-expanded | Present when the tooltip is open. |
| data-closed | Present when the tooltip is close. |
`Tooltip.Content` and `Tooltip.Arrow` share the same data-attributes.
### Tooltip.Content
The popper positioner will copy the same `z-index` as the `Tooltip.Content`.
| Prop | Description |
| --- | --- |
| onEscapeKeyDown | `(event: KeyboardEvent) => void`
Event handler called when the escape key is down. It can be prevented by calling `event.preventDefault`. |
| onPointerDownOutside | `(event: PointerDownOutsideEvent) => void`
Event handler called when a pointer event occurs outside the bounds of the component. It can be prevented by calling `event.preventDefault`. |
### Tooltip.Arrow
| Prop | Description |
| --- | --- |
| size | `number`
The size of the arrow. |
## Rendered elements
| Component | Default rendered element |
| --- | --- |
| `Tooltip` | none |
| `Tooltip.Trigger` | `button` |
| `Tooltip.Portal` | `Portal` |
| `Tooltip.Content` | `div` |
| `Tooltip.Arrow` | `div` |
## Accessibility
### Keyboard Interactions
| Key | Description |
| --- | --- |
| `Tab` | Opens/closes the tooltip without delay. |
| `Space` | When open, closes the tooltip without delay. |
| `Enter` | When open, closes the tooltip without delay. |
| `Esc` | When open, closes the tooltip without delay. |
Previous[←Toggle Group](https://kobalte.dev/docs/core/components/toggle-group)Next[I18nProvider→](https://kobalte.dev/docs/core/components/i18n-provider)