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
package/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 baesumin
4
+ Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ of this software and associated documentation files (the "Software"), to deal
6
+ in the Software without restriction, including without limitation the rights
7
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the Software is
9
+ furnished to do so, subject to the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be included in all
12
+ copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,262 @@
1
+ # React Native Layout DnD
2
+
3
+ Drag and drop for React Native grids and lists, built on Reanimated worklets and
4
+ Gesture Handler.
5
+
6
+ One provider owns a normalized layout state. An item can be reordered inside a
7
+ list, placed by coordinates in a grid, or moved between the two, and every move
8
+ arrives at your state layer as one complete candidate that you can accept or
9
+ reject.
10
+
11
+ > **Pre-release.** This package is not on npm yet, and its peer versions are
12
+ > pinned to the exact combination it has been verified against. Read
13
+ > [Status and limitations](#status-and-limitations) before adopting it.
14
+
15
+ ## Why this library
16
+
17
+ - **Grids and lists in one drag session.** A single `DndProvider` hosts any
18
+ number of list and grid zones. List-to-list, grid-to-grid and list-to-grid
19
+ moves all produce one candidate and one approval.
20
+ - **Grids with mixed spans.** Items occupy `rows x cols` cells at explicit
21
+ coordinates. Insertion and exchange are separate placement policies, and
22
+ rules such as full-width row rotation are configurable per provider.
23
+ - **Ordered grid zones.** Give a grid zone an `itemSpan` and it behaves like a
24
+ dock: array order is item order, a move inserts at the addressed slot,
25
+ removal closes the gap, and capacity is the slot count.
26
+ - **Lists that scroll.** Vertical and horizontal, fixed or measured variable
27
+ sizes, edge auto-scroll during a drag, and optional `FlatList` windowing for
28
+ long lists.
29
+ - **Your state stays in control.** Every move is a revisioned proposal. Reject
30
+ it synchronously with `canDrop`, or answer asynchronously within a timeout.
31
+ Rejection, cancellation and expiry restore the current layout without
32
+ overwriting a later external edit.
33
+ - **A pure engine you can call directly.** `react-native-layout-dnd/engine`
34
+ computes moves, packing and layout without loading React Native components,
35
+ so input that is not a gesture, such as a screen-reader action or an undo,
36
+ uses exactly the same rules as dragging.
37
+
38
+ ## Requirements
39
+
40
+ | Peer dependency | Accepted range | Verified |
41
+ | ---------------------------- | ---------------- | -------- |
42
+ | React Native | `>=0.78.0` | 0.87.1 |
43
+ | React Native Gesture Handler | `>=3.0.0 <4.0.0` | 3.3.0 |
44
+ | React Native Reanimated | `>=4.0.0 <5.0.0` | 4.6.0 |
45
+ | React Native Worklets | `>=0.5.0 <1.0.0` | 0.12.2 |
46
+
47
+ React is a peer too, at 19 or newer, but your React Native version already
48
+ decides it. The New Architecture is required, because Reanimated 4 supports
49
+ nothing else.
50
+
51
+ Each lower bound is the release that introduced an API this package calls: the
52
+ v3 gesture hooks in Gesture Handler 3.0.0, the worklets package split in
53
+ Reanimated 4.0.0, and `scheduleOnUI`, `scheduleOnRN` and `runOnUISync` in
54
+ Worklets 0.5.0. Only the **Verified** column has actually been built and run
55
+ end to end, so treat the rest of the range as accepted rather than tested, and
56
+ pin what works for you. Reanimated and Worklets constrain your React Native
57
+ version further through their own peer ranges.
58
+
59
+ Your app must also render the provider under `GestureHandlerRootView` and enable
60
+ the Worklets Babel plugin. This package ships worklet directives uncompiled so
61
+ that your plugin version transforms them:
62
+
63
+ ```js
64
+ // babel.config.js
65
+ module.exports = {
66
+ presets: ['module:@react-native/babel-preset'],
67
+ plugins: ['react-native-worklets/plugin'],
68
+ };
69
+ ```
70
+
71
+ ## Installation
72
+
73
+ Not published yet. Build a tarball from a clone and install it by path:
74
+
75
+ ```sh
76
+ git clone https://github.com/baesumin/react-native-layout-dnd.git
77
+ cd react-native-layout-dnd
78
+ yarn install
79
+ npm pack
80
+ ```
81
+
82
+ ```sh
83
+ # in your app
84
+ yarn add /absolute/path/to/react-native-layout-dnd-0.1.0-alpha.0.tgz
85
+ ```
86
+
87
+ Installing straight from the Git URL does not work, because the entry points
88
+ come from a build that only runs while packing.
89
+
90
+ ## Quick start
91
+
92
+ A sortable vertical list. `useDndState` holds the layout and acknowledges each
93
+ proposal for you, and `DragHandle` marks the part of an item that starts a drag.
94
+
95
+ ```tsx
96
+ import { Text, View } from 'react-native';
97
+ import {
98
+ DndProvider,
99
+ DragHandle,
100
+ SortableList,
101
+ useDndState,
102
+ type LayoutState,
103
+ } from 'react-native-layout-dnd';
104
+
105
+ type Task = { title: string };
106
+
107
+ const initial: LayoutState<Task> = {
108
+ revision: 0,
109
+ items: [
110
+ { id: 'a', data: { title: 'Notes' } },
111
+ { id: 'b', data: { title: 'Plan' } },
112
+ ],
113
+ zones: [
114
+ { id: 'tasks', kind: 'list', orientation: 'vertical', itemIds: ['a', 'b'] },
115
+ ],
116
+ };
117
+
118
+ export function Tasks() {
119
+ const { value, onChange } = useDndState(initial);
120
+ return (
121
+ <DndProvider value={value} onChange={onChange} style={{ flex: 1 }}>
122
+ <SortableList<Task>
123
+ zoneId="tasks"
124
+ style={{ flex: 1 }}
125
+ estimatedItemSize={72}
126
+ gap={8}
127
+ renderItem={({ item }) => (
128
+ <View style={{ padding: 12 }}>
129
+ <DragHandle>
130
+ <Text>{item.data.title}</Text>
131
+ </DragHandle>
132
+ </View>
133
+ )}
134
+ />
135
+ </DndProvider>
136
+ );
137
+ }
138
+ ```
139
+
140
+ The provider and every zone need a bounded viewport, for example `flex: 1`
141
+ inside a bounded parent. A drag starts after a 250 ms long press by default.
142
+
143
+ ### Moving between a list and a grid
144
+
145
+ Add a `SortableGrid` to the same provider. A list item carries no grid
146
+ footprint, so `getGridItemLayout` decides the span an incoming item takes. Keep
147
+ that function stable, because it is captured once per drag.
148
+
149
+ ```tsx
150
+ <DndProvider
151
+ value={value}
152
+ onChange={onChange}
153
+ getGridItemLayout={({ item }) => ({
154
+ span: item.data.span,
155
+ placement: 'insert',
156
+ })}
157
+ style={{ flex: 1 }}
158
+ >
159
+ <SortableList<Card> zoneId="library" virtualization ... />
160
+ <SortableGrid<Card>
161
+ zoneId="board"
162
+ style={{ height: 240 }}
163
+ geometry={{
164
+ mode: 'fit',
165
+ rowGap: 8,
166
+ columnGap: 8,
167
+ padding: { top: 8, right: 8, bottom: 8, left: 8 },
168
+ }}
169
+ renderItem={({ item, width, height }) => (
170
+ <View style={{ width, height }}>
171
+ <DragHandle>
172
+ <Text>{item.data.title}</Text>
173
+ </DragHandle>
174
+ </View>
175
+ )}
176
+ />
177
+ </DndProvider>
178
+ ```
179
+
180
+ A grid zone with `rows`, `columns` and `placements` is spatial. Add `itemSpan`
181
+ and it becomes an ordered zone instead, which is how a dock behaves.
182
+
183
+ ## How a move reaches your state
184
+
185
+ 1. The gesture resolves a target cell or index.
186
+ 2. The engine computes the **whole next layout**, including every item the move
187
+ displaces. It never commits partial work, so a move that cannot be placed
188
+ fails as a whole.
189
+ 3. `canDrop(proposal)` may reject the candidate synchronously, during the
190
+ preview and again at release.
191
+ 4. `onChange(next, proposal)` publishes the candidate together with
192
+ `proposal.baseRevision`. Answer it by committing a value whose revision is
193
+ that base plus one, or by rejecting it. `useDndState` and
194
+ `createDndStateStore` do this for you.
195
+ 5. `onDragEnd` reports the outcome: `accepted`, `rejected`, `expired`,
196
+ `mismatch`, `interrupted`, or a cancellation with its reason.
197
+
198
+ An unanswered proposal expires after `responseTimeoutMs`, 2000 ms by default,
199
+ and an external edit during a drag interrupts the session instead of being
200
+ overwritten.
201
+
202
+ For input that is not a gesture, compute the same move and commit it yourself:
203
+
204
+ ```ts
205
+ import { computeLayoutMove } from 'react-native-layout-dnd/engine';
206
+
207
+ const result = computeLayoutMove({
208
+ value,
209
+ itemId,
210
+ to: { kind: 'list', zoneId: 'tasks', index: targetIndex },
211
+ });
212
+ if (result.status === 'ok' && result.changed) setValue(result.value);
213
+ ```
214
+
215
+ ## Documentation
216
+
217
+ - [Lists and scrolling](docs/list-scroll-api.md) covers `DndProvider`,
218
+ `SortableList`, `DragHandle`, `useDndState`, virtualization, auto-scroll and
219
+ accessibility.
220
+ - [Grids and mixed layouts](docs/mixed-layout-api.md) covers `SortableGrid`,
221
+ spans, transfers between zones, approval and failure reasons.
222
+ - [Grid contracts and the `GridController` API](docs/api.md) covers the shared
223
+ layout contract, movement policies and preview rules, plus the grid-only API
224
+ kept for existing consumers, which is now an adapter over the same provider.
225
+ - [Contributing](CONTRIBUTING.md) lists the checks and the native test
226
+ checklist.
227
+
228
+ Runnable examples live in [`example/`](example/), including a 580-item
229
+ `FlatList` tab and a mixed grid and list screen:
230
+
231
+ ```sh
232
+ yarn install
233
+ yarn example start
234
+ yarn example ios # or: yarn example android
235
+ ```
236
+
237
+ ## Status and limitations
238
+
239
+ Automated verification passes 51 suites and 1,215 tests, seven
240
+ performance-tooling tests, TypeScript, ESLint, the build, and an isolated check
241
+ of the packed API and its types.
242
+
243
+ Known gaps, stated so you can judge the risk:
244
+
245
+ - **Not published.** The package stays `private` until the release criteria are
246
+ met, and the public API may still change.
247
+ - **One verified combination.** The peer ranges above come from the APIs this
248
+ package calls, not from a test matrix. Only the versions in the Verified
249
+ column have been built and run, and Expo has not been tried.
250
+ - **Device verification is incomplete.** iOS simulator measurement and an
251
+ Android emulator driver pass. Dragging across rotation and app backgrounding,
252
+ Android release-build touch input, and a physical-device run are still open.
253
+ - **Screen readers.** Handles forward accessibility view props and reduced
254
+ motion follows the system setting, but the drag state itself is not announced
255
+ and no move actions are wired up for you. See the
256
+ [accessibility support level](docs/list-scroll-api.md#accessibility-reduced-motion-and-alternative-movement).
257
+ - **Virtualization is list-only.** Grid zones render every placement, and there
258
+ are no FlashList or LegendList adapters.
259
+
260
+ ## License
261
+
262
+ [MIT](LICENSE) — baesumin.
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ import { isRecord } from "../engine/validation.js";
4
+ function isPoint(value) {
5
+ return isRecord(value) && typeof value.x === 'number' && Number.isFinite(value.x) && typeof value.y === 'number' && Number.isFinite(value.y);
6
+ }
7
+ function isRect(value) {
8
+ return isPoint(value) && 'width' in value && typeof value.width === 'number' && Number.isFinite(value.width) && value.width > 0 && 'height' in value && typeof value.height === 'number' && Number.isFinite(value.height) && value.height > 0;
9
+ }
10
+ function isNonnegativeFinite(value) {
11
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0;
12
+ }
13
+
14
+ /** Estimates remain estimates after validation; callers must inspect source. */
15
+ export function validateRectMeasurement(measurement, freshness) {
16
+ if (!isRecord(freshness) || !Number.isSafeInteger(freshness.revision) || freshness.revision < 0 || freshness.nowMs === undefined !== (freshness.maxAgeMs === undefined) || freshness.nowMs !== undefined && (!isNonnegativeFinite(freshness.nowMs) || !isNonnegativeFinite(freshness.maxAgeMs))) {
17
+ return {
18
+ valid: false,
19
+ reason: 'invalid-freshness'
20
+ };
21
+ }
22
+ if (!isRecord(measurement) || measurement.source !== 'measured' && measurement.source !== 'estimated' || measurement.space !== 'screen' && measurement.space !== 'content' || !isRect(measurement.rect) || !Number.isSafeInteger(measurement.revision) || measurement.revision < 0 || !isNonnegativeFinite(measurement.timestampMs)) {
23
+ return {
24
+ valid: false,
25
+ reason: 'invalid-measurement'
26
+ };
27
+ }
28
+ if (measurement.revision !== freshness.revision || freshness.nowMs !== undefined && (measurement.timestampMs > freshness.nowMs || freshness.nowMs - measurement.timestampMs > freshness.maxAgeMs)) {
29
+ return {
30
+ valid: false,
31
+ reason: 'stale-measurement'
32
+ };
33
+ }
34
+ return {
35
+ valid: true,
36
+ value: measurement
37
+ };
38
+ }
39
+ function validateContext(context, freshness) {
40
+ if (!isRecord(context) || !isPoint(context.scrollOffset)) {
41
+ return {
42
+ valid: false,
43
+ reason: 'invalid-context'
44
+ };
45
+ }
46
+ const measurement = validateRectMeasurement(context.viewport, freshness);
47
+ if (!measurement.valid) return measurement;
48
+ if (measurement.value.source !== 'measured' || measurement.value.space !== 'screen') {
49
+ return {
50
+ valid: false,
51
+ reason: 'invalid-context'
52
+ };
53
+ }
54
+ return {
55
+ valid: true,
56
+ value: context
57
+ };
58
+ }
59
+ function convertPoint(point, context, freshness, direction) {
60
+ if (!isPoint(point)) return {
61
+ valid: false,
62
+ reason: 'invalid-coordinate'
63
+ };
64
+ const validation = validateContext(context, freshness);
65
+ if (!validation.valid) return validation;
66
+ const {
67
+ rect
68
+ } = context.viewport;
69
+ const {
70
+ scrollOffset
71
+ } = context;
72
+ const value = direction === 'to-content' ? {
73
+ x: point.x - rect.x + scrollOffset.x,
74
+ y: point.y - rect.y + scrollOffset.y
75
+ } : {
76
+ x: point.x - scrollOffset.x + rect.x,
77
+ y: point.y - scrollOffset.y + rect.y
78
+ };
79
+ return isPoint(value) ? {
80
+ valid: true,
81
+ value
82
+ } : {
83
+ valid: false,
84
+ reason: 'invalid-coordinate'
85
+ };
86
+ }
87
+
88
+ /** Convert absolute screen pixels to zone content pixels using the current offset. */
89
+ export function screenToContent(point, context, freshness) {
90
+ return convertPoint(point, context, freshness, 'to-content');
91
+ }
92
+ export function contentToScreen(point, context, freshness) {
93
+ return convertPoint(point, context, freshness, 'to-screen');
94
+ }
95
+ export function screenRectToContent(measurement, context, freshness) {
96
+ const validation = validateRectMeasurement(measurement, freshness);
97
+ if (!validation.valid) return validation;
98
+ if (measurement.space !== 'screen') return {
99
+ valid: false,
100
+ reason: 'invalid-measurement'
101
+ };
102
+ const converted = screenToContent(measurement.rect, context, freshness);
103
+ return converted.valid ? {
104
+ valid: true,
105
+ value: {
106
+ ...measurement,
107
+ space: 'content',
108
+ rect: {
109
+ ...measurement.rect,
110
+ ...converted.value
111
+ }
112
+ }
113
+ } : converted;
114
+ }
115
+ export function contentRectToScreen(measurement, context, freshness) {
116
+ const validation = validateRectMeasurement(measurement, freshness);
117
+ if (!validation.valid) return validation;
118
+ if (measurement.space !== 'content') return {
119
+ valid: false,
120
+ reason: 'invalid-measurement'
121
+ };
122
+ const converted = contentToScreen(measurement.rect, context, freshness);
123
+ return converted.valid ? {
124
+ valid: true,
125
+ value: {
126
+ ...measurement,
127
+ space: 'screen',
128
+ rect: {
129
+ ...measurement.rect,
130
+ ...converted.value
131
+ }
132
+ }
133
+ } : converted;
134
+ }
135
+ //# sourceMappingURL=coordinates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isRecord","isPoint","value","x","Number","isFinite","y","isRect","width","height","isNonnegativeFinite","validateRectMeasurement","measurement","freshness","isSafeInteger","revision","nowMs","undefined","maxAgeMs","valid","reason","source","space","rect","timestampMs","validateContext","context","scrollOffset","viewport","convertPoint","point","direction","validation","screenToContent","contentToScreen","screenRectToContent","converted","contentRectToScreen"],"sourceRoot":"../../../src","sources":["adapters/coordinates.ts"],"mappings":";;AASA,SAASA,QAAQ,QAAQ,yBAAsB;AAE/C,SAASC,OAAOA,CAACC,KAAc,EAAwB;EACrD,OACEF,QAAQ,CAACE,KAAK,CAAC,IACf,OAAOA,KAAK,CAACC,CAAC,KAAK,QAAQ,IAC3BC,MAAM,CAACC,QAAQ,CAACH,KAAK,CAACC,CAAC,CAAC,IACxB,OAAOD,KAAK,CAACI,CAAC,KAAK,QAAQ,IAC3BF,MAAM,CAACC,QAAQ,CAACH,KAAK,CAACI,CAAC,CAAC;AAE5B;AAEA,SAASC,MAAMA,CAACL,KAAc,EAAuB;EACnD,OACED,OAAO,CAACC,KAAK,CAAC,IACd,OAAO,IAAIA,KAAK,IAChB,OAAOA,KAAK,CAACM,KAAK,KAAK,QAAQ,IAC/BJ,MAAM,CAACC,QAAQ,CAACH,KAAK,CAACM,KAAK,CAAC,IAC5BN,KAAK,CAACM,KAAK,GAAG,CAAC,IACf,QAAQ,IAAIN,KAAK,IACjB,OAAOA,KAAK,CAACO,MAAM,KAAK,QAAQ,IAChCL,MAAM,CAACC,QAAQ,CAACH,KAAK,CAACO,MAAM,CAAC,IAC7BP,KAAK,CAACO,MAAM,GAAG,CAAC;AAEpB;AAEA,SAASC,mBAAmBA,CAACR,KAAc,EAAmB;EAC5D,OAAO,OAAOA,KAAK,KAAK,QAAQ,IAAIE,MAAM,CAACC,QAAQ,CAACH,KAAK,CAAC,IAAIA,KAAK,IAAI,CAAC;AAC1E;;AAEA;AACA,OAAO,SAASS,uBAAuBA,CACrCC,WAAwB,EACxBC,SAA+B,EACA;EAC/B,IACE,CAACb,QAAQ,CAACa,SAAS,CAAC,IACpB,CAACT,MAAM,CAACU,aAAa,CAACD,SAAS,CAACE,QAAQ,CAAC,IACzCF,SAAS,CAACE,QAAQ,GAAG,CAAC,IACrBF,SAAS,CAACG,KAAK,KAAKC,SAAS,MAAOJ,SAAS,CAACK,QAAQ,KAAKD,SAAS,CAAC,IACrEJ,SAAS,CAACG,KAAK,KAAKC,SAAS,KAC3B,CAACP,mBAAmB,CAACG,SAAS,CAACG,KAAK,CAAC,IACpC,CAACN,mBAAmB,CAACG,SAAS,CAACK,QAAQ,CAAC,CAAE,EAC9C;IACA,OAAO;MAAEC,KAAK,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAoB,CAAC;EACtD;EACA,IACE,CAACpB,QAAQ,CAACY,WAAW,CAAC,IACrBA,WAAW,CAACS,MAAM,KAAK,UAAU,IAAIT,WAAW,CAACS,MAAM,KAAK,WAAY,IACxET,WAAW,CAACU,KAAK,KAAK,QAAQ,IAAIV,WAAW,CAACU,KAAK,KAAK,SAAU,IACnE,CAACf,MAAM,CAACK,WAAW,CAACW,IAAI,CAAC,IACzB,CAACnB,MAAM,CAACU,aAAa,CAACF,WAAW,CAACG,QAAQ,CAAC,IAC3CH,WAAW,CAACG,QAAQ,GAAG,CAAC,IACxB,CAACL,mBAAmB,CAACE,WAAW,CAACY,WAAW,CAAC,EAC7C;IACA,OAAO;MAAEL,KAAK,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAsB,CAAC;EACxD;EACA,IACER,WAAW,CAACG,QAAQ,KAAKF,SAAS,CAACE,QAAQ,IAC1CF,SAAS,CAACG,KAAK,KAAKC,SAAS,KAC3BL,WAAW,CAACY,WAAW,GAAGX,SAAS,CAACG,KAAK,IACxCH,SAAS,CAACG,KAAK,GAAGJ,WAAW,CAACY,WAAW,GAAGX,SAAS,CAACK,QAAS,CAAE,EACrE;IACA,OAAO;MAAEC,KAAK,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAoB,CAAC;EACtD;EACA,OAAO;IAAED,KAAK,EAAE,IAAI;IAAEjB,KAAK,EAAEU;EAAY,CAAC;AAC5C;AAEA,SAASa,eAAeA,CACtBC,OAA8B,EAC9Bb,SAA+B,EACU;EACzC,IAAI,CAACb,QAAQ,CAAC0B,OAAO,CAAC,IAAI,CAACzB,OAAO,CAACyB,OAAO,CAACC,YAAY,CAAC,EAAE;IACxD,OAAO;MAAER,KAAK,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAkB,CAAC;EACpD;EACA,MAAMR,WAAW,GAAGD,uBAAuB,CAACe,OAAO,CAACE,QAAQ,EAAEf,SAAS,CAAC;EACxE,IAAI,CAACD,WAAW,CAACO,KAAK,EAAE,OAAOP,WAAW;EAC1C,IACEA,WAAW,CAACV,KAAK,CAACmB,MAAM,KAAK,UAAU,IACvCT,WAAW,CAACV,KAAK,CAACoB,KAAK,KAAK,QAAQ,EACpC;IACA,OAAO;MAAEH,KAAK,EAAE,KAAK;MAAEC,MAAM,EAAE;IAAkB,CAAC;EACpD;EACA,OAAO;IAAED,KAAK,EAAE,IAAI;IAAEjB,KAAK,EAAEwB;EAAQ,CAAC;AACxC;AAEA,SAASG,YAAYA,CACnBC,KAAkB,EAClBJ,OAA8B,EAC9Bb,SAA+B,EAC/BkB,SAAqC,EACN;EAC/B,IAAI,CAAC9B,OAAO,CAAC6B,KAAK,CAAC,EAAE,OAAO;IAAEX,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAqB,CAAC;EAC1E,MAAMY,UAAU,GAAGP,eAAe,CAACC,OAAO,EAAEb,SAAS,CAAC;EACtD,IAAI,CAACmB,UAAU,CAACb,KAAK,EAAE,OAAOa,UAAU;EACxC,MAAM;IAAET;EAAK,CAAC,GAAGG,OAAO,CAACE,QAAQ;EACjC,MAAM;IAAED;EAAa,CAAC,GAAGD,OAAO;EAChC,MAAMxB,KAAK,GACT6B,SAAS,KAAK,YAAY,GACtB;IACE5B,CAAC,EAAE2B,KAAK,CAAC3B,CAAC,GAAGoB,IAAI,CAACpB,CAAC,GAAGwB,YAAY,CAACxB,CAAC;IACpCG,CAAC,EAAEwB,KAAK,CAACxB,CAAC,GAAGiB,IAAI,CAACjB,CAAC,GAAGqB,YAAY,CAACrB;EACrC,CAAC,GACD;IACEH,CAAC,EAAE2B,KAAK,CAAC3B,CAAC,GAAGwB,YAAY,CAACxB,CAAC,GAAGoB,IAAI,CAACpB,CAAC;IACpCG,CAAC,EAAEwB,KAAK,CAACxB,CAAC,GAAGqB,YAAY,CAACrB,CAAC,GAAGiB,IAAI,CAACjB;EACrC,CAAC;EACP,OAAOL,OAAO,CAACC,KAAK,CAAC,GACjB;IAAEiB,KAAK,EAAE,IAAI;IAAEjB;EAAM,CAAC,GACtB;IAAEiB,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAqB,CAAC;AACpD;;AAEA;AACA,OAAO,SAASa,eAAeA,CAC7BH,KAAkB,EAClBJ,OAA8B,EAC9Bb,SAA+B,EACA;EAC/B,OAAOgB,YAAY,CAACC,KAAK,EAAEJ,OAAO,EAAEb,SAAS,EAAE,YAAY,CAAC;AAC9D;AAEA,OAAO,SAASqB,eAAeA,CAC7BJ,KAAkB,EAClBJ,OAA8B,EAC9Bb,SAA+B,EACA;EAC/B,OAAOgB,YAAY,CAACC,KAAK,EAAEJ,OAAO,EAAEb,SAAS,EAAE,WAAW,CAAC;AAC7D;AAEA,OAAO,SAASsB,mBAAmBA,CACjCvB,WAAsC,EACtCc,OAA8B,EAC9Bb,SAA+B,EACe;EAC9C,MAAMmB,UAAU,GAAGrB,uBAAuB,CAACC,WAAW,EAAEC,SAAS,CAAC;EAClE,IAAI,CAACmB,UAAU,CAACb,KAAK,EAAE,OAAOa,UAAU;EACxC,IAAIpB,WAAW,CAACU,KAAK,KAAK,QAAQ,EAChC,OAAO;IAAEH,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAsB,CAAC;EACxD,MAAMgB,SAAS,GAAGH,eAAe,CAACrB,WAAW,CAACW,IAAI,EAAEG,OAAO,EAAEb,SAAS,CAAC;EACvE,OAAOuB,SAAS,CAACjB,KAAK,GAClB;IACEA,KAAK,EAAE,IAAI;IACXjB,KAAK,EAAE;MACL,GAAGU,WAAW;MACdU,KAAK,EAAE,SAAS;MAChBC,IAAI,EAAE;QAAE,GAAGX,WAAW,CAACW,IAAI;QAAE,GAAGa,SAAS,CAAClC;MAAM;IAClD;EACF,CAAC,GACDkC,SAAS;AACf;AAEA,OAAO,SAASC,mBAAmBA,CACjCzB,WAAuC,EACvCc,OAA8B,EAC9Bb,SAA+B,EACc;EAC7C,MAAMmB,UAAU,GAAGrB,uBAAuB,CAACC,WAAW,EAAEC,SAAS,CAAC;EAClE,IAAI,CAACmB,UAAU,CAACb,KAAK,EAAE,OAAOa,UAAU;EACxC,IAAIpB,WAAW,CAACU,KAAK,KAAK,SAAS,EACjC,OAAO;IAAEH,KAAK,EAAE,KAAK;IAAEC,MAAM,EAAE;EAAsB,CAAC;EACxD,MAAMgB,SAAS,GAAGF,eAAe,CAACtB,WAAW,CAACW,IAAI,EAAEG,OAAO,EAAEb,SAAS,CAAC;EACvE,OAAOuB,SAAS,CAACjB,KAAK,GAClB;IACEA,KAAK,EAAE,IAAI;IACXjB,KAAK,EAAE;MACL,GAAGU,WAAW;MACdU,KAAK,EAAE,QAAQ;MACfC,IAAI,EAAE;QAAE,GAAGX,WAAW,CAACW,IAAI;QAAE,GAAGa,SAAS,CAAClC;MAAM;IAClD;EACF,CAAC,GACDkC,SAAS;AACf","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+
3
+ /** The permitted drag direction is independent of a list's orientation. */
4
+
5
+ /** One axis of a measured scroll viewport, using logical pixels throughout. */
6
+
7
+ /** Validate public options before activating a gesture or executing a frame. */
8
+ export function validateAutoScrollOptions(options) {
9
+ 'worklet';
10
+
11
+ if (options !== undefined && (!options || typeof options !== 'object' || Array.isArray(options) || options.enabled !== undefined && typeof options.enabled !== 'boolean' || options.edgeThreshold !== undefined && (!Number.isFinite(options.edgeThreshold) || options.edgeThreshold <= 0) || options.maxSpeed !== undefined && (!Number.isFinite(options.maxSpeed) || options.maxSpeed < 0))) return {
12
+ valid: false,
13
+ reason: 'invalid-options'
14
+ };
15
+ return {
16
+ valid: true
17
+ };
18
+ }
19
+
20
+ /**
21
+ * Compute one frame of edge scrolling for either orientation. Adapters should
22
+ * call scrollTo only for nonzero velocity, preserving native bounce while idle.
23
+ * Call only during an active drag, and re-read its candidate after scrolling.
24
+ */
25
+ export function computeAutoScroll(input) {
26
+ 'worklet';
27
+
28
+ if (!input || typeof input !== 'object' || Array.isArray(input) || !Number.isFinite(input.pointer) || !Number.isFinite(input.viewportStart) || !Number.isFinite(input.viewportSize) || input.viewportSize <= 0 || !Number.isFinite(input.offset) || !Number.isFinite(input.contentSize) || input.contentSize < 0 || !Number.isFinite(input.deltaTimeMs) || input.deltaTimeMs < 0) return {
29
+ valid: false,
30
+ reason: 'invalid-input'
31
+ };
32
+ const {
33
+ options
34
+ } = input;
35
+ const validation = validateAutoScrollOptions(options);
36
+ if (!validation.valid) return validation;
37
+ const maximum = Math.max(0, input.contentSize - input.viewportSize);
38
+ const offset = Math.max(0, Math.min(maximum, input.offset));
39
+ const idle = {
40
+ valid: true,
41
+ offset,
42
+ velocity: 0
43
+ };
44
+ const pointer = input.pointer - input.viewportStart;
45
+ if (!Number.isFinite(pointer)) return {
46
+ valid: false,
47
+ reason: 'invalid-input'
48
+ };
49
+ if (options?.enabled === false || pointer < 0 || pointer > input.viewportSize || maximum === 0 || input.deltaTimeMs === 0) return idle;
50
+
51
+ // Cap overlapping edge bands at the midpoint so tiny viewports do not bias
52
+ // toward the first edge. The exact midpoint has no preferred direction.
53
+ const threshold = Math.min(options?.edgeThreshold ?? 48, input.viewportSize / 2);
54
+ if (threshold === 0) return idle;
55
+ const trailingDistance = input.viewportSize - pointer;
56
+ const direction = pointer < threshold ? -1 : trailingDistance < threshold ? 1 : 0;
57
+ if (direction === 0) return idle;
58
+ const distance = direction < 0 ? pointer : trailingDistance;
59
+ const speed = (options?.maxSpeed ?? 600) * (1 - distance / threshold);
60
+ // A paused/resumed frame must not skip a large portion of the list.
61
+ const seconds = Math.min(input.deltaTimeMs, 64) / 1000;
62
+ if (seconds === 0 || speed === 0) return idle;
63
+ const nextOffset = Math.max(0, Math.min(maximum, offset + direction * speed * seconds));
64
+ const movement = nextOffset - offset;
65
+ return {
66
+ valid: true,
67
+ offset: nextOffset,
68
+ velocity: movement === 0 ? 0 : direction * Math.min(speed, Math.abs(movement / seconds))
69
+ };
70
+ }
71
+
72
+ /** Project a validated screen point onto the configured axis through origin. */
73
+ export function constrainDragPoint(point, origin, axis) {
74
+ 'worklet';
75
+
76
+ return {
77
+ x: axis === 'y' ? origin.x : point.x,
78
+ y: axis === 'x' ? origin.y : point.y
79
+ };
80
+ }
81
+ //# sourceMappingURL=scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["validateAutoScrollOptions","options","undefined","Array","isArray","enabled","edgeThreshold","Number","isFinite","maxSpeed","valid","reason","computeAutoScroll","input","pointer","viewportStart","viewportSize","offset","contentSize","deltaTimeMs","validation","maximum","Math","max","min","idle","velocity","threshold","trailingDistance","direction","distance","speed","seconds","nextOffset","movement","abs","constrainDragPoint","point","origin","axis","x","y"],"sourceRoot":"../../../src","sources":["adapters/scroll.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ import { isPositiveInteger, isRecord } from "../engine/validation.js";
4
+
5
+ /** FlatList rendering limits; enabling virtualization preserves the layout API. */
6
+
7
+ const DEFAULT_OPTIONS = Object.freeze({
8
+ initialNumToRender: 12,
9
+ maxToRenderPerBatch: 12,
10
+ windowSize: 7,
11
+ updateCellsBatchingPeriod: 50
12
+ });
13
+ function invalid(message) {
14
+ return {
15
+ valid: false,
16
+ issues: [{
17
+ code: 'invalid-configuration',
18
+ message
19
+ }]
20
+ };
21
+ }
22
+
23
+ /** Undefined/false selects ScrollView; true or an options object selects FlatList. */
24
+ export function resolveListVirtualization(value) {
25
+ if (value === undefined || value === false) {
26
+ return {
27
+ valid: true,
28
+ options: null
29
+ };
30
+ }
31
+ if (value === true) return {
32
+ valid: true,
33
+ options: {
34
+ ...DEFAULT_OPTIONS
35
+ }
36
+ };
37
+ if (!isRecord(value)) {
38
+ return invalid('virtualization must be a boolean or an options object.');
39
+ }
40
+ if (Object.keys(value).some(key => key !== 'initialNumToRender' && key !== 'maxToRenderPerBatch' && key !== 'windowSize' && key !== 'updateCellsBatchingPeriod')) {
41
+ return invalid('virtualization supports only initialNumToRender, maxToRenderPerBatch, windowSize and updateCellsBatchingPeriod.');
42
+ }
43
+ const initialNumToRender = value.initialNumToRender === undefined ? DEFAULT_OPTIONS.initialNumToRender : value.initialNumToRender;
44
+ const maxToRenderPerBatch = value.maxToRenderPerBatch === undefined ? DEFAULT_OPTIONS.maxToRenderPerBatch : value.maxToRenderPerBatch;
45
+ const windowSize = value.windowSize === undefined ? DEFAULT_OPTIONS.windowSize : value.windowSize;
46
+ const updateCellsBatchingPeriod = value.updateCellsBatchingPeriod === undefined ? DEFAULT_OPTIONS.updateCellsBatchingPeriod : value.updateCellsBatchingPeriod;
47
+ if (!isPositiveInteger(initialNumToRender)) {
48
+ return invalid('virtualization.initialNumToRender must be a positive safe integer.');
49
+ }
50
+ if (!isPositiveInteger(maxToRenderPerBatch)) {
51
+ return invalid('virtualization.maxToRenderPerBatch must be a positive safe integer.');
52
+ }
53
+ if (typeof windowSize !== 'number' || !Number.isFinite(windowSize) || windowSize <= 1) {
54
+ return invalid('virtualization.windowSize must be finite and greater than 1.');
55
+ }
56
+ if (typeof updateCellsBatchingPeriod !== 'number' || !Number.isFinite(updateCellsBatchingPeriod) || updateCellsBatchingPeriod < 0) {
57
+ return invalid('virtualization.updateCellsBatchingPeriod must be finite and nonnegative.');
58
+ }
59
+ return {
60
+ valid: true,
61
+ options: {
62
+ initialNumToRender,
63
+ maxToRenderPerBatch,
64
+ windowSize,
65
+ updateCellsBatchingPeriod
66
+ }
67
+ };
68
+ }
69
+ //# sourceMappingURL=virtualizedList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isPositiveInteger","isRecord","DEFAULT_OPTIONS","Object","freeze","initialNumToRender","maxToRenderPerBatch","windowSize","updateCellsBatchingPeriod","invalid","message","valid","issues","code","resolveListVirtualization","value","undefined","options","keys","some","key","Number","isFinite"],"sourceRoot":"../../../src","sources":["adapters/virtualizedList.ts"],"mappings":";;AACA,SAASA,iBAAiB,EAAEC,QAAQ,QAAQ,yBAAsB;;AAElE;;AAgBA,MAAMC,eAA8D,GAClEC,MAAM,CAACC,MAAM,CAAC;EACZC,kBAAkB,EAAE,EAAE;EACtBC,mBAAmB,EAAE,EAAE;EACvBC,UAAU,EAAE,CAAC;EACbC,yBAAyB,EAAE;AAC7B,CAAC,CAAC;AAEJ,SAASC,OAAOA,CAACC,OAAe,EAA4B;EAC1D,OAAO;IACLC,KAAK,EAAE,KAAK;IACZC,MAAM,EAAE,CAAC;MAAEC,IAAI,EAAE,uBAAuB;MAAEH;IAAQ,CAAC;EACrD,CAAC;AACH;;AAEA;AACA,OAAO,SAASI,yBAAyBA,CACvCC,KAAc,EACY;EAC1B,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,KAAK,EAAE;IAC1C,OAAO;MAAEJ,KAAK,EAAE,IAAI;MAAEM,OAAO,EAAE;IAAK,CAAC;EACvC;EACA,IAAIF,KAAK,KAAK,IAAI,EAAE,OAAO;IAAEJ,KAAK,EAAE,IAAI;IAAEM,OAAO,EAAE;MAAE,GAAGf;IAAgB;EAAE,CAAC;EAC3E,IAAI,CAACD,QAAQ,CAACc,KAAK,CAAC,EAAE;IACpB,OAAON,OAAO,CAAC,wDAAwD,CAAC;EAC1E;EACA,IACEN,MAAM,CAACe,IAAI,CAACH,KAAK,CAAC,CAACI,IAAI,CACrBC,GAAG,IACDA,GAAG,KAAK,oBAAoB,IAC5BA,GAAG,KAAK,qBAAqB,IAC7BA,GAAG,KAAK,YAAY,IACpBA,GAAG,KAAK,2BACZ,CAAC,EACD;IACA,OAAOX,OAAO,CACZ,iHACF,CAAC;EACH;EACA,MAAMJ,kBAAkB,GACtBU,KAAK,CAACV,kBAAkB,KAAKW,SAAS,GAClCd,eAAe,CAACG,kBAAkB,GAClCU,KAAK,CAACV,kBAAkB;EAC9B,MAAMC,mBAAmB,GACvBS,KAAK,CAACT,mBAAmB,KAAKU,SAAS,GACnCd,eAAe,CAACI,mBAAmB,GACnCS,KAAK,CAACT,mBAAmB;EAC/B,MAAMC,UAAU,GACdQ,KAAK,CAACR,UAAU,KAAKS,SAAS,GAC1Bd,eAAe,CAACK,UAAU,GAC1BQ,KAAK,CAACR,UAAU;EACtB,MAAMC,yBAAyB,GAC7BO,KAAK,CAACP,yBAAyB,KAAKQ,SAAS,GACzCd,eAAe,CAACM,yBAAyB,GACzCO,KAAK,CAACP,yBAAyB;EACrC,IAAI,CAACR,iBAAiB,CAACK,kBAAkB,CAAC,EAAE;IAC1C,OAAOI,OAAO,CACZ,oEACF,CAAC;EACH;EACA,IAAI,CAACT,iBAAiB,CAACM,mBAAmB,CAAC,EAAE;IAC3C,OAAOG,OAAO,CACZ,qEACF,CAAC;EACH;EACA,IACE,OAAOF,UAAU,KAAK,QAAQ,IAC9B,CAACc,MAAM,CAACC,QAAQ,CAACf,UAAU,CAAC,IAC5BA,UAAU,IAAI,CAAC,EACf;IACA,OAAOE,OAAO,CACZ,8DACF,CAAC;EACH;EACA,IACE,OAAOD,yBAAyB,KAAK,QAAQ,IAC7C,CAACa,MAAM,CAACC,QAAQ,CAACd,yBAAyB,CAAC,IAC3CA,yBAAyB,GAAG,CAAC,EAC7B;IACA,OAAOC,OAAO,CACZ,0EACF,CAAC;EACH;EACA,OAAO;IACLE,KAAK,EAAE,IAAI;IACXM,OAAO,EAAE;MACPZ,kBAAkB;MAClBC,mBAAmB;MACnBC,UAAU;MACVC;IACF;EACF,CAAC;AACH","ignoreList":[]}