<script lang="ts"> | |
import DOMPurify from 'dompurify'; | |
import { onDestroy } from 'svelte'; | |
import { marked } from 'marked'; | |
import tippy from 'tippy.js'; | |
import { roundArrow } from 'tippy.js'; | |
export let placement = 'top'; | |
export let content = `I'm a tooltip!`; | |
export let touch = true; | |
export let className = 'flex'; | |
export let theme = ''; | |
export let allowHTML = true; | |
export let tippyOptions = {}; | |
let tooltipElement; | |
let tooltipInstance; | |
$: if (tooltipElement && content) { | |
if (tooltipInstance) { | |
tooltipInstance.setContent(DOMPurify.sanitize(content)); | |
} else { | |
tooltipInstance = tippy(tooltipElement, { | |
content: DOMPurify.sanitize(content), | |
placement: placement, | |
allowHTML: allowHTML, | |
touch: touch, | |
...(theme !== '' ? { theme } : { theme: 'dark' }), | |
arrow: false, | |
offset: [0, 4], | |
...tippyOptions | |
}); | |
} | |
} else if (tooltipInstance && content === '') { | |
if (tooltipInstance) { | |
tooltipInstance.destroy(); | |
} | |
} | |
onDestroy(() => { | |
if (tooltipInstance) { | |
tooltipInstance.destroy(); | |
} | |
}); | |
</script> | |
<div bind:this={tooltipElement} aria-label={DOMPurify.sanitize(content)} class={className}> | |
<slot /> | |
</div> | |