Skip to content

Commit 5b63381

Browse files
committed
Refactor Vue tooltip positioning to use shared pointer state
1 parent 7d1850a commit 5b63381

3 files changed

Lines changed: 28 additions & 3 deletions

File tree

js/interaction/resolution_master_interaction_methods.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,15 @@ export const interactionMethods = {
522522
}
523523
}
524524
this.tooltipMousePos = { x: e.canvasX, y: e.canvasY };
525+
if (this.isVueNodesMode?.()) {
526+
this._vueCompatTooltipPointerPosition = {
527+
clientX: e.clientX,
528+
clientY: e.clientY
529+
};
530+
if (newHover === this.hoverElement && this.showTooltip && this.tooltipElement === newHover) {
531+
this.positionVueCompatTooltip?.(this._vueCompatTooltipPointerPosition);
532+
}
533+
}
525534
if (newHover !== this.hoverElement) {
526535
this.hoverElement = newHover;
527536
this.handleTooltipHover(newHover, e);
@@ -542,13 +551,12 @@ export const interactionMethods = {
542551
}
543552
if (element && this.tooltips[element]) {
544553
const initialMousePos = { x: e.canvasX, y: e.canvasY };
545-
const initialClientPos = { clientX: e.clientX, clientY: e.clientY };
546554
this.tooltipTimer = setTimeout(() => {
547555
this.tooltipElement = element;
548556
this.showTooltip = true;
549557
this.tooltipFixedPos = initialMousePos;
550558
if (this.isVueNodesMode?.()) {
551-
this.showVueCompatTooltip?.(element, initialClientPos);
559+
this.showVueCompatTooltip?.(element, this._vueCompatTooltipPointerPosition);
552560
} else {
553561
this.requestCanvasUpdate(true);
554562
}

js/node/resolution_master_node_lifecycle.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ export const nodeLifecycleMethods = {
507507
this.tooltipTimer = null;
508508
}
509509
this.hideVueCompatTooltip();
510+
this._vueCompatTooltipPointerPosition = null;
510511
this.hoverElement = null;
511512
this.tooltipElement = null;
512513
this.showTooltip = false;
@@ -557,6 +558,18 @@ export const nodeLifecycleMethods = {
557558
tooltip.style.left = "0px";
558559
tooltip.style.top = "0px";
559560

561+
this.positionVueCompatTooltip(pointerPosition);
562+
tooltip.style.visibility = "visible";
563+
},
564+
565+
positionVueCompatTooltip(pointerPosition) {
566+
const tooltip = this._vueCompatTooltip;
567+
const clientX = Number(pointerPosition?.clientX);
568+
const clientY = Number(pointerPosition?.clientY);
569+
if (!tooltip || !Number.isFinite(clientX) || !Number.isFinite(clientY) || typeof document === "undefined") {
570+
return;
571+
}
572+
560573
const tooltipRect = tooltip.getBoundingClientRect();
561574
const viewportWidth = document.documentElement?.clientWidth || globalThis.innerWidth || 0;
562575
const viewportHeight = document.documentElement?.clientHeight || globalThis.innerHeight || 0;
@@ -579,7 +592,6 @@ export const nodeLifecycleMethods = {
579592

580593
tooltip.style.left = `${Math.round(left)}px`;
581594
tooltip.style.top = `${Math.round(top)}px`;
582-
tooltip.style.visibility = "visible";
583595
},
584596

585597
hideVueCompatTooltip() {
@@ -591,6 +603,7 @@ export const nodeLifecycleMethods = {
591603
teardownVueCompatTooltip() {
592604
this._vueCompatTooltip?.remove?.();
593605
this._vueCompatTooltip = null;
606+
this._vueCompatTooltipPointerPosition = null;
594607
},
595608

596609
teardownVueCompatCanvasEvents() {

tests/js/node_lifecycle.test.mjs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ test("Vue tooltip is rendered in the document overlay and constrained to the vie
210210
assert.equal(tooltip.style.top, "40px");
211211
assert.equal(tooltip.style.visibility, "visible");
212212

213+
controller.positionVueCompatTooltip({ clientX: 20, clientY: 150 });
214+
assert.equal(tooltip.style.left, "35px");
215+
assert.equal(tooltip.style.top, "100px");
216+
213217
controller.hideVueCompatTooltip();
214218
assert.equal(tooltip.style.display, "none");
215219

0 commit comments

Comments
 (0)