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,77 @@
1
+ "use strict";
2
+
3
+ /** Declarative configuration shared by the JS engine and UI worklets. */
4
+
5
+ const DEFAULT_CANDIDATES = Object.freeze(['row-rotation', 'insert', 'exchange']);
6
+
7
+ /** Neutral placement rules; caller data and item size never imply home behavior. */
8
+ export const DEFAULT_GRID_MOVEMENT_POLICY = Object.freeze({
9
+ rowRotation: 'disabled',
10
+ adjacentInsertExchange: 'disabled',
11
+ candidateOrder: DEFAULT_CANDIDATES,
12
+ pointer: Object.freeze({
13
+ cellHysteresis: 0.12,
14
+ exchangeThreshold: 0.8,
15
+ boundaryHysteresis: 4
16
+ })
17
+ });
18
+
19
+ /** Explicit compatibility with the extracted home grid's reversible movements. */
20
+ export const HOME_GRID_MOVEMENT_POLICY = Object.freeze({
21
+ ...DEFAULT_GRID_MOVEMENT_POLICY,
22
+ rowRotation: 'full-width',
23
+ adjacentInsertExchange: 'single-cell'
24
+ });
25
+
26
+ /** Copy configuration when starting a session so later caller edits cannot change it. */
27
+ export function resolveGridMovementPolicy(policy) {
28
+ 'worklet';
29
+
30
+ return {
31
+ rowRotation: policy?.rowRotation ?? DEFAULT_GRID_MOVEMENT_POLICY.rowRotation,
32
+ adjacentInsertExchange: policy?.adjacentInsertExchange ?? DEFAULT_GRID_MOVEMENT_POLICY.adjacentInsertExchange,
33
+ candidateOrder: [...(policy?.candidateOrder ?? DEFAULT_GRID_MOVEMENT_POLICY.candidateOrder)],
34
+ pointer: {
35
+ cellHysteresis: policy?.pointer?.cellHysteresis ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.cellHysteresis,
36
+ exchangeThreshold: policy?.pointer?.exchangeThreshold ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.exchangeThreshold,
37
+ boundaryHysteresis: policy?.pointer?.boundaryHysteresis ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.boundaryHysteresis
38
+ }
39
+ };
40
+ }
41
+ function record(value) {
42
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
43
+ }
44
+
45
+ /** Invalid policies reject the complete move before any candidate is computed. */
46
+ export function validateGridMovementPolicy(policy) {
47
+ if (policy === undefined) return {
48
+ valid: true
49
+ };
50
+ const invalid = message => ({
51
+ valid: false,
52
+ issues: [{
53
+ code: 'invalid-configuration',
54
+ message
55
+ }]
56
+ });
57
+ if (!record(policy)) return invalid('movementPolicy must be an object.');
58
+ if (policy.rowRotation !== undefined && policy.rowRotation !== 'disabled' && policy.rowRotation !== 'full-width') return invalid('movementPolicy.rowRotation must be disabled or full-width.');
59
+ if (policy.adjacentInsertExchange !== undefined && policy.adjacentInsertExchange !== 'disabled' && policy.adjacentInsertExchange !== 'single-cell') return invalid('movementPolicy.adjacentInsertExchange must be disabled or single-cell.');
60
+ if (policy.candidateOrder !== undefined && (!Array.isArray(policy.candidateOrder) || policy.candidateOrder.length === 0 || Array.from(policy.candidateOrder).some(candidate => !DEFAULT_CANDIDATES.includes(candidate)) || new Set(policy.candidateOrder).size !== policy.candidateOrder.length)) return invalid('movementPolicy.candidateOrder must contain distinct supported candidates.');
61
+ if (policy.pointer !== undefined) {
62
+ if (!record(policy.pointer)) return invalid('movementPolicy.pointer must be an object.');
63
+ const limits = {
64
+ cellHysteresis: [0, 0.5],
65
+ exchangeThreshold: [0.5, 1],
66
+ boundaryHysteresis: [0, Infinity]
67
+ };
68
+ for (const [key, [min, max]] of Object.entries(limits)) {
69
+ const value = policy.pointer[key];
70
+ if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max)) return invalid(`movementPolicy.pointer.${key} must be finite and between ${min} and ${max}.`);
71
+ }
72
+ }
73
+ return {
74
+ valid: true
75
+ };
76
+ }
77
+ //# sourceMappingURL=movementPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_CANDIDATES","Object","freeze","DEFAULT_GRID_MOVEMENT_POLICY","rowRotation","adjacentInsertExchange","candidateOrder","pointer","cellHysteresis","exchangeThreshold","boundaryHysteresis","HOME_GRID_MOVEMENT_POLICY","resolveGridMovementPolicy","policy","record","value","Array","isArray","validateGridMovementPolicy","undefined","valid","invalid","message","issues","code","length","from","some","candidate","includes","Set","size","limits","Infinity","key","min","max","entries","Number","isFinite"],"sourceRoot":"../../../src","sources":["engine/movementPolicy.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+
3
+ import { isCellSpan, isPositiveInteger, isRecord } from "./validation.js";
4
+ /**
5
+ * Raw ordered boundary. The caller first hit-tests the pointer against actual zones,
6
+ * removes the active item, and then applies the same hysteresis for preview and drop.
7
+ */
8
+ export function computeOrderedIndex(input) {
9
+ const fail = (code, message) => ({
10
+ status: 'invalid',
11
+ issues: [{
12
+ code,
13
+ message
14
+ }]
15
+ });
16
+ if (!isRecord(input)) return fail('invalid-structure', 'Expected ordered target geometry.');
17
+ if (!isPositiveInteger(input.rows) || !isPositiveInteger(input.columns)) return fail('invalid-dimension', 'Grid dimensions must be positive safe integers.');
18
+ if (input.itemSpan === undefined) return fail('missing-item-span', 'Ordered targeting requires itemSpan.');
19
+ if (!isCellSpan(input.itemSpan)) return fail('invalid-span', 'itemSpan must contain positive safe integers.');
20
+ if (!Number.isSafeInteger(input.itemCount) || input.itemCount < 0) return fail('invalid-structure', 'itemCount must be a non-negative safe integer.');
21
+ if (!isRecord(input.center) || !Number.isFinite(input.center.x) || !Number.isFinite(input.center.y) || !Number.isFinite(input.cellWidth) || input.cellWidth <= 0 || !Number.isFinite(input.cellHeight) || input.cellHeight <= 0 || !Number.isFinite(input.rowGap) || input.rowGap < 0 || !Number.isFinite(input.columnGap) || input.columnGap < 0) return fail('invalid-geometry', 'Center, cell sizes and gaps must be finite valid geometry.');
22
+ const {
23
+ rows,
24
+ columns,
25
+ itemSpan,
26
+ itemCount,
27
+ cellWidth,
28
+ cellHeight,
29
+ rowGap,
30
+ columnGap
31
+ } = input;
32
+ const slotsPerRow = Math.floor(columns / itemSpan.cols);
33
+ const slotRows = Math.floor(rows / itemSpan.rows);
34
+ const width = columns * cellWidth + (columns - 1) * columnGap;
35
+ const height = rows * cellHeight + (rows - 1) * rowGap;
36
+ const slotWidth = itemSpan.cols * cellWidth + (itemSpan.cols - 1) * columnGap;
37
+ const slotHeight = itemSpan.rows * cellHeight + (itemSpan.rows - 1) * rowGap;
38
+ const strideX = slotWidth + columnGap;
39
+ const strideY = slotHeight + rowGap;
40
+ if (![width, height, slotWidth, slotHeight, strideX, strideY].every(n => Number.isFinite(n) && n > 0)) return fail('invalid-geometry', 'Computed content and slot dimensions must be finite and positive.');
41
+ if (!slotsPerRow || !slotRows) return {
42
+ status: 'impossible'
43
+ };
44
+ if (Math.ceil(itemCount / slotsPerRow) > slotRows) return fail('capacity-exceeded', 'itemCount exceeds the ordered capacity.');
45
+ const x = Math.max(0, Math.min(width, input.center.x));
46
+ const y = Math.max(0, Math.min(height, input.center.y));
47
+
48
+ // Unfillable bottom rows are after the whole array, including a partly filled last row.
49
+ if (rows % itemSpan.rows !== 0 && y >= slotRows * strideY - rowGap) return {
50
+ status: 'ok',
51
+ index: itemCount
52
+ };
53
+ const row = Math.max(0, Math.min(slotRows - 1, Math.floor((y - slotHeight / 2) / strideY + 0.5)));
54
+ // Right-hand remainder belongs to this row's end, not the whole array's end.
55
+ if (columns % itemSpan.cols !== 0 && x >= slotsPerRow * strideX - columnGap) return {
56
+ status: 'ok',
57
+ index: Math.min(itemCount, (row + 1) * slotsPerRow)
58
+ };
59
+ const col = Math.max(0, Math.min(slotsPerRow - 1, Math.floor((x - slotWidth / 2) / strideX + 0.5)));
60
+ const slot = row * slotsPerRow + col;
61
+ if (slot >= itemCount) return {
62
+ status: 'ok',
63
+ index: itemCount
64
+ };
65
+ const after = slotsPerRow === 1 ? y >= row * strideY + slotHeight / 2 : x >= col * strideX + slotWidth / 2;
66
+ return {
67
+ status: 'ok',
68
+ index: Math.min(itemCount, slot + Number(after))
69
+ };
70
+ }
71
+ //# sourceMappingURL=orderedTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isCellSpan","isPositiveInteger","isRecord","computeOrderedIndex","input","fail","code","message","status","issues","rows","columns","itemSpan","undefined","Number","isSafeInteger","itemCount","center","isFinite","x","y","cellWidth","cellHeight","rowGap","columnGap","slotsPerRow","Math","floor","cols","slotRows","width","height","slotWidth","slotHeight","strideX","strideY","every","n","ceil","max","min","index","row","col","slot","after"],"sourceRoot":"../../../src","sources":["engine/orderedTarget.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ import { createPlacementSearch } from "./search.js";
4
+ import { validatePackInput } from "./validation.js";
5
+ export function packItems(input) {
6
+ const validation = validatePackInput(input);
7
+ if (!validation.valid) {
8
+ return {
9
+ status: 'invalid',
10
+ issues: validation.issues
11
+ };
12
+ }
13
+ const result = createPlacementSearch({
14
+ items: input.items,
15
+ rows: input.rows,
16
+ columns: input.columns,
17
+ searchBudget: input.searchBudget
18
+ }).advance(input.searchBudget);
19
+ if (result.status === 'ok') {
20
+ return {
21
+ status: 'ok',
22
+ placements: result.placements
23
+ };
24
+ }
25
+ // A chunk containing the entire global budget always resolves its status.
26
+ return {
27
+ status: result.status === 'impossible' ? 'impossible' : 'unresolved'
28
+ };
29
+ }
30
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPlacementSearch","validatePackInput","packItems","input","validation","valid","status","issues","result","items","rows","columns","searchBudget","advance","placements"],"sourceRoot":"../../../src","sources":["engine/pack.ts"],"mappings":";;AAEA,SAASA,qBAAqB,QAAQ,aAAU;AAChD,SAASC,iBAAiB,QAAQ,iBAAc;AAEhD,OAAO,SAASC,SAASA,CAAIC,KAAmB,EAAiB;EAC/D,MAAMC,UAAU,GAAGH,iBAAiB,CAACE,KAAK,CAAC;EAC3C,IAAI,CAACC,UAAU,CAACC,KAAK,EAAE;IACrB,OAAO;MAAEC,MAAM,EAAE,SAAS;MAAEC,MAAM,EAAEH,UAAU,CAACG;IAAO,CAAC;EACzD;EACA,MAAMC,MAAM,GAAGR,qBAAqB,CAAC;IACnCS,KAAK,EAAEN,KAAK,CAACM,KAAK;IAClBC,IAAI,EAAEP,KAAK,CAACO,IAAI;IAChBC,OAAO,EAAER,KAAK,CAACQ,OAAO;IACtBC,YAAY,EAAET,KAAK,CAACS;EACtB,CAAC,CAAC,CAACC,OAAO,CAACV,KAAK,CAACS,YAAY,CAAC;EAC9B,IAAIJ,MAAM,CAACF,MAAM,KAAK,IAAI,EAAE;IAC1B,OAAO;MAAEA,MAAM,EAAE,IAAI;MAAEQ,UAAU,EAAEN,MAAM,CAACM;IAAW,CAAC;EACxD;EACA;EACA,OAAO;IACLR,MAAM,EAAEE,MAAM,CAACF,MAAM,KAAK,YAAY,GAAG,YAAY,GAAG;EAC1D,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+
3
+ /** Internal: rectangles have validated nonnegative anchors and positive spans. */
4
+ export function rectanglesOverlap(a, b) {
5
+ 'worklet';
6
+
7
+ // Anchor differences stay exact without adding a span to a large coordinate.
8
+ const rowsOverlap = a.position.row <= b.position.row ? b.position.row - a.position.row < a.span.rows : a.position.row - b.position.row < b.span.rows;
9
+ const colsOverlap = a.position.col <= b.position.col ? b.position.col - a.position.col < a.span.cols : a.position.col - b.position.col < b.span.cols;
10
+ return rowsOverlap && colsOverlap;
11
+ }
12
+ //# sourceMappingURL=rectangles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","a","b","rowsOverlap","position","row","span","rows","colsOverlap","col","cols"],"sourceRoot":"../../../src","sources":["engine/rectangles.ts"],"mappings":";;AAIA;AACA,OAAO,SAASA,iBAAiBA,CAACC,CAAgB,EAAEC,CAAgB,EAAW;EAC7E,SAAS;;EACT;EACA,MAAMC,WAAW,GACfF,CAAC,CAACG,QAAQ,CAACC,GAAG,IAAIH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAC5BH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAAGJ,CAAC,CAACG,QAAQ,CAACC,GAAG,GAAGJ,CAAC,CAACK,IAAI,CAACC,IAAI,GAC7CN,CAAC,CAACG,QAAQ,CAACC,GAAG,GAAGH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAAGH,CAAC,CAACI,IAAI,CAACC,IAAI;EACnD,MAAMC,WAAW,GACfP,CAAC,CAACG,QAAQ,CAACK,GAAG,IAAIP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAC5BP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAAGR,CAAC,CAACG,QAAQ,CAACK,GAAG,GAAGR,CAAC,CAACK,IAAI,CAACI,IAAI,GAC7CT,CAAC,CAACG,QAAQ,CAACK,GAAG,GAAGP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAAGP,CAAC,CAACI,IAAI,CAACI,IAAI;EACnD,OAAOP,WAAW,IAAIK,WAAW;AACnC","ignoreList":[]}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ function sameZone(a, b) {
4
+ if (a.strategy !== b.strategy || a.rows !== b.rows || a.columns !== b.columns || a.items.length !== b.items.length) return false;
5
+ if (a.strategy === 'ordered' && b.strategy === 'ordered') {
6
+ return a.itemSpan.rows === b.itemSpan.rows && a.itemSpan.cols === b.itemSpan.cols && a.items.every((item, index) => {
7
+ const other = b.items[index];
8
+ return item.id === other.id && (item.placement ?? 'exchange') === (other.placement ?? 'exchange') && item.span.rows === other.span.rows && item.span.cols === other.span.cols;
9
+ });
10
+ }
11
+ if (a.strategy !== 'spatial' || b.strategy !== 'spatial') return false;
12
+ const byId = new Map(b.items.map(item => [item.id, item]));
13
+ return a.items.every(item => {
14
+ const other = byId.get(item.id);
15
+ return other !== undefined && (item.placement ?? 'exchange') === (other.placement ?? 'exchange') && item.span.rows === other.span.rows && item.span.cols === other.span.cols && item.position.row === other.position.row && item.position.col === other.position.col;
16
+ });
17
+ }
18
+
19
+ /** Compare validated layouts. Data, responses and spatial array order are not layout. */
20
+ export function hasSameLayout(a, b) {
21
+ if (a === b) return true;
22
+ if (a.zones.length !== b.zones.length) return false;
23
+ const byId = new Map(b.zones.map(zone => [zone.id, zone]));
24
+ return a.zones.every(zone => {
25
+ const other = byId.get(zone.id);
26
+ return other !== undefined && sameZone(zone, other);
27
+ });
28
+ }
29
+ //# sourceMappingURL=sameLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["sameZone","a","b","strategy","rows","columns","items","length","itemSpan","cols","every","item","index","other","id","placement","span","byId","Map","map","get","undefined","position","row","col","hasSameLayout","zones","zone"],"sourceRoot":"../../../src","sources":["engine/sameLayout.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+
3
+ import { rectanglesOverlap } from "./rectangles.js";
4
+ function* rowMajorCandidates(maxRow, maxCol) {
5
+ for (let row = 0; row <= maxRow; row++) {
6
+ for (let col = 0; col <= maxCol; col++) {
7
+ yield {
8
+ row,
9
+ col
10
+ };
11
+ }
12
+ }
13
+ }
14
+
15
+ /** Distance shells, then row/column order. No grid-sized array or sort. */
16
+ export function* nearestCandidates(maxRow, maxCol, origin) {
17
+ const colReach = Math.max(origin.col, maxCol - origin.col);
18
+ const maxDistance = Math.min(Number.MAX_SAFE_INTEGER, Math.max(origin.row, maxRow - origin.row) + colReach);
19
+ for (let distance = 0; distance <= maxDistance; distance++) {
20
+ const minRowDistance = Math.max(0, distance - colReach);
21
+ const firstRow = distance > origin.row ? 0 : origin.row - distance;
22
+ const lastRow = origin.row + Math.min(distance, maxRow - origin.row);
23
+ for (let row = firstRow; row <= lastRow; row++) {
24
+ // Skip the middle of a wide shell when the grid has very few columns.
25
+ if (Math.abs(row - origin.row) < minRowDistance) {
26
+ if (minRowDistance > maxRow - origin.row) {
27
+ break;
28
+ }
29
+ row = origin.row + minRowDistance;
30
+ }
31
+ if (row > lastRow) {
32
+ break;
33
+ }
34
+ const colDistance = distance - Math.abs(row - origin.row);
35
+ if (colDistance <= origin.col) {
36
+ yield {
37
+ row,
38
+ col: origin.col - colDistance
39
+ };
40
+ }
41
+ if (colDistance > 0 && colDistance <= maxCol - origin.col) {
42
+ yield {
43
+ row,
44
+ col: origin.col + colDistance
45
+ };
46
+ }
47
+ }
48
+ }
49
+ }
50
+ function exceedsArea(items, fixedItems, rows, columns) {
51
+ let remaining = rows * columns;
52
+ // Area is only a shortcut. Avoid a rounded product becoming a proof.
53
+ if (!Number.isSafeInteger(remaining)) {
54
+ return false;
55
+ }
56
+ for (const group of [fixedItems, items]) {
57
+ for (const item of group) {
58
+ const area = item.span.rows * item.span.cols;
59
+ if (area > remaining) {
60
+ return true;
61
+ }
62
+ remaining -= area;
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+
68
+ /** Internal: inputs are validated by the caller; fixed rectangles never move. */
69
+ export function createPlacementSearch({
70
+ items,
71
+ fixedItems = [],
72
+ rows,
73
+ columns,
74
+ searchBudget
75
+ }) {
76
+ let attempts = 0;
77
+ let depth = 0;
78
+ let terminal;
79
+ const placements = [];
80
+ const cursors = [];
81
+ let nextPosition;
82
+ if (items.some(item => item.span.rows > rows || item.span.cols > columns) || exceedsArea(items, fixedItems, rows, columns)) {
83
+ terminal = {
84
+ status: 'impossible',
85
+ attempts
86
+ };
87
+ }
88
+ function createCursor(index) {
89
+ const item = items[index];
90
+ const maxRow = rows - item.span.rows;
91
+ const maxCol = columns - item.span.cols;
92
+ return rowMajorCandidates(maxRow, maxCol);
93
+ }
94
+ return {
95
+ advance(maxAttempts) {
96
+ if (!Number.isSafeInteger(maxAttempts) || maxAttempts < 0) {
97
+ throw new RangeError('Search chunk size must be a nonnegative safe integer.');
98
+ }
99
+ let chunkAttempts = 0;
100
+ while (!terminal) {
101
+ if (depth === items.length) {
102
+ terminal = {
103
+ status: 'ok',
104
+ placements,
105
+ attempts
106
+ };
107
+ break;
108
+ }
109
+ cursors[depth] ??= createCursor(depth);
110
+ if (!nextPosition) {
111
+ const candidate = cursors[depth].next();
112
+ if (candidate.done) {
113
+ // Exhaustion is free to inspect: at an exact budget boundary this
114
+ // distinguishes a proof of impossibility from unfinished search.
115
+ cursors.pop();
116
+ if (depth === 0) {
117
+ terminal = {
118
+ status: 'impossible',
119
+ attempts
120
+ };
121
+ break;
122
+ }
123
+ depth--;
124
+ placements.pop();
125
+ continue;
126
+ }
127
+ nextPosition = candidate.value;
128
+ }
129
+ if (attempts === searchBudget) {
130
+ terminal = {
131
+ status: 'unresolved',
132
+ attempts
133
+ };
134
+ break;
135
+ }
136
+ if (chunkAttempts === maxAttempts) {
137
+ return {
138
+ status: 'pending',
139
+ attempts
140
+ };
141
+ }
142
+ attempts++;
143
+ chunkAttempts++;
144
+ const candidate = {
145
+ ...items[depth],
146
+ position: nextPosition
147
+ };
148
+ nextPosition = undefined;
149
+ if (fixedItems.some(item => rectanglesOverlap(candidate, item)) || placements.some(item => rectanglesOverlap(candidate, item))) {
150
+ continue;
151
+ }
152
+ placements.push(candidate);
153
+ depth++;
154
+ }
155
+ return terminal;
156
+ }
157
+ };
158
+ }
159
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","rowMajorCandidates","maxRow","maxCol","row","col","nearestCandidates","origin","colReach","Math","max","maxDistance","min","Number","MAX_SAFE_INTEGER","distance","minRowDistance","firstRow","lastRow","abs","colDistance","exceedsArea","items","fixedItems","rows","columns","remaining","isSafeInteger","group","item","area","span","cols","createPlacementSearch","searchBudget","attempts","depth","terminal","placements","cursors","nextPosition","some","status","createCursor","index","advance","maxAttempts","RangeError","chunkAttempts","length","candidate","next","done","pop","value","position","undefined","push"],"sourceRoot":"../../../src","sources":["engine/search.ts"],"mappings":";;AAEA,SAASA,iBAAiB,QAAQ,iBAAc;AAgBhD,UAAUC,kBAAkBA,CAC1BC,MAAc,EACdC,MAAc,EACW;EACzB,KAAK,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,IAAIF,MAAM,EAAEE,GAAG,EAAE,EAAE;IACtC,KAAK,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,IAAIF,MAAM,EAAEE,GAAG,EAAE,EAAE;MACtC,MAAM;QAAED,GAAG;QAAEC;MAAI,CAAC;IACpB;EACF;AACF;;AAEA;AACA,OAAO,UAAUC,iBAAiBA,CAChCJ,MAAc,EACdC,MAAc,EACdI,MAAoB,EACK;EACzB,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACH,MAAM,CAACF,GAAG,EAAEF,MAAM,GAAGI,MAAM,CAACF,GAAG,CAAC;EAC1D,MAAMM,WAAW,GAAGF,IAAI,CAACG,GAAG,CAC1BC,MAAM,CAACC,gBAAgB,EACvBL,IAAI,CAACC,GAAG,CAACH,MAAM,CAACH,GAAG,EAAEF,MAAM,GAAGK,MAAM,CAACH,GAAG,CAAC,GAAGI,QAC9C,CAAC;EACD,KAAK,IAAIO,QAAQ,GAAG,CAAC,EAAEA,QAAQ,IAAIJ,WAAW,EAAEI,QAAQ,EAAE,EAAE;IAC1D,MAAMC,cAAc,GAAGP,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEK,QAAQ,GAAGP,QAAQ,CAAC;IACvD,MAAMS,QAAQ,GAAGF,QAAQ,GAAGR,MAAM,CAACH,GAAG,GAAG,CAAC,GAAGG,MAAM,CAACH,GAAG,GAAGW,QAAQ;IAClE,MAAMG,OAAO,GAAGX,MAAM,CAACH,GAAG,GAAGK,IAAI,CAACG,GAAG,CAACG,QAAQ,EAAEb,MAAM,GAAGK,MAAM,CAACH,GAAG,CAAC;IACpE,KAAK,IAAIA,GAAG,GAAGa,QAAQ,EAAEb,GAAG,IAAIc,OAAO,EAAEd,GAAG,EAAE,EAAE;MAC9C;MACA,IAAIK,IAAI,CAACU,GAAG,CAACf,GAAG,GAAGG,MAAM,CAACH,GAAG,CAAC,GAAGY,cAAc,EAAE;QAC/C,IAAIA,cAAc,GAAGd,MAAM,GAAGK,MAAM,CAACH,GAAG,EAAE;UACxC;QACF;QACAA,GAAG,GAAGG,MAAM,CAACH,GAAG,GAAGY,cAAc;MACnC;MACA,IAAIZ,GAAG,GAAGc,OAAO,EAAE;QACjB;MACF;MACA,MAAME,WAAW,GAAGL,QAAQ,GAAGN,IAAI,CAACU,GAAG,CAACf,GAAG,GAAGG,MAAM,CAACH,GAAG,CAAC;MACzD,IAAIgB,WAAW,IAAIb,MAAM,CAACF,GAAG,EAAE;QAC7B,MAAM;UAAED,GAAG;UAAEC,GAAG,EAAEE,MAAM,CAACF,GAAG,GAAGe;QAAY,CAAC;MAC9C;MACA,IAAIA,WAAW,GAAG,CAAC,IAAIA,WAAW,IAAIjB,MAAM,GAAGI,MAAM,CAACF,GAAG,EAAE;QACzD,MAAM;UAAED,GAAG;UAAEC,GAAG,EAAEE,MAAM,CAACF,GAAG,GAAGe;QAAY,CAAC;MAC9C;IACF;EACF;AACF;AAEA,SAASC,WAAWA,CAClBC,KAA6B,EAC7BC,UAAwC,EACxCC,IAAY,EACZC,OAAe,EACN;EACT,IAAIC,SAAS,GAAGF,IAAI,GAAGC,OAAO;EAC9B;EACA,IAAI,CAACZ,MAAM,CAACc,aAAa,CAACD,SAAS,CAAC,EAAE;IACpC,OAAO,KAAK;EACd;EACA,KAAK,MAAME,KAAK,IAAI,CAACL,UAAU,EAAED,KAAK,CAAC,EAAE;IACvC,KAAK,MAAMO,IAAI,IAAID,KAAK,EAAE;MACxB,MAAME,IAAI,GAAGD,IAAI,CAACE,IAAI,CAACP,IAAI,GAAGK,IAAI,CAACE,IAAI,CAACC,IAAI;MAC5C,IAAIF,IAAI,GAAGJ,SAAS,EAAE;QACpB,OAAO,IAAI;MACb;MACAA,SAAS,IAAII,IAAI;IACnB;EACF;EACA,OAAO,KAAK;AACd;;AAEA;AACA,OAAO,SAASG,qBAAqBA,CAAI;EACvCX,KAAK;EACLC,UAAU,GAAG,EAAE;EACfC,IAAI;EACJC,OAAO;EACPS;AACc,CAAC,EAEf;EACA,IAAIC,QAAQ,GAAG,CAAC;EAChB,IAAIC,KAAK,GAAG,CAAC;EACb,IAAIC,QAA8C;EAClD,MAAMC,UAA+B,GAAG,EAAE;EAC1C,MAAMC,OAAkC,GAAG,EAAE;EAC7C,IAAIC,YAAsC;EAE1C,IACElB,KAAK,CAACmB,IAAI,CAACZ,IAAI,IAAIA,IAAI,CAACE,IAAI,CAACP,IAAI,GAAGA,IAAI,IAAIK,IAAI,CAACE,IAAI,CAACC,IAAI,GAAGP,OAAO,CAAC,IACrEJ,WAAW,CAACC,KAAK,EAAEC,UAAU,EAAEC,IAAI,EAAEC,OAAO,CAAC,EAC7C;IACAY,QAAQ,GAAG;MAAEK,MAAM,EAAE,YAAY;MAAEP;IAAS,CAAC;EAC/C;EAEA,SAASQ,YAAYA,CAACC,KAAa,EAA2B;IAC5D,MAAMf,IAAI,GAAGP,KAAK,CAACsB,KAAK,CAAC;IACzB,MAAM1C,MAAM,GAAGsB,IAAI,GAAGK,IAAI,CAACE,IAAI,CAACP,IAAI;IACpC,MAAMrB,MAAM,GAAGsB,OAAO,GAAGI,IAAI,CAACE,IAAI,CAACC,IAAI;IACvC,OAAO/B,kBAAkB,CAACC,MAAM,EAAEC,MAAM,CAAC;EAC3C;EAEA,OAAO;IACL0C,OAAOA,CAACC,WAAW,EAAE;MACnB,IAAI,CAACjC,MAAM,CAACc,aAAa,CAACmB,WAAW,CAAC,IAAIA,WAAW,GAAG,CAAC,EAAE;QACzD,MAAM,IAAIC,UAAU,CAClB,uDACF,CAAC;MACH;MACA,IAAIC,aAAa,GAAG,CAAC;MACrB,OAAO,CAACX,QAAQ,EAAE;QAChB,IAAID,KAAK,KAAKd,KAAK,CAAC2B,MAAM,EAAE;UAC1BZ,QAAQ,GAAG;YAAEK,MAAM,EAAE,IAAI;YAAEJ,UAAU;YAAEH;UAAS,CAAC;UACjD;QACF;QACAI,OAAO,CAACH,KAAK,CAAC,KAAKO,YAAY,CAACP,KAAK,CAAC;QACtC,IAAI,CAACI,YAAY,EAAE;UACjB,MAAMU,SAAS,GAAGX,OAAO,CAACH,KAAK,CAAC,CAACe,IAAI,CAAC,CAAC;UACvC,IAAID,SAAS,CAACE,IAAI,EAAE;YAClB;YACA;YACAb,OAAO,CAACc,GAAG,CAAC,CAAC;YACb,IAAIjB,KAAK,KAAK,CAAC,EAAE;cACfC,QAAQ,GAAG;gBAAEK,MAAM,EAAE,YAAY;gBAAEP;cAAS,CAAC;cAC7C;YACF;YACAC,KAAK,EAAE;YACPE,UAAU,CAACe,GAAG,CAAC,CAAC;YAChB;UACF;UACAb,YAAY,GAAGU,SAAS,CAACI,KAAK;QAChC;QACA,IAAInB,QAAQ,KAAKD,YAAY,EAAE;UAC7BG,QAAQ,GAAG;YAAEK,MAAM,EAAE,YAAY;YAAEP;UAAS,CAAC;UAC7C;QACF;QACA,IAAIa,aAAa,KAAKF,WAAW,EAAE;UACjC,OAAO;YAAEJ,MAAM,EAAE,SAAS;YAAEP;UAAS,CAAC;QACxC;QACAA,QAAQ,EAAE;QACVa,aAAa,EAAE;QACf,MAAME,SAAS,GAAG;UAAE,GAAG5B,KAAK,CAACc,KAAK,CAAC;UAAEmB,QAAQ,EAAEf;QAAa,CAAC;QAC7DA,YAAY,GAAGgB,SAAS;QACxB,IACEjC,UAAU,CAACkB,IAAI,CAACZ,IAAI,IAAI7B,iBAAiB,CAACkD,SAAS,EAAErB,IAAI,CAAC,CAAC,IAC3DS,UAAU,CAACG,IAAI,CAACZ,IAAI,IAAI7B,iBAAiB,CAACkD,SAAS,EAAErB,IAAI,CAAC,CAAC,EAC3D;UACA;QACF;QACAS,UAAU,CAACmB,IAAI,CAACP,SAAS,CAAC;QAC1Bd,KAAK,EAAE;MACT;MACA,OAAOC,QAAQ;IACjB;EACF,CAAC;AACH","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ import { exchangeSpatialRegions } from "./spatialExchange.js";
4
+ import { insertSpatialItem } from "./spatialInsertion.js";
5
+ import { rotateSpatialRows } from "./spatialRotation.js";
6
+ import { selectSpatialMove } from "./spatialPolicy.js";
7
+ /** Internal: target input is valid, and items excludes the active item. */
8
+ export function resolveSpatialMove(input) {
9
+ const {
10
+ move,
11
+ kind,
12
+ colliders
13
+ } = selectSpatialMove(input);
14
+ if (kind === 'row-rotation') return rotateSpatialRows(move);
15
+ if (kind === 'insert') return insertSpatialItem(move, colliders);
16
+ if (kind === 'exchange') return exchangeSpatialRegions(move);
17
+ if (kind === 'vacancy') return {
18
+ status: 'ok',
19
+ placements: [...move.items, move.active],
20
+ attempts: 0
21
+ };
22
+ return {
23
+ status: 'impossible',
24
+ attempts: 0
25
+ };
26
+ }
27
+ //# sourceMappingURL=spatial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["exchangeSpatialRegions","insertSpatialItem","rotateSpatialRows","selectSpatialMove","resolveSpatialMove","input","move","kind","colliders","status","placements","items","active","attempts"],"sourceRoot":"../../../src","sources":["engine/spatial.ts"],"mappings":";;AAIA,SAASA,sBAAsB,QAAQ,sBAAmB;AAC1D,SAASC,iBAAiB,QAAQ,uBAAoB;AACtD,SAASC,iBAAiB,QAAQ,sBAAmB;AACrD,SAASC,iBAAiB,QAAQ,oBAAiB;AAanD;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAA0B,EACA;EAC1B,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAU,CAAC,GAAGL,iBAAiB,CAACE,KAAK,CAAC;EAC1D,IAAIE,IAAI,KAAK,cAAc,EAAE,OAAOL,iBAAiB,CAACI,IAAI,CAAC;EAC3D,IAAIC,IAAI,KAAK,QAAQ,EAAE,OAAON,iBAAiB,CAACK,IAAI,EAAEE,SAAS,CAAC;EAChE,IAAID,IAAI,KAAK,UAAU,EAAE,OAAOP,sBAAsB,CAACM,IAAI,CAAC;EAC5D,IAAIC,IAAI,KAAK,SAAS,EACpB,OAAO;IACLE,MAAM,EAAE,IAAI;IACZC,UAAU,EAAE,CAAC,GAAGJ,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACM,MAAM,CAAC;IACxCC,QAAQ,EAAE;EACZ,CAAC;EACH,OAAO;IAAEJ,MAAM,EAAE,YAAY;IAAEI,QAAQ,EAAE;EAAE,CAAC;AAC9C","ignoreList":[]}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ import { rectanglesOverlap } from "./rectangles.js";
4
+ /** Resolve an adjacent app drag through the same move as dragging its widget. */
5
+ export function normalizeAppWidgetMove(input) {
6
+ 'worklet';
7
+
8
+ const {
9
+ items,
10
+ active,
11
+ origin
12
+ } = input;
13
+ if (!origin || active.placement !== 'insert' || active.span.rows !== 1 || active.span.cols !== 1) return null;
14
+ const widget = items.find(item => item.placement !== 'insert' && rectanglesOverlap(active, item));
15
+ if (!widget) return null;
16
+ const withinColumns = origin.position.col >= widget.position.col && origin.position.col < widget.position.col + widget.span.cols;
17
+ const withinRows = origin.position.row >= widget.position.row && origin.position.row < widget.position.row + widget.span.rows;
18
+ const above = withinColumns && origin.position.row === widget.position.row - 1;
19
+ const below = withinColumns && origin.position.row === widget.position.row + widget.span.rows;
20
+ const left = withinRows && origin.position.col === widget.position.col - 1;
21
+ const right = withinRows && origin.position.col === widget.position.col + widget.span.cols;
22
+ if (!above && !below && !left && !right) return null;
23
+
24
+ // Restore the picked-up app before resolving the widget's one-cell move.
25
+ // The ordinary widget policy then owns neighbor movement and boundary checks.
26
+ return {
27
+ ...input,
28
+ items: [...items.filter(item => item !== widget), origin],
29
+ origin: widget,
30
+ active: {
31
+ ...widget,
32
+ position: {
33
+ row: widget.position.row + (above ? -1 : below ? 1 : 0),
34
+ col: widget.position.col + (left ? -1 : right ? 1 : 0)
35
+ }
36
+ }
37
+ };
38
+ }
39
+ //# sourceMappingURL=spatialAppRotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","normalizeAppWidgetMove","input","items","active","origin","placement","span","rows","cols","widget","find","item","withinColumns","position","col","withinRows","row","above","below","left","right","filter"],"sourceRoot":"../../../src","sources":["engine/spatialAppRotation.ts"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,iBAAc;AAGhD;AACA,OAAO,SAASC,sBAAsBA,CACpCC,KAA0B,EACE;EAC5B,SAAS;;EACT,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC;EAAO,CAAC,GAAGH,KAAK;EACvC,IACE,CAACG,MAAM,IACPD,MAAM,CAACE,SAAS,KAAK,QAAQ,IAC7BF,MAAM,CAACG,IAAI,CAACC,IAAI,KAAK,CAAC,IACtBJ,MAAM,CAACG,IAAI,CAACE,IAAI,KAAK,CAAC,EAEtB,OAAO,IAAI;EAEb,MAAMC,MAAM,GAAGP,KAAK,CAACQ,IAAI,CACvBC,IAAI,IAAIA,IAAI,CAACN,SAAS,KAAK,QAAQ,IAAIN,iBAAiB,CAACI,MAAM,EAAEQ,IAAI,CACvE,CAAC;EACD,IAAI,CAACF,MAAM,EAAE,OAAO,IAAI;EACxB,MAAMG,aAAa,GACjBR,MAAM,CAACS,QAAQ,CAACC,GAAG,IAAIL,MAAM,CAACI,QAAQ,CAACC,GAAG,IAC1CV,MAAM,CAACS,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACH,IAAI,CAACE,IAAI;EAC9D,MAAMO,UAAU,GACdX,MAAM,CAACS,QAAQ,CAACG,GAAG,IAAIP,MAAM,CAACI,QAAQ,CAACG,GAAG,IAC1CZ,MAAM,CAACS,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACH,IAAI,CAACC,IAAI;EAC9D,MAAMU,KAAK,GACTL,aAAa,IAAIR,MAAM,CAACS,QAAQ,CAACG,GAAG,KAAKP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAG,CAAC;EAClE,MAAME,KAAK,GACTN,aAAa,IACbR,MAAM,CAACS,QAAQ,CAACG,GAAG,KAAKP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACH,IAAI,CAACC,IAAI;EAChE,MAAMY,IAAI,GAAGJ,UAAU,IAAIX,MAAM,CAACS,QAAQ,CAACC,GAAG,KAAKL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAG,CAAC;EAC1E,MAAMM,KAAK,GACTL,UAAU,IACVX,MAAM,CAACS,QAAQ,CAACC,GAAG,KAAKL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACH,IAAI,CAACE,IAAI;EAChE,IAAI,CAACS,KAAK,IAAI,CAACC,KAAK,IAAI,CAACC,IAAI,IAAI,CAACC,KAAK,EAAE,OAAO,IAAI;;EAEpD;EACA;EACA,OAAO;IACL,GAAGnB,KAAK;IACRC,KAAK,EAAE,CAAC,GAAGA,KAAK,CAACmB,MAAM,CAACV,IAAI,IAAIA,IAAI,KAAKF,MAAM,CAAC,EAAEL,MAAM,CAAC;IACzDA,MAAM,EAAEK,MAAM;IACdN,MAAM,EAAE;MACN,GAAGM,MAAM;MACTI,QAAQ,EAAE;QACRG,GAAG,EAAEP,MAAM,CAACI,QAAQ,CAACG,GAAG,IAAIC,KAAK,GAAG,CAAC,CAAC,GAAGC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QACvDJ,GAAG,EAAEL,MAAM,CAACI,QAAQ,CAACC,GAAG,IAAIK,IAAI,GAAG,CAAC,CAAC,GAAGC,KAAK,GAAG,CAAC,GAAG,CAAC;MACvD;IACF;EACF,CAAC;AACH","ignoreList":[]}