flotilla/src/lib/components/Tooltip.svelte

66 lines
1.5 KiB
Svelte
Raw Normal View History

2025-11-06 00:59:17 +00:00
<style>
:global(.tippy-box[data-theme~="tooltip"]) {
background-color: var(--content);
color: var(--surface);
border-radius: var(--radius-xl);
2025-11-06 00:59:17 +00:00
padding: 0.25rem 0.5rem;
font-size: 0.875rem;
box-shadow: var(--shadow);
2025-11-06 00:59:17 +00:00
}
:global(.tippy-box[data-theme~="tooltip"][data-placement^="top"] > .tippy-arrow::before) {
border-top-color: var(--content);
2025-11-06 00:59:17 +00:00
}
:global(.tippy-box[data-theme~="tooltip"][data-placement^="bottom"] > .tippy-arrow::before) {
border-bottom-color: var(--content);
2025-11-06 00:59:17 +00:00
}
:global(.tippy-box[data-theme~="tooltip"][data-placement^="left"] > .tippy-arrow::before) {
border-left-color: var(--content);
2025-11-06 00:59:17 +00:00
}
:global(.tippy-box[data-theme~="tooltip"][data-placement^="right"] > .tippy-arrow::before) {
border-right-color: var(--content);
2025-11-06 00:59:17 +00:00
}
</style>
<script lang="ts">
import "tippy.js/animations/shift-away.css"
import tippy from "tippy.js"
import {onMount} from "svelte"
import {isMobile} from "@lib/html"
let {
content,
arrow = true,
interactive = false,
children = undefined,
instance = $bindable(),
...restProps
} = $props()
let element: Element
onMount(() => {
instance = tippy(element, {
content,
arrow,
interactive,
animation: "shift-away",
theme: "tooltip",
appendTo: document.querySelector(".tippy-target")!,
trigger: isMobile ? "click" : "mouseenter focus",
})
return () => {
instance?.destroy()
}
})
</script>
<div bind:this={element} class={restProps.class}>
{@render children?.()}
</div>