@tamagui/floating 2.7.7 → 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,333 +1,326 @@
1
1
  import * as React from "react";
2
2
  import { useEvent } from "@tamagui/use-event";
3
3
  import { clearTimeoutIfSet, contains, getDocument, isElement, isMouseLikePointerType } from "./utils.native.js";
4
+
4
5
  var safePolygonIdentifier = "data-floating-ui-safe-polygon";
5
6
  function getDelay(value, prop, pointerType) {
6
- if (pointerType && !isMouseLikePointerType(pointerType)) {
7
- return 0;
8
- }
9
- if (typeof value === "number") {
10
- return value;
11
- }
12
- return value === null || value === void 0 ? void 0 : value[prop];
7
+ if (pointerType && !isMouseLikePointerType(pointerType)) {
8
+ return 0;
9
+ }
10
+ if (typeof value === "number") {
11
+ return value;
12
+ }
13
+ return value === null || value === void 0 ? void 0 : value[prop];
13
14
  }
14
15
  function useHover(context) {
15
- var props = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
16
- var {
17
- open,
18
- onOpenChange,
19
- dataRef,
20
- events,
21
- elements
22
- } = context;
23
- var {
24
- enabled = true,
25
- delay = 0,
26
- handleClose = null,
27
- mouseOnly = false,
28
- restMs = 0,
29
- move = true
30
- } = props;
31
- var handleCloseRef = React.useRef(handleClose);
32
- handleCloseRef.current = handleClose;
33
- var delayRef = React.useRef(delay);
34
- delayRef.current = delay;
35
- var openRef = React.useRef(open);
36
- openRef.current = open;
37
- var restMsRef = React.useRef(restMs);
38
- restMsRef.current = restMs;
39
- var stableOnOpenChange = useEvent(onOpenChange);
40
- var pointerTypeRef = React.useRef(void 0);
41
- var timeoutRef = React.useRef(-1);
42
- var handlerRef = React.useRef(void 0);
43
- var restTimeoutRef = React.useRef(-1);
44
- var blockMouseMoveRef = React.useRef(true);
45
- var performedPointerEventsMutationRef = React.useRef(false);
46
- var unbindMouseMoveRef = React.useRef(function () {});
47
- var restTimeoutPendingRef = React.useRef(false);
48
- var isHoverOpen = useEvent(function () {
49
- var _dataRef_current_openEvent;
50
- var type = (_dataRef_current_openEvent = dataRef.current.openEvent) === null || _dataRef_current_openEvent === void 0 ? void 0 : _dataRef_current_openEvent.type;
51
- return (type === null || type === void 0 ? void 0 : type.includes("mouse")) && type !== "mousedown";
52
- });
53
- React.useEffect(function () {
54
- if (!enabled) return;
55
- if (!events) return;
56
- function onOpenChange2(param) {
57
- var {
58
- open: open2
59
- } = param;
60
- if (!open2) {
61
- clearTimeoutIfSet(timeoutRef);
62
- clearTimeoutIfSet(restTimeoutRef);
63
- blockMouseMoveRef.current = true;
64
- restTimeoutPendingRef.current = false;
65
- }
66
- }
67
- events.on("openchange", onOpenChange2);
68
- return function () {
69
- events.off("openchange", onOpenChange2);
70
- };
71
- }, [enabled, events]);
72
- var closeWithDelay = useEvent(function (event) {
73
- var runElseBranch = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true,
74
- reason = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "hover";
75
- var closeDelay = getDelay(delayRef.current, "close", pointerTypeRef.current);
76
- if (closeDelay && !handlerRef.current) {
77
- clearTimeoutIfSet(timeoutRef);
78
- timeoutRef.current = window.setTimeout(function () {
79
- return stableOnOpenChange(false, event, reason);
80
- }, closeDelay);
81
- } else if (runElseBranch) {
82
- clearTimeoutIfSet(timeoutRef);
83
- stableOnOpenChange(false, event, reason);
84
- }
85
- });
86
- var cleanupMouseMoveHandler = useEvent(function () {
87
- unbindMouseMoveRef.current();
88
- handlerRef.current = void 0;
89
- if (context.handleCloseActiveRef) {
90
- context.handleCloseActiveRef.current = false;
91
- }
92
- });
93
- var clearPointerEvents = useEvent(function () {
94
- if (performedPointerEventsMutationRef.current) {
95
- var body = getDocument(elements.floating).body;
96
- body.style.pointerEvents = "";
97
- body.removeAttribute(safePolygonIdentifier);
98
- performedPointerEventsMutationRef.current = false;
99
- }
100
- });
101
- var isClickLikeOpenEvent = useEvent(function () {
102
- return dataRef.current.openEvent ? ["click", "mousedown"].includes(dataRef.current.openEvent.type) : false;
103
- });
104
- React.useEffect(function () {
105
- if (!enabled) return;
106
- function onReferenceMouseEnter(event) {
107
- clearTimeoutIfSet(timeoutRef);
108
- blockMouseMoveRef.current = false;
109
- if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMsRef.current > 0 && !getDelay(delayRef.current, "open")) {
110
- return;
111
- }
112
- var openDelay = getDelay(delayRef.current, "open", pointerTypeRef.current);
113
- if (openDelay) {
114
- timeoutRef.current = window.setTimeout(function () {
115
- if (!openRef.current) {
116
- stableOnOpenChange(true, event, "hover");
117
- }
118
- }, openDelay);
119
- } else if (!open) {
120
- stableOnOpenChange(true, event, "hover");
121
- }
122
- }
123
- function onReferenceMouseLeave(event) {
124
- var _context_triggerElements;
125
- if (isClickLikeOpenEvent()) {
126
- clearPointerEvents();
127
- return;
128
- }
129
- if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
130
- return;
131
- }
132
- unbindMouseMoveRef.current();
133
- var doc = getDocument(elements.floating);
134
- clearTimeoutIfSet(restTimeoutRef);
135
- restTimeoutPendingRef.current = false;
136
- if (handleCloseRef.current) {
137
- if (!open) {
138
- clearTimeoutIfSet(timeoutRef);
139
- }
140
- var placement = dataRef.current.placement || "bottom";
141
- var reference3 = elements.domReference;
142
- var floating2 = elements.floating;
143
- if (!reference3 || !floating2) return;
144
- handlerRef.current = handleCloseRef.current({
145
- x: event.clientX,
146
- y: event.clientY,
147
- placement,
148
- elements: {
149
- reference: reference3,
150
- floating: floating2,
151
- domReference: reference3
152
- },
153
- onClose() {
154
- if (context.handleCloseActiveRef) {
155
- context.handleCloseActiveRef.current = false;
156
- }
157
- clearPointerEvents();
158
- cleanupMouseMoveHandler();
159
- if (!isClickLikeOpenEvent()) {
160
- closeWithDelay(event, true, "safe-polygon");
161
- }
162
- }
163
- });
164
- if (context.handleCloseActiveRef) {
165
- context.handleCloseActiveRef.current = true;
166
- }
167
- var handler = handlerRef.current;
168
- doc.addEventListener("mousemove", handler);
169
- unbindMouseMoveRef.current = function () {
170
- doc.removeEventListener("mousemove", handler);
171
- };
172
- return;
173
- }
174
- var shouldClose = pointerTypeRef.current === "touch" ? !contains(elements.floating, event.relatedTarget) : true;
175
- if (shouldClose) {
176
- closeWithDelay(event);
177
- }
178
- }
179
- function onScrollMouseLeave(event) {
180
- var _context_triggerElements, _handleCloseRef_current;
181
- if (isClickLikeOpenEvent()) return;
182
- if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
183
- return;
184
- }
185
- var placement = dataRef.current.placement || "bottom";
186
- var reference3 = elements.domReference;
187
- var floating2 = elements.floating;
188
- if (!reference3 || !floating2) return;
189
- (_handleCloseRef_current = handleCloseRef.current) === null || _handleCloseRef_current === void 0 ? void 0 : _handleCloseRef_current.call(handleCloseRef, {
190
- x: event.clientX,
191
- y: event.clientY,
192
- placement,
193
- elements: {
194
- reference: reference3,
195
- floating: floating2,
196
- domReference: reference3
197
- },
198
- onClose() {
199
- clearPointerEvents();
200
- cleanupMouseMoveHandler();
201
- if (!isClickLikeOpenEvent()) {
202
- closeWithDelay(event);
203
- }
204
- }
205
- })(event);
206
- }
207
- function onFloatingMouseEnter() {
208
- clearTimeoutIfSet(timeoutRef);
209
- }
210
- function onFloatingMouseLeave(event) {
211
- var _context_triggerElements;
212
- if (isClickLikeOpenEvent()) return;
213
- if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
214
- return;
215
- }
216
- closeWithDelay(event, false);
217
- }
218
- if (isElement(elements.domReference)) {
219
- var reference2 = elements.domReference;
220
- var floating = elements.floating;
221
- if (open) {
222
- reference2.addEventListener("mouseleave", onScrollMouseLeave);
223
- }
224
- if (move) {
225
- reference2.addEventListener("mousemove", onReferenceMouseEnter, {
226
- once: true
227
- });
228
- }
229
- reference2.addEventListener("mouseenter", onReferenceMouseEnter);
230
- reference2.addEventListener("mouseleave", onReferenceMouseLeave);
231
- if (floating) {
232
- floating.addEventListener("mouseleave", onScrollMouseLeave);
233
- floating.addEventListener("mouseenter", onFloatingMouseEnter);
234
- floating.addEventListener("mouseleave", onFloatingMouseLeave);
235
- }
236
- return function () {
237
- if (open) {
238
- reference2.removeEventListener("mouseleave", onScrollMouseLeave);
239
- }
240
- if (move) {
241
- reference2.removeEventListener("mousemove", onReferenceMouseEnter);
242
- }
243
- reference2.removeEventListener("mouseenter", onReferenceMouseEnter);
244
- reference2.removeEventListener("mouseleave", onReferenceMouseLeave);
245
- if (floating) {
246
- floating.removeEventListener("mouseleave", onScrollMouseLeave);
247
- floating.removeEventListener("mouseenter", onFloatingMouseEnter);
248
- floating.removeEventListener("mouseleave", onFloatingMouseLeave);
249
- }
250
- cleanupMouseMoveHandler();
251
- };
252
- }
253
- }, [elements, enabled, context, mouseOnly, move, open, dataRef]);
254
- React.useLayoutEffect(function () {
255
- var _handleCloseRef_current___options, _handleCloseRef_current;
256
- if (!enabled) return;
257
- if (open && ((_handleCloseRef_current = handleCloseRef.current) === null || _handleCloseRef_current === void 0 ? void 0 : (_handleCloseRef_current___options = _handleCloseRef_current.__options) === null || _handleCloseRef_current___options === void 0 ? void 0 : _handleCloseRef_current___options.blockPointerEvents) && isHoverOpen()) {
258
- performedPointerEventsMutationRef.current = true;
259
- var floatingEl = elements.floating;
260
- if (isElement(elements.domReference) && floatingEl) {
261
- var body = getDocument(elements.floating).body;
262
- body.setAttribute(safePolygonIdentifier, "");
263
- var ref = elements.domReference;
264
- body.style.pointerEvents = "none";
265
- ref.style.pointerEvents = "auto";
266
- floatingEl.style.pointerEvents = "auto";
267
- return function () {
268
- body.style.pointerEvents = "";
269
- ref.style.pointerEvents = "";
270
- floatingEl.style.pointerEvents = "";
271
- };
272
- }
273
- }
274
- }, [enabled, open, elements, isHoverOpen]);
275
- React.useLayoutEffect(function () {
276
- if (!open) {
277
- pointerTypeRef.current = void 0;
278
- restTimeoutPendingRef.current = false;
279
- cleanupMouseMoveHandler();
280
- clearPointerEvents();
281
- }
282
- }, [open]);
283
- React.useEffect(function () {
284
- return function () {
285
- cleanupMouseMoveHandler();
286
- clearTimeoutIfSet(timeoutRef);
287
- clearTimeoutIfSet(restTimeoutRef);
288
- clearPointerEvents();
289
- };
290
- }, [enabled, elements.domReference]);
291
- var reference = React.useMemo(function () {
292
- function setPointerRef(event) {
293
- pointerTypeRef.current = event.pointerType;
294
- }
295
- return {
296
- onPointerDown: setPointerRef,
297
- onPointerEnter: setPointerRef,
298
- onMouseMove(event) {
299
- var {
300
- nativeEvent
301
- } = event;
302
- function handleMouseMove() {
303
- if (!blockMouseMoveRef.current && !openRef.current) {
304
- stableOnOpenChange(true, nativeEvent, "hover");
305
- }
306
- }
307
- if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {
308
- return;
309
- }
310
- if (open || restMsRef.current === 0) {
311
- return;
312
- }
313
- if (restTimeoutPendingRef.current && Math.pow(event.movementX, 2) + Math.pow(event.movementY, 2) < 2) {
314
- return;
315
- }
316
- clearTimeoutIfSet(restTimeoutRef);
317
- if (pointerTypeRef.current === "touch") {
318
- handleMouseMove();
319
- } else {
320
- restTimeoutPendingRef.current = true;
321
- restTimeoutRef.current = window.setTimeout(handleMouseMove, restMsRef.current);
322
- }
323
- }
324
- };
325
- }, [mouseOnly, open]);
326
- return React.useMemo(function () {
327
- return enabled ? {
328
- reference
329
- } : {};
330
- }, [enabled, reference]);
16
+ var props = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
17
+ var { open, onOpenChange, dataRef, events, elements } = context;
18
+ var { enabled = true, delay = 0, handleClose = null, mouseOnly = false, restMs = 0, move = true } = props;
19
+ var handleCloseRef = React.useRef(handleClose);
20
+ handleCloseRef.current = handleClose;
21
+ var delayRef = React.useRef(delay);
22
+ delayRef.current = delay;
23
+ var openRef = React.useRef(open);
24
+ openRef.current = open;
25
+ var restMsRef = React.useRef(restMs);
26
+ restMsRef.current = restMs;
27
+ var stableOnOpenChange = useEvent(onOpenChange);
28
+ var pointerTypeRef = React.useRef(void 0);
29
+ var timeoutRef = React.useRef(-1);
30
+ var handlerRef = React.useRef(void 0);
31
+ var restTimeoutRef = React.useRef(-1);
32
+ var blockMouseMoveRef = React.useRef(true);
33
+ var performedPointerEventsMutationRef = React.useRef(false);
34
+ var unbindMouseMoveRef = React.useRef(function() {});
35
+ var restTimeoutPendingRef = React.useRef(false);
36
+ var isHoverOpen = useEvent(function() {
37
+ var _dataRef_current_openEvent;
38
+ var type = (_dataRef_current_openEvent = dataRef.current.openEvent) === null || _dataRef_current_openEvent === void 0 ? void 0 : _dataRef_current_openEvent.type;
39
+ return (type === null || type === void 0 ? void 0 : type.includes("mouse")) && type !== "mousedown";
40
+ });
41
+ React.useEffect(function() {
42
+ if (!enabled) return;
43
+ if (!events) return;
44
+ function onOpenChange2(param) {
45
+ var { open: open2 } = param;
46
+ if (!open2) {
47
+ clearTimeoutIfSet(timeoutRef);
48
+ clearTimeoutIfSet(restTimeoutRef);
49
+ blockMouseMoveRef.current = true;
50
+ restTimeoutPendingRef.current = false;
51
+ }
52
+ }
53
+ events.on("openchange", onOpenChange2);
54
+ return function() {
55
+ events.off("openchange", onOpenChange2);
56
+ };
57
+ }, [enabled, events]);
58
+ var closeWithDelay = useEvent(function(event) {
59
+ var runElseBranch = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true, reason = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : "hover";
60
+ var closeDelay = getDelay(delayRef.current, "close", pointerTypeRef.current);
61
+ if (closeDelay && !handlerRef.current) {
62
+ clearTimeoutIfSet(timeoutRef);
63
+ timeoutRef.current = window.setTimeout(function() {
64
+ return stableOnOpenChange(false, event, reason);
65
+ }, closeDelay);
66
+ } else if (runElseBranch) {
67
+ clearTimeoutIfSet(timeoutRef);
68
+ stableOnOpenChange(false, event, reason);
69
+ }
70
+ });
71
+ var cleanupMouseMoveHandler = useEvent(function() {
72
+ unbindMouseMoveRef.current();
73
+ handlerRef.current = void 0;
74
+ if (context.handleCloseActiveRef) {
75
+ context.handleCloseActiveRef.current = false;
76
+ }
77
+ });
78
+ var clearPointerEvents = useEvent(function() {
79
+ if (performedPointerEventsMutationRef.current) {
80
+ var body = getDocument(elements.floating).body;
81
+ body.style.pointerEvents = "";
82
+ body.removeAttribute(safePolygonIdentifier);
83
+ performedPointerEventsMutationRef.current = false;
84
+ }
85
+ });
86
+ var isClickLikeOpenEvent = useEvent(function() {
87
+ return dataRef.current.openEvent ? ["click", "mousedown"].includes(dataRef.current.openEvent.type) : false;
88
+ });
89
+ React.useEffect(function() {
90
+ if (!enabled) return;
91
+ function onReferenceMouseEnter(event) {
92
+ clearTimeoutIfSet(timeoutRef);
93
+ blockMouseMoveRef.current = false;
94
+ if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current) || restMsRef.current > 0 && !getDelay(delayRef.current, "open")) {
95
+ return;
96
+ }
97
+ var openDelay = getDelay(delayRef.current, "open", pointerTypeRef.current);
98
+ if (openDelay) {
99
+ timeoutRef.current = window.setTimeout(function() {
100
+ if (!openRef.current) {
101
+ stableOnOpenChange(true, event, "hover");
102
+ }
103
+ }, openDelay);
104
+ } else if (!open) {
105
+ stableOnOpenChange(true, event, "hover");
106
+ }
107
+ }
108
+ function onReferenceMouseLeave(event) {
109
+ var _context_triggerElements;
110
+ if (isClickLikeOpenEvent()) {
111
+ clearPointerEvents();
112
+ return;
113
+ }
114
+ if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
115
+ return;
116
+ }
117
+ unbindMouseMoveRef.current();
118
+ var doc = getDocument(elements.floating);
119
+ clearTimeoutIfSet(restTimeoutRef);
120
+ restTimeoutPendingRef.current = false;
121
+ if (handleCloseRef.current) {
122
+ if (!open) {
123
+ clearTimeoutIfSet(timeoutRef);
124
+ }
125
+ var placement = dataRef.current.placement || "bottom";
126
+ var reference3 = elements.domReference;
127
+ var floating2 = elements.floating;
128
+ if (!reference3 || !floating2) return;
129
+ handlerRef.current = handleCloseRef.current({
130
+ x: event.clientX,
131
+ y: event.clientY,
132
+ placement,
133
+ elements: {
134
+ reference: reference3,
135
+ floating: floating2,
136
+ domReference: reference3
137
+ },
138
+ onClose() {
139
+ if (context.handleCloseActiveRef) {
140
+ context.handleCloseActiveRef.current = false;
141
+ }
142
+ clearPointerEvents();
143
+ cleanupMouseMoveHandler();
144
+ if (!isClickLikeOpenEvent()) {
145
+ closeWithDelay(event, true, "safe-polygon");
146
+ }
147
+ }
148
+ });
149
+ if (context.handleCloseActiveRef) {
150
+ context.handleCloseActiveRef.current = true;
151
+ }
152
+ var handler = handlerRef.current;
153
+ doc.addEventListener("mousemove", handler);
154
+ unbindMouseMoveRef.current = function() {
155
+ doc.removeEventListener("mousemove", handler);
156
+ };
157
+ return;
158
+ }
159
+ var shouldClose = pointerTypeRef.current === "touch" ? !contains(elements.floating, event.relatedTarget) : true;
160
+ if (shouldClose) {
161
+ closeWithDelay(event);
162
+ }
163
+ }
164
+ function onScrollMouseLeave(event) {
165
+ var _context_triggerElements, _handleCloseRef_current;
166
+ if (isClickLikeOpenEvent()) return;
167
+ if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
168
+ return;
169
+ }
170
+ var placement = dataRef.current.placement || "bottom";
171
+ var reference3 = elements.domReference;
172
+ var floating2 = elements.floating;
173
+ if (!reference3 || !floating2) return;
174
+ (_handleCloseRef_current = handleCloseRef.current) === null || _handleCloseRef_current === void 0 ? void 0 : _handleCloseRef_current.call(handleCloseRef, {
175
+ x: event.clientX,
176
+ y: event.clientY,
177
+ placement,
178
+ elements: {
179
+ reference: reference3,
180
+ floating: floating2,
181
+ domReference: reference3
182
+ },
183
+ onClose() {
184
+ clearPointerEvents();
185
+ cleanupMouseMoveHandler();
186
+ if (!isClickLikeOpenEvent()) {
187
+ closeWithDelay(event);
188
+ }
189
+ }
190
+ })(event);
191
+ }
192
+ function onFloatingMouseEnter() {
193
+ clearTimeoutIfSet(timeoutRef);
194
+ }
195
+ function onFloatingMouseLeave(event) {
196
+ var _context_triggerElements;
197
+ if (isClickLikeOpenEvent()) return;
198
+ if ((_context_triggerElements = context.triggerElements) === null || _context_triggerElements === void 0 ? void 0 : _context_triggerElements.hasElement(event.relatedTarget)) {
199
+ return;
200
+ }
201
+ closeWithDelay(event, false);
202
+ }
203
+ if (isElement(elements.domReference)) {
204
+ var reference2 = elements.domReference;
205
+ var floating = elements.floating;
206
+ if (open) {
207
+ reference2.addEventListener("mouseleave", onScrollMouseLeave);
208
+ }
209
+ if (move) {
210
+ reference2.addEventListener("mousemove", onReferenceMouseEnter, { once: true });
211
+ }
212
+ reference2.addEventListener("mouseenter", onReferenceMouseEnter);
213
+ reference2.addEventListener("mouseleave", onReferenceMouseLeave);
214
+ if (floating) {
215
+ floating.addEventListener("mouseleave", onScrollMouseLeave);
216
+ floating.addEventListener("mouseenter", onFloatingMouseEnter);
217
+ floating.addEventListener("mouseleave", onFloatingMouseLeave);
218
+ }
219
+ return function() {
220
+ if (open) {
221
+ reference2.removeEventListener("mouseleave", onScrollMouseLeave);
222
+ }
223
+ if (move) {
224
+ reference2.removeEventListener("mousemove", onReferenceMouseEnter);
225
+ }
226
+ reference2.removeEventListener("mouseenter", onReferenceMouseEnter);
227
+ reference2.removeEventListener("mouseleave", onReferenceMouseLeave);
228
+ if (floating) {
229
+ floating.removeEventListener("mouseleave", onScrollMouseLeave);
230
+ floating.removeEventListener("mouseenter", onFloatingMouseEnter);
231
+ floating.removeEventListener("mouseleave", onFloatingMouseLeave);
232
+ }
233
+ cleanupMouseMoveHandler();
234
+ };
235
+ }
236
+ }, [
237
+ elements,
238
+ enabled,
239
+ context,
240
+ mouseOnly,
241
+ move,
242
+ open,
243
+ dataRef
244
+ ]);
245
+ React.useLayoutEffect(function() {
246
+ var _handleCloseRef_current___options, _handleCloseRef_current;
247
+ if (!enabled) return;
248
+ if (open && ((_handleCloseRef_current = handleCloseRef.current) === null || _handleCloseRef_current === void 0 ? void 0 : (_handleCloseRef_current___options = _handleCloseRef_current.__options) === null || _handleCloseRef_current___options === void 0 ? void 0 : _handleCloseRef_current___options.blockPointerEvents) && isHoverOpen()) {
249
+ performedPointerEventsMutationRef.current = true;
250
+ var floatingEl = elements.floating;
251
+ if (isElement(elements.domReference) && floatingEl) {
252
+ var body = getDocument(elements.floating).body;
253
+ body.setAttribute(safePolygonIdentifier, "");
254
+ var ref = elements.domReference;
255
+ body.style.pointerEvents = "none";
256
+ ref.style.pointerEvents = "auto";
257
+ floatingEl.style.pointerEvents = "auto";
258
+ return function() {
259
+ body.style.pointerEvents = "";
260
+ ref.style.pointerEvents = "";
261
+ floatingEl.style.pointerEvents = "";
262
+ };
263
+ }
264
+ }
265
+ }, [
266
+ enabled,
267
+ open,
268
+ elements,
269
+ isHoverOpen
270
+ ]);
271
+ React.useLayoutEffect(function() {
272
+ if (!open) {
273
+ pointerTypeRef.current = void 0;
274
+ restTimeoutPendingRef.current = false;
275
+ cleanupMouseMoveHandler();
276
+ clearPointerEvents();
277
+ }
278
+ }, [open]);
279
+ React.useEffect(function() {
280
+ return function() {
281
+ cleanupMouseMoveHandler();
282
+ clearTimeoutIfSet(timeoutRef);
283
+ clearTimeoutIfSet(restTimeoutRef);
284
+ clearPointerEvents();
285
+ };
286
+ }, [enabled, elements.domReference]);
287
+ var reference = React.useMemo(function() {
288
+ function setPointerRef(event) {
289
+ pointerTypeRef.current = event.pointerType;
290
+ }
291
+ return {
292
+ onPointerDown: setPointerRef,
293
+ onPointerEnter: setPointerRef,
294
+ onMouseMove(event) {
295
+ var { nativeEvent } = event;
296
+ function handleMouseMove() {
297
+ if (!blockMouseMoveRef.current && !openRef.current) {
298
+ stableOnOpenChange(true, nativeEvent, "hover");
299
+ }
300
+ }
301
+ if (mouseOnly && !isMouseLikePointerType(pointerTypeRef.current)) {
302
+ return;
303
+ }
304
+ if (open || restMsRef.current === 0) {
305
+ return;
306
+ }
307
+ if (restTimeoutPendingRef.current && Math.pow(event.movementX, 2) + Math.pow(event.movementY, 2) < 2) {
308
+ return;
309
+ }
310
+ clearTimeoutIfSet(restTimeoutRef);
311
+ if (pointerTypeRef.current === "touch") {
312
+ handleMouseMove();
313
+ } else {
314
+ restTimeoutPendingRef.current = true;
315
+ restTimeoutRef.current = window.setTimeout(handleMouseMove, restMsRef.current);
316
+ }
317
+ }
318
+ };
319
+ }, [mouseOnly, open]);
320
+ return React.useMemo(function() {
321
+ return enabled ? { reference } : {};
322
+ }, [enabled, reference]);
331
323
  }
324
+
332
325
  export { getDelay, useHover };
333
326
  //# sourceMappingURL=useHover.native.js.map