@hanzogui/floating 8.3.0 → 8.3.2

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 (277) hide show
  1. package/dist/cjs/Floating.js +5 -0
  2. package/dist/cjs/Floating.js.map +1 -0
  3. package/dist/cjs/index.js +57 -0
  4. package/dist/cjs/index.js.map +1 -0
  5. package/dist/cjs/interactions/PopupTriggerMap.js +33 -0
  6. package/dist/cjs/interactions/PopupTriggerMap.js.map +1 -0
  7. package/dist/cjs/interactions/createFloatingEvents.js +31 -0
  8. package/dist/cjs/interactions/createFloatingEvents.js.map +1 -0
  9. package/dist/cjs/interactions/safePolygon.js +435 -0
  10. package/dist/cjs/interactions/safePolygon.js.map +1 -0
  11. package/dist/cjs/interactions/types.js +3 -0
  12. package/dist/cjs/interactions/types.js.map +1 -0
  13. package/dist/cjs/interactions/useClick.js +118 -0
  14. package/dist/cjs/interactions/useClick.js.map +1 -0
  15. package/dist/cjs/interactions/useDelayGroup.js +84 -0
  16. package/dist/cjs/interactions/useDelayGroup.js.map +1 -0
  17. package/dist/cjs/interactions/useFocus.js +118 -0
  18. package/dist/cjs/interactions/useFocus.js.map +1 -0
  19. package/dist/cjs/interactions/useHover.js +357 -0
  20. package/dist/cjs/interactions/useHover.js.map +1 -0
  21. package/dist/cjs/interactions/useInnerOffset.js +92 -0
  22. package/dist/cjs/interactions/useInnerOffset.js.map +1 -0
  23. package/dist/cjs/interactions/useInteractions.js +88 -0
  24. package/dist/cjs/interactions/useInteractions.js.map +1 -0
  25. package/dist/cjs/interactions/useListNavigation.js +447 -0
  26. package/dist/cjs/interactions/useListNavigation.js.map +1 -0
  27. package/dist/cjs/interactions/useRole.js +69 -0
  28. package/dist/cjs/interactions/useRole.js.map +1 -0
  29. package/dist/cjs/interactions/useTypeahead.js +121 -0
  30. package/dist/cjs/interactions/useTypeahead.js.map +1 -0
  31. package/dist/cjs/interactions/utils.js +200 -0
  32. package/dist/cjs/interactions/utils.js.map +1 -0
  33. package/dist/cjs/middleware/inner.js +82 -0
  34. package/dist/cjs/middleware/inner.js.map +1 -0
  35. package/dist/cjs/package.json +1 -0
  36. package/dist/cjs/useFloating.js +29 -0
  37. package/dist/cjs/useFloating.js.map +1 -0
  38. package/dist/esm/Floating.js +2 -0
  39. package/dist/esm/Floating.js.map +1 -0
  40. package/dist/esm/index.js +23 -18
  41. package/dist/esm/index.js.map +1 -1
  42. package/dist/esm/interactions/PopupTriggerMap.js +29 -0
  43. package/dist/esm/interactions/PopupTriggerMap.js.map +1 -0
  44. package/dist/esm/interactions/createFloatingEvents.js +28 -0
  45. package/dist/esm/interactions/createFloatingEvents.js.map +1 -0
  46. package/dist/esm/interactions/safePolygon.js +432 -0
  47. package/dist/esm/interactions/safePolygon.js.map +1 -0
  48. package/dist/esm/interactions/types.js +2 -0
  49. package/dist/esm/interactions/types.js.map +1 -0
  50. package/dist/esm/interactions/useClick.js +115 -0
  51. package/dist/esm/interactions/useClick.js.map +1 -0
  52. package/dist/esm/interactions/useDelayGroup.js +78 -0
  53. package/dist/esm/interactions/useDelayGroup.js.map +1 -0
  54. package/dist/esm/interactions/useFocus.js +115 -0
  55. package/dist/esm/interactions/useFocus.js.map +1 -0
  56. package/dist/esm/interactions/useHover.js +352 -0
  57. package/dist/esm/interactions/useHover.js.map +1 -0
  58. package/dist/esm/interactions/useInnerOffset.js +88 -0
  59. package/dist/esm/interactions/useInnerOffset.js.map +1 -0
  60. package/dist/esm/interactions/useInteractions.js +85 -0
  61. package/dist/esm/interactions/useInteractions.js.map +1 -0
  62. package/dist/esm/interactions/useListNavigation.js +444 -0
  63. package/dist/esm/interactions/useListNavigation.js.map +1 -0
  64. package/dist/esm/interactions/useRole.js +65 -0
  65. package/dist/esm/interactions/useRole.js.map +1 -0
  66. package/dist/esm/interactions/useTypeahead.js +118 -0
  67. package/dist/esm/interactions/useTypeahead.js.map +1 -0
  68. package/dist/esm/interactions/utils.js +176 -0
  69. package/dist/esm/interactions/utils.js.map +1 -0
  70. package/dist/esm/middleware/inner.js +77 -0
  71. package/dist/esm/middleware/inner.js.map +1 -0
  72. package/dist/esm/useFloating.js +24 -0
  73. package/dist/esm/useFloating.js.map +1 -0
  74. package/dist/native/Floating.js +5 -0
  75. package/dist/native/Floating.js.map +1 -0
  76. package/dist/native/index.js +23 -0
  77. package/dist/native/index.js.map +1 -0
  78. package/dist/native/interactions/PopupTriggerMap.js +29 -0
  79. package/dist/native/interactions/PopupTriggerMap.js.map +1 -0
  80. package/dist/native/interactions/createFloatingEvents.js +28 -0
  81. package/dist/native/interactions/createFloatingEvents.js.map +1 -0
  82. package/dist/native/interactions/safePolygon.js +432 -0
  83. package/dist/native/interactions/safePolygon.js.map +1 -0
  84. package/dist/native/interactions/types.js +2 -0
  85. package/dist/native/interactions/types.js.map +1 -0
  86. package/dist/native/interactions/useClick.js +115 -0
  87. package/dist/native/interactions/useClick.js.map +1 -0
  88. package/dist/native/interactions/useDelayGroup.js +78 -0
  89. package/dist/native/interactions/useDelayGroup.js.map +1 -0
  90. package/dist/native/interactions/useFocus.js +115 -0
  91. package/dist/native/interactions/useFocus.js.map +1 -0
  92. package/dist/native/interactions/useHover.js +352 -0
  93. package/dist/native/interactions/useHover.js.map +1 -0
  94. package/dist/native/interactions/useInnerOffset.js +88 -0
  95. package/dist/native/interactions/useInnerOffset.js.map +1 -0
  96. package/dist/native/interactions/useInteractions.js +85 -0
  97. package/dist/native/interactions/useInteractions.js.map +1 -0
  98. package/dist/native/interactions/useListNavigation.js +444 -0
  99. package/dist/native/interactions/useListNavigation.js.map +1 -0
  100. package/dist/native/interactions/useRole.js +65 -0
  101. package/dist/native/interactions/useRole.js.map +1 -0
  102. package/dist/native/interactions/useTypeahead.js +118 -0
  103. package/dist/native/interactions/useTypeahead.js.map +1 -0
  104. package/dist/native/interactions/utils.js +176 -0
  105. package/dist/native/interactions/utils.js.map +1 -0
  106. package/dist/native/middleware/inner.js +77 -0
  107. package/dist/native/middleware/inner.js.map +1 -0
  108. package/dist/native/useFloating.js +24 -0
  109. package/dist/native/useFloating.js.map +1 -0
  110. package/package.json +16 -16
  111. package/src/index.ts +18 -18
  112. package/src/interactions/safePolygon.ts +2 -2
  113. package/src/interactions/types.ts +2 -2
  114. package/src/interactions/useClick.ts +2 -2
  115. package/src/interactions/useDelayGroup.ts +1 -1
  116. package/src/interactions/useFocus.ts +2 -2
  117. package/src/interactions/useHover.ts +2 -2
  118. package/src/interactions/useInnerOffset.ts +1 -1
  119. package/src/interactions/useInteractions.ts +1 -1
  120. package/src/interactions/useListNavigation.ts +2 -2
  121. package/src/interactions/useRole.ts +1 -1
  122. package/src/interactions/useTypeahead.ts +6 -2
  123. package/src/useFloating.tsx +2 -2
  124. package/types/index.d.ts +18 -18
  125. package/types/index.d.ts.map +1 -1
  126. package/types/interactions/PopupTriggerMap.d.ts.map +1 -1
  127. package/types/interactions/safePolygon.d.ts +1 -1
  128. package/types/interactions/safePolygon.d.ts.map +1 -1
  129. package/types/interactions/types.d.ts +2 -2
  130. package/types/interactions/types.d.ts.map +1 -1
  131. package/types/interactions/useClick.d.ts +1 -1
  132. package/types/interactions/useClick.d.ts.map +1 -1
  133. package/types/interactions/useDelayGroup.d.ts +1 -1
  134. package/types/interactions/useDelayGroup.d.ts.map +1 -1
  135. package/types/interactions/useFocus.d.ts +1 -1
  136. package/types/interactions/useFocus.d.ts.map +1 -1
  137. package/types/interactions/useHover.d.ts +1 -1
  138. package/types/interactions/useHover.d.ts.map +1 -1
  139. package/types/interactions/useInnerOffset.d.ts +1 -1
  140. package/types/interactions/useInnerOffset.d.ts.map +1 -1
  141. package/types/interactions/useInteractions.d.ts +1 -1
  142. package/types/interactions/useInteractions.d.ts.map +1 -1
  143. package/types/interactions/useListNavigation.d.ts +1 -1
  144. package/types/interactions/useListNavigation.d.ts.map +1 -1
  145. package/types/interactions/useRole.d.ts +1 -1
  146. package/types/interactions/useRole.d.ts.map +1 -1
  147. package/types/interactions/useTypeahead.d.ts +1 -1
  148. package/types/interactions/useTypeahead.d.ts.map +1 -1
  149. package/types/middleware/inner.d.ts.map +1 -1
  150. package/types/useFloating.d.ts +2 -2
  151. package/types/useFloating.d.ts.map +1 -1
  152. package/dist/cjs/Floating.cjs +0 -20
  153. package/dist/cjs/Floating.native.js +0 -39
  154. package/dist/cjs/Floating.native.js.map +0 -1
  155. package/dist/cjs/index.cjs +0 -73
  156. package/dist/cjs/index.native.js +0 -76
  157. package/dist/cjs/index.native.js.map +0 -1
  158. package/dist/cjs/interactions/PopupTriggerMap.cjs +0 -49
  159. package/dist/cjs/interactions/PopupTriggerMap.native.js +0 -97
  160. package/dist/cjs/interactions/PopupTriggerMap.native.js.map +0 -1
  161. package/dist/cjs/interactions/createFloatingEvents.cjs +0 -50
  162. package/dist/cjs/interactions/createFloatingEvents.native.js +0 -56
  163. package/dist/cjs/interactions/createFloatingEvents.native.js.map +0 -1
  164. package/dist/cjs/interactions/safePolygon.cjs +0 -273
  165. package/dist/cjs/interactions/safePolygon.native.js +0 -284
  166. package/dist/cjs/interactions/safePolygon.native.js.map +0 -1
  167. package/dist/cjs/interactions/types.cjs +0 -18
  168. package/dist/cjs/interactions/types.native.js +0 -21
  169. package/dist/cjs/interactions/types.native.js.map +0 -1
  170. package/dist/cjs/interactions/useClick.cjs +0 -124
  171. package/dist/cjs/interactions/useClick.native.js +0 -132
  172. package/dist/cjs/interactions/useClick.native.js.map +0 -1
  173. package/dist/cjs/interactions/useDelayGroup.cjs +0 -115
  174. package/dist/cjs/interactions/useDelayGroup.native.js +0 -125
  175. package/dist/cjs/interactions/useDelayGroup.native.js.map +0 -1
  176. package/dist/cjs/interactions/useFocus.cjs +0 -130
  177. package/dist/cjs/interactions/useFocus.native.js +0 -139
  178. package/dist/cjs/interactions/useFocus.native.js.map +0 -1
  179. package/dist/cjs/interactions/useHover.cjs +0 -357
  180. package/dist/cjs/interactions/useHover.native.js +0 -373
  181. package/dist/cjs/interactions/useHover.native.js.map +0 -1
  182. package/dist/cjs/interactions/useInnerOffset.cjs +0 -128
  183. package/dist/cjs/interactions/useInnerOffset.native.js +0 -141
  184. package/dist/cjs/interactions/useInnerOffset.native.js.map +0 -1
  185. package/dist/cjs/interactions/useInteractions.cjs +0 -105
  186. package/dist/cjs/interactions/useInteractions.native.js +0 -216
  187. package/dist/cjs/interactions/useInteractions.native.js.map +0 -1
  188. package/dist/cjs/interactions/useListNavigation.cjs +0 -418
  189. package/dist/cjs/interactions/useListNavigation.native.js +0 -433
  190. package/dist/cjs/interactions/useListNavigation.native.js.map +0 -1
  191. package/dist/cjs/interactions/useRole.cjs +0 -122
  192. package/dist/cjs/interactions/useRole.native.js +0 -136
  193. package/dist/cjs/interactions/useRole.native.js.map +0 -1
  194. package/dist/cjs/interactions/useTypeahead.cjs +0 -143
  195. package/dist/cjs/interactions/useTypeahead.native.js +0 -159
  196. package/dist/cjs/interactions/useTypeahead.native.js.map +0 -1
  197. package/dist/cjs/interactions/utils.cjs +0 -208
  198. package/dist/cjs/interactions/utils.native.js +0 -227
  199. package/dist/cjs/interactions/utils.native.js.map +0 -1
  200. package/dist/cjs/middleware/inner.cjs +0 -118
  201. package/dist/cjs/middleware/inner.native.js +0 -130
  202. package/dist/cjs/middleware/inner.native.js.map +0 -1
  203. package/dist/cjs/useFloating.cjs +0 -64
  204. package/dist/cjs/useFloating.native.js +0 -69
  205. package/dist/cjs/useFloating.native.js.map +0 -1
  206. package/dist/esm/Floating.mjs +0 -2
  207. package/dist/esm/Floating.mjs.map +0 -1
  208. package/dist/esm/Floating.native.js +0 -8
  209. package/dist/esm/Floating.native.js.map +0 -1
  210. package/dist/esm/index.mjs +0 -18
  211. package/dist/esm/index.mjs.map +0 -1
  212. package/dist/esm/index.native.js +0 -18
  213. package/dist/esm/index.native.js.map +0 -1
  214. package/dist/esm/interactions/PopupTriggerMap.mjs +0 -24
  215. package/dist/esm/interactions/PopupTriggerMap.mjs.map +0 -1
  216. package/dist/esm/interactions/PopupTriggerMap.native.js +0 -69
  217. package/dist/esm/interactions/PopupTriggerMap.native.js.map +0 -1
  218. package/dist/esm/interactions/createFloatingEvents.mjs +0 -25
  219. package/dist/esm/interactions/createFloatingEvents.mjs.map +0 -1
  220. package/dist/esm/interactions/createFloatingEvents.native.js +0 -28
  221. package/dist/esm/interactions/createFloatingEvents.native.js.map +0 -1
  222. package/dist/esm/interactions/safePolygon.mjs +0 -248
  223. package/dist/esm/interactions/safePolygon.mjs.map +0 -1
  224. package/dist/esm/interactions/safePolygon.native.js +0 -256
  225. package/dist/esm/interactions/safePolygon.native.js.map +0 -1
  226. package/dist/esm/interactions/types.mjs +0 -2
  227. package/dist/esm/interactions/types.mjs.map +0 -1
  228. package/dist/esm/interactions/types.native.js +0 -2
  229. package/dist/esm/interactions/types.native.js.map +0 -1
  230. package/dist/esm/interactions/useClick.mjs +0 -99
  231. package/dist/esm/interactions/useClick.mjs.map +0 -1
  232. package/dist/esm/interactions/useClick.native.js +0 -104
  233. package/dist/esm/interactions/useClick.native.js.map +0 -1
  234. package/dist/esm/interactions/useDelayGroup.mjs +0 -77
  235. package/dist/esm/interactions/useDelayGroup.mjs.map +0 -1
  236. package/dist/esm/interactions/useDelayGroup.native.js +0 -84
  237. package/dist/esm/interactions/useDelayGroup.native.js.map +0 -1
  238. package/dist/esm/interactions/useFocus.mjs +0 -105
  239. package/dist/esm/interactions/useFocus.mjs.map +0 -1
  240. package/dist/esm/interactions/useFocus.native.js +0 -111
  241. package/dist/esm/interactions/useFocus.native.js.map +0 -1
  242. package/dist/esm/interactions/useHover.mjs +0 -320
  243. package/dist/esm/interactions/useHover.mjs.map +0 -1
  244. package/dist/esm/interactions/useHover.native.js +0 -333
  245. package/dist/esm/interactions/useHover.native.js.map +0 -1
  246. package/dist/esm/interactions/useInnerOffset.mjs +0 -92
  247. package/dist/esm/interactions/useInnerOffset.mjs.map +0 -1
  248. package/dist/esm/interactions/useInnerOffset.native.js +0 -102
  249. package/dist/esm/interactions/useInnerOffset.native.js.map +0 -1
  250. package/dist/esm/interactions/useInteractions.mjs +0 -80
  251. package/dist/esm/interactions/useInteractions.mjs.map +0 -1
  252. package/dist/esm/interactions/useInteractions.native.js +0 -188
  253. package/dist/esm/interactions/useInteractions.native.js.map +0 -1
  254. package/dist/esm/interactions/useListNavigation.mjs +0 -393
  255. package/dist/esm/interactions/useListNavigation.mjs.map +0 -1
  256. package/dist/esm/interactions/useListNavigation.native.js +0 -405
  257. package/dist/esm/interactions/useListNavigation.native.js.map +0 -1
  258. package/dist/esm/interactions/useRole.mjs +0 -86
  259. package/dist/esm/interactions/useRole.mjs.map +0 -1
  260. package/dist/esm/interactions/useRole.native.js +0 -97
  261. package/dist/esm/interactions/useRole.native.js.map +0 -1
  262. package/dist/esm/interactions/useTypeahead.mjs +0 -118
  263. package/dist/esm/interactions/useTypeahead.mjs.map +0 -1
  264. package/dist/esm/interactions/useTypeahead.native.js +0 -131
  265. package/dist/esm/interactions/useTypeahead.native.js.map +0 -1
  266. package/dist/esm/interactions/utils.mjs +0 -162
  267. package/dist/esm/interactions/utils.mjs.map +0 -1
  268. package/dist/esm/interactions/utils.native.js +0 -178
  269. package/dist/esm/interactions/utils.native.js.map +0 -1
  270. package/dist/esm/middleware/inner.mjs +0 -82
  271. package/dist/esm/middleware/inner.mjs.map +0 -1
  272. package/dist/esm/middleware/inner.native.js +0 -91
  273. package/dist/esm/middleware/inner.native.js.map +0 -1
  274. package/dist/esm/useFloating.mjs +0 -27
  275. package/dist/esm/useFloating.mjs.map +0 -1
  276. package/dist/esm/useFloating.native.js +0 -29
  277. package/dist/esm/useFloating.native.js.map +0 -1
@@ -0,0 +1,432 @@
1
+ import { clearTimeoutIfSet, contains, getTarget } from './utils.js';
2
+ function isPointInPolygon(point, polygon) {
3
+ const [x, y] = point;
4
+ let isInside = false;
5
+ const length = polygon.length;
6
+ for (let i = 0, j = length - 1; i < length; j = i++) {
7
+ const [xi, yi] = polygon[i] || [0, 0];
8
+ const [xj, yj] = polygon[j] || [0, 0];
9
+ const intersect = yi >= y !== yj >= y && x <= ((xj - xi) * (y - yi)) / (yj - yi) + xi;
10
+ if (intersect) {
11
+ isInside = !isInside;
12
+ }
13
+ }
14
+ return isInside;
15
+ }
16
+ function isInside(point, rect) {
17
+ return (point[0] >= rect.x &&
18
+ point[0] <= rect.x + rect.width &&
19
+ point[1] >= rect.y &&
20
+ point[1] <= rect.y + rect.height);
21
+ }
22
+ // generates a safe polygon area that the user can traverse without closing the
23
+ // floating element once leaving the reference element.
24
+ // ported from @floating-ui/react with full polygon geometry.
25
+ //
26
+ // the returned HandleCloseFn is a closure factory: called once on mouseleave
27
+ // with the leave position (x, y), it returns a handler that runs on each
28
+ // subsequent document mousemove. the original leave position is baked into
29
+ // the closure so the polygon anchor stays fixed.
30
+ //
31
+ // unlike @floating-ui/react, we do NOT add a documentElement mouseleave
32
+ // listener, which fixes the window-blur-closing-popover bug.
33
+ // debug overlay — renders polygon + trough as SVG on top of everything
34
+ let debugSvg = null;
35
+ function debugDrawPolygon(polygon, trough, cursor, anchor) {
36
+ if (!debugSvg) {
37
+ debugSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
38
+ debugSvg.id = '__safe-polygon-debug';
39
+ Object.assign(debugSvg.style, {
40
+ position: 'fixed',
41
+ inset: '0',
42
+ width: '100vw',
43
+ height: '100vh',
44
+ pointerEvents: 'none',
45
+ zIndex: '999999',
46
+ });
47
+ document.body.appendChild(debugSvg);
48
+ }
49
+ debugSvg.innerHTML = '';
50
+ // trough rectangle (blue)
51
+ if (trough.length) {
52
+ const troughEl = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
53
+ troughEl.setAttribute('points', trough.map((p) => p.join(',')).join(' '));
54
+ troughEl.setAttribute('fill', 'rgba(0,100,255,0.15)');
55
+ troughEl.setAttribute('stroke', 'rgba(0,100,255,0.6)');
56
+ troughEl.setAttribute('stroke-width', '1');
57
+ debugSvg.appendChild(troughEl);
58
+ }
59
+ // safe polygon (red)
60
+ if (polygon.length) {
61
+ const polyEl = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');
62
+ polyEl.setAttribute('points', polygon.map((p) => p.join(',')).join(' '));
63
+ polyEl.setAttribute('fill', 'rgba(255,50,50,0.2)');
64
+ polyEl.setAttribute('stroke', 'rgba(255,50,50,0.8)');
65
+ polyEl.setAttribute('stroke-width', '1.5');
66
+ debugSvg.appendChild(polyEl);
67
+ }
68
+ // anchor point (green circle)
69
+ const anchorCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
70
+ anchorCircle.setAttribute('cx', String(anchor[0]));
71
+ anchorCircle.setAttribute('cy', String(anchor[1]));
72
+ anchorCircle.setAttribute('r', '5');
73
+ anchorCircle.setAttribute('fill', 'lime');
74
+ anchorCircle.setAttribute('stroke', 'darkgreen');
75
+ anchorCircle.setAttribute('stroke-width', '1.5');
76
+ debugSvg.appendChild(anchorCircle);
77
+ // cursor point (yellow circle)
78
+ const cursorCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');
79
+ cursorCircle.setAttribute('cx', String(cursor[0]));
80
+ cursorCircle.setAttribute('cy', String(cursor[1]));
81
+ cursorCircle.setAttribute('r', '4');
82
+ cursorCircle.setAttribute('fill', 'yellow');
83
+ cursorCircle.setAttribute('stroke', 'orange');
84
+ cursorCircle.setAttribute('stroke-width', '1.5');
85
+ debugSvg.appendChild(cursorCircle);
86
+ }
87
+ function debugClear() {
88
+ if (debugSvg) {
89
+ debugSvg.remove();
90
+ debugSvg = null;
91
+ }
92
+ }
93
+ export function safePolygon(options = {}) {
94
+ const { buffer = 0.5, blockPointerEvents = false, requireIntent = true, __debug = false, } = options;
95
+ const timeoutRef = { current: -1 };
96
+ let hasLanded = false;
97
+ let lastX = null;
98
+ let lastY = null;
99
+ let lastCursorTime = typeof performance !== 'undefined' ? performance.now() : 0;
100
+ function getCursorSpeed(x, y) {
101
+ const currentTime = performance.now();
102
+ const elapsedTime = currentTime - lastCursorTime;
103
+ if (lastX === null || lastY === null || elapsedTime === 0) {
104
+ lastX = x;
105
+ lastY = y;
106
+ lastCursorTime = currentTime;
107
+ return null;
108
+ }
109
+ const deltaX = x - lastX;
110
+ const deltaY = y - lastY;
111
+ const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
112
+ const speed = distance / elapsedTime;
113
+ lastX = x;
114
+ lastY = y;
115
+ lastCursorTime = currentTime;
116
+ return speed;
117
+ }
118
+ // called once on mouseleave. x, y = cursor position when leaving.
119
+ // returns the mousemove handler that checks each subsequent position
120
+ // against the polygon anchored at (x, y).
121
+ const fn = ({ x, y, placement, elements, onClose }) => {
122
+ // reset on each new handler creation — each leave starts a fresh session
123
+ hasLanded = false;
124
+ lastX = null;
125
+ lastY = null;
126
+ return function onMouseMove(event) {
127
+ function close() {
128
+ clearTimeoutIfSet(timeoutRef);
129
+ onClose();
130
+ }
131
+ clearTimeoutIfSet(timeoutRef);
132
+ const domReference = elements.domReference ?? elements.reference;
133
+ if (!domReference ||
134
+ !elements.floating ||
135
+ placement == null ||
136
+ x == null ||
137
+ y == null) {
138
+ return;
139
+ }
140
+ const { clientX, clientY } = event;
141
+ const clientPoint = [clientX, clientY];
142
+ const target = getTarget(event);
143
+ const isLeave = event.type === 'mouseleave';
144
+ const isOverFloatingEl = contains(elements.floating, target);
145
+ const isOverReferenceEl = contains(domReference, target);
146
+ const refRect = domReference.getBoundingClientRect();
147
+ const rect = elements.floating.getBoundingClientRect();
148
+ const side = placement.split('-')[0];
149
+ // x, y are from the closure — the position when cursor LEFT the reference.
150
+ // cursorLeaveFromRight/Bottom determine which side of the floating el
151
+ // the leave point is on, to shape the polygon correctly.
152
+ const cursorLeaveFromRight = x > rect.right - rect.width / 2;
153
+ const cursorLeaveFromBottom = y > rect.bottom - rect.height / 2;
154
+ const isOverReferenceRect = isInside(clientPoint, refRect);
155
+ const isFloatingWider = rect.width > refRect.width;
156
+ const isFloatingTaller = rect.height > refRect.height;
157
+ const left = (isFloatingWider ? refRect : rect).left;
158
+ const right = (isFloatingWider ? refRect : rect).right;
159
+ const top = (isFloatingTaller ? refRect : rect).top;
160
+ const bottom = (isFloatingTaller ? refRect : rect).bottom;
161
+ if (isOverFloatingEl) {
162
+ hasLanded = true;
163
+ if (!isLeave) {
164
+ return;
165
+ }
166
+ }
167
+ if (isOverReferenceEl) {
168
+ hasLanded = false;
169
+ }
170
+ if (isOverReferenceEl && !isLeave) {
171
+ hasLanded = true;
172
+ return;
173
+ }
174
+ // cursor in reference bounding box but outside DOM element (rounded corners)
175
+ if (!isOverReferenceEl && isOverReferenceRect && !isLeave) {
176
+ return;
177
+ }
178
+ // prevent overlapping floating element from being stuck in an open-close
179
+ // loop: https://github.com/floating-ui/floating-ui/issues/1910
180
+ if (isLeave &&
181
+ event.relatedTarget &&
182
+ contains(elements.floating, event.relatedTarget)) {
183
+ return;
184
+ }
185
+ // if the pointer is leaving from the opposite side, the "buffer" logic
186
+ // creates a point where the floating element remains open, but should be
187
+ // ignored. a constant of 1 handles floating point rounding errors.
188
+ if ((side === 'top' && y >= refRect.bottom - 1) ||
189
+ (side === 'bottom' && y <= refRect.top + 1) ||
190
+ (side === 'left' && x >= refRect.right - 1) ||
191
+ (side === 'right' && x <= refRect.left + 1)) {
192
+ return close();
193
+ }
194
+ // ignore when the cursor is within the rectangular trough between the
195
+ // two elements. since the polygon is created from the cursor point,
196
+ // which can start beyond the ref element's edge, traversing back and
197
+ // forth from the ref to the floating element can cause it to close. this
198
+ // ensures it always remains open in that case.
199
+ let rectPoly = [];
200
+ switch (side) {
201
+ case 'top':
202
+ rectPoly = [
203
+ [left, refRect.top + 1],
204
+ [left, rect.bottom - 1],
205
+ [right, rect.bottom - 1],
206
+ [right, refRect.top + 1],
207
+ ];
208
+ break;
209
+ case 'bottom':
210
+ rectPoly = [
211
+ [left, rect.top + 1],
212
+ [left, refRect.bottom - 1],
213
+ [right, refRect.bottom - 1],
214
+ [right, rect.top + 1],
215
+ ];
216
+ break;
217
+ case 'left':
218
+ rectPoly = [
219
+ [rect.right - 1, bottom],
220
+ [rect.right - 1, top],
221
+ [refRect.left + 1, top],
222
+ [refRect.left + 1, bottom],
223
+ ];
224
+ break;
225
+ case 'right':
226
+ rectPoly = [
227
+ [refRect.right - 1, bottom],
228
+ [refRect.right - 1, top],
229
+ [rect.left + 1, top],
230
+ [rect.left + 1, bottom],
231
+ ];
232
+ break;
233
+ }
234
+ // getPolygon uses the closure's (x, y) — the LEAVE position — as the
235
+ // polygon anchor point, NOT the current cursor position. this creates
236
+ // a stable triangular/trapezoidal safe zone from the leave point toward
237
+ // the floating element's edges.
238
+ function getPolygon([x, y]) {
239
+ switch (side) {
240
+ case 'top': {
241
+ const cursorPointOne = [
242
+ isFloatingWider
243
+ ? x + buffer / 2
244
+ : cursorLeaveFromRight
245
+ ? x + buffer * 4
246
+ : x - buffer * 4,
247
+ y + buffer + 1,
248
+ ];
249
+ const cursorPointTwo = [
250
+ isFloatingWider
251
+ ? x - buffer / 2
252
+ : cursorLeaveFromRight
253
+ ? x + buffer * 4
254
+ : x - buffer * 4,
255
+ y + buffer + 1,
256
+ ];
257
+ const commonPoints = [
258
+ [
259
+ rect.left,
260
+ cursorLeaveFromRight
261
+ ? rect.bottom - buffer
262
+ : isFloatingWider
263
+ ? rect.bottom - buffer
264
+ : rect.top,
265
+ ],
266
+ [
267
+ rect.right,
268
+ cursorLeaveFromRight
269
+ ? isFloatingWider
270
+ ? rect.bottom - buffer
271
+ : rect.top
272
+ : rect.bottom - buffer,
273
+ ],
274
+ ];
275
+ return [cursorPointOne, cursorPointTwo, ...commonPoints];
276
+ }
277
+ case 'bottom': {
278
+ const cursorPointOne = [
279
+ isFloatingWider
280
+ ? x + buffer / 2
281
+ : cursorLeaveFromRight
282
+ ? x + buffer * 4
283
+ : x - buffer * 4,
284
+ y - buffer,
285
+ ];
286
+ const cursorPointTwo = [
287
+ isFloatingWider
288
+ ? x - buffer / 2
289
+ : cursorLeaveFromRight
290
+ ? x + buffer * 4
291
+ : x - buffer * 4,
292
+ y - buffer,
293
+ ];
294
+ const commonPoints = [
295
+ [
296
+ rect.left,
297
+ cursorLeaveFromRight
298
+ ? rect.top + buffer
299
+ : isFloatingWider
300
+ ? rect.top + buffer
301
+ : rect.bottom,
302
+ ],
303
+ [
304
+ rect.right,
305
+ cursorLeaveFromRight
306
+ ? isFloatingWider
307
+ ? rect.top + buffer
308
+ : rect.bottom
309
+ : rect.top + buffer,
310
+ ],
311
+ ];
312
+ return [cursorPointOne, cursorPointTwo, ...commonPoints];
313
+ }
314
+ case 'left': {
315
+ const cursorPointOne = [
316
+ x + buffer + 1,
317
+ isFloatingTaller
318
+ ? y + buffer / 2
319
+ : cursorLeaveFromBottom
320
+ ? y + buffer * 4
321
+ : y - buffer * 4,
322
+ ];
323
+ const cursorPointTwo = [
324
+ x + buffer + 1,
325
+ isFloatingTaller
326
+ ? y - buffer / 2
327
+ : cursorLeaveFromBottom
328
+ ? y + buffer * 4
329
+ : y - buffer * 4,
330
+ ];
331
+ const commonPoints = [
332
+ [
333
+ cursorLeaveFromBottom
334
+ ? rect.right - buffer
335
+ : isFloatingTaller
336
+ ? rect.right - buffer
337
+ : rect.left,
338
+ rect.top,
339
+ ],
340
+ [
341
+ cursorLeaveFromBottom
342
+ ? isFloatingTaller
343
+ ? rect.right - buffer
344
+ : rect.left
345
+ : rect.right - buffer,
346
+ rect.bottom,
347
+ ],
348
+ ];
349
+ return [...commonPoints, cursorPointOne, cursorPointTwo];
350
+ }
351
+ case 'right': {
352
+ const cursorPointOne = [
353
+ x - buffer,
354
+ isFloatingTaller
355
+ ? y + buffer / 2
356
+ : cursorLeaveFromBottom
357
+ ? y + buffer * 4
358
+ : y - buffer * 4,
359
+ ];
360
+ const cursorPointTwo = [
361
+ x - buffer,
362
+ isFloatingTaller
363
+ ? y - buffer / 2
364
+ : cursorLeaveFromBottom
365
+ ? y + buffer * 4
366
+ : y - buffer * 4,
367
+ ];
368
+ const commonPoints = [
369
+ [
370
+ cursorLeaveFromBottom
371
+ ? rect.left + buffer
372
+ : isFloatingTaller
373
+ ? rect.left + buffer
374
+ : rect.right,
375
+ rect.top,
376
+ ],
377
+ [
378
+ cursorLeaveFromBottom
379
+ ? isFloatingTaller
380
+ ? rect.left + buffer
381
+ : rect.right
382
+ : rect.left + buffer,
383
+ rect.bottom,
384
+ ],
385
+ ];
386
+ return [cursorPointOne, cursorPointTwo, ...commonPoints];
387
+ }
388
+ }
389
+ }
390
+ const poly = getPolygon([x, y]);
391
+ if (__debug) {
392
+ debugDrawPolygon(poly, rectPoly, clientPoint, [x, y]);
393
+ }
394
+ if (isPointInPolygon([clientX, clientY], rectPoly)) {
395
+ return;
396
+ }
397
+ if (hasLanded && !isOverReferenceRect) {
398
+ if (__debug)
399
+ debugClear();
400
+ return close();
401
+ }
402
+ // polygon check first — inside polygon = safe.
403
+ // the polygon geometry itself limits the safe zone to valid cursor
404
+ // paths toward the floating element, so no timeout is needed here.
405
+ // a previous 40ms requireIntent timeout caused premature closures
406
+ // during natural mouse pauses (humans routinely pause >40ms while
407
+ // moving diagonally from trigger to content).
408
+ if (isPointInPolygon([clientX, clientY], poly)) {
409
+ return;
410
+ }
411
+ // speed check only applies outside polygon
412
+ if (!isLeave && requireIntent) {
413
+ const cursorSpeed = getCursorSpeed(clientX, clientY);
414
+ const cursorSpeedThreshold = 0.1;
415
+ if (cursorSpeed !== null && cursorSpeed < cursorSpeedThreshold) {
416
+ if (__debug)
417
+ debugClear();
418
+ return close();
419
+ }
420
+ }
421
+ // outside polygon — close
422
+ if (__debug)
423
+ debugClear();
424
+ close();
425
+ };
426
+ };
427
+ fn.__options = {
428
+ blockPointerEvents,
429
+ };
430
+ return fn;
431
+ }
432
+ //# sourceMappingURL=safePolygon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safePolygon.js","sourceRoot":"","sources":["../../../src/interactions/safePolygon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/interactions/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,115 @@
1
+ import { useMemo, useRef } from 'react';
2
+ import { isHTMLElement, isMouseLikePointerType, isTypeableElement } from './utils.js';
3
+ function isButtonTarget(event) {
4
+ return isHTMLElement(event.target) && event.target.tagName === 'BUTTON';
5
+ }
6
+ function isAnchorTarget(event) {
7
+ return isHTMLElement(event.target) && event.target.tagName === 'A';
8
+ }
9
+ function isSpaceIgnored(element) {
10
+ return isTypeableElement(element);
11
+ }
12
+ // click interaction: toggles open state on click/mousedown
13
+ export function useClick(context, props = {}) {
14
+ const { open, onOpenChange, dataRef, elements: { domReference }, } = context;
15
+ const { enabled = true, event: eventOption = 'click', toggle = true, ignoreMouse = false, keyboardHandlers = true, stickIfOpen = true, } = props;
16
+ const pointerTypeRef = useRef(undefined);
17
+ const didKeyDownRef = useRef(false);
18
+ const reference = useMemo(() => ({
19
+ onPointerDown(event) {
20
+ pointerTypeRef.current = event.pointerType;
21
+ },
22
+ onMouseDown(event) {
23
+ const pointerType = pointerTypeRef.current;
24
+ // ignore all buttons except for the "main" button
25
+ if (event.button !== 0)
26
+ return;
27
+ if (eventOption === 'click')
28
+ return;
29
+ if (isMouseLikePointerType(pointerType, true) && ignoreMouse)
30
+ return;
31
+ if (open &&
32
+ toggle &&
33
+ (dataRef.current.openEvent && stickIfOpen
34
+ ? dataRef.current.openEvent.type === 'mousedown'
35
+ : true)) {
36
+ onOpenChange(false, event.nativeEvent || event, 'click');
37
+ }
38
+ else {
39
+ // prevent stealing focus from the floating element
40
+ event.preventDefault();
41
+ onOpenChange(true, event.nativeEvent || event, 'click');
42
+ }
43
+ },
44
+ onClick(event) {
45
+ const pointerType = pointerTypeRef.current;
46
+ if (eventOption === 'mousedown' && pointerTypeRef.current) {
47
+ pointerTypeRef.current = undefined;
48
+ return;
49
+ }
50
+ if (isMouseLikePointerType(pointerType, true) && ignoreMouse)
51
+ return;
52
+ if (open &&
53
+ toggle &&
54
+ (dataRef.current.openEvent && stickIfOpen
55
+ ? dataRef.current.openEvent.type === 'click'
56
+ : true)) {
57
+ onOpenChange(false, event.nativeEvent || event, 'click');
58
+ }
59
+ else {
60
+ onOpenChange(true, event.nativeEvent || event, 'click');
61
+ }
62
+ },
63
+ onKeyDown(event) {
64
+ pointerTypeRef.current = undefined;
65
+ if (event.defaultPrevented || !keyboardHandlers || isButtonTarget(event)) {
66
+ return;
67
+ }
68
+ if (event.key === ' ' && !isSpaceIgnored(domReference)) {
69
+ // prevent scrolling
70
+ event.preventDefault();
71
+ didKeyDownRef.current = true;
72
+ }
73
+ if (isAnchorTarget(event)) {
74
+ return;
75
+ }
76
+ if (event.key === 'Enter') {
77
+ if (open && toggle) {
78
+ onOpenChange(false, event.nativeEvent || event, 'click');
79
+ }
80
+ else {
81
+ onOpenChange(true, event.nativeEvent || event, 'click');
82
+ }
83
+ }
84
+ },
85
+ onKeyUp(event) {
86
+ if (event.defaultPrevented ||
87
+ !keyboardHandlers ||
88
+ isButtonTarget(event) ||
89
+ isSpaceIgnored(domReference)) {
90
+ return;
91
+ }
92
+ if (event.key === ' ' && didKeyDownRef.current) {
93
+ didKeyDownRef.current = false;
94
+ if (open && toggle) {
95
+ onOpenChange(false, event.nativeEvent || event, 'click');
96
+ }
97
+ else {
98
+ onOpenChange(true, event.nativeEvent || event, 'click');
99
+ }
100
+ }
101
+ },
102
+ }), [
103
+ dataRef,
104
+ domReference,
105
+ eventOption,
106
+ ignoreMouse,
107
+ keyboardHandlers,
108
+ onOpenChange,
109
+ open,
110
+ stickIfOpen,
111
+ toggle,
112
+ ]);
113
+ return useMemo(() => (enabled ? { reference } : {}), [enabled, reference]);
114
+ }
115
+ //# sourceMappingURL=useClick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClick.js","sourceRoot":"","sources":["../../../src/interactions/useClick.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import * as React from 'react';
2
+ const DelayGroupContext = React.createContext({
3
+ currentId: null,
4
+ setCurrentId: () => { },
5
+ delay: 0,
6
+ timeoutMs: 0,
7
+ initialDelay: 0,
8
+ });
9
+ export function useDelayGroupContext() {
10
+ return React.useContext(DelayGroupContext);
11
+ }
12
+ // provider for coordinated tooltip delay.
13
+ // when one tooltip is already open (currentId is set), subsequent tooltips
14
+ // in the group open instantly instead of with the configured delay.
15
+ export function FloatingDelayGroup({ children, delay, timeoutMs = 0, }) {
16
+ const [currentId, setCurrentIdRaw] = React.useState(null);
17
+ const timeoutRef = React.useRef(undefined);
18
+ const setCurrentId = React.useCallback((id) => {
19
+ clearTimeout(timeoutRef.current);
20
+ if (id == null && timeoutMs > 0) {
21
+ // delay clearing so moving between tooltips stays instant
22
+ timeoutRef.current = setTimeout(() => {
23
+ setCurrentIdRaw(null);
24
+ }, timeoutMs);
25
+ }
26
+ else {
27
+ setCurrentIdRaw(id);
28
+ }
29
+ }, [timeoutMs]);
30
+ React.useEffect(() => {
31
+ return () => clearTimeout(timeoutRef.current);
32
+ }, []);
33
+ const value = React.useMemo(() => ({
34
+ currentId,
35
+ setCurrentId,
36
+ delay,
37
+ timeoutMs,
38
+ initialDelay: delay,
39
+ }), [currentId, setCurrentId, delay, timeoutMs]);
40
+ return React.createElement(DelayGroupContext.Provider, { value }, children);
41
+ }
42
+ // registers a tooltip with the delay group.
43
+ // returns coordinated delay: instant open when another tooltip in the group is showing.
44
+ export function useDelayGroup(context, options = {}) {
45
+ const { id } = options;
46
+ const groupContext = React.useContext(DelayGroupContext);
47
+ // when this tooltip closes, start the timeout to clear the group
48
+ React.useEffect(() => {
49
+ if (!context.open && groupContext.currentId === id) {
50
+ groupContext.setCurrentId(null);
51
+ }
52
+ }, [context.open, id]);
53
+ // when another tooltip in the group opens (currentId changed to someone else),
54
+ // close this one so only one tooltip is visible at a time
55
+ React.useEffect(() => {
56
+ if (groupContext.currentId != null && groupContext.currentId !== id && context.open) {
57
+ context.onOpenChange(false);
58
+ }
59
+ }, [groupContext.currentId, id, context.open]);
60
+ // if another tooltip is currently open (currentId is set and not us),
61
+ // use instant delay for opening
62
+ if (groupContext.currentId != null) {
63
+ return {
64
+ delay: { open: 1, close: getClose(groupContext.initialDelay) },
65
+ currentId: groupContext.currentId,
66
+ };
67
+ }
68
+ return {
69
+ delay: groupContext.initialDelay,
70
+ currentId: groupContext.currentId,
71
+ };
72
+ }
73
+ function getClose(delay) {
74
+ if (typeof delay === 'number')
75
+ return delay;
76
+ return delay?.close ?? 0;
77
+ }
78
+ //# sourceMappingURL=useDelayGroup.js.map