TooltipHandler automatically creates tooltips for any HTML element with data-tooltip attributes. Perfect for server-rendered content, markdown output, or third-party
widgets.
Resize your browser window or zoom to test different viewport conditions!
This demo now uses the enhanced ElementManager with multiple selector groups:
Tooltips work on any HTML element, not just buttons:
TooltipHandler uses MutationObserver to detect dynamically added elements. Add multiple elements to test:
Click "Add Element" to dynamically create tooltip-enabled buttons
TooltipHandler supports constraining tooltips within specific container boundaries:
Test how the smart positioning handles extreme cases:
| Attribute | Description | Example |
|---|---|---|
data-tooltip | Enable tooltip (uses title) or specify snippet name | data-tooltip or data-tooltip="snippetName" |
data-tooltip-text | Set tooltip text directly | data-tooltip-text="Custom text" |
data-tooltip-side | Side: top, right, bottom, left | data-tooltip-side="right" |
data-tooltip-wait | Wait time in milliseconds | data-tooltip-wait="200" |
data-contained | Use container-constrained positioning | data-contained="true" |
<script>
import { ElementManager, TooltipHandler } from 'svelte-ui';
let elementGroups = $state();
</script>
<!-- Single ElementManager with multiple selector groups -->
<ElementManager
selectors={{
viewport: "[data-tooltip]:not([data-contained])",
container: "[data-tooltip][data-contained]"
}}
bind:elements={elementGroups}
>
{#if elementGroups?.viewport}
<TooltipHandler elements={elementGroups.viewport} />
{/if}
{#if elementGroups?.container}
<TooltipHandler
elements={elementGroups.container}
container=".modal-content"
/>
{/if}
<slot />
</ElementManager> <script>
import { ElementManager, TooltipHandler } from 'svelte-ui';
let tooltipElements = $state(new Map());
</script>
<ElementManager
selector="[data-tooltip], [data-tooltip-text]"
bind:elements={tooltipElements}
>
<TooltipHandler elements={tooltipElements}>
<slot />
</TooltipHandler>
</ElementManager> <ElementManager
selectors={{
tooltips: "[data-tooltip], [data-tooltip-text]"
}}
bind:elements={elementGroups}
>
<TooltipHandler
elements={elementGroups.tooltips}
warning={warningSnippet}
info={infoSnippet}
>
{#snippet warningSnippet()}
<div class="text-center">
<div class="font-semibold text-yellow-300">⚠️ Warning</div>
<div class="text-xs mt-1">Action cannot be undone!</div>
</div>
{/snippet}
{#snippet infoSnippet()}
<div class="flex items-center gap-2">
<span>More info</span>
<kbd class="px-1 py-0.5 bg-white/20 rounded text-xs">?</kbd>
</div>
{/snippet}
<slot />
</TooltipHandler>
</ElementManager>
<!-- Then use in HTML -->
<button data-tooltip="warning">Delete</button>
<button data-tooltip-text="Simple text">Save</button> Once added to your layout, any element with data-tooltip attributes
will automatically get tooltips!