Skip to content

Commit 93a5692

Browse files
driskullbenelan
authored andcommitted
fix(tooltip): close tooltip when hovering out of an iframe (#11600)
**Related Issue:** #11091 ## Summary - Sets up an event listener on the document for when the pointer leaves the document - Closes tooltip when this occurs - This is to support a mouse moving out of an iframe with tooltips
1 parent 1deeed3 commit 93a5692

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

packages/calcite-components/src/components/tooltip/TooltipManager.ts

+7
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ export default class TooltipManager {
9898
}
9999
};
100100

101+
private pointerLeaveHandler = (): void => {
102+
this.clearHoverTimeout();
103+
this.closeHoveredTooltip();
104+
};
105+
101106
private pointerMoveHandler = (event: PointerEvent): void => {
102107
if (event.defaultPrevented) {
103108
this.closeHoveredTooltip();
@@ -218,6 +223,7 @@ export default class TooltipManager {
218223
window.addEventListener("click", this.clickHandler);
219224
window.addEventListener("focusin", this.focusInHandler);
220225
window.addEventListener("blur", this.blurHandler);
226+
document.addEventListener("pointerleave", this.pointerLeaveHandler);
221227
}
222228

223229
private removeListeners(): void {
@@ -226,6 +232,7 @@ export default class TooltipManager {
226232
window.removeEventListener("click", this.clickHandler);
227233
window.removeEventListener("focusin", this.focusInHandler);
228234
window.removeEventListener("blur", this.blurHandler);
235+
document.removeEventListener("pointerleave", this.pointerLeaveHandler);
229236
}
230237

231238
private clearHoverOpenTimeout(): void {

packages/calcite-components/src/components/tooltip/tooltip.e2e.ts

+23
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,29 @@ describe("calcite-tooltip", () => {
13961396
});
13971397
});
13981398

1399+
it("closes tooltip when pointer leaves document (simulates iframe use case)", async () => {
1400+
const page = await newE2EPage();
1401+
await page.setContent(`
1402+
<calcite-tooltip id="tooltip" reference-element="trigger">Awesome tooltip!</calcite-tooltip>
1403+
<button id="trigger">Hover me</button>
1404+
`);
1405+
const button = await page.find("#trigger");
1406+
const tooltip = await page.find("calcite-tooltip");
1407+
1408+
await button.hover();
1409+
await page.waitForTimeout(TOOLTIP_OPEN_DELAY_MS);
1410+
await page.waitForChanges();
1411+
1412+
expect(await tooltip.getProperty("open")).toBe(true);
1413+
1414+
const viewport = page.viewport();
1415+
await page.mouse.move(viewport.width + 100, viewport.height + 100);
1416+
await page.waitForChanges();
1417+
1418+
await page.waitForTimeout(TOOLTIP_CLOSE_DELAY_MS);
1419+
expect(await tooltip.getProperty("open")).toBe(false);
1420+
});
1421+
13991422
describe("theme", () => {
14001423
describe("default", () => {
14011424
themed(

0 commit comments

Comments
 (0)