Skip to content

Commit f63540c

Browse files
committed
fix(tooltip): delay positioning using observer to handle scrollable container visibility
1 parent c11773f commit f63540c

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed

src/packages/tour/components/HelperLayer.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { style } from "../../../util/style";
22
import dom, { State } from "../../dom";
33
import { helperLayerClassName } from "../classNames";
4-
import { setPositionRelativeToStep } from "../position";
4+
import { waitAndSetPositionRelativeToStep } from "../position";
55
import { TourStep } from "../steps";
66

77
const { div } = dom.tags;
@@ -64,7 +64,8 @@ export const HelperLayer = ({
6464
// set the new position if the step or refreshes change
6565
if (!step.val || refreshes.val === undefined) return;
6666

67-
setPositionRelativeToStep(
67+
68+
waitAndSetPositionRelativeToStep(
6869
targetElement,
6970
helperLayer,
7071
step.val,

src/packages/tour/position.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,37 @@ export const setPositionRelativeToStep = (
1818
step.position === "floating" ? 0 : padding
1919
);
2020
};
21+
22+
/**
23+
* Waits for the target element to be visible in viewport, then sets tooltip position.
24+
*/
25+
export const waitAndSetPositionRelativeToStep = (
26+
relativeElement: HTMLElement,
27+
tooltipLayer: HTMLElement,
28+
step: TourStep,
29+
padding: number
30+
) => {
31+
const target = step.element as HTMLElement;
32+
33+
const observer = new IntersectionObserver(
34+
(entries) => {
35+
const entry = entries[0];
36+
37+
if (entry.isIntersecting) {
38+
observer.disconnect();
39+
40+
setPositionRelativeToStep(
41+
relativeElement,
42+
tooltipLayer,
43+
step,
44+
padding
45+
);
46+
}
47+
},
48+
{
49+
threshold: 0.1,
50+
}
51+
);
52+
53+
observer.observe(target);
54+
};

0 commit comments

Comments
 (0)