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,164 @@
1
+ "use strict";
2
+
3
+ import { rectanglesOverlap } from "./rectangles.js";
4
+ import { nearestCandidates } from "./search.js";
5
+ function contains(region, item) {
6
+ return item.position.row >= region.position.row && item.position.col >= region.position.col && item.position.row - region.position.row <= region.span.rows - item.span.rows && item.position.col - region.position.col <= region.span.cols - item.span.cols;
7
+ }
8
+
9
+ /** Include complete target items; expanding one edge may encounter another item. */
10
+ function closeTargetRegion(active, items) {
11
+ let region = {
12
+ position: active.position,
13
+ span: active.span
14
+ };
15
+ let expanded = true;
16
+ while (expanded) {
17
+ expanded = false;
18
+ for (const item of items) {
19
+ if (!rectanglesOverlap(region, item) || contains(region, item)) continue;
20
+ const row = Math.min(region.position.row, item.position.row);
21
+ const col = Math.min(region.position.col, item.position.col);
22
+ // Validated items and the active target fit in the zone, so ends stay safe.
23
+ const endRow = Math.max(region.position.row + region.span.rows, item.position.row + item.span.rows);
24
+ const endCol = Math.max(region.position.col + region.span.cols, item.position.col + item.span.cols);
25
+ region = {
26
+ position: {
27
+ row,
28
+ col
29
+ },
30
+ span: {
31
+ rows: endRow - row,
32
+ cols: endCol - col
33
+ }
34
+ };
35
+ expanded = true;
36
+ }
37
+ }
38
+ return region;
39
+ }
40
+ function translated(item, from, to) {
41
+ return {
42
+ ...item,
43
+ position: {
44
+ row: to.position.row + (item.position.row - from.position.row),
45
+ col: to.position.col + (item.position.col - from.position.col)
46
+ }
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Rotate entering items through an overlapping translation into the vacated edge.
52
+ * A whole item must follow one cycle; an item whose cells would split is rejected.
53
+ */
54
+ function exchangeOverlappingRegions(items, active, origin, target) {
55
+ const attempts = 1;
56
+ // Expanded mixed-item regions have no unambiguous overlapping source region.
57
+ if (target.position.row !== active.position.row || target.position.col !== active.position.col || target.span.rows !== active.span.rows || target.span.cols !== active.span.cols) return {
58
+ status: 'impossible',
59
+ attempts
60
+ };
61
+ const rowStep = origin.position.row - active.position.row;
62
+ const colStep = origin.position.col - active.position.col;
63
+ const placements = [];
64
+ for (const item of items) {
65
+ if (!rectanglesOverlap(target, item)) {
66
+ placements.push(item);
67
+ continue;
68
+ }
69
+ // Compute the first translation wholly outside the target, without a loop
70
+ // proportional to grid dimensions (which may be very large safe integers).
71
+ const rowSteps = rowStep > 0 ? Math.ceil((target.position.row + target.span.rows - item.position.row) / rowStep) : rowStep < 0 ? Math.ceil((item.position.row + item.span.rows - target.position.row) / -rowStep) : Infinity;
72
+ const colSteps = colStep > 0 ? Math.ceil((target.position.col + target.span.cols - item.position.col) / colStep) : colStep < 0 ? Math.ceil((item.position.col + item.span.cols - target.position.col) / -colStep) : Infinity;
73
+ const steps = Math.min(rowSteps, colSteps);
74
+ const moved = {
75
+ ...item,
76
+ position: {
77
+ row: item.position.row + steps * rowStep,
78
+ col: item.position.col + steps * colStep
79
+ }
80
+ };
81
+ if (!Number.isSafeInteger(moved.position.row) || !Number.isSafeInteger(moved.position.col) || !contains(origin, moved) || rectanglesOverlap(target, moved)) return {
82
+ status: 'impossible',
83
+ attempts
84
+ };
85
+ // Containment in origin = target + step also means the entire previous
86
+ // translation was inside target. Thus no part of this item exits early.
87
+ // These cycles are disjoint and origin contains no other original items.
88
+ placements.push(moved);
89
+ }
90
+ placements.push(active);
91
+ return {
92
+ status: 'ok',
93
+ placements,
94
+ attempts
95
+ };
96
+ }
97
+
98
+ /** Exchange equal regions, preserving whole items and their empty cells. */
99
+ export function exchangeSpatialRegions({
100
+ items,
101
+ active,
102
+ origin,
103
+ rows,
104
+ columns,
105
+ searchBudget
106
+ }) {
107
+ if (!origin) return {
108
+ status: 'impossible',
109
+ attempts: 0
110
+ };
111
+ const target = closeTargetRegion(active, items);
112
+ if (rectanglesOverlap(origin, active)) return exchangeOverlappingRegions(items, active, origin, target);
113
+ const firstRow = Math.max(0, origin.position.row - (target.span.rows - origin.span.rows));
114
+ const firstCol = Math.max(0, origin.position.col - (target.span.cols - origin.span.cols));
115
+ const lastRow = Math.min(origin.position.row, rows - target.span.rows);
116
+ const lastCol = Math.min(origin.position.col, columns - target.span.cols);
117
+ // Choosing a source near this anchor puts the active item near its requested
118
+ // target. Clamping each axis adds a constant distance to every valid candidate.
119
+ const preferred = {
120
+ row: origin.position.row + (target.position.row - active.position.row),
121
+ col: origin.position.col + (target.position.col - active.position.col)
122
+ };
123
+ const candidates = nearestCandidates(lastRow - firstRow, lastCol - firstCol, {
124
+ row: Math.max(firstRow, Math.min(lastRow, preferred.row)) - firstRow,
125
+ col: Math.max(firstCol, Math.min(lastCol, preferred.col)) - firstCol
126
+ });
127
+ let attempts = 0;
128
+ for (const position of candidates) {
129
+ if (attempts === searchBudget) return {
130
+ status: 'unresolved',
131
+ attempts
132
+ };
133
+ attempts++;
134
+ const source = {
135
+ position: {
136
+ row: firstRow + position.row,
137
+ col: firstCol + position.col
138
+ },
139
+ span: target.span
140
+ };
141
+ if (rectanglesOverlap(source, target)) continue;
142
+ if (items.some(item => rectanglesOverlap(source, item) && !contains(source, item))) continue;
143
+
144
+ // Each touched item is wholly contained in exactly one disjoint region.
145
+ // Translation therefore cannot collide with fixed items or lose any holes.
146
+ const placements = items.map(item => {
147
+ if (contains(source, item)) return translated(item, source, target);
148
+ if (contains(target, item)) return translated(item, target, source);
149
+ return item;
150
+ });
151
+ const moved = translated(origin, source, target);
152
+ placements.push(moved.position.row === active.position.row && moved.position.col === active.position.col ? active : moved);
153
+ return {
154
+ status: 'ok',
155
+ placements,
156
+ attempts
157
+ };
158
+ }
159
+ return {
160
+ status: 'impossible',
161
+ attempts
162
+ };
163
+ }
164
+ //# sourceMappingURL=spatialExchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","nearestCandidates","contains","region","item","position","row","col","span","rows","cols","closeTargetRegion","active","items","expanded","Math","min","endRow","max","endCol","translated","from","to","exchangeOverlappingRegions","origin","target","attempts","status","rowStep","colStep","placements","push","rowSteps","ceil","Infinity","colSteps","steps","moved","Number","isSafeInteger","exchangeSpatialRegions","columns","searchBudget","firstRow","firstCol","lastRow","lastCol","preferred","candidates","source","some","map"],"sourceRoot":"../../../src","sources":["engine/spatialExchange.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ import { rectanglesOverlap } from "./rectangles.js";
4
+ function comparePositions(left, right) {
5
+ return left.row - right.row || left.col - right.col;
6
+ }
7
+ function isSlotAligned(item, span) {
8
+ return item.span.rows === span.rows && item.span.cols === span.cols && item.position.row % span.rows === 0 && item.position.col % span.cols === 0;
9
+ }
10
+ function withPosition(item, position) {
11
+ return {
12
+ ...item,
13
+ position: {
14
+ ...position
15
+ }
16
+ };
17
+ }
18
+ function applyInsertion(items, active, moved, attempts) {
19
+ return {
20
+ status: 'ok',
21
+ placements: [...items.map(item => moved.get(item.id) ?? item), active],
22
+ attempts
23
+ };
24
+ }
25
+
26
+ /** Shift intervening occupied slots; keep the requested target even when it was empty. */
27
+ function insertWithinZone({
28
+ items,
29
+ active,
30
+ origin
31
+ }, vacantTarget = false) {
32
+ const forward = comparePositions(origin.position, active.position) < 0;
33
+ const start = forward ? origin.position : active.position;
34
+ const end = forward ? active.position : origin.position;
35
+ const displaced = items.filter(item => item.placement === 'insert' && comparePositions(item.position, start) >= 0 && comparePositions(item.position, end) <= 0).sort((left, right) => forward ? comparePositions(left.position, right.position) : comparePositions(right.position, left.position));
36
+ if (!isSlotAligned(active, active.span) || !isSlotAligned(origin, active.span) || displaced.some(item => !isSlotAligned(item, active.span))) {
37
+ // An empty target remains usable even when larger insertion items do not
38
+ // share aligned slots. Only compatible slots participate in insertion.
39
+ if (vacantTarget) return {
40
+ status: 'ok',
41
+ placements: [...items, active],
42
+ attempts: 0
43
+ };
44
+ return {
45
+ status: 'impossible',
46
+ attempts: 1
47
+ };
48
+ }
49
+ let vacant = origin.position;
50
+ const moved = new Map();
51
+ for (const item of displaced) {
52
+ moved.set(item.id, withPosition(item, vacant));
53
+ vacant = item.position;
54
+ }
55
+ return applyInsertion(items, active, moved, 1);
56
+ }
57
+
58
+ /** An incoming item shifts insertion slots forward until a free slot is reached. */
59
+ function insertFromAnotherZone({
60
+ items,
61
+ active,
62
+ rows,
63
+ columns,
64
+ searchBudget
65
+ }) {
66
+ const displaced = [];
67
+ const maxRow = rows - active.span.rows;
68
+ const maxCol = columns - active.span.cols;
69
+ let {
70
+ row,
71
+ col
72
+ } = active.position;
73
+ let attempts = 0;
74
+ while (row <= maxRow) {
75
+ if (attempts === searchBudget) return {
76
+ status: 'unresolved',
77
+ attempts
78
+ };
79
+ attempts++;
80
+ const slot = {
81
+ span: active.span,
82
+ position: {
83
+ row,
84
+ col
85
+ }
86
+ };
87
+ const occupants = items.filter(item => rectanglesOverlap(item, slot));
88
+ if (occupants.length === 0) {
89
+ const moved = new Map();
90
+ for (let index = 0; index < displaced.length; index++) {
91
+ moved.set(displaced[index].id, withPosition(displaced[index], displaced[index + 1]?.position ?? slot.position));
92
+ }
93
+ return applyInsertion(items, active, moved, attempts);
94
+ }
95
+ if (occupants.some(item => item.placement === 'insert' && !isSlotAligned(item, active.span))) return {
96
+ status: 'impossible',
97
+ attempts
98
+ };
99
+ if (occupants.length === 1 && occupants[0].placement === 'insert') {
100
+ displaced.push(occupants[0]);
101
+ }
102
+ // Do not multiply the number of rows and columns or increment past safe ends.
103
+ if (col <= maxCol - active.span.cols) {
104
+ col += active.span.cols;
105
+ } else if (row <= maxRow - active.span.rows) {
106
+ row += active.span.rows;
107
+ col = 0;
108
+ } else {
109
+ break;
110
+ }
111
+ }
112
+ return {
113
+ status: 'impossible',
114
+ attempts
115
+ };
116
+ }
117
+ export function insertSpatialItem(input, colliders) {
118
+ const {
119
+ active,
120
+ origin
121
+ } = input;
122
+ if (origin && colliders.length === 0) return insertWithinZone({
123
+ ...input,
124
+ origin
125
+ }, true);
126
+ if (colliders.length !== 1 || !isSlotAligned(active, active.span) || !isSlotAligned(colliders[0], active.span) || comparePositions(colliders[0].position, active.position) !== 0) return {
127
+ status: 'impossible',
128
+ attempts: 0
129
+ };
130
+ return origin ? insertWithinZone({
131
+ ...input,
132
+ origin
133
+ }) : insertFromAnotherZone(input);
134
+ }
135
+ //# sourceMappingURL=spatialInsertion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","comparePositions","left","right","row","col","isSlotAligned","item","span","rows","cols","position","withPosition","applyInsertion","items","active","moved","attempts","status","placements","map","get","id","insertWithinZone","origin","vacantTarget","forward","start","end","displaced","filter","placement","sort","some","vacant","Map","set","insertFromAnotherZone","columns","searchBudget","maxRow","maxCol","slot","occupants","length","index","push","insertSpatialItem","input","colliders"],"sourceRoot":"../../../src","sources":["engine/spatialInsertion.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { DEFAULT_GRID_MOVEMENT_POLICY } from "./movementPolicy.js";
4
+ import { rectanglesOverlap } from "./rectangles.js";
5
+ import { normalizeAppWidgetMove } from "./spatialAppRotation.js";
6
+
7
+ /** Shared rule selection only: no packing, search, or caller callbacks on the UI thread. */
8
+ export function selectSpatialMove(input) {
9
+ 'worklet';
10
+
11
+ const policy = input.movementPolicy ?? DEFAULT_GRID_MOVEMENT_POLICY;
12
+ const move = policy.adjacentInsertExchange === 'single-cell' ? normalizeAppWidgetMove(input) ?? input : input;
13
+ const {
14
+ active,
15
+ origin,
16
+ items,
17
+ columns
18
+ } = move;
19
+ const colliders = items.filter(item => rectanglesOverlap(active, item));
20
+ let kind = colliders.length === 0 ? 'vacancy' : 'blocked';
21
+ for (const candidate of policy.candidateOrder ?? DEFAULT_GRID_MOVEMENT_POLICY.candidateOrder) {
22
+ if (candidate === 'row-rotation' && policy.rowRotation === 'full-width' && origin && active.placement !== 'insert' && active.span.cols === columns && active.position.col === origin.position.col && active.position.row !== origin.position.row) {
23
+ kind = candidate;
24
+ break;
25
+ }
26
+ if (candidate === 'insert' && active.placement === 'insert' && (origin !== undefined || colliders.length > 0) && colliders.every(item => item.placement === 'insert')) {
27
+ kind = candidate;
28
+ break;
29
+ }
30
+ if (candidate === 'exchange' && colliders.length > 0) {
31
+ kind = candidate;
32
+ break;
33
+ }
34
+ }
35
+ return {
36
+ move,
37
+ kind,
38
+ colliders
39
+ };
40
+ }
41
+ //# sourceMappingURL=spatialPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["DEFAULT_GRID_MOVEMENT_POLICY","rectanglesOverlap","normalizeAppWidgetMove","selectSpatialMove","input","policy","movementPolicy","move","adjacentInsertExchange","active","origin","items","columns","colliders","filter","item","kind","length","candidate","candidateOrder","rowRotation","placement","span","cols","position","col","row","undefined","every"],"sourceRoot":"../../../src","sources":["engine/spatialPolicy.ts"],"mappings":";;AAAA,SAASA,4BAA4B,QAAQ,qBAAkB;AAE/D,SAASC,iBAAiB,QAAQ,iBAAc;AAEhD,SAASC,sBAAsB,QAAQ,yBAAsB;;AAE7D;AACA,OAAO,SAASC,iBAAiBA,CAAIC,KAA0B,EAAE;EAC/D,SAAS;;EACT,MAAMC,MAAM,GAAGD,KAAK,CAACE,cAAc,IAAIN,4BAA4B;EACnE,MAAMO,IAAI,GACRF,MAAM,CAACG,sBAAsB,KAAK,aAAa,GAC1CN,sBAAsB,CAACE,KAAK,CAAC,IAAIA,KAAK,GACvCA,KAAK;EACX,MAAM;IAAEK,MAAM;IAAEC,MAAM;IAAEC,KAAK;IAAEC;EAAQ,CAAC,GAAGL,IAAI;EAC/C,MAAMM,SAAS,GAAGF,KAAK,CAACG,MAAM,CAACC,IAAI,IAAId,iBAAiB,CAACQ,MAAM,EAAEM,IAAI,CAAC,CAAC;EACvE,IAAIC,IAA+C,GACjDH,SAAS,CAACI,MAAM,KAAK,CAAC,GAAG,SAAS,GAAG,SAAS;EAChD,KAAK,MAAMC,SAAS,IAAIb,MAAM,CAACc,cAAc,IAC3CnB,4BAA4B,CAACmB,cAAc,EAAE;IAC7C,IACED,SAAS,KAAK,cAAc,IAC5Bb,MAAM,CAACe,WAAW,KAAK,YAAY,IACnCV,MAAM,IACND,MAAM,CAACY,SAAS,KAAK,QAAQ,IAC7BZ,MAAM,CAACa,IAAI,CAACC,IAAI,KAAKX,OAAO,IAC5BH,MAAM,CAACe,QAAQ,CAACC,GAAG,KAAKf,MAAM,CAACc,QAAQ,CAACC,GAAG,IAC3ChB,MAAM,CAACe,QAAQ,CAACE,GAAG,KAAKhB,MAAM,CAACc,QAAQ,CAACE,GAAG,EAC3C;MACAV,IAAI,GAAGE,SAAS;MAChB;IACF;IACA,IACEA,SAAS,KAAK,QAAQ,IACtBT,MAAM,CAACY,SAAS,KAAK,QAAQ,KAC5BX,MAAM,KAAKiB,SAAS,IAAId,SAAS,CAACI,MAAM,GAAG,CAAC,CAAC,IAC9CJ,SAAS,CAACe,KAAK,CAACb,IAAI,IAAIA,IAAI,CAACM,SAAS,KAAK,QAAQ,CAAC,EACpD;MACAL,IAAI,GAAGE,SAAS;MAChB;IACF;IACA,IAAIA,SAAS,KAAK,UAAU,IAAIL,SAAS,CAACI,MAAM,GAAG,CAAC,EAAE;MACpDD,IAAI,GAAGE,SAAS;MAChB;IACF;EACF;EACA,OAAO;IAAEX,IAAI;IAAES,IAAI;IAAEH;EAAU,CAAC;AAClC","ignoreList":[]}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Move a full-width exchange item through a vertical band, preserving its holes.
5
+ * Null means this movement belongs to another policy; impossible is terminal.
6
+ */
7
+ export function rotateSpatialRows({
8
+ items,
9
+ active,
10
+ origin,
11
+ columns
12
+ }) {
13
+ if (!origin || active.placement === 'insert' || active.span.cols !== columns || active.position.col !== origin.position.col || active.position.row === origin.position.row) return null;
14
+ const firstRow = Math.min(origin.position.row, active.position.row);
15
+ // Both rectangles were validated within the zone, so their ends stay safe.
16
+ const endRow = Math.max(origin.position.row, active.position.row) + active.span.rows;
17
+ const offset = active.position.row > origin.position.row ? -active.span.rows : active.span.rows;
18
+ const placements = [];
19
+ let attempts = 0;
20
+ for (const item of items) {
21
+ const itemEnd = item.position.row + item.span.rows;
22
+ if (itemEnd <= firstRow || item.position.row >= endRow) {
23
+ placements.push(item);
24
+ continue;
25
+ }
26
+ attempts = 1;
27
+ if (item.position.row < firstRow || itemEnd > endRow) return {
28
+ status: 'impossible',
29
+ attempts
30
+ };
31
+ // The full-width source contains no other item. All touched items therefore
32
+ // occupy the remaining band and translate together by the source height.
33
+ placements.push({
34
+ ...item,
35
+ position: {
36
+ row: item.position.row + offset,
37
+ col: item.position.col
38
+ }
39
+ });
40
+ }
41
+ placements.push(active);
42
+ return {
43
+ status: 'ok',
44
+ placements,
45
+ attempts
46
+ };
47
+ }
48
+ //# sourceMappingURL=spatialRotation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rotateSpatialRows","items","active","origin","columns","placement","span","cols","position","col","row","firstRow","Math","min","endRow","max","rows","offset","placements","attempts","item","itemEnd","push","status"],"sourceRoot":"../../../src","sources":["engine/spatialRotation.ts"],"mappings":";;AAKA;AACA;AACA;AACA;AACA,OAAO,SAASA,iBAAiBA,CAAI;EACnCC,KAAK;EACLC,MAAM;EACNC,MAAM;EACNC;AACmB,CAAC,EAAmC;EACvD,IACE,CAACD,MAAM,IACPD,MAAM,CAACG,SAAS,KAAK,QAAQ,IAC7BH,MAAM,CAACI,IAAI,CAACC,IAAI,KAAKH,OAAO,IAC5BF,MAAM,CAACM,QAAQ,CAACC,GAAG,KAAKN,MAAM,CAACK,QAAQ,CAACC,GAAG,IAC3CP,MAAM,CAACM,QAAQ,CAACE,GAAG,KAAKP,MAAM,CAACK,QAAQ,CAACE,GAAG,EAE3C,OAAO,IAAI;EAEb,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAACV,MAAM,CAACK,QAAQ,CAACE,GAAG,EAAER,MAAM,CAACM,QAAQ,CAACE,GAAG,CAAC;EACnE;EACA,MAAMI,MAAM,GACVF,IAAI,CAACG,GAAG,CAACZ,MAAM,CAACK,QAAQ,CAACE,GAAG,EAAER,MAAM,CAACM,QAAQ,CAACE,GAAG,CAAC,GAAGR,MAAM,CAACI,IAAI,CAACU,IAAI;EACvE,MAAMC,MAAM,GACVf,MAAM,CAACM,QAAQ,CAACE,GAAG,GAAGP,MAAM,CAACK,QAAQ,CAACE,GAAG,GACrC,CAACR,MAAM,CAACI,IAAI,CAACU,IAAI,GACjBd,MAAM,CAACI,IAAI,CAACU,IAAI;EACtB,MAAME,UAA+B,GAAG,EAAE;EAC1C,IAAIC,QAAQ,GAAG,CAAC;EAChB,KAAK,MAAMC,IAAI,IAAInB,KAAK,EAAE;IACxB,MAAMoB,OAAO,GAAGD,IAAI,CAACZ,QAAQ,CAACE,GAAG,GAAGU,IAAI,CAACd,IAAI,CAACU,IAAI;IAClD,IAAIK,OAAO,IAAIV,QAAQ,IAAIS,IAAI,CAACZ,QAAQ,CAACE,GAAG,IAAII,MAAM,EAAE;MACtDI,UAAU,CAACI,IAAI,CAACF,IAAI,CAAC;MACrB;IACF;IACAD,QAAQ,GAAG,CAAC;IACZ,IAAIC,IAAI,CAACZ,QAAQ,CAACE,GAAG,GAAGC,QAAQ,IAAIU,OAAO,GAAGP,MAAM,EAClD,OAAO;MAAES,MAAM,EAAE,YAAY;MAAEJ;IAAS,CAAC;IAC3C;IACA;IACAD,UAAU,CAACI,IAAI,CAAC;MACd,GAAGF,IAAI;MACPZ,QAAQ,EAAE;QACRE,GAAG,EAAEU,IAAI,CAACZ,QAAQ,CAACE,GAAG,GAAGO,MAAM;QAC/BR,GAAG,EAAEW,IAAI,CAACZ,QAAQ,CAACC;MACrB;IACF,CAAC,CAAC;EACJ;EACAS,UAAU,CAACI,IAAI,CAACpB,MAAM,CAAC;EACvB,OAAO;IAAEqB,MAAM,EAAE,IAAI;IAAEL,UAAU;IAAEC;EAAS,CAAC;AAC/C","ignoreList":[]}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+
3
+ import { rectanglesOverlap } from "./rectangles.js";
4
+ export function isRecord(value) {
5
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
6
+ }
7
+ export function isPositiveInteger(value) {
8
+ return typeof value === 'number' && Number.isSafeInteger(value) && value > 0;
9
+ }
10
+ export function isCellSpan(value) {
11
+ return isRecord(value) && isPositiveInteger(value.rows) && isPositiveInteger(value.cols);
12
+ }
13
+ export function isCellPosition(value) {
14
+ return isRecord(value) && typeof value.row === 'number' && Number.isSafeInteger(value.row) && typeof value.col === 'number' && Number.isSafeInteger(value.col);
15
+ }
16
+ function result(issues) {
17
+ return issues.length === 0 ? {
18
+ valid: true
19
+ } : {
20
+ valid: false,
21
+ issues
22
+ };
23
+ }
24
+ function addIssue(issues, code, message, context = {}) {
25
+ issues.push({
26
+ code,
27
+ ...context,
28
+ message
29
+ });
30
+ }
31
+ function validateDimensions(rows, columns, issues, context = {}) {
32
+ if (isPositiveInteger(rows) && isPositiveInteger(columns)) {
33
+ return true;
34
+ }
35
+ addIssue(issues, 'invalid-dimension', 'Rows and columns must be positive safe integers.', context);
36
+ return false;
37
+ }
38
+ function validateItem(item, itemIds, issues, zoneContext) {
39
+ if (!isRecord(item)) {
40
+ addIssue(issues, 'invalid-structure', 'Each item must be an object.', zoneContext);
41
+ return false;
42
+ }
43
+ const context = {
44
+ ...zoneContext,
45
+ ...(typeof item.id === 'string' ? {
46
+ itemId: item.id
47
+ } : {})
48
+ };
49
+ if (typeof item.id !== 'string') {
50
+ addIssue(issues, 'invalid-structure', 'Item ID must be a string.', context);
51
+ } else if (itemIds.has(item.id)) {
52
+ addIssue(issues, 'duplicate-id', 'Item ID must be unique.', context);
53
+ } else {
54
+ itemIds.add(item.id);
55
+ }
56
+ if (!isCellSpan(item.span)) {
57
+ addIssue(issues, 'invalid-span', 'Item span must contain positive safe integer rows and cols.', context);
58
+ }
59
+ if (item.placement !== undefined && item.placement !== 'insert' && item.placement !== 'exchange') {
60
+ addIssue(issues, 'invalid-placement', 'Item placement must be insert or exchange when provided.', context);
61
+ }
62
+ // data is deliberately not read: it is opaque to the layout engine.
63
+ return true;
64
+ }
65
+ function collectZoneIssues(zone, zoneIds, itemIds, issues) {
66
+ if (!isRecord(zone)) {
67
+ addIssue(issues, 'invalid-structure', 'Each zone must be an object.');
68
+ return;
69
+ }
70
+ const context = typeof zone.id === 'string' ? {
71
+ zoneId: zone.id
72
+ } : {};
73
+ if (typeof zone.id !== 'string') {
74
+ addIssue(issues, 'invalid-structure', 'Zone ID must be a string.');
75
+ } else if (zoneIds.has(zone.id)) {
76
+ addIssue(issues, 'duplicate-id', 'Zone ID must be unique.', context);
77
+ } else {
78
+ zoneIds.add(zone.id);
79
+ }
80
+ const dimensionsValid = validateDimensions(zone.rows, zone.columns, issues, context);
81
+ if (zone.strategy !== 'spatial' && zone.strategy !== 'ordered') {
82
+ addIssue(issues, 'invalid-structure', 'Zone strategy must be spatial or ordered.', context);
83
+ }
84
+ if (zone.strategy === 'ordered') {
85
+ if (zone.itemSpan === undefined) {
86
+ addIssue(issues, 'missing-item-span', 'Ordered zones require itemSpan.', context);
87
+ } else if (!isCellSpan(zone.itemSpan)) {
88
+ addIssue(issues, 'invalid-span', 'Ordered itemSpan must contain positive safe integer rows and cols.', context);
89
+ }
90
+ }
91
+ if (!Array.isArray(zone.items)) {
92
+ addIssue(issues, 'invalid-structure', 'Zone items must be an array.', context);
93
+ return;
94
+ }
95
+ const rectangles = [];
96
+ for (const item of zone.items) {
97
+ if (!validateItem(item, itemIds, issues, context)) {
98
+ continue;
99
+ }
100
+ const itemContext = {
101
+ ...context,
102
+ ...(typeof item.id === 'string' ? {
103
+ itemId: item.id
104
+ } : {})
105
+ };
106
+ if (zone.strategy === 'ordered') {
107
+ if (isCellSpan(zone.itemSpan) && isCellSpan(item.span) && (item.span.rows !== zone.itemSpan.rows || item.span.cols !== zone.itemSpan.cols)) {
108
+ addIssue(issues, 'span-mismatch', 'Every ordered item span must equal the zone itemSpan.', itemContext);
109
+ }
110
+ } else if (zone.strategy === 'spatial') {
111
+ if (!isCellPosition(item.position)) {
112
+ addIssue(issues, 'invalid-position', 'Spatial item position must contain safe integer row and col.', itemContext);
113
+ continue;
114
+ }
115
+ if (!isCellSpan(item.span) || !dimensionsValid) {
116
+ continue;
117
+ }
118
+ if (item.position.row < 0 || item.position.col < 0 || item.position.row > zone.rows - item.span.rows || item.position.col > zone.columns - item.span.cols) {
119
+ addIssue(issues, 'out-of-bounds', 'Spatial item rectangle must fit inside the zone.', itemContext);
120
+ continue;
121
+ }
122
+ const rectangle = {
123
+ position: item.position,
124
+ span: item.span,
125
+ ...('itemId' in itemContext ? {
126
+ itemId: itemContext.itemId
127
+ } : {})
128
+ };
129
+ for (const previous of rectangles) {
130
+ if (rectanglesOverlap(previous, rectangle)) {
131
+ addIssue(issues, 'overlap', `Spatial item overlaps an earlier item${previous.itemId === undefined ? '.' : ` (${previous.itemId}).`}`, itemContext);
132
+ }
133
+ }
134
+ rectangles.push(rectangle);
135
+ }
136
+ }
137
+ if (zone.strategy === 'ordered' && dimensionsValid && isCellSpan(zone.itemSpan)) {
138
+ const slotsPerRow = Math.floor(zone.columns / zone.itemSpan.cols);
139
+ const slotRows = Math.floor(zone.rows / zone.itemSpan.rows);
140
+ // Avoid multiplying dimensions: their product can overflow despite valid inputs.
141
+ const exceedsCapacity = zone.items.length > 0 && (slotsPerRow === 0 || Math.ceil(zone.items.length / slotsPerRow) > slotRows);
142
+ if (exceedsCapacity) {
143
+ addIssue(issues, 'capacity-exceeded', 'Ordered item count exceeds the available slots.', context);
144
+ }
145
+ }
146
+ }
147
+ export function validateZone(zone) {
148
+ const issues = [];
149
+ collectZoneIssues(zone, new Set(), new Set(), issues);
150
+ return result(issues);
151
+ }
152
+ export function validateValue(value) {
153
+ const issues = [];
154
+ if (!isRecord(value)) {
155
+ return {
156
+ valid: false,
157
+ issues: [{
158
+ code: 'invalid-structure',
159
+ message: 'Grid value must be an object.'
160
+ }]
161
+ };
162
+ }
163
+ if (!Array.isArray(value.zones)) {
164
+ addIssue(issues, 'invalid-structure', 'Grid zones must be an array.');
165
+ } else {
166
+ const zoneIds = new Set();
167
+ const itemIds = new Set();
168
+ for (const zone of value.zones) {
169
+ collectZoneIssues(zone, zoneIds, itemIds, issues);
170
+ }
171
+ }
172
+ if (value.revision !== undefined && (!Number.isSafeInteger(value.revision) || value.revision < 0)) {
173
+ addIssue(issues, 'invalid-structure', 'Revision must be a non-negative safe integer.');
174
+ }
175
+ if (value.proposalResponse !== undefined && (!isRecord(value.proposalResponse) || typeof value.proposalResponse.sessionId !== 'string' || typeof value.proposalResponse.accepted !== 'boolean' || value.proposalResponse.baseRevision !== undefined && (!Number.isSafeInteger(value.proposalResponse.baseRevision) || value.proposalResponse.baseRevision < 0))) {
176
+ addIssue(issues, 'invalid-structure', 'Proposal response must contain a string sessionId and boolean accepted.');
177
+ }
178
+ return result(issues);
179
+ }
180
+ export function validatePackInput(input) {
181
+ const issues = [];
182
+ if (!isRecord(input)) {
183
+ return {
184
+ valid: false,
185
+ issues: [{
186
+ code: 'invalid-structure',
187
+ message: 'Pack input must be an object.'
188
+ }]
189
+ };
190
+ }
191
+ validateDimensions(input.rows, input.columns, issues);
192
+ if (!isPositiveInteger(input.searchBudget)) {
193
+ addIssue(issues, 'invalid-budget', 'Search budget must be a positive safe integer.');
194
+ }
195
+ if (!Array.isArray(input.items)) {
196
+ addIssue(issues, 'invalid-structure', 'Pack items must be an array.');
197
+ } else {
198
+ const itemIds = new Set();
199
+ for (const item of input.items) {
200
+ validateItem(item, itemIds, issues, {});
201
+ }
202
+ }
203
+ return result(issues);
204
+ }
205
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rectanglesOverlap","isRecord","value","Array","isArray","isPositiveInteger","Number","isSafeInteger","isCellSpan","rows","cols","isCellPosition","row","col","result","issues","length","valid","addIssue","code","message","context","push","validateDimensions","columns","validateItem","item","itemIds","zoneContext","id","itemId","has","add","span","placement","undefined","collectZoneIssues","zone","zoneIds","zoneId","dimensionsValid","strategy","itemSpan","items","rectangles","itemContext","position","rectangle","previous","slotsPerRow","Math","floor","slotRows","exceedsCapacity","ceil","validateZone","Set","validateValue","zones","revision","proposalResponse","sessionId","accepted","baseRevision","validatePackInput","input","searchBudget"],"sourceRoot":"../../../src","sources":["engine/validation.ts"],"mappings":"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","ignoreList":[]}