From 65f4655898512941785a4031360c1bf7ba3eecdb Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sat, 13 Jan 2024 18:49:32 -0800 Subject: feat(lib): tooltip action --- src/lib/Tooltip/tooltip.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/lib/Tooltip/tooltip.ts diff --git a/src/lib/Tooltip/tooltip.ts b/src/lib/Tooltip/tooltip.ts new file mode 100644 index 00000000..fd1428f4 --- /dev/null +++ b/src/lib/Tooltip/tooltip.ts @@ -0,0 +1,58 @@ +const tooltip = (element: HTMLElement) => { + let div: HTMLDivElement; + let title: string | null; + const offset = 10; + let timer: number; + + const mouseOver = (event: MouseEvent) => { + title = element.getAttribute('title'); + + element.removeAttribute('title'); + + timer = window.setTimeout(() => { + div = document.createElement('div'); + div.textContent = title; + + div.setAttribute( + 'style', + `position: absolute; + top: -${event.pageX - div.offsetWidth / 2}px; + left: -${event.pageY - div.offsetHeight - offset / 2}px;` + ); + + div.classList.add('card'); + div.classList.add('card-small'); + document.body.appendChild(div); + }, 0); + }; + + const mouseMove = (event: MouseEvent) => { + if (div) { + div.style.left = `${event.pageX - div.offsetWidth / 2}px`; + div.style.top = `${event.pageY - div.offsetHeight - offset / 2}px`; + } + }; + + const mouseLeave = () => { + clearTimeout(timer); + + if (div) { + document.body.removeChild(div); + element.setAttribute('title', title as string); + } + }; + + element.addEventListener('mouseover', mouseOver); + element.addEventListener('mouseleave', mouseLeave); + element.addEventListener('mousemove', mouseMove); + + return { + destroy() { + element.removeEventListener('mouseover', mouseOver); + element.removeEventListener('mouseleave', mouseLeave); + element.removeEventListener('mousemove', mouseMove); + } + }; +}; + +export default tooltip; -- cgit v1.2.3