breakout71/src/tooltip.ts

64 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-04-01 13:39:09 +02:00
import { isOptionOn } from "./options";
2025-04-01 13:35:33 +02:00
export function setupTooltips() {
2025-04-01 13:39:09 +02:00
const tooltip = document.getElementById("tooltip") as HTMLDivElement;
if (isOptionOn("mobile-mode")) {
tooltip.style.display = "none";
return;
}
2025-04-01 13:35:33 +02:00
2025-04-02 10:41:35 +02:00
2025-04-01 13:39:09 +02:00
function updateTooltipPosition(e: MouseEvent) {
tooltip.style.transform =
`translate(${e.clientX}px,${e.clientY + 20}px) ` +
(e.clientX > window.innerWidth / 2 ? " translate(-100%,0)" : "");
}
2025-04-01 13:35:33 +02:00
2025-04-02 10:41:35 +02:00
function closeToolTip(){
tooltip.style.display = "none";
hovering=null
}
let hovering:HTMLElement|null=null
2025-04-01 13:39:09 +02:00
document.body.addEventListener(
"mouseenter",
(e: MouseEvent) => {
let parent: HTMLElement | null = e.target as HTMLElement;
while (parent && !parent.hasAttribute("data-tooltip")) {
parent = parent.parentElement;
}
if (parent?.hasAttribute("data-tooltip")) {
2025-04-02 10:41:35 +02:00
hovering=parent as HTMLElement
tooltip.innerHTML = hovering.getAttribute("data-tooltip") || '';
2025-04-01 13:39:09 +02:00
tooltip.style.display = "";
updateTooltipPosition(e);
} else {
2025-04-02 10:41:35 +02:00
closeToolTip()
2025-04-01 13:39:09 +02:00
}
},
true,
);
2025-04-02 10:41:35 +02:00
setInterval(()=>{
if(hovering){
if(!document.body.contains(hovering)){
closeToolTip()
}
}
},200)
2025-04-01 13:39:09 +02:00
document.body.addEventListener(
"mousemove",
(e) => {
if (!tooltip.style.display) {
updateTooltipPosition(e);
}
},
true,
);
document.body.addEventListener(
"mouseleave",
(e) => {
2025-04-02 10:41:35 +02:00
closeToolTip()
}
2025-04-01 13:39:09 +02:00
);
2025-04-01 13:35:33 +02:00
}