Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
<script lang="ts">
import { Portal, Tooltip } from '@skeletonlabs/skeleton-svelte';
</script>
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt enim.
import { Portal, Tooltip } from '@skeletonlabs/skeleton-react';
export default function Default() {
return (
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
);
}
Arrow
You may optionally enable arrows via the Arrow and ArrowTip component parts. Note that Zag.js opts to style these with CSS custom properties, which can be adjusted using a style attribute.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
<script lang="ts">
import { Portal, Tooltip } from '@skeletonlabs/skeleton-svelte';
</script>
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
<Tooltip.Arrow style="--arrow-size: calc(var(--spacing) * 2); --arrow-background: var(--color-surface-100-900);">
<Tooltip.ArrowTip />
</Tooltip.Arrow>
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt enim.
import { Portal, Tooltip } from '@skeletonlabs/skeleton-react';
export default function Arrow() {
return (
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
<Tooltip.Arrow
style={{
['--arrow-size' as string]: 'calc(var(--spacing) * 2)',
['--arrow-background' as string]: 'var(--color-surface-100-900)',
}}
>
<Tooltip.ArrowTip />
</Tooltip.Arrow>
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
);
}
Z-Index
This example will be below the sibling.
This example will be above the sibling.
Sibling (10)
<script lang="ts">
import { Portal, Tooltip } from '@skeletonlabs/skeleton-svelte';
</script>
<div class="grid grid-cols-2 gap-4">
<Tooltip>
<Tooltip.Trigger>Default (auto)</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">This example will be below the sibling.</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
<Tooltip>
<Tooltip.Trigger>Above (20)</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner class="z-20!">
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">This example will be above the sibling.</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
<div class="col-span-2 h-[100px] relative">
<div class="rounded bg-primary-200-800/75 w-full h-full z-10 flex justify-center items-center absolute">Sibling (10)</div>
</div>
</div>
This example will be below the sibling.
This example will be above the sibling.
Sibling (10)
import { Portal, Tooltip } from '@skeletonlabs/skeleton-react';
export default function ZIndex() {
return (
<div className="grid grid-cols-2 gap-4">
<Tooltip>
<Tooltip.Trigger>Default (auto)</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
This example will be below the sibling.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
<Tooltip>
<Tooltip.Trigger>Above (20)</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner className="z-20!">
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
This example will be above the sibling.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
<div className="col-span-2 h-[100px] relative">
<div className="rounded bg-primary-200-800/75 w-full h-full z-10 flex justify-center items-center absolute">Sibling (10)</div>
</div>
</div>
);
}
Programmatic Control
This is made possible via the Provider Pattern.
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
<script lang="ts">
import { Portal, Tooltip, useTooltip } from '@skeletonlabs/skeleton-svelte';
const id = $props.id();
const tooltip = useTooltip({ id });
</script>
<div class="grid gap-4">
<button class="btn preset-filled w-[150px]" onclick={() => tooltip().setOpen(!tooltip().open)}>Trigger</button>
<Tooltip.Provider value={tooltip}>
<Tooltip.Trigger>Anchor ({tooltip().open ? 'open' : 'closed'})</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip.Provider>
</div>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt enim.
import { Portal, Tooltip, useTooltip } from '@skeletonlabs/skeleton-react';
export default function Programmatic() {
const tooltip = useTooltip();
return (
<div className="flex flex-col gap-4">
<button className="btn preset-filled w-[150px]" onClick={() => tooltip.setOpen(!tooltip.open)}>
Trigger
</button>
<Tooltip.Provider value={tooltip}>
<Tooltip.Trigger>Anchor ({tooltip.open ? 'open' : 'closed'})</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip.Provider>
</div>
);
}
Direction
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
<script lang="ts">
import { Portal, Tooltip } from '@skeletonlabs/skeleton-svelte';
</script>
<Tooltip dir="rtl">
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt
enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa nesciunt enim.
import { Portal, Tooltip } from '@skeletonlabs/skeleton-react';
export default function Dir() {
return (
<Tooltip dir="rtl">
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl">
Lorem ipsum dolor, sit amet consectetur adipisicing elit. Sapiente magni distinctio explicabo quisquam. Rerum impedit culpa
nesciunt enim.
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
);
}
Headless
Three spooky skeletons!
<script lang="ts">
import { Portal, Tooltip } from '@skeletonlabs/skeleton-svelte';
</script>
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content class="card max-w-md p-2 bg-surface-100-900 shadow-xl space-y-2">
<img
class="size-72"
src="https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNWVmbzcxanp6YmtxZ28xcXBqaXBscThsdDZ5Nm9ncWxkeWtqaHJ2bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9dg/dn1PN6NtunfnUjUGFC/giphy.gif"
alt="Skeleton Gif"
/>
<p>Three spooky skeletons!</p>
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>

Three spooky skeletons!
import { Portal, Tooltip } from '@skeletonlabs/skeleton-react';
export default function Headless() {
return (
<Tooltip>
<Tooltip.Trigger>Hover Me</Tooltip.Trigger>
<Portal>
<Tooltip.Positioner>
<Tooltip.Content className="card max-w-md p-2 bg-surface-100-900 shadow-xl space-y-2">
<img
className="size-72"
src="https://media3.giphy.com/media/v1.Y2lkPTc5MGI3NjExNWVmbzcxanp6YmtxZ28xcXBqaXBscThsdDZ5Nm9ncWxkeWtqaHJ2bSZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9dg/dn1PN6NtunfnUjUGFC/giphy.gif"
alt="Skeleton Gif"
/>
<p>Three spooky skeletons!</p>
</Tooltip.Content>
</Tooltip.Positioner>
</Portal>
</Tooltip>
);
}
API Reference
Root
| Property | Default | Type |
|---|---|---|
children | - | ReactNode |
dir | "ltr" | "ltr" | "rtl" | undefinedThe document's text/writing direction. |
aria-label | - | string | undefinedCustom label for the tooltip. |
ids | - | Partial<{ trigger: string; content: string; arrow: string; positioner: string; }> | undefined The ids of the elements in the tooltip. Useful for composition. |
openDelay | 400 | number | undefinedThe open delay of the tooltip. |
closeDelay | 150 | number | undefinedThe close delay of the tooltip. |
closeOnPointerDown | true | boolean | undefinedWhether to close the tooltip on pointerdown. |
closeOnEscape | true | boolean | undefinedWhether to close the tooltip when the Escape key is pressed. |
closeOnScroll | true | boolean | undefinedWhether the tooltip should close on scroll |
closeOnClick | true | boolean | undefinedWhether the tooltip should close on click |
interactive | false | boolean | undefinedWhether the tooltip's content is interactive. In this mode, the tooltip will remain open when user hovers over the content. |
onOpenChange | - | ((details: OpenChangeDetails) => void) | undefinedFunction called when the tooltip is opened. |
positioning | - | PositioningOptions | undefinedThe user provided options used to position the popover content |
disabled | - | boolean | undefinedWhether the tooltip is disabled |
open | - | boolean | undefinedThe controlled open state of the tooltip |
defaultOpen | - | boolean | undefinedThe initial open state of the tooltip when rendered. Use when you don't need to control the open state of the tooltip. |
getRootNode | - | (() => Node | ShadowRoot | Document) | undefinedA root node to correctly resolve document in custom environments. E.x.: Iframes, Electron. |
RootProvider
| Property | Default | Type |
|---|---|---|
value | - | TooltipApi<PropTypes> |
children | - | ReactNode |
RootContext
| Property | Default | Type |
|---|---|---|
children | - | (tooltip: TooltipApi<PropTypes>) => ReactNode |
Trigger
| Property | Default | Type |
|---|---|---|
element | - | ((attributes: HTMLAttributes<"button">) => Element) | undefinedRender the element yourself |
Positioner
| Property | Default | Type |
|---|---|---|
element | - | ((attributes: HTMLAttributes<"div">) => Element) | undefinedRender the element yourself |
Content
| Property | Default | Type |
|---|---|---|
element | - | ((attributes: HTMLAttributes<"div">) => Element) | undefinedRender the element yourself |
Arrow
| Property | Default | Type |
|---|---|---|
element | - | ((attributes: HTMLAttributes<"div">) => Element) | undefinedRender the element yourself |
ArrowTip
| Property | Default | Type |
|---|---|---|
element | - | ((attributes: HTMLAttributes<"div">) => Element) | undefinedRender the element yourself |