Files
flotilla/src/lib/components/Tippy.svelte
T
2024-11-15 14:05:52 -08:00

42 lines
1023 B
Svelte

<script lang="ts">
import "tippy.js/animations/shift-away.css"
import {onMount} from "svelte"
import type {SvelteComponent, ComponentType, ComponentProps} from "svelte"
import tippy, {type Instance, type Props} from "tippy.js"
export let component: ComponentType
export let props: ComponentProps<any> = {}
export let params: Partial<Props> = {}
export let popover: Instance | undefined = undefined
export let instance: SvelteComponent | undefined = undefined
let element: Element
$: instance?.$set(props)
onMount(() => {
if (element) {
const target = document.createElement("div")
popover = tippy(element, {
content: target,
animation: "shift-away",
appendTo: document.querySelector(".tippy-target")!,
...params,
})
instance = new component({target, props})
return () => {
popover?.destroy()
instance?.$destroy()
}
}
})
</script>
<div bind:this={element} class={$$props.class}>
<slot />
</div>