@plasmicpkgs/react-aria 0.0.109 → 0.0.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/react-aria.esm.js +173 -105
- package/dist/react-aria.esm.js.map +1 -1
- package/dist/react-aria.js +170 -102
- package/dist/react-aria.js.map +1 -1
- package/dist/registerTooltip.d.ts +3 -1
- package/package.json +2 -2
- package/skinny/registerDialogTrigger.cjs.js +2 -2
- package/skinny/registerDialogTrigger.cjs.js.map +1 -1
- package/skinny/registerDialogTrigger.esm.js +2 -2
- package/skinny/registerDialogTrigger.esm.js.map +1 -1
- package/skinny/registerDialogTrigger.stories.cjs.js +2 -19
- package/skinny/registerDialogTrigger.stories.cjs.js.map +1 -1
- package/skinny/registerDialogTrigger.stories.esm.js +2 -19
- package/skinny/registerDialogTrigger.stories.esm.js.map +1 -1
- package/skinny/registerModal.cjs.js +1 -1
- package/skinny/registerModal.cjs.js.map +1 -1
- package/skinny/registerModal.esm.js +1 -1
- package/skinny/registerModal.esm.js.map +1 -1
- package/skinny/registerSelect.cjs.js +2 -0
- package/skinny/registerSelect.cjs.js.map +1 -1
- package/skinny/registerSelect.esm.js +2 -0
- package/skinny/registerSelect.esm.js.map +1 -1
- package/skinny/registerSelect.stories.cjs.js +39 -0
- package/skinny/registerSelect.stories.cjs.js.map +1 -1
- package/skinny/registerSelect.stories.esm.js +38 -1
- package/skinny/registerSelect.stories.esm.js.map +1 -1
- package/skinny/registerSlider.stories.cjs.js +16 -35
- package/skinny/registerSlider.stories.cjs.js.map +1 -1
- package/skinny/registerSlider.stories.esm.js +17 -37
- package/skinny/registerSlider.stories.esm.js.map +1 -1
- package/skinny/registerSliderTrack.cjs.js +6 -4
- package/skinny/registerSliderTrack.cjs.js.map +1 -1
- package/skinny/registerSliderTrack.esm.js +7 -5
- package/skinny/registerSliderTrack.esm.js.map +1 -1
- package/skinny/registerTooltip.cjs.js +111 -47
- package/skinny/registerTooltip.cjs.js.map +1 -1
- package/skinny/registerTooltip.d.ts +3 -1
- package/skinny/registerTooltip.esm.js +115 -51
- package/skinny/registerTooltip.esm.js.map +1 -1
- package/skinny/registerTooltip.stories.cjs.js +282 -24
- package/skinny/registerTooltip.stories.cjs.js.map +1 -1
- package/skinny/registerTooltip.stories.esm.js +278 -26
- package/skinny/registerTooltip.stories.esm.js.map +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PlasmicCanvasContext } from '@plasmicapp/host';
|
|
2
|
-
import { fn,
|
|
2
|
+
import { fn, within, expect, waitFor, userEvent } from '@storybook/test';
|
|
3
3
|
import React, { useState, useEffect } from 'react';
|
|
4
4
|
import { BaseButton } from './registerButton.esm.js';
|
|
5
5
|
import { BaseTooltip } from './registerTooltip.esm.js';
|
|
@@ -9,6 +9,7 @@ import './common-ceebbaea.esm.js';
|
|
|
9
9
|
import './utils-5d1b4c6b.esm.js';
|
|
10
10
|
import '@plasmicapp/host/registerComponent';
|
|
11
11
|
import './variant-utils-4405ebb0.esm.js';
|
|
12
|
+
import 'react-stately';
|
|
12
13
|
|
|
13
14
|
var __defProp = Object.defineProperty;
|
|
14
15
|
var __defProps = Object.defineProperties;
|
|
@@ -46,29 +47,41 @@ const meta = {
|
|
|
46
47
|
component: BaseTooltip,
|
|
47
48
|
args: {
|
|
48
49
|
onOpenChange: fn(),
|
|
49
|
-
children: /* @__PURE__ */ React.createElement(
|
|
50
|
+
children: /* @__PURE__ */ React.createElement("span", null, "Show tooltip"),
|
|
50
51
|
// anything can be used as a trigger
|
|
51
52
|
tooltipContent: /* @__PURE__ */ React.createElement("div", { "data-testid": "tooltip-content" }, "This is a tooltip"),
|
|
52
53
|
trigger: void 0,
|
|
53
54
|
// means that it triggers on both focus and hover
|
|
54
55
|
delay: 0,
|
|
55
56
|
closeDelay: 0
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
onOpenChange: (newValue) => {
|
|
67
|
-
setOpen(newValue);
|
|
68
|
-
onOpenChange == null ? void 0 : onOpenChange(newValue);
|
|
69
|
-
}
|
|
70
|
-
}, args)
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const Basic = {
|
|
60
|
+
play: async ({ canvasElement, args }) => {
|
|
61
|
+
const canvas = within(canvasElement);
|
|
62
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
63
|
+
await waitFor(
|
|
64
|
+
() => expect(
|
|
65
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
66
|
+
).not.toBeInTheDocument()
|
|
71
67
|
);
|
|
68
|
+
await userEvent.hover(trigger);
|
|
69
|
+
await waitFor(() => {
|
|
70
|
+
var _a, _b;
|
|
71
|
+
const tooltip = within(document.body).getByTestId("tooltip-content");
|
|
72
|
+
const tooltipId = (_a = tooltip.parentElement) == null ? void 0 : _a.getAttribute("id");
|
|
73
|
+
expect(tooltipId).toBeDefined();
|
|
74
|
+
expect((_b = trigger.parentElement) == null ? void 0 : _b.getAttribute("aria-describedby")).toEqual(
|
|
75
|
+
tooltipId
|
|
76
|
+
);
|
|
77
|
+
});
|
|
78
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
79
|
+
await userEvent.unhover(trigger);
|
|
80
|
+
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
81
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(2);
|
|
82
|
+
await userEvent.tab();
|
|
83
|
+
await expect(trigger).not.toHaveFocus();
|
|
84
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(2);
|
|
72
85
|
}
|
|
73
86
|
};
|
|
74
87
|
const AlwaysOpen = {
|
|
@@ -85,13 +98,52 @@ const AlwaysOpen = {
|
|
|
85
98
|
}
|
|
86
99
|
};
|
|
87
100
|
const FocusTrigger = {
|
|
88
|
-
|
|
101
|
+
args: {
|
|
102
|
+
// TabIndex=0 makes it focusable
|
|
103
|
+
children: /* @__PURE__ */ React.createElement("span", { tabIndex: 0 }, "Show tooltip")
|
|
104
|
+
// anything can be used as a trigger
|
|
105
|
+
},
|
|
106
|
+
play: async ({ canvasElement, args }) => {
|
|
107
|
+
const canvas = within(canvasElement);
|
|
108
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
109
|
+
await waitFor(
|
|
110
|
+
() => expect(
|
|
111
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
112
|
+
).not.toBeInTheDocument()
|
|
113
|
+
);
|
|
114
|
+
await userEvent.tab();
|
|
115
|
+
await expect(trigger).toHaveFocus();
|
|
116
|
+
await waitFor(
|
|
117
|
+
() => expect(
|
|
118
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
119
|
+
).toBeInTheDocument()
|
|
120
|
+
);
|
|
121
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
122
|
+
await userEvent.tab();
|
|
123
|
+
await expect(trigger).not.toHaveFocus();
|
|
124
|
+
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
const CustomButton = (_a) => {
|
|
128
|
+
var _b = _a, { children } = _b, props = __objRest(_b, ["children"]);
|
|
129
|
+
return /* @__PURE__ */ React.createElement("div", __spreadProps(__spreadValues({}, props), { "data-testid": "trigger-wrapper" }), /* @__PURE__ */ React.createElement("span", { tabIndex: 0 }, children), /* @__PURE__ */ React.createElement("span", { tabIndex: 0 }, children));
|
|
130
|
+
};
|
|
131
|
+
const WithoutForwardRefTrigger = {
|
|
132
|
+
args: {
|
|
133
|
+
children: /* @__PURE__ */ React.createElement(CustomButton, null, "Show tooltip")
|
|
134
|
+
},
|
|
135
|
+
play: async ({ args, canvasElement }) => {
|
|
136
|
+
const canvas = within(canvasElement);
|
|
137
|
+
const triggerWrapper = canvas.getByTestId("trigger-wrapper");
|
|
138
|
+
const innerFocusableButtons = canvas.getAllByText("Show tooltip");
|
|
89
139
|
await waitFor(
|
|
90
140
|
() => expect(
|
|
91
141
|
within(document.body).queryByTestId("tooltip-content")
|
|
92
142
|
).not.toBeInTheDocument()
|
|
93
143
|
);
|
|
144
|
+
await expect(innerFocusableButtons[0]).not.toHaveFocus();
|
|
94
145
|
await userEvent.tab();
|
|
146
|
+
expect(innerFocusableButtons[0]).toHaveFocus();
|
|
95
147
|
await waitFor(
|
|
96
148
|
() => expect(
|
|
97
149
|
within(document.body).queryByTestId("tooltip-content")
|
|
@@ -99,16 +151,46 @@ const FocusTrigger = {
|
|
|
99
151
|
);
|
|
100
152
|
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
101
153
|
await userEvent.tab();
|
|
154
|
+
expect(innerFocusableButtons[0]).not.toHaveFocus();
|
|
155
|
+
expect(innerFocusableButtons[1]).toHaveFocus();
|
|
156
|
+
await waitFor(
|
|
157
|
+
() => expect(
|
|
158
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
159
|
+
).toBeInTheDocument()
|
|
160
|
+
);
|
|
161
|
+
await userEvent.tab();
|
|
162
|
+
expect(innerFocusableButtons[1]).not.toHaveFocus();
|
|
163
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(false);
|
|
164
|
+
await waitFor(
|
|
165
|
+
() => expect(
|
|
166
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
167
|
+
).not.toBeInTheDocument()
|
|
168
|
+
);
|
|
169
|
+
await userEvent.hover(triggerWrapper);
|
|
170
|
+
await waitFor(
|
|
171
|
+
() => expect(
|
|
172
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
173
|
+
).toBeInTheDocument()
|
|
174
|
+
);
|
|
175
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
176
|
+
await userEvent.unhover(triggerWrapper);
|
|
177
|
+
await waitFor(
|
|
178
|
+
() => expect(
|
|
179
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
180
|
+
).not.toBeInTheDocument()
|
|
181
|
+
);
|
|
102
182
|
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
103
183
|
}
|
|
104
184
|
};
|
|
105
185
|
const FocusTriggerOnly = {
|
|
106
186
|
args: {
|
|
107
|
-
trigger: "focus"
|
|
187
|
+
trigger: "focus",
|
|
188
|
+
children: /* @__PURE__ */ React.createElement("span", { tabIndex: 0 }, "Show tooltip")
|
|
189
|
+
// anything can be used as a trigger
|
|
108
190
|
},
|
|
109
191
|
play: async ({ args, canvasElement }) => {
|
|
110
192
|
const canvas = within(canvasElement);
|
|
111
|
-
const trigger = canvas.getByText("
|
|
193
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
112
194
|
await waitFor(
|
|
113
195
|
() => expect(
|
|
114
196
|
within(document.body).queryByTestId("tooltip-content")
|
|
@@ -123,6 +205,7 @@ const FocusTriggerOnly = {
|
|
|
123
205
|
expect(args.onOpenChange).not.toHaveBeenCalled();
|
|
124
206
|
await userEvent.unhover(trigger);
|
|
125
207
|
await userEvent.tab();
|
|
208
|
+
await expect(trigger).toHaveFocus();
|
|
126
209
|
await waitFor(
|
|
127
210
|
() => expect(
|
|
128
211
|
within(document.body).queryByTestId("tooltip-content")
|
|
@@ -133,13 +216,41 @@ const FocusTriggerOnly = {
|
|
|
133
216
|
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
134
217
|
}
|
|
135
218
|
};
|
|
219
|
+
const TriggerWithEventHandlers = {
|
|
220
|
+
parameters: {
|
|
221
|
+
customOnFocus: fn()
|
|
222
|
+
},
|
|
223
|
+
render: (args, { parameters }) => /* @__PURE__ */ React.createElement(BaseTooltip, __spreadValues({}, args), /* @__PURE__ */ React.createElement("button", { className: "custom-class", onFocus: parameters.customOnFocus }, "Show tooltip")),
|
|
224
|
+
play: async ({ args, canvasElement, parameters }) => {
|
|
225
|
+
const canvas = within(canvasElement);
|
|
226
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
227
|
+
await expect(trigger).toHaveClass("custom-class");
|
|
228
|
+
await waitFor(
|
|
229
|
+
() => expect(
|
|
230
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
231
|
+
).not.toBeInTheDocument()
|
|
232
|
+
);
|
|
233
|
+
expect(parameters.customOnFocus).not.toHaveBeenCalled();
|
|
234
|
+
await userEvent.tab();
|
|
235
|
+
await expect(trigger).toHaveFocus();
|
|
236
|
+
await waitFor(
|
|
237
|
+
() => expect(
|
|
238
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
239
|
+
).toBeInTheDocument()
|
|
240
|
+
);
|
|
241
|
+
expect(parameters.customOnFocus).toHaveBeenCalled();
|
|
242
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
243
|
+
await userEvent.tab();
|
|
244
|
+
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
245
|
+
}
|
|
246
|
+
};
|
|
136
247
|
const Disabled = {
|
|
137
248
|
args: {
|
|
138
249
|
isDisabled: true
|
|
139
250
|
},
|
|
140
251
|
play: async ({ args, canvasElement }) => {
|
|
141
252
|
const canvas = within(canvasElement);
|
|
142
|
-
const trigger = canvas.getByText("
|
|
253
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
143
254
|
await waitFor(
|
|
144
255
|
() => expect(
|
|
145
256
|
within(document.body).queryByTestId("tooltip-content")
|
|
@@ -155,9 +266,96 @@ const Disabled = {
|
|
|
155
266
|
await userEvent.hover(trigger);
|
|
156
267
|
}
|
|
157
268
|
};
|
|
158
|
-
const
|
|
269
|
+
const Controlled = {
|
|
159
270
|
render: (_c) => {
|
|
160
|
-
var _d = _c, args = __objRest(_d, ["
|
|
271
|
+
var _d = _c, { isOpen: _isOpen, onOpenChange } = _d, args = __objRest(_d, ["isOpen", "onOpenChange"]);
|
|
272
|
+
const [open, setOpen] = useState(false);
|
|
273
|
+
return /* @__PURE__ */ React.createElement(
|
|
274
|
+
BaseTooltip,
|
|
275
|
+
__spreadProps(__spreadValues({}, args), {
|
|
276
|
+
isOpen: open,
|
|
277
|
+
onOpenChange: (newVal) => {
|
|
278
|
+
setOpen(newVal);
|
|
279
|
+
onOpenChange == null ? void 0 : onOpenChange(newVal);
|
|
280
|
+
}
|
|
281
|
+
})
|
|
282
|
+
);
|
|
283
|
+
},
|
|
284
|
+
play: async ({ canvasElement }) => {
|
|
285
|
+
const canvas = within(canvasElement);
|
|
286
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
287
|
+
await waitFor(
|
|
288
|
+
() => expect(
|
|
289
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
290
|
+
).not.toBeInTheDocument()
|
|
291
|
+
);
|
|
292
|
+
await userEvent.hover(trigger);
|
|
293
|
+
await waitFor(
|
|
294
|
+
() => expect(
|
|
295
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
296
|
+
).toBeInTheDocument()
|
|
297
|
+
);
|
|
298
|
+
await userEvent.unhover(trigger);
|
|
299
|
+
await waitFor(
|
|
300
|
+
() => expect(
|
|
301
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
302
|
+
).not.toBeInTheDocument()
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const AriaButtonTrigger = {
|
|
307
|
+
args: {
|
|
308
|
+
children: /* @__PURE__ */ React.createElement(BaseButton, null, "Show tooltip")
|
|
309
|
+
// anything can be used as a trigger
|
|
310
|
+
},
|
|
311
|
+
play: async ({ args, canvasElement }) => {
|
|
312
|
+
const canvas = within(canvasElement);
|
|
313
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
314
|
+
await waitFor(
|
|
315
|
+
() => expect(
|
|
316
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
317
|
+
).not.toBeInTheDocument()
|
|
318
|
+
);
|
|
319
|
+
await userEvent.hover(trigger);
|
|
320
|
+
await waitFor(
|
|
321
|
+
() => expect(
|
|
322
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
323
|
+
).toBeInTheDocument()
|
|
324
|
+
);
|
|
325
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
326
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(1);
|
|
327
|
+
await userEvent.unhover(trigger);
|
|
328
|
+
await waitFor(
|
|
329
|
+
() => expect(
|
|
330
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
331
|
+
).not.toBeInTheDocument()
|
|
332
|
+
);
|
|
333
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(false);
|
|
334
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(2);
|
|
335
|
+
await expect(trigger).not.toHaveFocus();
|
|
336
|
+
await userEvent.tab();
|
|
337
|
+
expect(trigger).toHaveFocus();
|
|
338
|
+
await waitFor(
|
|
339
|
+
() => expect(
|
|
340
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
341
|
+
).toBeInTheDocument()
|
|
342
|
+
);
|
|
343
|
+
expect(args.onOpenChange).toHaveBeenCalledWith(true);
|
|
344
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(3);
|
|
345
|
+
await userEvent.tab();
|
|
346
|
+
await expect(canvas.getByText("Show tooltip")).not.toHaveFocus();
|
|
347
|
+
await waitFor(
|
|
348
|
+
() => expect(
|
|
349
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
350
|
+
).not.toBeInTheDocument()
|
|
351
|
+
);
|
|
352
|
+
await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));
|
|
353
|
+
expect(args.onOpenChange).toHaveBeenCalledTimes(4);
|
|
354
|
+
}
|
|
355
|
+
};
|
|
356
|
+
const SelectedInCanvas = {
|
|
357
|
+
render: (_e) => {
|
|
358
|
+
var _f = _e, args = __objRest(_f, ["__plasmic_selection_prop__"]);
|
|
161
359
|
const [selected, setSelected] = useState(false);
|
|
162
360
|
const [selectedSlotName, setSelectedSlotName] = useState("");
|
|
163
361
|
useEffect(() => {
|
|
@@ -180,12 +378,12 @@ const SelectedInCanvas = {
|
|
|
180
378
|
},
|
|
181
379
|
/* @__PURE__ */ React.createElement(
|
|
182
380
|
BaseTooltip,
|
|
183
|
-
|
|
381
|
+
__spreadProps(__spreadValues({}, args), {
|
|
184
382
|
__plasmic_selection_prop__: {
|
|
185
383
|
isSelected: selected,
|
|
186
384
|
selectedSlotName
|
|
187
385
|
}
|
|
188
|
-
})
|
|
386
|
+
})
|
|
189
387
|
)
|
|
190
388
|
)
|
|
191
389
|
);
|
|
@@ -210,6 +408,60 @@ const SelectedInCanvas = {
|
|
|
210
408
|
);
|
|
211
409
|
}
|
|
212
410
|
};
|
|
411
|
+
const TooltipPosition = {
|
|
412
|
+
render: (args) => {
|
|
413
|
+
const [className, setClassName] = useState("trigger");
|
|
414
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
415
|
+
"style",
|
|
416
|
+
{
|
|
417
|
+
dangerouslySetInnerHTML: {
|
|
418
|
+
__html: `
|
|
419
|
+
.trigger {
|
|
420
|
+
display: inline-block;
|
|
421
|
+
}
|
|
422
|
+
.trigger-right {
|
|
423
|
+
position: absolute;
|
|
424
|
+
right: 0;
|
|
425
|
+
}
|
|
426
|
+
`
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
), /* @__PURE__ */ React.createElement("button", { onClick: () => setClassName("trigger trigger-right") }, "Move right"), /* @__PURE__ */ React.createElement(BaseTooltip, __spreadProps(__spreadValues({}, args), { className })));
|
|
430
|
+
},
|
|
431
|
+
play: async ({ canvasElement }) => {
|
|
432
|
+
const canvas = within(canvasElement);
|
|
433
|
+
const trigger = canvas.getByText("Show tooltip");
|
|
434
|
+
const moveRightBtn = canvas.getByText("Move right");
|
|
435
|
+
await waitFor(
|
|
436
|
+
() => expect(
|
|
437
|
+
within(document.body).queryByTestId("tooltip-content")
|
|
438
|
+
).not.toBeInTheDocument()
|
|
439
|
+
);
|
|
440
|
+
await userEvent.hover(trigger);
|
|
441
|
+
let initialTooltipLeftPosition;
|
|
442
|
+
await waitFor(() => {
|
|
443
|
+
const tooltip = within(document.body).getByTestId("tooltip-content");
|
|
444
|
+
initialTooltipLeftPosition = tooltip.getBoundingClientRect().left;
|
|
445
|
+
});
|
|
446
|
+
await userEvent.unhover(trigger);
|
|
447
|
+
await userEvent.hover(trigger);
|
|
448
|
+
await waitFor(async () => {
|
|
449
|
+
const tooltip = within(document.body).getByTestId("tooltip-content");
|
|
450
|
+
expect(initialTooltipLeftPosition).toEqual(
|
|
451
|
+
tooltip.getBoundingClientRect().left
|
|
452
|
+
);
|
|
453
|
+
});
|
|
454
|
+
await userEvent.unhover(trigger);
|
|
455
|
+
await userEvent.click(moveRightBtn);
|
|
456
|
+
await userEvent.hover(trigger);
|
|
457
|
+
await waitFor(() => {
|
|
458
|
+
const tooltip = within(document.body).getByTestId("tooltip-content");
|
|
459
|
+
expect(initialTooltipLeftPosition).not.toEqual(
|
|
460
|
+
tooltip.getBoundingClientRect().left
|
|
461
|
+
);
|
|
462
|
+
});
|
|
463
|
+
}
|
|
464
|
+
};
|
|
213
465
|
|
|
214
|
-
export { AlwaysOpen, Disabled, FocusTrigger, FocusTriggerOnly, SelectedInCanvas, meta as default };
|
|
466
|
+
export { AlwaysOpen, AriaButtonTrigger, Basic, Controlled, Disabled, FocusTrigger, FocusTriggerOnly, SelectedInCanvas, TooltipPosition, TriggerWithEventHandlers, WithoutForwardRefTrigger, meta as default };
|
|
215
467
|
//# sourceMappingURL=registerTooltip.stories.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerTooltip.stories.esm.js","sources":["../src/registerTooltip.stories.tsx"],"sourcesContent":["import { PlasmicCanvasContext } from \"@plasmicapp/host\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport { expect, fn, userEvent, waitFor, within } from \"@storybook/test\";\nimport React, { useEffect, useState } from \"react\";\nimport { BaseButton } from \"./registerButton\";\nimport { BaseTooltip } from \"./registerTooltip\";\n\nconst meta: Meta<typeof BaseTooltip> = {\n title: \"Components/BaseTooltip\",\n component: BaseTooltip,\n args: {\n onOpenChange: fn(),\n children: <BaseButton>Hover me!</BaseButton>, // anything can be used as a trigger\n tooltipContent: <div data-testid=\"tooltip-content\">This is a tooltip</div>,\n trigger: undefined, // means that it triggers on both focus and hover\n delay: 0,\n closeDelay: 0,\n },\n // TODO: Currently, the BaseTooltip component cannot be uncontrolled, because a false is assumed for isOpen prop, if it is undefined\n // Remove this render function in the PR that fixes the issue\n render: ({ isOpen, onOpenChange, ...args }) => {\n const [open, setOpen] = useState(isOpen);\n return (\n <BaseTooltip\n isOpen={open}\n onOpenChange={(newValue) => {\n setOpen(newValue);\n onOpenChange?.(newValue);\n }}\n {...args}\n />\n );\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof BaseTooltip>;\n\n// TODO: Note, this test is failing only in headless mode (so the CI will fail),\n// because the hover simulation does not trigger the onOpenChange event.\n// I'm unsure why this is happening, as the story/test passes in interactive mode.\n// Uncomment this test in the PR that fixes the issue\n// Basic tooltip with hover trigger\n// export const Basic: Story = {\n// play: async ({ canvasElement, args }) => {\n// const canvas = within(canvasElement);\n// const trigger = canvas.getByText(\"Hover me!\");\n\n// await waitFor(() =>\n// expect(\n// within(document.body).queryByTestId(\"tooltip-content\")\n// ).not.toBeInTheDocument()\n// );\n\n// await userEvent.hover(trigger);\n\n// // Check that tooltip appears\n// await waitFor(() =>\n// expect(\n// within(document.body).queryByTestId(\"tooltip-content\")\n// ).toBeInTheDocument()\n// );\n\n// expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n// await userEvent.unhover(trigger);\n\n// await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n// },\n// };\n\n// Test only that the tooltip renders initially\nexport const AlwaysOpen: Story = {\n args: {\n isOpen: true, // Force tooltip to be open\n },\n play: async () => {\n // Just verify the tooltip content is in the document\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n },\n};\n\n// Tooltip with focus trigger\nexport const FocusTrigger: Story = {\n play: async ({ args }) => {\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Focus trigger\n await userEvent.tab();\n\n // Check that tooltip appears\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\n// Tooltip with focus trigger only\nexport const FocusTriggerOnly: Story = {\n args: {\n trigger: \"focus\",\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Hover me!\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Hover over trigger\n await userEvent.hover(trigger);\n\n // Check that tooltip does NOT appear on hover\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n expect(args.onOpenChange).not.toHaveBeenCalled();\n\n // Move mouse away\n await userEvent.unhover(trigger);\n\n // Focus trigger\n await userEvent.tab();\n\n // Check that tooltip DOES appear on focus\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\n// Disabled tooltip\nexport const Disabled: Story = {\n args: {\n isDisabled: true,\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Hover me!\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Focus trigger\n await userEvent.tab();\n\n // Check that the disabled tooltip does NOT appear\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n expect(args.onOpenChange).not.toHaveBeenCalled();\n\n await userEvent.hover(trigger);\n },\n};\n\nexport const SelectedInCanvas: Story = {\n render: ({ __plasmic_selection_prop__, ...args }) => {\n const [selected, setSelected] = useState(false);\n const [selectedSlotName, setSelectedSlotName] = useState(\"\");\n\n useEffect(() => {\n setTimeout(() => {\n setSelected(true);\n setTimeout(() => {\n // Simulate trigger slot selection in Plasmic canvas\n setSelectedSlotName(\"children\");\n }, 1000);\n }, 1000);\n }, []);\n\n return (\n // Simulate Plasmic canvas envirnment\n <PlasmicCanvasContext.Provider\n value={{\n componentName: \"test\",\n globalVariants: {},\n }}\n >\n <BaseTooltip\n {...args}\n // Simulate node selection in Plasmic canvas\n __plasmic_selection_prop__={{\n isSelected: selected,\n selectedSlotName,\n }}\n {...args}\n />\n </PlasmicCanvasContext.Provider>\n );\n },\n play: async () => {\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await waitFor(\n () =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument(),\n { timeout: 1100 }\n );\n\n await waitFor(\n () =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument(),\n { timeout: 1100 }\n );\n },\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registerTooltip.stories.esm.js","sources":["../src/registerTooltip.stories.tsx"],"sourcesContent":["import { PlasmicCanvasContext } from \"@plasmicapp/host\";\nimport type { Meta, StoryObj } from \"@storybook/react\";\nimport { expect, fn, userEvent, waitFor, within } from \"@storybook/test\";\nimport React, { useEffect, useState } from \"react\";\nimport { BaseButton } from \"./registerButton\";\nimport { BaseTooltip } from \"./registerTooltip\";\n\nconst meta: Meta<typeof BaseTooltip> = {\n title: \"Components/BaseTooltip\",\n component: BaseTooltip,\n args: {\n onOpenChange: fn(),\n children: <span>Show tooltip</span>, // anything can be used as a trigger\n tooltipContent: <div data-testid=\"tooltip-content\">This is a tooltip</div>,\n trigger: undefined, // means that it triggers on both focus and hover\n delay: 0,\n closeDelay: 0,\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof BaseTooltip>;\n\n// Basic tooltip with hover trigger\nexport const Basic: Story = {\n play: async ({ canvasElement, args }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await userEvent.hover(trigger);\n\n // Check that tooltip appears\n await waitFor(() => {\n const tooltip = within(document.body).getByTestId(\"tooltip-content\");\n const tooltipId = tooltip.parentElement?.getAttribute(\"id\");\n expect(tooltipId).toBeDefined();\n expect(trigger.parentElement?.getAttribute(\"aria-describedby\")).toEqual(\n tooltipId\n );\n });\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n await userEvent.unhover(trigger);\n\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n expect(args.onOpenChange).toHaveBeenCalledTimes(2);\n\n await userEvent.tab();\n\n // Non-focusable elements should still not be focusable when used as a tooltip trigger\n await expect(trigger).not.toHaveFocus();\n expect(args.onOpenChange).toHaveBeenCalledTimes(2); // no change\n },\n};\n\n// Test only that the tooltip renders initially\nexport const AlwaysOpen: Story = {\n args: {\n isOpen: true, // Force tooltip to be open\n },\n play: async () => {\n // Just verify the tooltip content is in the document\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n },\n};\n\n// Tooltip with focus trigger\nexport const FocusTrigger: Story = {\n args: {\n // TabIndex=0 makes it focusable\n children: <span tabIndex={0}>Show tooltip</span>, // anything can be used as a trigger\n },\n play: async ({ canvasElement, args }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Focus trigger\n await userEvent.tab();\n\n await expect(trigger).toHaveFocus();\n\n // Check that tooltip appears\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n await expect(trigger).not.toHaveFocus();\n\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\nconst CustomButton = ({ children, ...props }: any) => {\n return (\n <div {...props} data-testid=\"trigger-wrapper\">\n <span tabIndex={0}>{children}</span>\n <span tabIndex={0}>{children}</span>\n </div>\n );\n};\nexport const WithoutForwardRefTrigger: Story = {\n args: {\n children: <CustomButton>Show tooltip</CustomButton>,\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const triggerWrapper = canvas.getByTestId(\"trigger-wrapper\");\n const innerFocusableButtons = canvas.getAllByText(\"Show tooltip\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await expect(innerFocusableButtons[0]).not.toHaveFocus();\n\n // Focus trigger\n await userEvent.tab();\n expect(innerFocusableButtons[0]).toHaveFocus(); // ensure that the focus is on the first focusable item in the trigger wrapper\n\n // Check that tooltip appears\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n expect(innerFocusableButtons[0]).not.toHaveFocus();\n expect(innerFocusableButtons[1]).toHaveFocus();\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n await userEvent.tab();\n expect(innerFocusableButtons[1]).not.toHaveFocus();\n expect(args.onOpenChange).toHaveBeenCalledWith(false); //ensure that tooltip is no longer open\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // should also work with hover\n await userEvent.hover(triggerWrapper);\n\n // Check that tooltip appears\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n await userEvent.unhover(triggerWrapper);\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\n// Tooltip with focus trigger only\nexport const FocusTriggerOnly: Story = {\n args: {\n trigger: \"focus\",\n children: <span tabIndex={0}>Show tooltip</span>, // anything can be used as a trigger\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Hover over trigger\n await userEvent.hover(trigger);\n\n // Check that tooltip does NOT appear on hover\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n expect(args.onOpenChange).not.toHaveBeenCalled();\n\n // Move mouse away\n await userEvent.unhover(trigger);\n\n // Focus trigger\n await userEvent.tab();\n await expect(trigger).toHaveFocus();\n\n // Check that tooltip DOES appear on focus\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\n// Ensures that any custom event handlers on the trigger are called, and any custom props passed to it are passed through.\nexport const TriggerWithEventHandlers: Story = {\n parameters: {\n customOnFocus: fn(),\n },\n render: (args, { parameters }) => (\n <BaseTooltip {...args}>\n <button className=\"custom-class\" onFocus={parameters.customOnFocus}>\n Show tooltip\n </button>\n </BaseTooltip>\n ),\n play: async ({ args, canvasElement, parameters }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n\n await expect(trigger).toHaveClass(\"custom-class\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n expect(parameters.customOnFocus).not.toHaveBeenCalled();\n // Focus trigger\n await userEvent.tab();\n await expect(trigger).toHaveFocus();\n\n // Check that tooltip DOES appear on focus\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n expect(parameters.customOnFocus).toHaveBeenCalled();\n\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n\n // Move focus away\n await userEvent.tab();\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n },\n};\n\n// Disabled tooltip\nexport const Disabled: Story = {\n args: {\n isDisabled: true,\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n // Focus trigger\n await userEvent.tab();\n\n // Check that the disabled tooltip does NOT appear\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n expect(args.onOpenChange).not.toHaveBeenCalled();\n\n await userEvent.hover(trigger);\n },\n};\n\nexport const Controlled: Story = {\n render: ({ isOpen: _isOpen, onOpenChange, ...args }) => {\n const [open, setOpen] = useState(false);\n\n return (\n <BaseTooltip\n {...args}\n isOpen={open}\n onOpenChange={(newVal) => {\n setOpen(newVal);\n onOpenChange?.(newVal);\n }}\n />\n );\n },\n play: async ({ canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await userEvent.hover(trigger);\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n\n await userEvent.unhover(trigger);\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n },\n};\n\nexport const AriaButtonTrigger: Story = {\n args: {\n children: <BaseButton>Show tooltip</BaseButton>, // anything can be used as a trigger\n },\n play: async ({ args, canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await userEvent.hover(trigger);\n\n // Check that tooltip appears\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n expect(args.onOpenChange).toHaveBeenCalledTimes(1);\n\n await userEvent.unhover(trigger);\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n expect(args.onOpenChange).toHaveBeenCalledWith(false);\n expect(args.onOpenChange).toHaveBeenCalledTimes(2);\n\n await expect(trigger).not.toHaveFocus();\n\n // Focus trigger\n await userEvent.tab();\n expect(trigger).toHaveFocus();\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument()\n );\n expect(args.onOpenChange).toHaveBeenCalledWith(true);\n expect(args.onOpenChange).toHaveBeenCalledTimes(3);\n\n // Move focus away\n await userEvent.tab();\n await expect(canvas.getByText(\"Show tooltip\")).not.toHaveFocus();\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await waitFor(() => expect(args.onOpenChange).toHaveBeenCalledWith(false));\n expect(args.onOpenChange).toHaveBeenCalledTimes(4);\n },\n};\n\nexport const SelectedInCanvas: Story = {\n render: ({ __plasmic_selection_prop__, ...args }) => {\n const [selected, setSelected] = useState(false);\n const [selectedSlotName, setSelectedSlotName] = useState(\"\");\n\n useEffect(() => {\n setTimeout(() => {\n setSelected(true);\n setTimeout(() => {\n // Simulate trigger slot selection in Plasmic canvas\n setSelectedSlotName(\"children\");\n }, 1000);\n }, 1000);\n }, []);\n\n return (\n // Simulate Plasmic canvas envirnment\n <PlasmicCanvasContext.Provider\n value={{\n componentName: \"test\",\n globalVariants: {},\n }}\n >\n <BaseTooltip\n {...args}\n // Simulate node selection in Plasmic canvas\n __plasmic_selection_prop__={{\n isSelected: selected,\n selectedSlotName,\n }}\n />\n </PlasmicCanvasContext.Provider>\n );\n },\n play: async () => {\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await waitFor(\n () =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).toBeInTheDocument(),\n { timeout: 1100 }\n );\n\n await waitFor(\n () =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument(),\n { timeout: 1100 }\n );\n },\n};\n\n// Ensures that the tooltip is positioned relative to its trigger\nexport const TooltipPosition: Story = {\n render: (args) => {\n const [className, setClassName] = useState<string | undefined>(\"trigger\");\n\n return (\n <>\n <style\n dangerouslySetInnerHTML={{\n __html: `\n .trigger {\n display: inline-block;\n }\n .trigger-right {\n position: absolute;\n right: 0;\n }\n `,\n }}\n />\n <button onClick={() => setClassName(\"trigger trigger-right\")}>\n Move right\n </button>\n <BaseTooltip {...args} className={className} />\n </>\n );\n },\n play: async ({ canvasElement }) => {\n const canvas = within(canvasElement);\n const trigger = canvas.getByText(\"Show tooltip\");\n const moveRightBtn = canvas.getByText(\"Move right\");\n\n await waitFor(() =>\n expect(\n within(document.body).queryByTestId(\"tooltip-content\")\n ).not.toBeInTheDocument()\n );\n\n await userEvent.hover(trigger);\n\n let initialTooltipLeftPosition: number;\n\n // Check that tooltip appears\n await waitFor(() => {\n const tooltip = within(document.body).getByTestId(\"tooltip-content\");\n initialTooltipLeftPosition = tooltip.getBoundingClientRect().left;\n });\n\n await userEvent.unhover(trigger);\n\n await userEvent.hover(trigger);\n\n await waitFor(async () => {\n const tooltip = within(document.body).getByTestId(\"tooltip-content\");\n expect(initialTooltipLeftPosition).toEqual(\n tooltip.getBoundingClientRect().left\n ); // opens at exactly the same position again\n });\n\n await userEvent.unhover(trigger);\n\n await userEvent.click(moveRightBtn);\n await userEvent.hover(trigger);\n\n await waitFor(() => {\n const tooltip = within(document.body).getByTestId(\"tooltip-content\");\n expect(initialTooltipLeftPosition).not.toEqual(\n tooltip.getBoundingClientRect().left\n ); // opens at a different position because the position of the trigger changed\n });\n },\n};\n"],"names":[],"mappings":"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"}
|