@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,447 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useListNavigation = useListNavigation;
4
+ const react_1 = require("react");
5
+ const use_event_1 = require("@hanzogui/use-event");
6
+ const utils_ts_1 = require("./utils.js");
7
+ const ARROW_UP = 'ArrowUp';
8
+ const ARROW_DOWN = 'ArrowDown';
9
+ const ARROW_LEFT = 'ArrowLeft';
10
+ const ARROW_RIGHT = 'ArrowRight';
11
+ function doSwitch(orientation, vertical, horizontal) {
12
+ switch (orientation) {
13
+ case 'vertical':
14
+ return vertical;
15
+ case 'horizontal':
16
+ return horizontal;
17
+ default:
18
+ return vertical || horizontal;
19
+ }
20
+ }
21
+ function isMainOrientationKey(key, orientation) {
22
+ const vertical = key === ARROW_UP || key === ARROW_DOWN;
23
+ const horizontal = key === ARROW_LEFT || key === ARROW_RIGHT;
24
+ return doSwitch(orientation, vertical, horizontal);
25
+ }
26
+ function isMainOrientationToEndKey(key, orientation, rtl) {
27
+ const vertical = key === ARROW_DOWN;
28
+ const horizontal = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;
29
+ return (doSwitch(orientation, vertical, horizontal) ||
30
+ key === 'Enter' ||
31
+ key === ' ' ||
32
+ key === '');
33
+ }
34
+ function isCrossOrientationOpenKey(key, orientation, rtl) {
35
+ const vertical = rtl ? key === ARROW_LEFT : key === ARROW_RIGHT;
36
+ const horizontal = key === ARROW_DOWN;
37
+ return doSwitch(orientation, vertical, horizontal);
38
+ }
39
+ function isCrossOrientationCloseKey(key, orientation, rtl) {
40
+ const vertical = rtl ? key === ARROW_RIGHT : key === ARROW_LEFT;
41
+ const horizontal = key === ARROW_UP;
42
+ return doSwitch(orientation, vertical, horizontal);
43
+ }
44
+ // arrow key-based navigation of a list of items, with real or virtual (aria-activedescendant) focus
45
+ function useListNavigation(context, props) {
46
+ const { open, onOpenChange, elements } = context;
47
+ const { listRef, activeIndex, onNavigate: unstable_onNavigate = () => { }, enabled = true, selectedIndex = null, allowEscape = false, loop = false, nested = false, rtl = false, virtual = false, focusItemOnOpen = 'auto', focusItemOnHover = true, openOnArrowKeyDown = true, disabledIndices = undefined, orientation = 'vertical', scrollItemIntoView = true, } = props;
48
+ const typeableComboboxReference = (0, utils_ts_1.isTypeableCombobox)(elements.domReference);
49
+ const focusItemOnOpenRef = (0, react_1.useRef)(focusItemOnOpen);
50
+ const indexRef = (0, react_1.useRef)(selectedIndex ?? -1);
51
+ const keyRef = (0, react_1.useRef)(null);
52
+ const isPointerModalityRef = (0, react_1.useRef)(true);
53
+ const previousMountedRef = (0, react_1.useRef)(!!elements.floating);
54
+ const previousOpenRef = (0, react_1.useRef)(open);
55
+ const forceSyncFocusRef = (0, react_1.useRef)(false);
56
+ const forceScrollIntoViewRef = (0, react_1.useRef)(false);
57
+ // latest-value refs
58
+ const disabledIndicesRef = (0, react_1.useRef)(disabledIndices);
59
+ disabledIndicesRef.current = disabledIndices;
60
+ const latestOpenRef = (0, react_1.useRef)(open);
61
+ latestOpenRef.current = open;
62
+ const scrollItemIntoViewRef = (0, react_1.useRef)(scrollItemIntoView);
63
+ scrollItemIntoViewRef.current = scrollItemIntoView;
64
+ const selectedIndexRef = (0, react_1.useRef)(selectedIndex);
65
+ selectedIndexRef.current = selectedIndex;
66
+ // stable callback via useEvent
67
+ const stableOnNavigate = (0, use_event_1.useEvent)(unstable_onNavigate);
68
+ const [activeId, setActiveId] = (0, react_1.useState)();
69
+ // stable onNavigate that reads from indexRef
70
+ const onNavigate = (0, use_event_1.useEvent)(() => {
71
+ stableOnNavigate(indexRef.current === -1 ? null : indexRef.current);
72
+ });
73
+ // store previous onNavigate for cleanup
74
+ const previousOnNavigateRef = (0, react_1.useRef)(onNavigate);
75
+ const focusItem = (0, use_event_1.useEvent)(() => {
76
+ function runFocus(item) {
77
+ if (virtual) {
78
+ setActiveId(item.id);
79
+ }
80
+ else {
81
+ (0, utils_ts_1.enqueueFocus)(item, {
82
+ sync: forceSyncFocusRef.current,
83
+ preventScroll: true,
84
+ });
85
+ }
86
+ }
87
+ const initialItem = listRef.current[indexRef.current];
88
+ const forceScrollIntoView = forceScrollIntoViewRef.current;
89
+ if (initialItem) {
90
+ runFocus(initialItem);
91
+ }
92
+ const scheduler = forceSyncFocusRef.current
93
+ ? (v) => v()
94
+ : requestAnimationFrame;
95
+ scheduler(() => {
96
+ const waitedItem = listRef.current[indexRef.current] || initialItem;
97
+ if (!waitedItem)
98
+ return;
99
+ if (!initialItem) {
100
+ runFocus(waitedItem);
101
+ }
102
+ const scrollIntoViewOptions = scrollItemIntoViewRef.current;
103
+ const shouldScrollIntoView = scrollIntoViewOptions &&
104
+ waitedItem &&
105
+ (forceScrollIntoView || !isPointerModalityRef.current);
106
+ if (shouldScrollIntoView) {
107
+ waitedItem.scrollIntoView?.(typeof scrollIntoViewOptions === 'boolean'
108
+ ? { block: 'nearest', inline: 'nearest' }
109
+ : scrollIntoViewOptions);
110
+ }
111
+ });
112
+ });
113
+ // sync selectedIndex to activeIndex on open, reset on close
114
+ (0, react_1.useLayoutEffect)(() => {
115
+ if (!enabled)
116
+ return;
117
+ if (open && elements.floating) {
118
+ if (focusItemOnOpenRef.current && selectedIndex != null) {
119
+ forceScrollIntoViewRef.current = true;
120
+ indexRef.current = selectedIndex;
121
+ onNavigate();
122
+ }
123
+ }
124
+ else if (previousMountedRef.current) {
125
+ indexRef.current = -1;
126
+ previousOnNavigateRef.current();
127
+ }
128
+ }, [enabled, open, elements.floating, selectedIndex, onNavigate]);
129
+ // sync activeIndex to focused item while open
130
+ (0, react_1.useLayoutEffect)(() => {
131
+ if (!enabled)
132
+ return;
133
+ if (!open)
134
+ return;
135
+ if (!elements.floating)
136
+ return;
137
+ if (activeIndex == null) {
138
+ forceSyncFocusRef.current = false;
139
+ if (selectedIndexRef.current != null) {
140
+ return;
141
+ }
142
+ // reset while the floating element was open (e.g. the list changed)
143
+ if (previousMountedRef.current) {
144
+ indexRef.current = -1;
145
+ focusItem();
146
+ }
147
+ // initial sync
148
+ if ((!previousOpenRef.current || !previousMountedRef.current) &&
149
+ focusItemOnOpenRef.current &&
150
+ (keyRef.current != null ||
151
+ (focusItemOnOpenRef.current === true && keyRef.current == null))) {
152
+ let runs = 0;
153
+ const waitForListPopulated = () => {
154
+ if (listRef.current[0] == null) {
155
+ if (runs < 2) {
156
+ const scheduler = runs ? requestAnimationFrame : queueMicrotask;
157
+ scheduler(waitForListPopulated);
158
+ }
159
+ runs++;
160
+ }
161
+ else {
162
+ indexRef.current =
163
+ keyRef.current == null ||
164
+ isMainOrientationToEndKey(keyRef.current, orientation, rtl) ||
165
+ nested
166
+ ? (0, utils_ts_1.getMinListIndex)(listRef, disabledIndicesRef.current)
167
+ : (0, utils_ts_1.getMaxListIndex)(listRef, disabledIndicesRef.current);
168
+ keyRef.current = null;
169
+ onNavigate();
170
+ }
171
+ };
172
+ waitForListPopulated();
173
+ }
174
+ }
175
+ else if (!(0, utils_ts_1.isIndexOutOfListBounds)(listRef, activeIndex)) {
176
+ indexRef.current = activeIndex;
177
+ focusItem();
178
+ forceScrollIntoViewRef.current = false;
179
+ }
180
+ }, [
181
+ enabled,
182
+ open,
183
+ elements.floating,
184
+ activeIndex,
185
+ selectedIndexRef,
186
+ nested,
187
+ listRef,
188
+ orientation,
189
+ rtl,
190
+ onNavigate,
191
+ focusItem,
192
+ disabledIndicesRef,
193
+ ]);
194
+ // track previous state
195
+ (0, react_1.useLayoutEffect)(() => {
196
+ previousOnNavigateRef.current = onNavigate;
197
+ previousOpenRef.current = open;
198
+ previousMountedRef.current = !!elements.floating;
199
+ });
200
+ (0, react_1.useLayoutEffect)(() => {
201
+ if (!open) {
202
+ keyRef.current = null;
203
+ focusItemOnOpenRef.current = focusItemOnOpen;
204
+ }
205
+ }, [open, focusItemOnOpen]);
206
+ const hasActiveIndex = activeIndex != null;
207
+ const commonOnKeyDown = (0, use_event_1.useEvent)((event) => {
208
+ isPointerModalityRef.current = false;
209
+ forceSyncFocusRef.current = true;
210
+ // composing character check (chrome fires ArrowDown twice)
211
+ if (event.which === 229) {
212
+ return;
213
+ }
214
+ // if floating element is animating out, ignore navigation
215
+ if (!latestOpenRef.current && event.currentTarget === elements.floating) {
216
+ return;
217
+ }
218
+ if (nested && isCrossOrientationCloseKey(event.key, orientation, rtl)) {
219
+ (0, utils_ts_1.stopEvent)(event);
220
+ onOpenChange(false, event.nativeEvent, 'list-navigation');
221
+ if ((0, utils_ts_1.isHTMLElement)(elements.domReference)) {
222
+ elements.domReference.focus();
223
+ }
224
+ return;
225
+ }
226
+ const currentIndex = indexRef.current;
227
+ const minIndex = (0, utils_ts_1.getMinListIndex)(listRef, disabledIndices);
228
+ const maxIndex = (0, utils_ts_1.getMaxListIndex)(listRef, disabledIndices);
229
+ if (!typeableComboboxReference) {
230
+ if (event.key === 'Home') {
231
+ (0, utils_ts_1.stopEvent)(event);
232
+ indexRef.current = minIndex;
233
+ onNavigate();
234
+ }
235
+ if (event.key === 'End') {
236
+ (0, utils_ts_1.stopEvent)(event);
237
+ indexRef.current = maxIndex;
238
+ onNavigate();
239
+ }
240
+ }
241
+ if (isMainOrientationKey(event.key, orientation)) {
242
+ (0, utils_ts_1.stopEvent)(event);
243
+ // reset the index if no item is focused
244
+ if (open &&
245
+ !virtual &&
246
+ (0, utils_ts_1.activeElement)(event.currentTarget.ownerDocument) === event.currentTarget) {
247
+ indexRef.current = isMainOrientationToEndKey(event.key, orientation, rtl)
248
+ ? minIndex
249
+ : maxIndex;
250
+ onNavigate();
251
+ return;
252
+ }
253
+ if (isMainOrientationToEndKey(event.key, orientation, rtl)) {
254
+ if (loop) {
255
+ indexRef.current =
256
+ currentIndex >= maxIndex
257
+ ? allowEscape && currentIndex !== listRef.current.length
258
+ ? -1
259
+ : minIndex
260
+ : (0, utils_ts_1.findNonDisabledListIndex)(listRef, {
261
+ startingIndex: currentIndex,
262
+ disabledIndices,
263
+ });
264
+ }
265
+ else {
266
+ indexRef.current = Math.min(maxIndex, (0, utils_ts_1.findNonDisabledListIndex)(listRef, {
267
+ startingIndex: currentIndex,
268
+ disabledIndices,
269
+ }));
270
+ }
271
+ }
272
+ else {
273
+ if (loop) {
274
+ indexRef.current =
275
+ currentIndex <= minIndex
276
+ ? allowEscape && currentIndex !== -1
277
+ ? listRef.current.length
278
+ : maxIndex
279
+ : (0, utils_ts_1.findNonDisabledListIndex)(listRef, {
280
+ startingIndex: currentIndex,
281
+ decrement: true,
282
+ disabledIndices,
283
+ });
284
+ }
285
+ else {
286
+ indexRef.current = Math.max(minIndex, (0, utils_ts_1.findNonDisabledListIndex)(listRef, {
287
+ startingIndex: currentIndex,
288
+ decrement: true,
289
+ disabledIndices,
290
+ }));
291
+ }
292
+ }
293
+ if ((0, utils_ts_1.isIndexOutOfListBounds)(listRef, indexRef.current)) {
294
+ indexRef.current = -1;
295
+ }
296
+ onNavigate();
297
+ }
298
+ });
299
+ const ariaActiveDescendantProp = (0, react_1.useMemo)(() => {
300
+ return (virtual &&
301
+ open &&
302
+ hasActiveIndex && {
303
+ 'aria-activedescendant': activeId,
304
+ });
305
+ }, [virtual, open, hasActiveIndex, activeId]);
306
+ const floating = (0, react_1.useMemo)(() => {
307
+ return {
308
+ 'aria-orientation': orientation === 'both' ? undefined : orientation,
309
+ ...(!typeableComboboxReference ? ariaActiveDescendantProp : {}),
310
+ onKeyDown: commonOnKeyDown,
311
+ onPointerMove() {
312
+ isPointerModalityRef.current = true;
313
+ },
314
+ };
315
+ }, [ariaActiveDescendantProp, commonOnKeyDown, orientation, typeableComboboxReference]);
316
+ const reference = (0, react_1.useMemo)(() => {
317
+ function checkVirtualMouse(event) {
318
+ if (focusItemOnOpen === 'auto' && (0, utils_ts_1.isVirtualClick)(event.nativeEvent)) {
319
+ focusItemOnOpenRef.current = true;
320
+ }
321
+ }
322
+ function checkVirtualPointer(event) {
323
+ focusItemOnOpenRef.current = focusItemOnOpen;
324
+ if (focusItemOnOpen === 'auto' && (0, utils_ts_1.isVirtualPointerEvent)(event.nativeEvent)) {
325
+ focusItemOnOpenRef.current = true;
326
+ }
327
+ }
328
+ return {
329
+ ...ariaActiveDescendantProp,
330
+ onKeyDown(event) {
331
+ isPointerModalityRef.current = false;
332
+ const isArrowKey = event.key.startsWith('Arrow');
333
+ const isCrossOpenKey = isCrossOrientationOpenKey(event.key, orientation, rtl);
334
+ const isMainKey = isMainOrientationKey(event.key, orientation);
335
+ const isNavigationKey = (nested ? isCrossOpenKey : isMainKey) ||
336
+ event.key === 'Enter' ||
337
+ event.key.trim() === '';
338
+ if (virtual && open) {
339
+ return commonOnKeyDown(event);
340
+ }
341
+ // if a floating element should not open on arrow key down, avoid
342
+ // setting activeIndex while it's closed
343
+ if (!open && !openOnArrowKeyDown && isArrowKey) {
344
+ return;
345
+ }
346
+ if (isNavigationKey) {
347
+ keyRef.current = event.key;
348
+ }
349
+ if (nested) {
350
+ if (isCrossOpenKey) {
351
+ (0, utils_ts_1.stopEvent)(event);
352
+ if (open) {
353
+ indexRef.current = (0, utils_ts_1.getMinListIndex)(listRef, disabledIndicesRef.current);
354
+ onNavigate();
355
+ }
356
+ else {
357
+ onOpenChange(true, event.nativeEvent, 'list-navigation');
358
+ }
359
+ }
360
+ return;
361
+ }
362
+ if (isMainKey) {
363
+ if (selectedIndex != null) {
364
+ indexRef.current = selectedIndex;
365
+ }
366
+ (0, utils_ts_1.stopEvent)(event);
367
+ if (!open && openOnArrowKeyDown) {
368
+ onOpenChange(true, event.nativeEvent, 'list-navigation');
369
+ }
370
+ else {
371
+ commonOnKeyDown(event);
372
+ }
373
+ if (open) {
374
+ onNavigate();
375
+ }
376
+ }
377
+ },
378
+ onFocus() {
379
+ if (open && !virtual) {
380
+ indexRef.current = -1;
381
+ onNavigate();
382
+ }
383
+ },
384
+ onPointerDown: checkVirtualPointer,
385
+ onPointerEnter: checkVirtualPointer,
386
+ onMouseDown: checkVirtualMouse,
387
+ onClick: checkVirtualMouse,
388
+ };
389
+ }, [
390
+ ariaActiveDescendantProp,
391
+ commonOnKeyDown,
392
+ disabledIndicesRef,
393
+ focusItemOnOpen,
394
+ listRef,
395
+ nested,
396
+ onNavigate,
397
+ onOpenChange,
398
+ open,
399
+ openOnArrowKeyDown,
400
+ orientation,
401
+ rtl,
402
+ selectedIndex,
403
+ virtual,
404
+ ]);
405
+ const item = (0, react_1.useMemo)(() => {
406
+ function syncCurrentTarget(currentTarget) {
407
+ if (!latestOpenRef.current)
408
+ return;
409
+ const index = listRef.current.indexOf(currentTarget);
410
+ if (index !== -1 && indexRef.current !== index) {
411
+ indexRef.current = index;
412
+ onNavigate();
413
+ }
414
+ }
415
+ const itemProps = {
416
+ onFocus({ currentTarget }) {
417
+ forceSyncFocusRef.current = true;
418
+ syncCurrentTarget(currentTarget);
419
+ },
420
+ onClick: ({ currentTarget }) => currentTarget.focus({ preventScroll: true }), // safari
421
+ onMouseMove({ currentTarget }) {
422
+ forceSyncFocusRef.current = true;
423
+ forceScrollIntoViewRef.current = false;
424
+ if (focusItemOnHover) {
425
+ syncCurrentTarget(currentTarget);
426
+ }
427
+ },
428
+ onPointerLeave({ pointerType }) {
429
+ if (!isPointerModalityRef.current || pointerType === 'touch') {
430
+ return;
431
+ }
432
+ forceSyncFocusRef.current = true;
433
+ if (!focusItemOnHover) {
434
+ return;
435
+ }
436
+ indexRef.current = -1;
437
+ onNavigate();
438
+ if (!virtual) {
439
+ elements.floating?.focus({ preventScroll: true });
440
+ }
441
+ },
442
+ };
443
+ return itemProps;
444
+ }, [latestOpenRef, focusItemOnHover, listRef, onNavigate, virtual, elements.floating]);
445
+ return (0, react_1.useMemo)(() => (enabled ? { reference, floating, item } : {}), [enabled, reference, floating, item]);
446
+ }
447
+ //# sourceMappingURL=useListNavigation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useListNavigation.js","sourceRoot":"","sources":["../../../src/interactions/useListNavigation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRole = useRole;
4
+ const tslib_1 = require("tslib");
5
+ const React = tslib_1.__importStar(require("react"));
6
+ const componentRoleToAriaRoleMap = new Map([
7
+ ['select', 'listbox'],
8
+ ['combobox', 'listbox'],
9
+ ['label', false],
10
+ ]);
11
+ let idCounter = 0;
12
+ // sets ARIA attributes based on role
13
+ function useRole(context, props = {}) {
14
+ const { open, elements } = context;
15
+ const { enabled = true, role = 'dialog' } = props;
16
+ const defaultReferenceId = React.useId();
17
+ const referenceId = elements.domReference?.id || defaultReferenceId;
18
+ const defaultFloatingId = React.useMemo(() => `floating-${idCounter++}`, []);
19
+ const floatingId = React.useMemo(() => elements.floating?.id || defaultFloatingId, [elements.floating, defaultFloatingId]);
20
+ const ariaRole = (componentRoleToAriaRoleMap.get(role) ?? role);
21
+ const reference = React.useMemo(() => {
22
+ if (ariaRole === 'tooltip' || role === 'label') {
23
+ return {
24
+ [`aria-${role === 'label' ? 'labelledby' : 'describedby'}`]: open
25
+ ? floatingId
26
+ : undefined,
27
+ };
28
+ }
29
+ return {
30
+ 'aria-expanded': open ? 'true' : 'false',
31
+ 'aria-haspopup': ariaRole === 'alertdialog' ? 'dialog' : ariaRole,
32
+ 'aria-controls': open ? floatingId : undefined,
33
+ ...(ariaRole === 'listbox' && { role: 'combobox' }),
34
+ ...(ariaRole === 'menu' && { id: referenceId }),
35
+ ...(role === 'select' && { 'aria-autocomplete': 'none' }),
36
+ ...(role === 'combobox' && { 'aria-autocomplete': 'list' }),
37
+ };
38
+ }, [ariaRole, floatingId, open, referenceId, role]);
39
+ const floating = React.useMemo(() => {
40
+ const floatingProps = {
41
+ id: floatingId,
42
+ ...(ariaRole && { role: ariaRole }),
43
+ };
44
+ if (ariaRole === 'tooltip' || role === 'label') {
45
+ return floatingProps;
46
+ }
47
+ return {
48
+ ...floatingProps,
49
+ ...(ariaRole === 'menu' && { 'aria-labelledby': referenceId }),
50
+ };
51
+ }, [ariaRole, floatingId, referenceId, role]);
52
+ const item = React.useCallback(({ active, selected }) => {
53
+ const commonProps = {
54
+ role: 'option',
55
+ ...(active && { id: `${floatingId}-fui-option` }),
56
+ };
57
+ switch (role) {
58
+ case 'select':
59
+ case 'combobox':
60
+ return {
61
+ ...commonProps,
62
+ 'aria-selected': selected,
63
+ };
64
+ }
65
+ return {};
66
+ }, [floatingId, role]);
67
+ return React.useMemo(() => (enabled ? { reference, floating, item } : {}), [enabled, reference, floating, item]);
68
+ }
69
+ //# sourceMappingURL=useRole.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRole.js","sourceRoot":"","sources":["../../../src/interactions/useRole.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTypeahead = useTypeahead;
4
+ const react_1 = require("react");
5
+ const use_event_1 = require("@hanzogui/use-event");
6
+ const utils_ts_1 = require("./utils.js");
7
+ // typeahead: character buffer matching against list items
8
+ // ported from floating-ui/react useTypeahead
9
+ function useTypeahead(context, props) {
10
+ const { open, dataRef } = context;
11
+ const { listRef, activeIndex, onMatch: unstable_onMatch, onTypingChange: unstable_onTypingChange, enabled = true, findMatch = null, resetMs = 750, ignoreKeys = [], selectedIndex = null, } = props;
12
+ const timeoutIdRef = (0, react_1.useRef)(-1);
13
+ const stringRef = (0, react_1.useRef)('');
14
+ const prevIndexRef = (0, react_1.useRef)(selectedIndex ?? activeIndex ?? -1);
15
+ const matchIndexRef = (0, react_1.useRef)(null);
16
+ // stable callbacks via useEvent
17
+ const onMatch = (0, use_event_1.useEvent)(unstable_onMatch || (() => { }));
18
+ const onTypingChange = (0, use_event_1.useEvent)(unstable_onTypingChange || (() => { }));
19
+ // latest-value refs
20
+ const findMatchRef = (0, react_1.useRef)(findMatch);
21
+ findMatchRef.current = findMatch;
22
+ const ignoreKeysRef = (0, react_1.useRef)(ignoreKeys);
23
+ ignoreKeysRef.current = ignoreKeys;
24
+ (0, react_1.useLayoutEffect)(() => {
25
+ if (open) {
26
+ (0, utils_ts_1.clearTimeoutIfSet)(timeoutIdRef);
27
+ matchIndexRef.current = null;
28
+ stringRef.current = '';
29
+ }
30
+ }, [open]);
31
+ (0, react_1.useLayoutEffect)(() => {
32
+ // sync arrow key navigation but not typeahead navigation
33
+ if (open && stringRef.current === '') {
34
+ prevIndexRef.current = selectedIndex ?? activeIndex ?? -1;
35
+ }
36
+ }, [open, selectedIndex, activeIndex]);
37
+ const setTypingChange = (value) => {
38
+ if (value) {
39
+ if (!dataRef.current.typing) {
40
+ dataRef.current.typing = value;
41
+ onTypingChange(value);
42
+ }
43
+ }
44
+ else {
45
+ if (dataRef.current.typing) {
46
+ dataRef.current.typing = value;
47
+ onTypingChange(value);
48
+ }
49
+ }
50
+ };
51
+ const onKeyDown = (event) => {
52
+ function getMatchingIndex(list, orderedList, string) {
53
+ const str = findMatchRef.current
54
+ ? findMatchRef.current(orderedList, string)
55
+ : orderedList.find((text) => text?.toLocaleLowerCase().indexOf(string.toLocaleLowerCase()) === 0);
56
+ return str ? list.indexOf(str) : -1;
57
+ }
58
+ const listContent = listRef.current;
59
+ if (stringRef.current.length > 0 && stringRef.current[0] !== ' ') {
60
+ if (getMatchingIndex(listContent, listContent, stringRef.current) === -1) {
61
+ setTypingChange(false);
62
+ }
63
+ else if (event.key === ' ') {
64
+ (0, utils_ts_1.stopEvent)(event);
65
+ }
66
+ }
67
+ if (listContent == null ||
68
+ ignoreKeysRef.current.includes(event.key) ||
69
+ // character key
70
+ event.key.length !== 1 ||
71
+ // modifier key
72
+ event.ctrlKey ||
73
+ event.metaKey ||
74
+ event.altKey) {
75
+ return;
76
+ }
77
+ if (open && event.key !== ' ') {
78
+ (0, utils_ts_1.stopEvent)(event);
79
+ setTypingChange(true);
80
+ }
81
+ // bail out if the list contains a word like "llama" or "aaron"
82
+ const allowRapidSuccessionOfFirstLetter = listContent.every((text) => text ? text[0]?.toLocaleLowerCase() !== text[1]?.toLocaleLowerCase() : true);
83
+ // allows the user to cycle through items that start with the same letter
84
+ // in rapid succession
85
+ if (allowRapidSuccessionOfFirstLetter && stringRef.current === event.key) {
86
+ stringRef.current = '';
87
+ prevIndexRef.current = matchIndexRef.current;
88
+ }
89
+ stringRef.current += event.key;
90
+ (0, utils_ts_1.clearTimeoutIfSet)(timeoutIdRef);
91
+ timeoutIdRef.current = window.setTimeout(() => {
92
+ stringRef.current = '';
93
+ prevIndexRef.current = matchIndexRef.current;
94
+ setTypingChange(false);
95
+ }, resetMs);
96
+ const prevIndex = prevIndexRef.current;
97
+ const index = getMatchingIndex(listContent, [
98
+ ...listContent.slice((prevIndex || 0) + 1),
99
+ ...listContent.slice(0, (prevIndex || 0) + 1),
100
+ ], stringRef.current);
101
+ if (index !== -1) {
102
+ onMatch(index);
103
+ matchIndexRef.current = index;
104
+ }
105
+ else if (event.key !== ' ') {
106
+ stringRef.current = '';
107
+ setTypingChange(false);
108
+ }
109
+ };
110
+ const reference = (0, react_1.useMemo)(() => ({ onKeyDown: onKeyDown }), [open, enabled]);
111
+ const floating = (0, react_1.useMemo)(() => ({
112
+ onKeyDown: onKeyDown,
113
+ onKeyUp(event) {
114
+ if (event.key === ' ') {
115
+ setTypingChange(false);
116
+ }
117
+ },
118
+ }), [open, enabled]);
119
+ return (0, react_1.useMemo)(() => (enabled ? { reference, floating } : {}), [enabled, reference, floating]);
120
+ }
121
+ //# sourceMappingURL=useTypeahead.js.map