Tooltip
A popup that displays information related to an element when the element receives keyboard focus or the mouse hovers over it.
Let us cook!
Props
Features
- 🎈 Fully customize Floating UI’s options
- 🎨 Animation support
Usage
<script lang="ts"> import { Tooltip } from "melt/builders";
const tooltip = new Tooltip();</script>
<button {...tooltip.trigger}> Hover me</button><div {...tooltip.content}> <div {...tooltip.arrow}></div> <p>Content</p></div>
<script lang="ts"> import { Tooltip } from "melt/components";</script>
<Tooltip> {#snippet children(tooltip)} <button {...tooltip.trigger}> Hover me </button> <div {...tooltip.content}> <div {...tooltip.arrow}></div> <p>Content</p> </div> {/snippet}</Tooltip>
Customizing floating elements
Floating elements use Floating UI under the hood. To this end, we expose a floatingConfig
option, which can be used to control the underlying computePosition function, its middlewares, and the resulting styling that is applied.
API Reference
Constructor Props
The props that are passed when calling
new Tooltip()
new Tooltip()
export type TooltipProps = { /** * If the Tooltip is open. * * When passing a getter, it will be used as source of truth, * meaning that the value only changes when the getter returns a new value. * * Otherwise, if passing a static value, it'll serve as the default value. * * @default false */ open?: MaybeGetter<boolean | undefined>;
/** * Called when the value is supposed to change. */ onOpenChange?: (value: boolean) => void;
/** * If `true`, tooltip will close if trigger is pressed. * * @default true */ closeOnPointerDown?: MaybeGetter<boolean | undefined>;
/** * Tooltip open delay in milliseconds. * * @default 1000 */ openDelay?: MaybeGetter<number | undefined>;
/** * Tooltip close delay in milliseconds. * * @default 0 */ closeDelay?: MaybeGetter<number | undefined>;
/** * Config to be passed to `useFloating` */ floatingConfig?: UseFloatingArgs["config"];
/** * If the popover visibility should be controlled by the user. * * @default false */ forceVisible?: MaybeGetter<boolean | undefined>;
/** * If `true`, leaving trigger will close the tooltip. * * @default false */ disableHoverableContent?: MaybeGetter<boolean | undefined>;};
export type TooltipProps = { /** * If the Tooltip is open. * * When passing a getter, it will be used as source of truth, * meaning that the value only changes when the getter returns a new value. * * Otherwise, if passing a static value, it'll serve as the default value. * * @default false */ open?: MaybeGetter<boolean | undefined>;
/** * Called when the value is supposed to change. */ onOpenChange?: (value: boolean) => void;
/** * If `true`, tooltip will close if trigger is pressed. * * @default true */ closeOnPointerDown?: MaybeGetter<boolean | undefined>;
/** * Tooltip open delay in milliseconds. * * @default 1000 */ openDelay?: MaybeGetter<number | undefined>;
/** * Tooltip close delay in milliseconds. * * @default 0 */ closeDelay?: MaybeGetter<number | undefined>;
/** * Config to be passed to `useFloating` */ floatingConfig?: UseFloatingArgs["config"];
/** * If the popover visibility should be controlled by the user. * * @default false */ forceVisible?: MaybeGetter<boolean | undefined>;
/** * If `true`, leaving trigger will close the tooltip. * * @default false */ disableHoverableContent?: MaybeGetter<boolean | undefined>;};
Properties
The properties returned from
new Tooltip()
new Tooltip()
-
invokerRect
{ x: number; y: number; width: number; height: number } | undefined{ x: number; y: number; width: number; height: number } | undefined -
closeOnPointerDown
booleanboolean -
openDelay
numbernumber -
closeDelay
numbernumber -
disableHoverableContent
booleanboolean -
forceVisible
booleanboolean -
floatingConfig
UseFloatingConfigUseFloatingConfig -
isVisible
booleanbooleanState -
graceAreaPolygon
{ x: number; y: number }[]{ x: number; y: number }[] -
open
booleanboolean -
trigger
{readonly onfocusout: () => Promise<void>readonly style: `--melt-invoker-width: ${string}; --melt-invoker-height: ${string}; --melt-invoker-x: ${string}; --melt-invoker-y: ${string}`readonly "data-melt-tooltip-trigger": ""readonly id: stringreadonly "aria-describedby": stringreadonly "data-open": "" | undefinedreadonly onpointerdown: () => voidreadonly onpointerenter: (e: PointerEvent & { currentTarget: EventTarget & HTMLElement },) => voidreadonly onpointermove: () => voidreadonly onpointerleave: (e: PointerEvent & { currentTarget: EventTarget & HTMLElement },) => voidreadonly onfocus: () => voidreadonly onblur: () => void}{readonly onfocusout: () => Promise<void>readonly style: `--melt-invoker-width: ${string}; --melt-invoker-height: ${string}; --melt-invoker-x: ${string}; --melt-invoker-y: ${string}`readonly "data-melt-tooltip-trigger": ""readonly id: stringreadonly "aria-describedby": stringreadonly "data-open": "" | undefinedreadonly onpointerdown: () => voidreadonly onpointerenter: (e: PointerEvent & { currentTarget: EventTarget & HTMLElement },) => voidreadonly onpointermove: () => voidreadonly onpointerleave: (e: PointerEvent & { currentTarget: EventTarget & HTMLElement },) => voidreadonly onfocus: () => voidreadonly onblur: () => void} -
content
{readonly style: stringreadonly onfocusout: () => Promise<void>readonly "data-melt-tooltip-content": ""readonly id: stringreadonly popover: "manual"readonly role: "tooltip"readonly tabindex: -1readonly inert: booleanreadonly "data-open": "" | undefinedreadonly onpointerenter: () => voidreadonly onpointerleave: () => voidreadonly onpointerdown: () => void}{readonly style: stringreadonly onfocusout: () => Promise<void>readonly "data-melt-tooltip-content": ""readonly id: stringreadonly popover: "manual"readonly role: "tooltip"readonly tabindex: -1readonly inert: booleanreadonly "data-open": "" | undefinedreadonly onpointerenter: () => voidreadonly onpointerleave: () => voidreadonly onpointerdown: () => void} -
arrow
{readonly "data-melt-tooltip-arrow": ""readonly id: stringreadonly "data-arrow": ""readonly "aria-hidden": truereadonly "data-open": "" | undefined}{readonly "data-melt-tooltip-arrow": ""readonly id: stringreadonly "data-arrow": ""readonly "aria-hidden": truereadonly "data-open": "" | undefined}