import { watchEffect, watch, onMounted, type CSSProperties, defineComponent, ref } from "vue"; const carrierStyle = { opacity: "0", display: "block", pointerEvents: "none", backgroundColor: "black", border: "white solid 1px", color: "white", padding: "10px", position: "absolute", zIndex: "1", overflow: "hidden", height: "0", width: "0", transition: "opacity 200ms, height 200ms, width 200ms", } satisfies CSSProperties; const textCarrierStyle = { fontSize: '16px', fontFamily: "Roboto, serif", display: "block", overflow: "hidden", } satisfies CSSProperties; const defaultWidth = 350; export default defineComponent({ name: "dj-sexy-tooltip", props: { tooltip: { type: String, required: true, }, }, setup(props, { slots, attrs }) { const active = ref(false); const carrier = ref(null); const textCarrier = ref(null); onMounted(() => { document.addEventListener("mousemove", (event) => { const pos = { x: event.pageX, y: event.pageY }; if (carrier.value && getComputedStyle(carrier.value).opacity !== "0") { if (pos.x + 15 + carrier.value.clientWidth <= document.body.scrollWidth) { carrier.value.style.left = (pos.x + 15) + "px"; } else { carrier.value.style.left = (document.body.scrollWidth - carrier.value.clientWidth - 5) + "px"; } if (pos.y + carrier.value.clientHeight <= document.body.scrollHeight) { carrier.value.style.top = pos.y + "px"; } else { carrier.value.style.top = (document.body.scrollHeight - carrier.value.clientHeight - 5) + "px"; } } }); }); watchEffect(() => { if (carrier.value) { carrier.value.style.height = active.value ? '16px' : '0'; carrier.value.style.opacity = active.value ? '1' : '0'; carrier.value.style.width = active.value ? '350px' : '0'; } }); return () => <>
{ active.value = true; }} onMouseleave={() => { active.value = false; }} > {slots.default && }
{props.tooltip}
; }, });