aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Tooltip
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-01-13 18:49:32 -0800
committerFuwn <[email protected]>2024-01-13 18:49:32 -0800
commit65f4655898512941785a4031360c1bf7ba3eecdb (patch)
treef1dfa0ccfbc70acc9ffe1203c2d252128f7f4bcc /src/lib/Tooltip
parentfeat(user): radius and middle align (diff)
downloaddue.moe-65f4655898512941785a4031360c1bf7ba3eecdb.tar.xz
due.moe-65f4655898512941785a4031360c1bf7ba3eecdb.zip
feat(lib): tooltip action
Diffstat (limited to 'src/lib/Tooltip')
-rw-r--r--src/lib/Tooltip/tooltip.ts58
1 files changed, 58 insertions, 0 deletions
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;