@tamagui/floating 2.7.6 → 3.0.0-beta.637.1

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.
Files changed (151) hide show
  1. package/dist/cjs/Floating.cjs +10 -11
  2. package/dist/cjs/Floating.native.cjs +37 -0
  3. package/dist/cjs/Floating.native.js +20 -20
  4. package/dist/cjs/Floating.native.js.map +1 -1
  5. package/dist/cjs/index.cjs +45 -46
  6. package/dist/cjs/index.native.cjs +74 -0
  7. package/dist/cjs/index.native.js +45 -45
  8. package/dist/cjs/index.native.js.map +1 -1
  9. package/dist/cjs/interactions/PopupTriggerMap.cjs +36 -39
  10. package/dist/cjs/interactions/PopupTriggerMap.native.cjs +96 -0
  11. package/dist/cjs/interactions/PopupTriggerMap.native.js +76 -75
  12. package/dist/cjs/interactions/PopupTriggerMap.native.js.map +1 -1
  13. package/dist/cjs/interactions/createFloatingEvents.cjs +36 -39
  14. package/dist/cjs/interactions/createFloatingEvents.native.cjs +52 -0
  15. package/dist/cjs/interactions/createFloatingEvents.native.js +39 -41
  16. package/dist/cjs/interactions/createFloatingEvents.native.js.map +1 -1
  17. package/dist/cjs/interactions/safePolygon.cjs +263 -252
  18. package/dist/cjs/interactions/safePolygon.native.cjs +294 -0
  19. package/dist/cjs/interactions/safePolygon.native.js +271 -259
  20. package/dist/cjs/interactions/safePolygon.native.js.map +1 -1
  21. package/dist/cjs/interactions/types.cjs +10 -11
  22. package/dist/cjs/interactions/types.native.cjs +19 -0
  23. package/dist/cjs/interactions/types.native.js +10 -10
  24. package/dist/cjs/interactions/types.native.js.map +1 -1
  25. package/dist/cjs/interactions/useClick.cjs +96 -105
  26. package/dist/cjs/interactions/useClick.native.cjs +122 -0
  27. package/dist/cjs/interactions/useClick.native.js +101 -109
  28. package/dist/cjs/interactions/useClick.native.js.map +1 -1
  29. package/dist/cjs/interactions/useDelayGroup.cjs +86 -91
  30. package/dist/cjs/interactions/useDelayGroup.native.cjs +119 -0
  31. package/dist/cjs/interactions/useDelayGroup.native.js +92 -96
  32. package/dist/cjs/interactions/useDelayGroup.native.js.map +1 -1
  33. package/dist/cjs/interactions/useFocus.cjs +108 -115
  34. package/dist/cjs/interactions/useFocus.native.cjs +131 -0
  35. package/dist/cjs/interactions/useFocus.native.js +114 -120
  36. package/dist/cjs/interactions/useFocus.native.js.map +1 -1
  37. package/dist/cjs/interactions/useHover.cjs +321 -335
  38. package/dist/cjs/interactions/useHover.native.cjs +357 -0
  39. package/dist/cjs/interactions/useHover.native.js +333 -347
  40. package/dist/cjs/interactions/useHover.native.js.map +1 -1
  41. package/dist/cjs/interactions/useInnerOffset.cjs +103 -111
  42. package/dist/cjs/interactions/useInnerOffset.native.cjs +132 -0
  43. package/dist/cjs/interactions/useInnerOffset.native.js +113 -120
  44. package/dist/cjs/interactions/useInnerOffset.native.js.map +1 -1
  45. package/dist/cjs/interactions/useInteractions.cjs +85 -90
  46. package/dist/cjs/interactions/useInteractions.native.cjs +199 -0
  47. package/dist/cjs/interactions/useInteractions.native.js +180 -195
  48. package/dist/cjs/interactions/useInteractions.native.js.map +1 -1
  49. package/dist/cjs/interactions/useListNavigation.cjs +404 -390
  50. package/dist/cjs/interactions/useListNavigation.native.cjs +446 -0
  51. package/dist/cjs/interactions/useListNavigation.native.js +416 -401
  52. package/dist/cjs/interactions/useListNavigation.native.js.map +1 -1
  53. package/dist/cjs/interactions/useRole.cjs +92 -106
  54. package/dist/cjs/interactions/useRole.native.cjs +121 -0
  55. package/dist/cjs/interactions/useRole.native.js +103 -116
  56. package/dist/cjs/interactions/useRole.native.js.map +1 -1
  57. package/dist/cjs/interactions/useTypeahead.cjs +115 -129
  58. package/dist/cjs/interactions/useTypeahead.native.cjs +144 -0
  59. package/dist/cjs/interactions/useTypeahead.native.js +128 -141
  60. package/dist/cjs/interactions/useTypeahead.native.js.map +1 -1
  61. package/dist/cjs/interactions/utils.cjs +126 -143
  62. package/dist/cjs/interactions/utils.native.cjs +209 -0
  63. package/dist/cjs/interactions/utils.native.js +138 -154
  64. package/dist/cjs/interactions/utils.native.js.map +1 -1
  65. package/dist/cjs/middleware/inner.cjs +74 -101
  66. package/dist/cjs/middleware/inner.native.cjs +102 -0
  67. package/dist/cjs/middleware/inner.native.js +83 -109
  68. package/dist/cjs/middleware/inner.native.js.map +1 -1
  69. package/dist/cjs/useFloating.cjs +34 -46
  70. package/dist/cjs/useFloating.native.cjs +56 -0
  71. package/dist/cjs/useFloating.native.js +37 -48
  72. package/dist/cjs/useFloating.native.js.map +1 -1
  73. package/dist/esm/Floating.mjs +1 -2
  74. package/dist/esm/Floating.native.js +6 -4
  75. package/dist/esm/Floating.native.js.map +1 -1
  76. package/dist/esm/index.js +4 -5
  77. package/dist/esm/index.mjs +4 -5
  78. package/dist/esm/index.native.js +4 -5
  79. package/dist/esm/interactions/PopupTriggerMap.mjs +23 -22
  80. package/dist/esm/interactions/PopupTriggerMap.mjs.map +1 -1
  81. package/dist/esm/interactions/PopupTriggerMap.native.js +62 -58
  82. package/dist/esm/interactions/PopupTriggerMap.native.js.map +1 -1
  83. package/dist/esm/interactions/createFloatingEvents.mjs +22 -21
  84. package/dist/esm/interactions/createFloatingEvents.mjs.map +1 -1
  85. package/dist/esm/interactions/createFloatingEvents.native.js +25 -24
  86. package/dist/esm/interactions/createFloatingEvents.native.js.map +1 -1
  87. package/dist/esm/interactions/safePolygon.mjs +250 -234
  88. package/dist/esm/interactions/safePolygon.mjs.map +1 -1
  89. package/dist/esm/interactions/safePolygon.native.js +258 -242
  90. package/dist/esm/interactions/safePolygon.native.js.map +1 -1
  91. package/dist/esm/interactions/types.mjs +0 -2
  92. package/dist/esm/interactions/types.native.js +0 -2
  93. package/dist/esm/interactions/useClick.mjs +83 -87
  94. package/dist/esm/interactions/useClick.mjs.map +1 -1
  95. package/dist/esm/interactions/useClick.native.js +88 -92
  96. package/dist/esm/interactions/useClick.native.js.map +1 -1
  97. package/dist/esm/interactions/useDelayGroup.mjs +68 -65
  98. package/dist/esm/interactions/useDelayGroup.mjs.map +1 -1
  99. package/dist/esm/interactions/useDelayGroup.native.js +74 -71
  100. package/dist/esm/interactions/useDelayGroup.native.js.map +1 -1
  101. package/dist/esm/interactions/useFocus.mjs +95 -97
  102. package/dist/esm/interactions/useFocus.mjs.map +1 -1
  103. package/dist/esm/interactions/useFocus.native.js +101 -103
  104. package/dist/esm/interactions/useFocus.native.js.map +1 -1
  105. package/dist/esm/interactions/useHover.mjs +304 -310
  106. package/dist/esm/interactions/useHover.mjs.map +1 -1
  107. package/dist/esm/interactions/useHover.native.js +316 -323
  108. package/dist/esm/interactions/useHover.native.js.map +1 -1
  109. package/dist/esm/interactions/useInnerOffset.mjs +87 -85
  110. package/dist/esm/interactions/useInnerOffset.mjs.map +1 -1
  111. package/dist/esm/interactions/useInnerOffset.native.js +97 -95
  112. package/dist/esm/interactions/useInnerOffset.native.js.map +1 -1
  113. package/dist/esm/interactions/useInteractions.mjs +71 -72
  114. package/dist/esm/interactions/useInteractions.mjs.map +1 -1
  115. package/dist/esm/interactions/useInteractions.native.js +166 -178
  116. package/dist/esm/interactions/useInteractions.native.js.map +1 -1
  117. package/dist/esm/interactions/useListNavigation.mjs +392 -373
  118. package/dist/esm/interactions/useListNavigation.mjs.map +1 -1
  119. package/dist/esm/interactions/useListNavigation.native.js +404 -385
  120. package/dist/esm/interactions/useListNavigation.native.js.map +1 -1
  121. package/dist/esm/interactions/useRole.mjs +76 -80
  122. package/dist/esm/interactions/useRole.mjs.map +1 -1
  123. package/dist/esm/interactions/useRole.native.js +87 -91
  124. package/dist/esm/interactions/useRole.native.js.map +1 -1
  125. package/dist/esm/interactions/useTypeahead.mjs +102 -111
  126. package/dist/esm/interactions/useTypeahead.mjs.map +1 -1
  127. package/dist/esm/interactions/useTypeahead.native.js +115 -124
  128. package/dist/esm/interactions/useTypeahead.native.js.map +1 -1
  129. package/dist/esm/interactions/utils.mjs +91 -106
  130. package/dist/esm/interactions/utils.mjs.map +1 -1
  131. package/dist/esm/interactions/utils.native.js +103 -118
  132. package/dist/esm/interactions/utils.native.js.map +1 -1
  133. package/dist/esm/middleware/inner.mjs +58 -75
  134. package/dist/esm/middleware/inner.mjs.map +1 -1
  135. package/dist/esm/middleware/inner.native.js +67 -84
  136. package/dist/esm/middleware/inner.native.js.map +1 -1
  137. package/dist/esm/useFloating.mjs +17 -21
  138. package/dist/esm/useFloating.mjs.map +1 -1
  139. package/dist/esm/useFloating.native.js +19 -23
  140. package/dist/esm/useFloating.native.js.map +1 -1
  141. package/package.json +6 -5
  142. package/types/interactions/PopupTriggerMap.d.ts.map +1 -1
  143. package/types/interactions/useInteractions.d.ts.map +1 -1
  144. package/types/middleware/inner.d.ts.map +1 -1
  145. package/types/useFloating.d.ts.map +1 -1
  146. package/dist/esm/Floating.mjs.map +0 -1
  147. package/dist/esm/index.js.map +0 -1
  148. package/dist/esm/index.mjs.map +0 -1
  149. package/dist/esm/index.native.js.map +0 -1
  150. package/dist/esm/interactions/types.mjs.map +0 -1
  151. package/dist/esm/interactions/types.native.js.map +0 -1
@@ -1,3 +1,4 @@
1
+
1
2
  var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -5,36 +6,29 @@ var __getOwnPropNames = Object.getOwnPropertyNames;
5
6
  var __getProtoOf = Object.getPrototypeOf;
6
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
8
  var __export = (target, all) => {
8
- for (var name in all) __defProp(target, name, {
9
- get: all[name],
10
- enumerable: true
11
- });
9
+ for (var name in all) __defProp(target, name, {
10
+ get: all[name],
11
+ enumerable: true
12
+ });
12
13
  };
13
14
  var __copyProps = (to, from, except, desc) => {
14
- if (from && typeof from === "object" || typeof from === "function") {
15
- for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
- get: () => from[key],
17
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
- });
19
- }
20
- return to;
15
+ if (from && typeof from === "object" || typeof from === "function") {
16
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
17
+ get: () => from[key],
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ return to;
21
22
  };
22
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
23
- // If the importer is in node compatibility mode or this is not an ESM
24
- // file that has been converted to a CommonJS file using a Babel-
25
- // compatible transform (i.e. "__esModule" has not been set), then set
26
- // "default" to the CommonJS "module.exports" for node compatibility.
27
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
28
- value: mod,
29
- enumerable: true
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
+ value: mod,
25
+ enumerable: true
30
26
  }) : target, mod));
31
- var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
32
- value: true
33
- }), mod);
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
34
28
  var useHover_exports = {};
35
29
  __export(useHover_exports, {
36
- getDelay: () => getDelay,
37
- useHover: () => useHover
30
+ getDelay: () => getDelay,
31
+ useHover: () => useHover
38
32
  });
39
33
  module.exports = __toCommonJS(useHover_exports);
40
34
  var React = __toESM(require("react"), 1);
@@ -42,316 +36,308 @@ var import_use_event = require("@tamagui/use-event");
42
36
  var import_utils = require("./utils.cjs");
43
37
  const safePolygonIdentifier = "data-floating-ui-safe-polygon";
44
38
  function getDelay(value, prop, pointerType) {
45
- if (pointerType && !(0, import_utils.isMouseLikePointerType)(pointerType)) {
46
- return 0;
47
- }
48
- if (typeof value === "number") {
49
- return value;
50
- }
51
- return value?.[prop];
39
+ if (pointerType && !(0, import_utils.isMouseLikePointerType)(pointerType)) {
40
+ return 0;
41
+ }
42
+ if (typeof value === "number") {
43
+ return value;
44
+ }
45
+ return value?.[prop];
52
46
  }
53
47
  function useHover(context, props = {}) {
54
- const {
55
- open,
56
- onOpenChange,
57
- dataRef,
58
- events,
59
- elements
60
- } = context;
61
- const {
62
- enabled = true,
63
- delay = 0,
64
- handleClose = null,
65
- mouseOnly = false,
66
- restMs = 0,
67
- move = true
68
- } = props;
69
- const handleCloseRef = React.useRef(handleClose);
70
- handleCloseRef.current = handleClose;
71
- const delayRef = React.useRef(delay);
72
- delayRef.current = delay;
73
- const openRef = React.useRef(open);
74
- openRef.current = open;
75
- const restMsRef = React.useRef(restMs);
76
- restMsRef.current = restMs;
77
- const stableOnOpenChange = (0, import_use_event.useEvent)(onOpenChange);
78
- const pointerTypeRef = React.useRef(void 0);
79
- const timeoutRef = React.useRef(-1);
80
- const handlerRef = React.useRef(void 0);
81
- const restTimeoutRef = React.useRef(-1);
82
- const blockMouseMoveRef = React.useRef(true);
83
- const performedPointerEventsMutationRef = React.useRef(false);
84
- const unbindMouseMoveRef = React.useRef(() => {});
85
- const restTimeoutPendingRef = React.useRef(false);
86
- const isHoverOpen = (0, import_use_event.useEvent)(() => {
87
- const type = dataRef.current.openEvent?.type;
88
- return type?.includes("mouse") && type !== "mousedown";
89
- });
90
- React.useEffect(() => {
91
- if (!enabled) return;
92
- if (!events) return;
93
- function onOpenChange2({
94
- open: open2
95
- }) {
96
- if (!open2) {
97
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
98
- (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
99
- blockMouseMoveRef.current = true;
100
- restTimeoutPendingRef.current = false;
101
- }
102
- }
103
- events.on("openchange", onOpenChange2);
104
- return () => {
105
- events.off("openchange", onOpenChange2);
106
- };
107
- }, [enabled, events]);
108
- const closeWithDelay = (0, import_use_event.useEvent)((event, runElseBranch = true, reason = "hover") => {
109
- const closeDelay = getDelay(delayRef.current, "close", pointerTypeRef.current);
110
- if (closeDelay && !handlerRef.current) {
111
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
112
- timeoutRef.current = window.setTimeout(() => stableOnOpenChange(false, event, reason), closeDelay);
113
- } else if (runElseBranch) {
114
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
115
- stableOnOpenChange(false, event, reason);
116
- }
117
- });
118
- const cleanupMouseMoveHandler = (0, import_use_event.useEvent)(() => {
119
- unbindMouseMoveRef.current();
120
- handlerRef.current = void 0;
121
- if (context.handleCloseActiveRef) {
122
- context.handleCloseActiveRef.current = false;
123
- }
124
- });
125
- const clearPointerEvents = (0, import_use_event.useEvent)(() => {
126
- if (performedPointerEventsMutationRef.current) {
127
- const body = (0, import_utils.getDocument)(elements.floating).body;
128
- body.style.pointerEvents = "";
129
- body.removeAttribute(safePolygonIdentifier);
130
- performedPointerEventsMutationRef.current = false;
131
- }
132
- });
133
- const isClickLikeOpenEvent = (0, import_use_event.useEvent)(() => {
134
- return dataRef.current.openEvent ? ["click", "mousedown"].includes(dataRef.current.openEvent.type) : false;
135
- });
136
- React.useEffect(() => {
137
- if (!enabled) return;
138
- function onReferenceMouseEnter(event) {
139
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
140
- blockMouseMoveRef.current = false;
141
- if (mouseOnly && !(0, import_utils.isMouseLikePointerType)(pointerTypeRef.current) || restMsRef.current > 0 && !getDelay(delayRef.current, "open")) {
142
- return;
143
- }
144
- const openDelay = getDelay(delayRef.current, "open", pointerTypeRef.current);
145
- if (openDelay) {
146
- timeoutRef.current = window.setTimeout(() => {
147
- if (!openRef.current) {
148
- stableOnOpenChange(true, event, "hover");
149
- }
150
- }, openDelay);
151
- } else if (!open) {
152
- stableOnOpenChange(true, event, "hover");
153
- }
154
- }
155
- function onReferenceMouseLeave(event) {
156
- if (isClickLikeOpenEvent()) {
157
- clearPointerEvents();
158
- return;
159
- }
160
- if (context.triggerElements?.hasElement(event.relatedTarget)) {
161
- return;
162
- }
163
- unbindMouseMoveRef.current();
164
- const doc = (0, import_utils.getDocument)(elements.floating);
165
- (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
166
- restTimeoutPendingRef.current = false;
167
- if (handleCloseRef.current) {
168
- if (!open) {
169
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
170
- }
171
- const placement = dataRef.current.placement || "bottom";
172
- const reference2 = elements.domReference;
173
- const floating = elements.floating;
174
- if (!reference2 || !floating) return;
175
- handlerRef.current = handleCloseRef.current({
176
- x: event.clientX,
177
- y: event.clientY,
178
- placement,
179
- elements: {
180
- reference: reference2,
181
- floating,
182
- domReference: reference2
183
- },
184
- onClose() {
185
- if (context.handleCloseActiveRef) {
186
- context.handleCloseActiveRef.current = false;
187
- }
188
- clearPointerEvents();
189
- cleanupMouseMoveHandler();
190
- if (!isClickLikeOpenEvent()) {
191
- closeWithDelay(event, true, "safe-polygon");
192
- }
193
- }
194
- });
195
- if (context.handleCloseActiveRef) {
196
- context.handleCloseActiveRef.current = true;
197
- }
198
- const handler = handlerRef.current;
199
- doc.addEventListener("mousemove", handler);
200
- unbindMouseMoveRef.current = () => {
201
- doc.removeEventListener("mousemove", handler);
202
- };
203
- return;
204
- }
205
- const shouldClose = pointerTypeRef.current === "touch" ? !(0, import_utils.contains)(elements.floating, event.relatedTarget) : true;
206
- if (shouldClose) {
207
- closeWithDelay(event);
208
- }
209
- }
210
- function onScrollMouseLeave(event) {
211
- if (isClickLikeOpenEvent()) return;
212
- if (context.triggerElements?.hasElement(event.relatedTarget)) {
213
- return;
214
- }
215
- const placement = dataRef.current.placement || "bottom";
216
- const reference2 = elements.domReference;
217
- const floating = elements.floating;
218
- if (!reference2 || !floating) return;
219
- handleCloseRef.current?.({
220
- x: event.clientX,
221
- y: event.clientY,
222
- placement,
223
- elements: {
224
- reference: reference2,
225
- floating,
226
- domReference: reference2
227
- },
228
- onClose() {
229
- clearPointerEvents();
230
- cleanupMouseMoveHandler();
231
- if (!isClickLikeOpenEvent()) {
232
- closeWithDelay(event);
233
- }
234
- }
235
- })(event);
236
- }
237
- function onFloatingMouseEnter() {
238
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
239
- }
240
- function onFloatingMouseLeave(event) {
241
- if (isClickLikeOpenEvent()) return;
242
- if (context.triggerElements?.hasElement(event.relatedTarget)) {
243
- return;
244
- }
245
- closeWithDelay(event, false);
246
- }
247
- if ((0, import_utils.isElement)(elements.domReference)) {
248
- const reference2 = elements.domReference;
249
- const floating = elements.floating;
250
- if (open) {
251
- reference2.addEventListener("mouseleave", onScrollMouseLeave);
252
- }
253
- if (move) {
254
- reference2.addEventListener("mousemove", onReferenceMouseEnter, {
255
- once: true
256
- });
257
- }
258
- reference2.addEventListener("mouseenter", onReferenceMouseEnter);
259
- reference2.addEventListener("mouseleave", onReferenceMouseLeave);
260
- if (floating) {
261
- floating.addEventListener("mouseleave", onScrollMouseLeave);
262
- floating.addEventListener("mouseenter", onFloatingMouseEnter);
263
- floating.addEventListener("mouseleave", onFloatingMouseLeave);
264
- }
265
- return () => {
266
- if (open) {
267
- reference2.removeEventListener("mouseleave", onScrollMouseLeave);
268
- }
269
- if (move) {
270
- reference2.removeEventListener("mousemove", onReferenceMouseEnter);
271
- }
272
- reference2.removeEventListener("mouseenter", onReferenceMouseEnter);
273
- reference2.removeEventListener("mouseleave", onReferenceMouseLeave);
274
- if (floating) {
275
- floating.removeEventListener("mouseleave", onScrollMouseLeave);
276
- floating.removeEventListener("mouseenter", onFloatingMouseEnter);
277
- floating.removeEventListener("mouseleave", onFloatingMouseLeave);
278
- }
279
- cleanupMouseMoveHandler();
280
- };
281
- }
282
- }, [elements, enabled, context, mouseOnly, move, open, dataRef]);
283
- React.useLayoutEffect(() => {
284
- if (!enabled) return;
285
- if (open && handleCloseRef.current?.__options?.blockPointerEvents && isHoverOpen()) {
286
- performedPointerEventsMutationRef.current = true;
287
- const floatingEl = elements.floating;
288
- if ((0, import_utils.isElement)(elements.domReference) && floatingEl) {
289
- const body = (0, import_utils.getDocument)(elements.floating).body;
290
- body.setAttribute(safePolygonIdentifier, "");
291
- const ref = elements.domReference;
292
- body.style.pointerEvents = "none";
293
- ref.style.pointerEvents = "auto";
294
- floatingEl.style.pointerEvents = "auto";
295
- return () => {
296
- body.style.pointerEvents = "";
297
- ref.style.pointerEvents = "";
298
- floatingEl.style.pointerEvents = "";
299
- };
300
- }
301
- }
302
- }, [enabled, open, elements, isHoverOpen]);
303
- React.useLayoutEffect(() => {
304
- if (!open) {
305
- pointerTypeRef.current = void 0;
306
- restTimeoutPendingRef.current = false;
307
- cleanupMouseMoveHandler();
308
- clearPointerEvents();
309
- }
310
- }, [open]);
311
- React.useEffect(() => {
312
- return () => {
313
- cleanupMouseMoveHandler();
314
- (0, import_utils.clearTimeoutIfSet)(timeoutRef);
315
- (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
316
- clearPointerEvents();
317
- };
318
- }, [enabled, elements.domReference]);
319
- const reference = React.useMemo(() => {
320
- function setPointerRef(event) {
321
- pointerTypeRef.current = event.pointerType;
322
- }
323
- return {
324
- onPointerDown: setPointerRef,
325
- onPointerEnter: setPointerRef,
326
- onMouseMove(event) {
327
- const {
328
- nativeEvent
329
- } = event;
330
- function handleMouseMove() {
331
- if (!blockMouseMoveRef.current && !openRef.current) {
332
- stableOnOpenChange(true, nativeEvent, "hover");
333
- }
334
- }
335
- if (mouseOnly && !(0, import_utils.isMouseLikePointerType)(pointerTypeRef.current)) {
336
- return;
337
- }
338
- if (open || restMsRef.current === 0) {
339
- return;
340
- }
341
- if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {
342
- return;
343
- }
344
- (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
345
- if (pointerTypeRef.current === "touch") {
346
- handleMouseMove();
347
- } else {
348
- restTimeoutPendingRef.current = true;
349
- restTimeoutRef.current = window.setTimeout(handleMouseMove, restMsRef.current);
350
- }
351
- }
352
- };
353
- }, [mouseOnly, open]);
354
- return React.useMemo(() => enabled ? {
355
- reference
356
- } : {}, [enabled, reference]);
357
- }
48
+ const { open, onOpenChange, dataRef, events, elements } = context;
49
+ const { enabled = true, delay = 0, handleClose = null, mouseOnly = false, restMs = 0, move = true } = props;
50
+ const handleCloseRef = React.useRef(handleClose);
51
+ handleCloseRef.current = handleClose;
52
+ const delayRef = React.useRef(delay);
53
+ delayRef.current = delay;
54
+ const openRef = React.useRef(open);
55
+ openRef.current = open;
56
+ const restMsRef = React.useRef(restMs);
57
+ restMsRef.current = restMs;
58
+ const stableOnOpenChange = (0, import_use_event.useEvent)(onOpenChange);
59
+ const pointerTypeRef = React.useRef(void 0);
60
+ const timeoutRef = React.useRef(-1);
61
+ const handlerRef = React.useRef(void 0);
62
+ const restTimeoutRef = React.useRef(-1);
63
+ const blockMouseMoveRef = React.useRef(true);
64
+ const performedPointerEventsMutationRef = React.useRef(false);
65
+ const unbindMouseMoveRef = React.useRef(() => {});
66
+ const restTimeoutPendingRef = React.useRef(false);
67
+ const isHoverOpen = (0, import_use_event.useEvent)(() => {
68
+ const type = dataRef.current.openEvent?.type;
69
+ return type?.includes("mouse") && type !== "mousedown";
70
+ });
71
+ React.useEffect(() => {
72
+ if (!enabled) return;
73
+ if (!events) return;
74
+ function onOpenChange2({ open: open2 }) {
75
+ if (!open2) {
76
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
77
+ (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
78
+ blockMouseMoveRef.current = true;
79
+ restTimeoutPendingRef.current = false;
80
+ }
81
+ }
82
+ events.on("openchange", onOpenChange2);
83
+ return () => {
84
+ events.off("openchange", onOpenChange2);
85
+ };
86
+ }, [enabled, events]);
87
+ const closeWithDelay = (0, import_use_event.useEvent)((event, runElseBranch = true, reason = "hover") => {
88
+ const closeDelay = getDelay(delayRef.current, "close", pointerTypeRef.current);
89
+ if (closeDelay && !handlerRef.current) {
90
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
91
+ timeoutRef.current = window.setTimeout(() => stableOnOpenChange(false, event, reason), closeDelay);
92
+ } else if (runElseBranch) {
93
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
94
+ stableOnOpenChange(false, event, reason);
95
+ }
96
+ });
97
+ const cleanupMouseMoveHandler = (0, import_use_event.useEvent)(() => {
98
+ unbindMouseMoveRef.current();
99
+ handlerRef.current = void 0;
100
+ if (context.handleCloseActiveRef) {
101
+ context.handleCloseActiveRef.current = false;
102
+ }
103
+ });
104
+ const clearPointerEvents = (0, import_use_event.useEvent)(() => {
105
+ if (performedPointerEventsMutationRef.current) {
106
+ const body = (0, import_utils.getDocument)(elements.floating).body;
107
+ body.style.pointerEvents = "";
108
+ body.removeAttribute(safePolygonIdentifier);
109
+ performedPointerEventsMutationRef.current = false;
110
+ }
111
+ });
112
+ const isClickLikeOpenEvent = (0, import_use_event.useEvent)(() => {
113
+ return dataRef.current.openEvent ? ["click", "mousedown"].includes(dataRef.current.openEvent.type) : false;
114
+ });
115
+ React.useEffect(() => {
116
+ if (!enabled) return;
117
+ function onReferenceMouseEnter(event) {
118
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
119
+ blockMouseMoveRef.current = false;
120
+ if (mouseOnly && !(0, import_utils.isMouseLikePointerType)(pointerTypeRef.current) || restMsRef.current > 0 && !getDelay(delayRef.current, "open")) {
121
+ return;
122
+ }
123
+ const openDelay = getDelay(delayRef.current, "open", pointerTypeRef.current);
124
+ if (openDelay) {
125
+ timeoutRef.current = window.setTimeout(() => {
126
+ if (!openRef.current) {
127
+ stableOnOpenChange(true, event, "hover");
128
+ }
129
+ }, openDelay);
130
+ } else if (!open) {
131
+ stableOnOpenChange(true, event, "hover");
132
+ }
133
+ }
134
+ function onReferenceMouseLeave(event) {
135
+ if (isClickLikeOpenEvent()) {
136
+ clearPointerEvents();
137
+ return;
138
+ }
139
+ if (context.triggerElements?.hasElement(event.relatedTarget)) {
140
+ return;
141
+ }
142
+ unbindMouseMoveRef.current();
143
+ const doc = (0, import_utils.getDocument)(elements.floating);
144
+ (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
145
+ restTimeoutPendingRef.current = false;
146
+ if (handleCloseRef.current) {
147
+ if (!open) {
148
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
149
+ }
150
+ const placement = dataRef.current.placement || "bottom";
151
+ const reference2 = elements.domReference;
152
+ const floating = elements.floating;
153
+ if (!reference2 || !floating) return;
154
+ handlerRef.current = handleCloseRef.current({
155
+ x: event.clientX,
156
+ y: event.clientY,
157
+ placement,
158
+ elements: {
159
+ reference: reference2,
160
+ floating,
161
+ domReference: reference2
162
+ },
163
+ onClose() {
164
+ if (context.handleCloseActiveRef) {
165
+ context.handleCloseActiveRef.current = false;
166
+ }
167
+ clearPointerEvents();
168
+ cleanupMouseMoveHandler();
169
+ if (!isClickLikeOpenEvent()) {
170
+ closeWithDelay(event, true, "safe-polygon");
171
+ }
172
+ }
173
+ });
174
+ if (context.handleCloseActiveRef) {
175
+ context.handleCloseActiveRef.current = true;
176
+ }
177
+ const handler = handlerRef.current;
178
+ doc.addEventListener("mousemove", handler);
179
+ unbindMouseMoveRef.current = () => {
180
+ doc.removeEventListener("mousemove", handler);
181
+ };
182
+ return;
183
+ }
184
+ const shouldClose = pointerTypeRef.current === "touch" ? !(0, import_utils.contains)(elements.floating, event.relatedTarget) : true;
185
+ if (shouldClose) {
186
+ closeWithDelay(event);
187
+ }
188
+ }
189
+ function onScrollMouseLeave(event) {
190
+ if (isClickLikeOpenEvent()) return;
191
+ if (context.triggerElements?.hasElement(event.relatedTarget)) {
192
+ return;
193
+ }
194
+ const placement = dataRef.current.placement || "bottom";
195
+ const reference2 = elements.domReference;
196
+ const floating = elements.floating;
197
+ if (!reference2 || !floating) return;
198
+ handleCloseRef.current?.({
199
+ x: event.clientX,
200
+ y: event.clientY,
201
+ placement,
202
+ elements: {
203
+ reference: reference2,
204
+ floating,
205
+ domReference: reference2
206
+ },
207
+ onClose() {
208
+ clearPointerEvents();
209
+ cleanupMouseMoveHandler();
210
+ if (!isClickLikeOpenEvent()) {
211
+ closeWithDelay(event);
212
+ }
213
+ }
214
+ })(event);
215
+ }
216
+ function onFloatingMouseEnter() {
217
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
218
+ }
219
+ function onFloatingMouseLeave(event) {
220
+ if (isClickLikeOpenEvent()) return;
221
+ if (context.triggerElements?.hasElement(event.relatedTarget)) {
222
+ return;
223
+ }
224
+ closeWithDelay(event, false);
225
+ }
226
+ if ((0, import_utils.isElement)(elements.domReference)) {
227
+ const reference2 = elements.domReference;
228
+ const floating = elements.floating;
229
+ if (open) {
230
+ reference2.addEventListener("mouseleave", onScrollMouseLeave);
231
+ }
232
+ if (move) {
233
+ reference2.addEventListener("mousemove", onReferenceMouseEnter, { once: true });
234
+ }
235
+ reference2.addEventListener("mouseenter", onReferenceMouseEnter);
236
+ reference2.addEventListener("mouseleave", onReferenceMouseLeave);
237
+ if (floating) {
238
+ floating.addEventListener("mouseleave", onScrollMouseLeave);
239
+ floating.addEventListener("mouseenter", onFloatingMouseEnter);
240
+ floating.addEventListener("mouseleave", onFloatingMouseLeave);
241
+ }
242
+ return () => {
243
+ if (open) {
244
+ reference2.removeEventListener("mouseleave", onScrollMouseLeave);
245
+ }
246
+ if (move) {
247
+ reference2.removeEventListener("mousemove", onReferenceMouseEnter);
248
+ }
249
+ reference2.removeEventListener("mouseenter", onReferenceMouseEnter);
250
+ reference2.removeEventListener("mouseleave", onReferenceMouseLeave);
251
+ if (floating) {
252
+ floating.removeEventListener("mouseleave", onScrollMouseLeave);
253
+ floating.removeEventListener("mouseenter", onFloatingMouseEnter);
254
+ floating.removeEventListener("mouseleave", onFloatingMouseLeave);
255
+ }
256
+ cleanupMouseMoveHandler();
257
+ };
258
+ }
259
+ }, [
260
+ elements,
261
+ enabled,
262
+ context,
263
+ mouseOnly,
264
+ move,
265
+ open,
266
+ dataRef
267
+ ]);
268
+ React.useLayoutEffect(() => {
269
+ if (!enabled) return;
270
+ if (open && handleCloseRef.current?.__options?.blockPointerEvents && isHoverOpen()) {
271
+ performedPointerEventsMutationRef.current = true;
272
+ const floatingEl = elements.floating;
273
+ if ((0, import_utils.isElement)(elements.domReference) && floatingEl) {
274
+ const body = (0, import_utils.getDocument)(elements.floating).body;
275
+ body.setAttribute(safePolygonIdentifier, "");
276
+ const ref = elements.domReference;
277
+ body.style.pointerEvents = "none";
278
+ ref.style.pointerEvents = "auto";
279
+ floatingEl.style.pointerEvents = "auto";
280
+ return () => {
281
+ body.style.pointerEvents = "";
282
+ ref.style.pointerEvents = "";
283
+ floatingEl.style.pointerEvents = "";
284
+ };
285
+ }
286
+ }
287
+ }, [
288
+ enabled,
289
+ open,
290
+ elements,
291
+ isHoverOpen
292
+ ]);
293
+ React.useLayoutEffect(() => {
294
+ if (!open) {
295
+ pointerTypeRef.current = void 0;
296
+ restTimeoutPendingRef.current = false;
297
+ cleanupMouseMoveHandler();
298
+ clearPointerEvents();
299
+ }
300
+ }, [open]);
301
+ React.useEffect(() => {
302
+ return () => {
303
+ cleanupMouseMoveHandler();
304
+ (0, import_utils.clearTimeoutIfSet)(timeoutRef);
305
+ (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
306
+ clearPointerEvents();
307
+ };
308
+ }, [enabled, elements.domReference]);
309
+ const reference = React.useMemo(() => {
310
+ function setPointerRef(event) {
311
+ pointerTypeRef.current = event.pointerType;
312
+ }
313
+ return {
314
+ onPointerDown: setPointerRef,
315
+ onPointerEnter: setPointerRef,
316
+ onMouseMove(event) {
317
+ const { nativeEvent } = event;
318
+ function handleMouseMove() {
319
+ if (!blockMouseMoveRef.current && !openRef.current) {
320
+ stableOnOpenChange(true, nativeEvent, "hover");
321
+ }
322
+ }
323
+ if (mouseOnly && !(0, import_utils.isMouseLikePointerType)(pointerTypeRef.current)) {
324
+ return;
325
+ }
326
+ if (open || restMsRef.current === 0) {
327
+ return;
328
+ }
329
+ if (restTimeoutPendingRef.current && event.movementX ** 2 + event.movementY ** 2 < 2) {
330
+ return;
331
+ }
332
+ (0, import_utils.clearTimeoutIfSet)(restTimeoutRef);
333
+ if (pointerTypeRef.current === "touch") {
334
+ handleMouseMove();
335
+ } else {
336
+ restTimeoutPendingRef.current = true;
337
+ restTimeoutRef.current = window.setTimeout(handleMouseMove, restMsRef.current);
338
+ }
339
+ }
340
+ };
341
+ }, [mouseOnly, open]);
342
+ return React.useMemo(() => enabled ? { reference } : {}, [enabled, reference]);
343
+ }