react-native-layout-dnd 0.1.0-alpha.0

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 (340) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +262 -0
  3. package/lib/module/adapters/coordinates.js +135 -0
  4. package/lib/module/adapters/coordinates.js.map +1 -0
  5. package/lib/module/adapters/scroll.js +81 -0
  6. package/lib/module/adapters/scroll.js.map +1 -0
  7. package/lib/module/adapters/virtualizedList.js +69 -0
  8. package/lib/module/adapters/virtualizedList.js.map +1 -0
  9. package/lib/module/components/DndProvider.js +1144 -0
  10. package/lib/module/components/DndProvider.js.map +1 -0
  11. package/lib/module/components/DragHandle.js +65 -0
  12. package/lib/module/components/DragHandle.js.map +1 -0
  13. package/lib/module/components/GridController.js +151 -0
  14. package/lib/module/components/GridController.js.map +1 -0
  15. package/lib/module/components/GridDragHandle.js +15 -0
  16. package/lib/module/components/GridDragHandle.js.map +1 -0
  17. package/lib/module/components/GridZoneView.js +59 -0
  18. package/lib/module/components/GridZoneView.js.map +1 -0
  19. package/lib/module/components/SortableGrid.js +305 -0
  20. package/lib/module/components/SortableGrid.js.map +1 -0
  21. package/lib/module/components/SortableList.js +714 -0
  22. package/lib/module/components/SortableList.js.map +1 -0
  23. package/lib/module/components/dndTypes.js +4 -0
  24. package/lib/module/components/dndTypes.js.map +1 -0
  25. package/lib/module/components/gridTypes.js +4 -0
  26. package/lib/module/components/gridTypes.js.map +1 -0
  27. package/lib/module/components/handleViewProps.js +13 -0
  28. package/lib/module/components/handleViewProps.js.map +1 -0
  29. package/lib/module/contracts.js +4 -0
  30. package/lib/module/contracts.js.map +1 -0
  31. package/lib/module/controller/approval.js +98 -0
  32. package/lib/module/controller/approval.js.map +1 -0
  33. package/lib/module/controller/coordinatorBase.js +93 -0
  34. package/lib/module/controller/coordinatorBase.js.map +1 -0
  35. package/lib/module/controller/dndSession.js +621 -0
  36. package/lib/module/controller/dndSession.js.map +1 -0
  37. package/lib/module/controller/dndState.js +103 -0
  38. package/lib/module/controller/dndState.js.map +1 -0
  39. package/lib/module/controller/gridAdapter.js +191 -0
  40. package/lib/module/controller/gridAdapter.js.map +1 -0
  41. package/lib/module/controller/gridState.js +101 -0
  42. package/lib/module/controller/gridState.js.map +1 -0
  43. package/lib/module/controller/locations.js +48 -0
  44. package/lib/module/controller/locations.js.map +1 -0
  45. package/lib/module/controller/previewPath.js +73 -0
  46. package/lib/module/controller/previewPath.js.map +1 -0
  47. package/lib/module/controller/sessionCore.js +222 -0
  48. package/lib/module/controller/sessionCore.js.map +1 -0
  49. package/lib/module/controller/useDndState.js +9 -0
  50. package/lib/module/controller/useDndState.js.map +1 -0
  51. package/lib/module/controller/useGridState.js +9 -0
  52. package/lib/module/controller/useGridState.js.map +1 -0
  53. package/lib/module/controller/useStoreState.js +15 -0
  54. package/lib/module/controller/useStoreState.js.map +1 -0
  55. package/lib/module/defaults.js +7 -0
  56. package/lib/module/defaults.js.map +1 -0
  57. package/lib/module/diagnostics.js +16 -0
  58. package/lib/module/diagnostics.js.map +1 -0
  59. package/lib/module/engine/gridPlacements.js +54 -0
  60. package/lib/module/engine/gridPlacements.js.map +1 -0
  61. package/lib/module/engine/index.js +19 -0
  62. package/lib/module/engine/index.js.map +1 -0
  63. package/lib/module/engine/layout.js +36 -0
  64. package/lib/module/engine/layout.js.map +1 -0
  65. package/lib/module/engine/layoutMove.js +326 -0
  66. package/lib/module/engine/layoutMove.js.map +1 -0
  67. package/lib/module/engine/layoutState.js +344 -0
  68. package/lib/module/engine/layoutState.js.map +1 -0
  69. package/lib/module/engine/list.js +172 -0
  70. package/lib/module/engine/list.js.map +1 -0
  71. package/lib/module/engine/listIndex.js +125 -0
  72. package/lib/module/engine/listIndex.js.map +1 -0
  73. package/lib/module/engine/move.js +216 -0
  74. package/lib/module/engine/move.js.map +1 -0
  75. package/lib/module/engine/movementPolicy.js +77 -0
  76. package/lib/module/engine/movementPolicy.js.map +1 -0
  77. package/lib/module/engine/orderedTarget.js +71 -0
  78. package/lib/module/engine/orderedTarget.js.map +1 -0
  79. package/lib/module/engine/pack.js +30 -0
  80. package/lib/module/engine/pack.js.map +1 -0
  81. package/lib/module/engine/rectangles.js +12 -0
  82. package/lib/module/engine/rectangles.js.map +1 -0
  83. package/lib/module/engine/sameLayout.js +29 -0
  84. package/lib/module/engine/sameLayout.js.map +1 -0
  85. package/lib/module/engine/search.js +159 -0
  86. package/lib/module/engine/search.js.map +1 -0
  87. package/lib/module/engine/spatial.js +27 -0
  88. package/lib/module/engine/spatial.js.map +1 -0
  89. package/lib/module/engine/spatialAppRotation.js +39 -0
  90. package/lib/module/engine/spatialAppRotation.js.map +1 -0
  91. package/lib/module/engine/spatialExchange.js +164 -0
  92. package/lib/module/engine/spatialExchange.js.map +1 -0
  93. package/lib/module/engine/spatialInsertion.js +135 -0
  94. package/lib/module/engine/spatialInsertion.js.map +1 -0
  95. package/lib/module/engine/spatialPolicy.js +41 -0
  96. package/lib/module/engine/spatialPolicy.js.map +1 -0
  97. package/lib/module/engine/spatialRotation.js +48 -0
  98. package/lib/module/engine/spatialRotation.js.map +1 -0
  99. package/lib/module/engine/validation.js +205 -0
  100. package/lib/module/engine/validation.js.map +1 -0
  101. package/lib/module/gesture/DndGestureGroup.js +268 -0
  102. package/lib/module/gesture/DndGestureGroup.js.map +1 -0
  103. package/lib/module/gesture/DndGestureHost.js +32 -0
  104. package/lib/module/gesture/DndGestureHost.js.map +1 -0
  105. package/lib/module/gesture/gestureConfig.js +81 -0
  106. package/lib/module/gesture/gestureConfig.js.map +1 -0
  107. package/lib/module/gesture/gestureGrouping.js +122 -0
  108. package/lib/module/gesture/gestureGrouping.js.map +1 -0
  109. package/lib/module/gesture/gestureHost.js +106 -0
  110. package/lib/module/gesture/gestureHost.js.map +1 -0
  111. package/lib/module/index.js +23 -0
  112. package/lib/module/index.js.map +1 -0
  113. package/lib/module/package.json +1 -0
  114. package/lib/module/pointer/dndTarget.js +101 -0
  115. package/lib/module/pointer/dndTarget.js.map +1 -0
  116. package/lib/module/pointer/geometry.js +363 -0
  117. package/lib/module/pointer/geometry.js.map +1 -0
  118. package/lib/module/pointer/layoutTarget.js +307 -0
  119. package/lib/module/pointer/layoutTarget.js.map +1 -0
  120. package/lib/module/pointer/listCellMotion.js +99 -0
  121. package/lib/module/pointer/listCellMotion.js.map +1 -0
  122. package/lib/module/pointer/listTarget.js +42 -0
  123. package/lib/module/pointer/listTarget.js.map +1 -0
  124. package/lib/module/pointer/motion.js +37 -0
  125. package/lib/module/pointer/motion.js.map +1 -0
  126. package/lib/module/runtime/dndPresentation.js +81 -0
  127. package/lib/module/runtime/dndPresentation.js.map +1 -0
  128. package/lib/module/runtime/dndRenderStore.js +129 -0
  129. package/lib/module/runtime/dndRenderStore.js.map +1 -0
  130. package/lib/module/runtime/dndRuntime.js +135 -0
  131. package/lib/module/runtime/dndRuntime.js.map +1 -0
  132. package/lib/module/runtime/dndSettlement.js +77 -0
  133. package/lib/module/runtime/dndSettlement.js.map +1 -0
  134. package/lib/module/runtime/gridRuntime.js +37 -0
  135. package/lib/module/runtime/gridRuntime.js.map +1 -0
  136. package/lib/module/types.js +4 -0
  137. package/lib/module/types.js.map +1 -0
  138. package/lib/typescript/package.json +1 -0
  139. package/lib/typescript/src/adapters/coordinates.d.ts +9 -0
  140. package/lib/typescript/src/adapters/coordinates.d.ts.map +1 -0
  141. package/lib/typescript/src/adapters/scroll.d.ts +49 -0
  142. package/lib/typescript/src/adapters/scroll.d.ts.map +1 -0
  143. package/lib/typescript/src/adapters/virtualizedList.d.ts +22 -0
  144. package/lib/typescript/src/adapters/virtualizedList.d.ts.map +1 -0
  145. package/lib/typescript/src/components/DndProvider.d.ts +4 -0
  146. package/lib/typescript/src/components/DndProvider.d.ts.map +1 -0
  147. package/lib/typescript/src/components/DragHandle.d.ts +4 -0
  148. package/lib/typescript/src/components/DragHandle.d.ts.map +1 -0
  149. package/lib/typescript/src/components/GridController.d.ts +21 -0
  150. package/lib/typescript/src/components/GridController.d.ts.map +1 -0
  151. package/lib/typescript/src/components/GridDragHandle.d.ts +8 -0
  152. package/lib/typescript/src/components/GridDragHandle.d.ts.map +1 -0
  153. package/lib/typescript/src/components/GridZoneView.d.ts +8 -0
  154. package/lib/typescript/src/components/GridZoneView.d.ts.map +1 -0
  155. package/lib/typescript/src/components/SortableGrid.d.ts +4 -0
  156. package/lib/typescript/src/components/SortableGrid.d.ts.map +1 -0
  157. package/lib/typescript/src/components/SortableList.d.ts +4 -0
  158. package/lib/typescript/src/components/SortableList.d.ts.map +1 -0
  159. package/lib/typescript/src/components/dndTypes.d.ts +94 -0
  160. package/lib/typescript/src/components/dndTypes.d.ts.map +1 -0
  161. package/lib/typescript/src/components/gridTypes.d.ts +84 -0
  162. package/lib/typescript/src/components/gridTypes.d.ts.map +1 -0
  163. package/lib/typescript/src/components/handleViewProps.d.ts +6 -0
  164. package/lib/typescript/src/components/handleViewProps.d.ts.map +1 -0
  165. package/lib/typescript/src/contracts.d.ts +145 -0
  166. package/lib/typescript/src/contracts.d.ts.map +1 -0
  167. package/lib/typescript/src/controller/approval.d.ts +66 -0
  168. package/lib/typescript/src/controller/approval.d.ts.map +1 -0
  169. package/lib/typescript/src/controller/coordinatorBase.d.ts +37 -0
  170. package/lib/typescript/src/controller/coordinatorBase.d.ts.map +1 -0
  171. package/lib/typescript/src/controller/dndSession.d.ts +152 -0
  172. package/lib/typescript/src/controller/dndSession.d.ts.map +1 -0
  173. package/lib/typescript/src/controller/dndState.d.ts +27 -0
  174. package/lib/typescript/src/controller/dndState.d.ts.map +1 -0
  175. package/lib/typescript/src/controller/gridAdapter.d.ts +44 -0
  176. package/lib/typescript/src/controller/gridAdapter.d.ts.map +1 -0
  177. package/lib/typescript/src/controller/gridState.d.ts +18 -0
  178. package/lib/typescript/src/controller/gridState.d.ts.map +1 -0
  179. package/lib/typescript/src/controller/locations.d.ts +9 -0
  180. package/lib/typescript/src/controller/locations.d.ts.map +1 -0
  181. package/lib/typescript/src/controller/previewPath.d.ts +49 -0
  182. package/lib/typescript/src/controller/previewPath.d.ts.map +1 -0
  183. package/lib/typescript/src/controller/sessionCore.d.ts +106 -0
  184. package/lib/typescript/src/controller/sessionCore.d.ts.map +1 -0
  185. package/lib/typescript/src/controller/useDndState.d.ts +8 -0
  186. package/lib/typescript/src/controller/useDndState.d.ts.map +1 -0
  187. package/lib/typescript/src/controller/useGridState.d.ts +8 -0
  188. package/lib/typescript/src/controller/useGridState.d.ts.map +1 -0
  189. package/lib/typescript/src/controller/useStoreState.d.ts +16 -0
  190. package/lib/typescript/src/controller/useStoreState.d.ts.map +1 -0
  191. package/lib/typescript/src/defaults.d.ts +5 -0
  192. package/lib/typescript/src/defaults.d.ts.map +1 -0
  193. package/lib/typescript/src/diagnostics.d.ts +9 -0
  194. package/lib/typescript/src/diagnostics.d.ts.map +1 -0
  195. package/lib/typescript/src/engine/gridPlacements.d.ts +22 -0
  196. package/lib/typescript/src/engine/gridPlacements.d.ts.map +1 -0
  197. package/lib/typescript/src/engine/index.d.ts +28 -0
  198. package/lib/typescript/src/engine/index.d.ts.map +1 -0
  199. package/lib/typescript/src/engine/layout.d.ts +4 -0
  200. package/lib/typescript/src/engine/layout.d.ts.map +1 -0
  201. package/lib/typescript/src/engine/layoutMove.d.ts +46 -0
  202. package/lib/typescript/src/engine/layoutMove.d.ts.map +1 -0
  203. package/lib/typescript/src/engine/layoutState.d.ts +22 -0
  204. package/lib/typescript/src/engine/layoutState.d.ts.map +1 -0
  205. package/lib/typescript/src/engine/list.d.ts +68 -0
  206. package/lib/typescript/src/engine/list.d.ts.map +1 -0
  207. package/lib/typescript/src/engine/listIndex.d.ts +32 -0
  208. package/lib/typescript/src/engine/listIndex.d.ts.map +1 -0
  209. package/lib/typescript/src/engine/move.d.ts +10 -0
  210. package/lib/typescript/src/engine/move.d.ts.map +1 -0
  211. package/lib/typescript/src/engine/movementPolicy.d.ts +34 -0
  212. package/lib/typescript/src/engine/movementPolicy.d.ts.map +1 -0
  213. package/lib/typescript/src/engine/orderedTarget.d.ts +32 -0
  214. package/lib/typescript/src/engine/orderedTarget.d.ts.map +1 -0
  215. package/lib/typescript/src/engine/pack.d.ts +3 -0
  216. package/lib/typescript/src/engine/pack.d.ts.map +1 -0
  217. package/lib/typescript/src/engine/rectangles.d.ts +9 -0
  218. package/lib/typescript/src/engine/rectangles.d.ts.map +1 -0
  219. package/lib/typescript/src/engine/sameLayout.d.ts +4 -0
  220. package/lib/typescript/src/engine/sameLayout.d.ts.map +1 -0
  221. package/lib/typescript/src/engine/search.d.ts +28 -0
  222. package/lib/typescript/src/engine/search.d.ts.map +1 -0
  223. package/lib/typescript/src/engine/spatial.d.ts +16 -0
  224. package/lib/typescript/src/engine/spatial.d.ts.map +1 -0
  225. package/lib/typescript/src/engine/spatialAppRotation.d.ts +4 -0
  226. package/lib/typescript/src/engine/spatialAppRotation.d.ts.map +1 -0
  227. package/lib/typescript/src/engine/spatialExchange.d.ts +5 -0
  228. package/lib/typescript/src/engine/spatialExchange.d.ts.map +1 -0
  229. package/lib/typescript/src/engine/spatialInsertion.d.ts +5 -0
  230. package/lib/typescript/src/engine/spatialInsertion.d.ts.map +1 -0
  231. package/lib/typescript/src/engine/spatialPolicy.d.ts +9 -0
  232. package/lib/typescript/src/engine/spatialPolicy.d.ts.map +1 -0
  233. package/lib/typescript/src/engine/spatialRotation.d.ts +8 -0
  234. package/lib/typescript/src/engine/spatialRotation.d.ts.map +1 -0
  235. package/lib/typescript/src/engine/validation.d.ts +9 -0
  236. package/lib/typescript/src/engine/validation.d.ts.map +1 -0
  237. package/lib/typescript/src/gesture/DndGestureGroup.d.ts +33 -0
  238. package/lib/typescript/src/gesture/DndGestureGroup.d.ts.map +1 -0
  239. package/lib/typescript/src/gesture/DndGestureHost.d.ts +12 -0
  240. package/lib/typescript/src/gesture/DndGestureHost.d.ts.map +1 -0
  241. package/lib/typescript/src/gesture/gestureConfig.d.ts +15 -0
  242. package/lib/typescript/src/gesture/gestureConfig.d.ts.map +1 -0
  243. package/lib/typescript/src/gesture/gestureGrouping.d.ts +66 -0
  244. package/lib/typescript/src/gesture/gestureGrouping.d.ts.map +1 -0
  245. package/lib/typescript/src/gesture/gestureHost.d.ts +23 -0
  246. package/lib/typescript/src/gesture/gestureHost.d.ts.map +1 -0
  247. package/lib/typescript/src/index.d.ts +38 -0
  248. package/lib/typescript/src/index.d.ts.map +1 -0
  249. package/lib/typescript/src/pointer/dndTarget.d.ts +14 -0
  250. package/lib/typescript/src/pointer/dndTarget.d.ts.map +1 -0
  251. package/lib/typescript/src/pointer/geometry.d.ts +28 -0
  252. package/lib/typescript/src/pointer/geometry.d.ts.map +1 -0
  253. package/lib/typescript/src/pointer/layoutTarget.d.ts +43 -0
  254. package/lib/typescript/src/pointer/layoutTarget.d.ts.map +1 -0
  255. package/lib/typescript/src/pointer/listCellMotion.d.ts +43 -0
  256. package/lib/typescript/src/pointer/listCellMotion.d.ts.map +1 -0
  257. package/lib/typescript/src/pointer/listTarget.d.ts +7 -0
  258. package/lib/typescript/src/pointer/listTarget.d.ts.map +1 -0
  259. package/lib/typescript/src/pointer/motion.d.ts +20 -0
  260. package/lib/typescript/src/pointer/motion.d.ts.map +1 -0
  261. package/lib/typescript/src/runtime/dndPresentation.d.ts +37 -0
  262. package/lib/typescript/src/runtime/dndPresentation.d.ts.map +1 -0
  263. package/lib/typescript/src/runtime/dndRenderStore.d.ts +46 -0
  264. package/lib/typescript/src/runtime/dndRenderStore.d.ts.map +1 -0
  265. package/lib/typescript/src/runtime/dndRuntime.d.ts +138 -0
  266. package/lib/typescript/src/runtime/dndRuntime.d.ts.map +1 -0
  267. package/lib/typescript/src/runtime/dndSettlement.d.ts +18 -0
  268. package/lib/typescript/src/runtime/dndSettlement.d.ts.map +1 -0
  269. package/lib/typescript/src/runtime/gridRuntime.d.ts +54 -0
  270. package/lib/typescript/src/runtime/gridRuntime.d.ts.map +1 -0
  271. package/lib/typescript/src/types.d.ts +180 -0
  272. package/lib/typescript/src/types.d.ts.map +1 -0
  273. package/package.json +136 -0
  274. package/src/adapters/coordinates.ts +181 -0
  275. package/src/adapters/scroll.ts +147 -0
  276. package/src/adapters/virtualizedList.ts +112 -0
  277. package/src/components/DndProvider.tsx +1836 -0
  278. package/src/components/DragHandle.tsx +89 -0
  279. package/src/components/GridController.tsx +213 -0
  280. package/src/components/GridDragHandle.tsx +11 -0
  281. package/src/components/GridZoneView.tsx +57 -0
  282. package/src/components/SortableGrid.tsx +449 -0
  283. package/src/components/SortableList.tsx +1028 -0
  284. package/src/components/dndTypes.ts +102 -0
  285. package/src/components/gridTypes.ts +90 -0
  286. package/src/components/handleViewProps.ts +35 -0
  287. package/src/contracts.ts +149 -0
  288. package/src/controller/approval.ts +179 -0
  289. package/src/controller/coordinatorBase.ts +118 -0
  290. package/src/controller/dndSession.ts +1058 -0
  291. package/src/controller/dndState.ts +198 -0
  292. package/src/controller/gridAdapter.ts +268 -0
  293. package/src/controller/gridState.ts +187 -0
  294. package/src/controller/locations.ts +67 -0
  295. package/src/controller/previewPath.ts +90 -0
  296. package/src/controller/sessionCore.ts +390 -0
  297. package/src/controller/useDndState.ts +26 -0
  298. package/src/controller/useGridState.ts +22 -0
  299. package/src/controller/useStoreState.ts +27 -0
  300. package/src/defaults.ts +4 -0
  301. package/src/diagnostics.ts +23 -0
  302. package/src/engine/gridPlacements.ts +85 -0
  303. package/src/engine/index.ts +99 -0
  304. package/src/engine/layout.ts +29 -0
  305. package/src/engine/layoutMove.ts +401 -0
  306. package/src/engine/layoutState.ts +490 -0
  307. package/src/engine/list.ts +307 -0
  308. package/src/engine/listIndex.ts +174 -0
  309. package/src/engine/move.ts +274 -0
  310. package/src/engine/movementPolicy.ts +151 -0
  311. package/src/engine/orderedTarget.ts +131 -0
  312. package/src/engine/pack.ts +24 -0
  313. package/src/engine/rectangles.ts +18 -0
  314. package/src/engine/sameLayout.ts +50 -0
  315. package/src/engine/search.ts +174 -0
  316. package/src/engine/spatial.ts +36 -0
  317. package/src/engine/spatialAppRotation.ts +53 -0
  318. package/src/engine/spatialExchange.ts +212 -0
  319. package/src/engine/spatialInsertion.ts +157 -0
  320. package/src/engine/spatialPolicy.ts +48 -0
  321. package/src/engine/spatialRotation.ts +56 -0
  322. package/src/engine/validation.ts +358 -0
  323. package/src/gesture/DndGestureGroup.tsx +357 -0
  324. package/src/gesture/DndGestureHost.tsx +50 -0
  325. package/src/gesture/gestureConfig.ts +123 -0
  326. package/src/gesture/gestureGrouping.ts +210 -0
  327. package/src/gesture/gestureHost.tsx +163 -0
  328. package/src/index.ts +162 -0
  329. package/src/pointer/dndTarget.ts +213 -0
  330. package/src/pointer/geometry.ts +584 -0
  331. package/src/pointer/layoutTarget.ts +515 -0
  332. package/src/pointer/listCellMotion.ts +174 -0
  333. package/src/pointer/listTarget.ts +56 -0
  334. package/src/pointer/motion.ts +66 -0
  335. package/src/runtime/dndPresentation.ts +113 -0
  336. package/src/runtime/dndRenderStore.ts +246 -0
  337. package/src/runtime/dndRuntime.ts +311 -0
  338. package/src/runtime/dndSettlement.ts +117 -0
  339. package/src/runtime/gridRuntime.ts +73 -0
  340. package/src/types.ts +189 -0
@@ -0,0 +1,268 @@
1
+ "use strict";
2
+
3
+ import { useLayoutEffect, useMemo, useRef } from 'react';
4
+ import { GestureStateManager, usePanGesture } from 'react-native-gesture-handler';
5
+ import { useSharedValue } from 'react-native-reanimated';
6
+ import { scheduleOnRN } from 'react-native-worklets';
7
+ import { constrainDragPoint } from "../adapters/scroll.js";
8
+ import { EMPTY_DND_MOTION, measureDndRect, pointInRect, readListViewports } from "../runtime/dndRuntime.js";
9
+ import { createTargetChannel as createChannel } from "./gestureGrouping.js";
10
+
11
+ /**
12
+ * UI-thread hit target of one registered handle. The host keeps the object
13
+ * identical while its registration is unchanged, so Worklets reuses the
14
+ * serialized copy when the group's target list is published again.
15
+ */
16
+
17
+ /** Delivers a group's hit targets without re-rendering the group. */
18
+ export function createTargetChannel(initial) {
19
+ return createChannel(initial);
20
+ }
21
+ /**
22
+ * One native Pan serves every handle that shares a gesture relation signature.
23
+ * The recognizer belongs to the Provider, so a source cell can leave the
24
+ * virtualized window or remount without touching the active gesture; the hit
25
+ * target list only decides which handle an initial touch may activate.
26
+ */
27
+ export function DndGestureGroup({
28
+ groupId,
29
+ relations,
30
+ channel,
31
+ runtime,
32
+ publish
33
+ }) {
34
+ const ownToken = useSharedValue(0);
35
+ const ownHandle = useSharedValue(-1);
36
+ const uiTargets = useSharedValue(channel.targets);
37
+ const publishedTargets = useRef(channel.targets);
38
+ useLayoutEffect(() => {
39
+ const sync = targets => {
40
+ if (publishedTargets.current === targets) return;
41
+ publishedTargets.current = targets;
42
+ uiTargets.set(targets);
43
+ };
44
+ sync(channel.targets);
45
+ return channel.subscribe(sync);
46
+ }, [channel, uiTargets]);
47
+ const {
48
+ motion,
49
+ token,
50
+ zones,
51
+ disabled: providerDisabled,
52
+ rootRef,
53
+ begin,
54
+ move,
55
+ release,
56
+ prepareRelease,
57
+ dragAxis,
58
+ revision,
59
+ activationDelayMs,
60
+ gestureConfigRevision,
61
+ frameDriven,
62
+ enabled
63
+ } = runtime;
64
+ const config = useMemo(() => {
65
+ const currentRevision = () => {
66
+ 'worklet';
67
+
68
+ return typeof revision === 'number' ? revision : revision.get();
69
+ };
70
+ // Every provider-owned recognizer receives the initial root touch. Find the
71
+ // enabled handle under the pointer before measuring the root or any scroll
72
+ // viewport; a handle that does not contain the pointer costs one measure.
73
+ const hit = (x, y, committedRevision) => {
74
+ 'worklet';
75
+
76
+ if (!Number.isFinite(x) || !Number.isFinite(y) || providerDisabled.get()) return null;
77
+ const pointer = {
78
+ x,
79
+ y
80
+ };
81
+ const list = uiTargets.get();
82
+ let target = null;
83
+ for (let index = 0; index < list.length; index++) {
84
+ const candidate = list[index];
85
+ if (candidate.disabled) continue;
86
+ const handle = measureDndRect(candidate.ref);
87
+ if (handle && pointInRect(pointer, handle)) {
88
+ target = candidate;
89
+ break;
90
+ }
91
+ }
92
+ if (!target) return null;
93
+ const root = measureDndRect(rootRef);
94
+ if (!root || !pointInRect(pointer, root)) return null;
95
+ const sourceZoneId = target.zoneId;
96
+ const source = zones.get().find(zone => zone.zoneId === sourceZoneId);
97
+ if (!source || source.revision !== committedRevision || source.kind === 'list' && !Number.isFinite(source.offset.get())) return null;
98
+ const viewport = measureDndRect(source.ref);
99
+ return viewport && pointInRect(pointer, viewport) ? target : null;
100
+ };
101
+ const owned = current => {
102
+ 'worklet';
103
+
104
+ return current.phase === 'dragging' && current.token === ownToken.get() && current.handleId === ownHandle.get();
105
+ };
106
+ const cancelOwned = () => {
107
+ 'worklet';
108
+
109
+ const current = motion.get();
110
+ if (!owned(current)) return;
111
+ const next = {
112
+ ...current,
113
+ phase: 'released',
114
+ seq: current.seq + 1
115
+ };
116
+ motion.set(next);
117
+ scheduleOnRN(release, next, true);
118
+ };
119
+ return {
120
+ block: relations?.block,
121
+ requireToFail: relations?.requireToFail,
122
+ simultaneousWith: relations?.simultaneousWith,
123
+ enabled,
124
+ maxPointers: 1,
125
+ activateAfterLongPress: activationDelayMs,
126
+ cancelsTouchesInView: true,
127
+ onBegin: () => {
128
+ 'worklet';
129
+
130
+ ownToken.set(0);
131
+ ownHandle.set(-1);
132
+ },
133
+ onTouchesDown: event => {
134
+ 'worklet';
135
+
136
+ if (event.numberOfTouches > 1) {
137
+ cancelOwned();
138
+ GestureStateManager.fail(event.handlerTag);
139
+ return;
140
+ }
141
+ const touch = event.changedTouches[0];
142
+ // Root-attached recognizers must restrict activation to a visible handle.
143
+ if (!touch || !hit(touch.absoluteX, touch.absoluteY, currentRevision()) || motion.get().phase !== 'idle') {
144
+ GestureStateManager.fail(event.handlerTag);
145
+ }
146
+ },
147
+ onActivate: event => {
148
+ 'worklet';
149
+
150
+ // Read committed state at activation without rebuilding the native
151
+ // handler when another drop advances the layout revision.
152
+ const committedRevision = currentRevision();
153
+ const target = motion.get().phase === 'idle' ? hit(event.absoluteX, event.absoluteY, committedRevision) : null;
154
+ if (!target) {
155
+ GestureStateManager.fail(event.handlerTag);
156
+ return;
157
+ }
158
+ const source = measureDndRect(target.sourceRef);
159
+ const root = measureDndRect(rootRef);
160
+ if (!source || !root) {
161
+ GestureStateManager.fail(event.handlerTag);
162
+ return;
163
+ }
164
+ const nextToken = token.get() + 1;
165
+ token.set(nextToken);
166
+ ownToken.set(nextToken);
167
+ ownHandle.set(target.id);
168
+ const pointer = {
169
+ x: event.absoluteX,
170
+ y: event.absoluteY
171
+ };
172
+ const next = {
173
+ ...EMPTY_DND_MOTION,
174
+ token: nextToken,
175
+ handleId: target.id,
176
+ seq: 1,
177
+ phase: 'dragging',
178
+ itemId: target.itemId,
179
+ sourceZoneId: target.zoneId,
180
+ revision: committedRevision,
181
+ pointer,
182
+ origin: pointer,
183
+ axis: dragAxis,
184
+ activationDelayMs,
185
+ configRevision: gestureConfigRevision,
186
+ grip: {
187
+ x: pointer.x - source.x,
188
+ y: pointer.y - source.y
189
+ },
190
+ width: source.width,
191
+ height: source.height,
192
+ root,
193
+ zones: readListViewports(zones.get())
194
+ };
195
+ motion.set(next);
196
+ scheduleOnRN(begin, next);
197
+ },
198
+ onUpdate: event => {
199
+ 'worklet';
200
+
201
+ if (!Number.isFinite(event.absoluteX) || !Number.isFinite(event.absoluteY)) return;
202
+ const current = motion.get();
203
+ if (!owned(current)) return;
204
+ if (providerDisabled.get() || event.numberOfPointers > 1) {
205
+ cancelOwned();
206
+ return;
207
+ }
208
+ const root = frameDriven ? current.root : measureDndRect(rootRef);
209
+ const next = {
210
+ ...current,
211
+ pointer: constrainDragPoint({
212
+ x: event.absoluteX,
213
+ y: event.absoluteY
214
+ }, current.origin, current.axis),
215
+ zones: frameDriven ? current.zones : root ? readListViewports(zones.get()) : [],
216
+ root: root ?? current.root,
217
+ seq: current.seq + 1
218
+ };
219
+ motion.set(next);
220
+ if (!frameDriven) scheduleOnRN(move, next);
221
+ },
222
+ onDeactivate: event => {
223
+ 'worklet';
224
+
225
+ if (!Number.isFinite(event.absoluteX) || !Number.isFinite(event.absoluteY)) {
226
+ cancelOwned();
227
+ return;
228
+ }
229
+ const current = motion.get();
230
+ if (!owned(current)) return;
231
+ if (event.canceled || providerDisabled.get()) {
232
+ cancelOwned();
233
+ return;
234
+ }
235
+ const root = measureDndRect(rootRef);
236
+ const next = {
237
+ ...current,
238
+ phase: 'released',
239
+ pointer: constrainDragPoint({
240
+ x: event.absoluteX,
241
+ y: event.absoluteY
242
+ }, current.origin, current.axis),
243
+ zones: root ? readListViewports(zones.get()) : [],
244
+ root: root ?? current.root,
245
+ seq: current.seq + 1
246
+ };
247
+ if (root) prepareRelease?.(next);
248
+ motion.set(next);
249
+ scheduleOnRN(release, next, root ? false : 'measure-failed');
250
+ },
251
+ onTouchesCancel: cancelOwned,
252
+ onFinalize: () => {
253
+ 'worklet';
254
+
255
+ cancelOwned();
256
+ ownToken.set(0);
257
+ ownHandle.set(-1);
258
+ }
259
+ };
260
+ }, [relations, motion, token, zones, providerDisabled, rootRef, begin, move, release, prepareRelease, dragAxis, revision, activationDelayMs, gestureConfigRevision, frameDriven, enabled, ownToken, ownHandle, uiTargets]);
261
+ const pan = usePanGesture(config);
262
+ useLayoutEffect(() => {
263
+ publish(groupId, pan);
264
+ }, [groupId, pan, publish]);
265
+ useLayoutEffect(() => () => publish(groupId, null), [groupId, publish]);
266
+ return null;
267
+ }
268
+ //# sourceMappingURL=DndGestureGroup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useLayoutEffect","useMemo","useRef","GestureStateManager","usePanGesture","useSharedValue","scheduleOnRN","constrainDragPoint","EMPTY_DND_MOTION","measureDndRect","pointInRect","readListViewports","createTargetChannel","createChannel","initial","DndGestureGroup","groupId","relations","channel","runtime","publish","ownToken","ownHandle","uiTargets","targets","publishedTargets","sync","current","set","subscribe","motion","token","zones","disabled","providerDisabled","rootRef","begin","move","release","prepareRelease","dragAxis","revision","activationDelayMs","gestureConfigRevision","frameDriven","enabled","config","currentRevision","get","hit","x","y","committedRevision","Number","isFinite","pointer","list","target","index","length","candidate","handle","ref","root","sourceZoneId","zoneId","source","find","zone","kind","offset","viewport","owned","phase","handleId","cancelOwned","next","seq","block","requireToFail","simultaneousWith","maxPointers","activateAfterLongPress","cancelsTouchesInView","onBegin","onTouchesDown","event","numberOfTouches","fail","handlerTag","touch","changedTouches","absoluteX","absoluteY","onActivate","sourceRef","nextToken","id","itemId","origin","axis","configRevision","grip","width","height","onUpdate","numberOfPointers","onDeactivate","canceled","onTouchesCancel","onFinalize","pan"],"sourceRoot":"../../../src","sources":["gesture/DndGestureGroup.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ import { DndGestureGroup } from "./DndGestureGroup.js";
4
+ import { createGestureRegistry, groupGestureOwners as groupOwners } from "./gestureGrouping.js";
5
+ import { createGestureHost } from "./gestureHost.js";
6
+ function toDndTarget({
7
+ id,
8
+ registration
9
+ }) {
10
+ return {
11
+ id,
12
+ itemId: registration.itemId,
13
+ zoneId: registration.zoneId,
14
+ ref: registration.ref,
15
+ sourceRef: registration.sourceRef,
16
+ disabled: registration.disabled
17
+ };
18
+ }
19
+
20
+ /** Handle mounts update their native owners without rendering the Provider. */
21
+ export function createDndGestureRegistry() {
22
+ return createGestureRegistry();
23
+ }
24
+ /** Groups the published owners by gesture relation signature; see `groupGestureOwners`. */
25
+ export function groupGestureOwners(owners, state) {
26
+ return groupOwners(owners, state, toDndTarget);
27
+ }
28
+ export const DndGestureHost = createGestureHost({
29
+ Group: DndGestureGroup,
30
+ toTarget: toDndTarget
31
+ });
32
+ //# sourceMappingURL=DndGestureHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DndGestureGroup","createGestureRegistry","groupGestureOwners","groupOwners","createGestureHost","toDndTarget","id","registration","itemId","zoneId","ref","sourceRef","disabled","createDndGestureRegistry","owners","state","DndGestureHost","Group","toTarget"],"sourceRoot":"../../../src","sources":["gesture/DndGestureHost.tsx"],"mappings":";;AAAA,SACEA,eAAe,QAGV,sBAAmB;AAE1B,SACEC,qBAAqB,EACrBC,kBAAkB,IAAIC,WAAW,QAK5B,sBAAmB;AAC1B,SAASC,iBAAiB,QAAQ,kBAAe;AAEjD,SAASC,WAAWA,CAAC;EACnBC,EAAE;EACFC;AACmC,CAAC,EAAmB;EACvD,OAAO;IACLD,EAAE;IACFE,MAAM,EAAED,YAAY,CAACC,MAAM;IAC3BC,MAAM,EAAEF,YAAY,CAACE,MAAM;IAC3BC,GAAG,EAAEH,YAAY,CAACG,GAAG;IACrBC,SAAS,EAAEJ,YAAY,CAACI,SAAS;IACjCC,QAAQ,EAAEL,YAAY,CAACK;EACzB,CAAC;AACH;;AAEA;AACA,OAAO,SAASC,wBAAwBA,CAAA,EAA2C;EACjF,OAAOZ,qBAAqB,CAAwB,CAAC;AACvD;AAIA;AACA,OAAO,SAASC,kBAAkBA,CAChCY,MAAsD,EACtDC,KAA4D,EACV;EAClD,OAAOZ,WAAW,CAACW,MAAM,EAAEC,KAAK,EAAEV,WAAW,CAAC;AAChD;AAEA,OAAO,MAAMW,cAAc,GAAGZ,iBAAiB,CAI7C;EAAEa,KAAK,EAAEjB,eAAe;EAAEkB,QAAQ,EAAEb;AAAY,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ function record(value) {
4
+ return !!value && typeof value === 'object' && !Array.isArray(value);
5
+ }
6
+ function tags(value) {
7
+ return Array.isArray(value) && value.every(tag => Number.isSafeInteger(tag) && tag > 0);
8
+ }
9
+
10
+ /** Published RNGH v3 gesture surface, without probing detector internals. */
11
+ function gestureTags(gesture) {
12
+ if (!record(gesture) || typeof gesture.type !== 'string' || !gesture.type || !record(gesture.config) || !record(gesture.detectorCallbacks)) return null;
13
+ if ('handlerTags' in gesture) {
14
+ return tags(gesture.handlerTags) && tags(gesture.externalSimultaneousHandlers) && Array.isArray(gesture.gestures) ? gesture.handlerTags : null;
15
+ }
16
+ const relations = gesture.gestureRelations;
17
+ if (!Number.isSafeInteger(gesture.handlerTag) || gesture.handlerTag <= 0 || !record(relations) || !tags(relations.simultaneousHandlers) || !tags(relations.waitFor) || !tags(relations.blocksHandlers)) return null;
18
+ return [gesture.handlerTag];
19
+ }
20
+
21
+ /** Element-wise equality of the three relation lists; a single gesture equals a one-element list. */
22
+ export function sameGestureRelations(first, second) {
23
+ return ['block', 'requireToFail', 'simultaneousWith'].every(key => {
24
+ const a = first?.[key];
25
+ const b = second?.[key];
26
+ const aa = a === undefined ? [] : Array.isArray(a) ? a : [a];
27
+ const bb = b === undefined ? [] : Array.isArray(b) ? b : [b];
28
+ return aa.length === bb.length && aa.every((gesture, index) => gesture === bb[index]);
29
+ });
30
+ }
31
+
32
+ /** Attachment to an actual detector still requires device validation by the caller. */
33
+ export function validateGestureRelations(value) {
34
+ if (value === undefined) return {
35
+ valid: true,
36
+ relations: undefined
37
+ };
38
+ const fail = message => ({
39
+ valid: false,
40
+ issues: [{
41
+ code: 'invalid-configuration',
42
+ message
43
+ }]
44
+ });
45
+ const keys = ['block', 'requireToFail', 'simultaneousWith'];
46
+ if (!record(value) || Object.keys(value).some(key => !keys.some(known => known === key))) {
47
+ return fail('gestureRelations must contain only block, requireToFail and simultaneousWith.');
48
+ }
49
+ const normalized = {};
50
+ const objectOwners = new Map();
51
+ const tagOwners = new Map();
52
+ for (const key of keys) {
53
+ const relation = value[key];
54
+ if (relation === undefined) continue;
55
+ const gestures = Array.isArray(relation) ? relation : [relation];
56
+ const unique = new Set();
57
+ for (const gesture of gestures) {
58
+ const handlerTags = gestureTags(gesture);
59
+ if (!handlerTags || !record(gesture)) {
60
+ return fail(`${key} requires v3 gesture objects, not refs or incomplete objects.`);
61
+ }
62
+ const prior = objectOwners.get(gesture);
63
+ if (prior && prior !== key) return fail(`The same gesture cannot be in both ${prior} and ${key}.`);
64
+ objectOwners.set(gesture, key);
65
+ for (const tag of handlerTags) {
66
+ const owner = tagOwners.get(tag);
67
+ if (owner && owner !== key) return fail(`The same native handler cannot be in both ${owner} and ${key}.`);
68
+ tagOwners.set(tag, key);
69
+ }
70
+ unique.add(gesture);
71
+ }
72
+ // Preserve actual gesture object identities; v3 connects relations through
73
+ // these objects and mutates their symmetric relation lists itself.
74
+ normalized[key] = [...unique];
75
+ }
76
+ return {
77
+ valid: true,
78
+ relations: normalized
79
+ };
80
+ }
81
+ //# sourceMappingURL=gestureConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["record","value","Array","isArray","tags","every","tag","Number","isSafeInteger","gestureTags","gesture","type","config","detectorCallbacks","handlerTags","externalSimultaneousHandlers","gestures","relations","gestureRelations","handlerTag","simultaneousHandlers","waitFor","blocksHandlers","sameGestureRelations","first","second","key","a","b","aa","undefined","bb","length","index","validateGestureRelations","valid","fail","message","issues","code","keys","Object","some","known","normalized","objectOwners","Map","tagOwners","relation","unique","Set","prior","get","set","owner","add"],"sourceRoot":"../../../src","sources":["gesture/gestureConfig.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+
3
+ import { sameGestureRelations } from "./gestureConfig.js";
4
+
5
+ /** One registered handle as the gesture host sees it. */
6
+
7
+ /** Handle mounts update their native owners without rendering the controller. */
8
+ export function createGestureRegistry() {
9
+ let owners = [];
10
+ const listeners = new Set();
11
+ return {
12
+ getSnapshot: () => owners,
13
+ subscribe(listener) {
14
+ listeners.add(listener);
15
+ return () => {
16
+ listeners.delete(listener);
17
+ };
18
+ },
19
+ setOwners(next) {
20
+ if (next.length === owners.length && next.every((owner, index) => owner.id === owners[index].id && owner.registration === owners[index].registration)) return;
21
+ owners = next.map(({
22
+ id,
23
+ registration
24
+ }) => ({
25
+ id,
26
+ registration
27
+ }));
28
+ for (const listener of Array.from(listeners)) listener();
29
+ }
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Delivers a group's hit targets without re-rendering the group. A re-render
35
+ * would make Reanimated and Gesture Handler rebuild and re-register the native
36
+ * event handler, which costs a serialization of every callback closure.
37
+ */
38
+
39
+ export function createTargetChannel(initial) {
40
+ let targets = initial;
41
+ const listeners = new Set();
42
+ return {
43
+ get targets() {
44
+ return targets;
45
+ },
46
+ set(next) {
47
+ if (next === targets) return;
48
+ targets = next;
49
+ for (const listener of Array.from(listeners)) listener(next);
50
+ },
51
+ subscribe(listener) {
52
+ listeners.add(listener);
53
+ return () => {
54
+ listeners.delete(listener);
55
+ };
56
+ }
57
+ };
58
+ }
59
+
60
+ /** Props of one shared-recognizer component rendered by a gesture host. */
61
+
62
+ /** Handles sharing one relation signature share one native recognizer. */
63
+
64
+ export function createGroupingState() {
65
+ return {
66
+ targets: new Map(),
67
+ signatures: [],
68
+ nextGroupId: 0,
69
+ groups: []
70
+ };
71
+ }
72
+ function sameTargets(previous, next) {
73
+ return previous.length === next.length && previous.every((target, index) => target === next[index]);
74
+ }
75
+
76
+ /**
77
+ * Groups the published owners by gesture relation signature. Target objects
78
+ * stay identical while their registration is unchanged and a group's target
79
+ * array stays identical while its content is unchanged, so an unchanged group
80
+ * publishes nothing to the UI runtime.
81
+ */
82
+ export function groupGestureOwners(owners, state, toTarget) {
83
+ const targets = new Map();
84
+ const collected = new Map();
85
+ for (const owner of owners) {
86
+ const cached = state.targets.get(owner.id);
87
+ const target = cached?.registration === owner.registration ? cached.target : toTarget(owner);
88
+ targets.set(owner.id, {
89
+ registration: owner.registration,
90
+ target
91
+ });
92
+ let signature = state.signatures.find(entry => sameGestureRelations(entry.relations, owner.registration.gestureRelations));
93
+ if (!signature) {
94
+ signature = {
95
+ relations: owner.registration.gestureRelations,
96
+ groupId: ++state.nextGroupId
97
+ };
98
+ state.signatures.push(signature);
99
+ }
100
+ const group = collected.get(signature.groupId);
101
+ if (group) group.targets.push(target);else collected.set(signature.groupId, {
102
+ relations: signature.relations,
103
+ targets: [target]
104
+ });
105
+ }
106
+ state.targets = targets;
107
+ // A signature without handles releases its native recognizer.
108
+ state.signatures = state.signatures.filter(entry => collected.has(entry.groupId));
109
+ const groups = Array.from(collected, ([groupId, group]) => {
110
+ const previous = state.groups.find(entry => entry.groupId === groupId);
111
+ const hitTargets = previous && sameTargets(previous.targets, group.targets) ? previous.targets : group.targets;
112
+ return {
113
+ groupId,
114
+ relations: previous?.relations ?? group.relations,
115
+ targets: hitTargets,
116
+ channel: previous?.channel ?? createTargetChannel(hitTargets)
117
+ };
118
+ });
119
+ state.groups = groups.length === state.groups.length && groups.every((group, index) => group.groupId === state.groups[index].groupId && group.targets === state.groups[index].targets && group.relations === state.groups[index].relations) ? state.groups : groups;
120
+ return state.groups;
121
+ }
122
+ //# sourceMappingURL=gestureGrouping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sameGestureRelations","createGestureRegistry","owners","listeners","Set","getSnapshot","subscribe","listener","add","delete","setOwners","next","length","every","owner","index","id","registration","map","Array","from","createTargetChannel","initial","targets","set","createGroupingState","Map","signatures","nextGroupId","groups","sameTargets","previous","target","groupGestureOwners","state","toTarget","collected","cached","get","signature","find","entry","relations","gestureRelations","groupId","push","group","filter","has","hitTargets","channel"],"sourceRoot":"../../../src","sources":["gesture/gestureGrouping.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+
3
+ import { createContext, memo, useCallback, useContext, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';
4
+ import { GestureDetector, useCompetingGestures, useManualGesture } from 'react-native-gesture-handler';
5
+ import { createGroupingState, groupGestureOwners } from "./gestureGrouping.js";
6
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
7
+ const SENTINEL_CONFIG = {
8
+ enabled: false,
9
+ onTouchesDown: () => {
10
+ 'worklet';
11
+ }
12
+ };
13
+
14
+ /**
15
+ * Builds a host that owns one native recognizer per gesture relation
16
+ * signature. Handle mounts publish through the registry; the host groups them,
17
+ * renders one `Group` per signature and composes their recognizers on a single
18
+ * detector around the root content. Root content updates never render the
19
+ * detector or the groups.
20
+ */
21
+ export function createGestureHost({
22
+ Group,
23
+ toTarget
24
+ }) {
25
+ const RootContentContext = /*#__PURE__*/createContext(null);
26
+
27
+ // Only this descendant consumes changing root content. Its context update does
28
+ // not render the detector or re-run the gesture composition hooks above it.
29
+ function NativeRoot() {
30
+ return useContext(RootContentContext);
31
+ }
32
+ const GestureGroup = /*#__PURE__*/memo(Group);
33
+ const NativeGestureDetector = /*#__PURE__*/memo(function NativeGestureDetectorImpl({
34
+ nativeGestures
35
+ }) {
36
+ // Keep the native component type stable while no handle is registered.
37
+ const sentinel = useManualGesture(SENTINEL_CONFIG);
38
+ const gesture = useCompetingGestures(sentinel, ...nativeGestures.values());
39
+ return /*#__PURE__*/_jsx(GestureDetector, {
40
+ gesture: gesture,
41
+ children: /*#__PURE__*/_jsx(NativeRoot, {})
42
+ });
43
+ });
44
+ const GestureHost = /*#__PURE__*/memo(function GestureHostImpl({
45
+ registry,
46
+ runtime
47
+ }) {
48
+ const owners = useSyncExternalStore(registry.subscribe, registry.getSnapshot, registry.getSnapshot);
49
+ const mounted = useRef(true);
50
+ const gestureValues = useRef(new Map());
51
+ const [gestureVersion, setGestureVersion] = useState(0);
52
+ // Group layout effects can publish several changes in one commit. Update
53
+ // their private map in O(1), then copy once when React renders the combined
54
+ // update. Never mutate the snapshot passed to the memoized detector.
55
+ const nativeGestures = useMemo(() => new Map(gestureValues.current),
56
+ // The version explicitly invalidates this snapshot of the mutable registry.
57
+ // eslint-disable-next-line react-hooks/exhaustive-deps
58
+ [gestureVersion]);
59
+ useLayoutEffect(() => {
60
+ mounted.current = true;
61
+ return () => {
62
+ mounted.current = false;
63
+ };
64
+ }, []);
65
+ const publish = useCallback((id, gesture) => {
66
+ if (!mounted.current) return;
67
+ const current = gestureValues.current;
68
+ if (gesture ? current.get(id) === gesture : !current.has(id)) return;
69
+ if (gesture) current.set(id, gesture);else current.delete(id);
70
+ setGestureVersion(version => version + 1);
71
+ }, []);
72
+ const grouping = useRef(createGroupingState()).current;
73
+ // Re-running this for the same owners is idempotent, which keeps StrictMode
74
+ // and discarded renders from producing different group identities.
75
+ const groups = useMemo(() => groupGestureOwners(owners, grouping, toTarget), [owners, grouping]);
76
+ // Publish after commit: the group's subscription effect is registered first.
77
+ useLayoutEffect(() => {
78
+ for (const group of groups) group.channel.set(group.targets);
79
+ }, [groups]);
80
+ return /*#__PURE__*/_jsxs(_Fragment, {
81
+ children: [/*#__PURE__*/_jsx(NativeGestureDetector, {
82
+ nativeGestures: nativeGestures
83
+ }), groups.map(group => /*#__PURE__*/_jsx(GestureGroup, {
84
+ groupId: group.groupId,
85
+ relations: group.relations,
86
+ channel: group.channel,
87
+ runtime: runtime,
88
+ publish: publish
89
+ }, group.groupId))]
90
+ });
91
+ });
92
+ return function Host({
93
+ children,
94
+ registry,
95
+ runtime
96
+ }) {
97
+ return /*#__PURE__*/_jsx(RootContentContext, {
98
+ value: children,
99
+ children: /*#__PURE__*/_jsx(GestureHost, {
100
+ registry: registry,
101
+ runtime: runtime
102
+ })
103
+ });
104
+ };
105
+ }
106
+ //# sourceMappingURL=gestureHost.js.map