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.
- package/LICENSE +20 -0
- package/README.md +262 -0
- package/lib/module/adapters/coordinates.js +135 -0
- package/lib/module/adapters/coordinates.js.map +1 -0
- package/lib/module/adapters/scroll.js +81 -0
- package/lib/module/adapters/scroll.js.map +1 -0
- package/lib/module/adapters/virtualizedList.js +69 -0
- package/lib/module/adapters/virtualizedList.js.map +1 -0
- package/lib/module/components/DndProvider.js +1144 -0
- package/lib/module/components/DndProvider.js.map +1 -0
- package/lib/module/components/DragHandle.js +65 -0
- package/lib/module/components/DragHandle.js.map +1 -0
- package/lib/module/components/GridController.js +151 -0
- package/lib/module/components/GridController.js.map +1 -0
- package/lib/module/components/GridDragHandle.js +15 -0
- package/lib/module/components/GridDragHandle.js.map +1 -0
- package/lib/module/components/GridZoneView.js +59 -0
- package/lib/module/components/GridZoneView.js.map +1 -0
- package/lib/module/components/SortableGrid.js +305 -0
- package/lib/module/components/SortableGrid.js.map +1 -0
- package/lib/module/components/SortableList.js +714 -0
- package/lib/module/components/SortableList.js.map +1 -0
- package/lib/module/components/dndTypes.js +4 -0
- package/lib/module/components/dndTypes.js.map +1 -0
- package/lib/module/components/gridTypes.js +4 -0
- package/lib/module/components/gridTypes.js.map +1 -0
- package/lib/module/components/handleViewProps.js +13 -0
- package/lib/module/components/handleViewProps.js.map +1 -0
- package/lib/module/contracts.js +4 -0
- package/lib/module/contracts.js.map +1 -0
- package/lib/module/controller/approval.js +98 -0
- package/lib/module/controller/approval.js.map +1 -0
- package/lib/module/controller/coordinatorBase.js +93 -0
- package/lib/module/controller/coordinatorBase.js.map +1 -0
- package/lib/module/controller/dndSession.js +621 -0
- package/lib/module/controller/dndSession.js.map +1 -0
- package/lib/module/controller/dndState.js +103 -0
- package/lib/module/controller/dndState.js.map +1 -0
- package/lib/module/controller/gridAdapter.js +191 -0
- package/lib/module/controller/gridAdapter.js.map +1 -0
- package/lib/module/controller/gridState.js +101 -0
- package/lib/module/controller/gridState.js.map +1 -0
- package/lib/module/controller/locations.js +48 -0
- package/lib/module/controller/locations.js.map +1 -0
- package/lib/module/controller/previewPath.js +73 -0
- package/lib/module/controller/previewPath.js.map +1 -0
- package/lib/module/controller/sessionCore.js +222 -0
- package/lib/module/controller/sessionCore.js.map +1 -0
- package/lib/module/controller/useDndState.js +9 -0
- package/lib/module/controller/useDndState.js.map +1 -0
- package/lib/module/controller/useGridState.js +9 -0
- package/lib/module/controller/useGridState.js.map +1 -0
- package/lib/module/controller/useStoreState.js +15 -0
- package/lib/module/controller/useStoreState.js.map +1 -0
- package/lib/module/defaults.js +7 -0
- package/lib/module/defaults.js.map +1 -0
- package/lib/module/diagnostics.js +16 -0
- package/lib/module/diagnostics.js.map +1 -0
- package/lib/module/engine/gridPlacements.js +54 -0
- package/lib/module/engine/gridPlacements.js.map +1 -0
- package/lib/module/engine/index.js +19 -0
- package/lib/module/engine/index.js.map +1 -0
- package/lib/module/engine/layout.js +36 -0
- package/lib/module/engine/layout.js.map +1 -0
- package/lib/module/engine/layoutMove.js +326 -0
- package/lib/module/engine/layoutMove.js.map +1 -0
- package/lib/module/engine/layoutState.js +344 -0
- package/lib/module/engine/layoutState.js.map +1 -0
- package/lib/module/engine/list.js +172 -0
- package/lib/module/engine/list.js.map +1 -0
- package/lib/module/engine/listIndex.js +125 -0
- package/lib/module/engine/listIndex.js.map +1 -0
- package/lib/module/engine/move.js +216 -0
- package/lib/module/engine/move.js.map +1 -0
- package/lib/module/engine/movementPolicy.js +77 -0
- package/lib/module/engine/movementPolicy.js.map +1 -0
- package/lib/module/engine/orderedTarget.js +71 -0
- package/lib/module/engine/orderedTarget.js.map +1 -0
- package/lib/module/engine/pack.js +30 -0
- package/lib/module/engine/pack.js.map +1 -0
- package/lib/module/engine/rectangles.js +12 -0
- package/lib/module/engine/rectangles.js.map +1 -0
- package/lib/module/engine/sameLayout.js +29 -0
- package/lib/module/engine/sameLayout.js.map +1 -0
- package/lib/module/engine/search.js +159 -0
- package/lib/module/engine/search.js.map +1 -0
- package/lib/module/engine/spatial.js +27 -0
- package/lib/module/engine/spatial.js.map +1 -0
- package/lib/module/engine/spatialAppRotation.js +39 -0
- package/lib/module/engine/spatialAppRotation.js.map +1 -0
- package/lib/module/engine/spatialExchange.js +164 -0
- package/lib/module/engine/spatialExchange.js.map +1 -0
- package/lib/module/engine/spatialInsertion.js +135 -0
- package/lib/module/engine/spatialInsertion.js.map +1 -0
- package/lib/module/engine/spatialPolicy.js +41 -0
- package/lib/module/engine/spatialPolicy.js.map +1 -0
- package/lib/module/engine/spatialRotation.js +48 -0
- package/lib/module/engine/spatialRotation.js.map +1 -0
- package/lib/module/engine/validation.js +205 -0
- package/lib/module/engine/validation.js.map +1 -0
- package/lib/module/gesture/DndGestureGroup.js +268 -0
- package/lib/module/gesture/DndGestureGroup.js.map +1 -0
- package/lib/module/gesture/DndGestureHost.js +32 -0
- package/lib/module/gesture/DndGestureHost.js.map +1 -0
- package/lib/module/gesture/gestureConfig.js +81 -0
- package/lib/module/gesture/gestureConfig.js.map +1 -0
- package/lib/module/gesture/gestureGrouping.js +122 -0
- package/lib/module/gesture/gestureGrouping.js.map +1 -0
- package/lib/module/gesture/gestureHost.js +106 -0
- package/lib/module/gesture/gestureHost.js.map +1 -0
- package/lib/module/index.js +23 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/pointer/dndTarget.js +101 -0
- package/lib/module/pointer/dndTarget.js.map +1 -0
- package/lib/module/pointer/geometry.js +363 -0
- package/lib/module/pointer/geometry.js.map +1 -0
- package/lib/module/pointer/layoutTarget.js +307 -0
- package/lib/module/pointer/layoutTarget.js.map +1 -0
- package/lib/module/pointer/listCellMotion.js +99 -0
- package/lib/module/pointer/listCellMotion.js.map +1 -0
- package/lib/module/pointer/listTarget.js +42 -0
- package/lib/module/pointer/listTarget.js.map +1 -0
- package/lib/module/pointer/motion.js +37 -0
- package/lib/module/pointer/motion.js.map +1 -0
- package/lib/module/runtime/dndPresentation.js +81 -0
- package/lib/module/runtime/dndPresentation.js.map +1 -0
- package/lib/module/runtime/dndRenderStore.js +129 -0
- package/lib/module/runtime/dndRenderStore.js.map +1 -0
- package/lib/module/runtime/dndRuntime.js +135 -0
- package/lib/module/runtime/dndRuntime.js.map +1 -0
- package/lib/module/runtime/dndSettlement.js +77 -0
- package/lib/module/runtime/dndSettlement.js.map +1 -0
- package/lib/module/runtime/gridRuntime.js +37 -0
- package/lib/module/runtime/gridRuntime.js.map +1 -0
- package/lib/module/types.js +4 -0
- package/lib/module/types.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/adapters/coordinates.d.ts +9 -0
- package/lib/typescript/src/adapters/coordinates.d.ts.map +1 -0
- package/lib/typescript/src/adapters/scroll.d.ts +49 -0
- package/lib/typescript/src/adapters/scroll.d.ts.map +1 -0
- package/lib/typescript/src/adapters/virtualizedList.d.ts +22 -0
- package/lib/typescript/src/adapters/virtualizedList.d.ts.map +1 -0
- package/lib/typescript/src/components/DndProvider.d.ts +4 -0
- package/lib/typescript/src/components/DndProvider.d.ts.map +1 -0
- package/lib/typescript/src/components/DragHandle.d.ts +4 -0
- package/lib/typescript/src/components/DragHandle.d.ts.map +1 -0
- package/lib/typescript/src/components/GridController.d.ts +21 -0
- package/lib/typescript/src/components/GridController.d.ts.map +1 -0
- package/lib/typescript/src/components/GridDragHandle.d.ts +8 -0
- package/lib/typescript/src/components/GridDragHandle.d.ts.map +1 -0
- package/lib/typescript/src/components/GridZoneView.d.ts +8 -0
- package/lib/typescript/src/components/GridZoneView.d.ts.map +1 -0
- package/lib/typescript/src/components/SortableGrid.d.ts +4 -0
- package/lib/typescript/src/components/SortableGrid.d.ts.map +1 -0
- package/lib/typescript/src/components/SortableList.d.ts +4 -0
- package/lib/typescript/src/components/SortableList.d.ts.map +1 -0
- package/lib/typescript/src/components/dndTypes.d.ts +94 -0
- package/lib/typescript/src/components/dndTypes.d.ts.map +1 -0
- package/lib/typescript/src/components/gridTypes.d.ts +84 -0
- package/lib/typescript/src/components/gridTypes.d.ts.map +1 -0
- package/lib/typescript/src/components/handleViewProps.d.ts +6 -0
- package/lib/typescript/src/components/handleViewProps.d.ts.map +1 -0
- package/lib/typescript/src/contracts.d.ts +145 -0
- package/lib/typescript/src/contracts.d.ts.map +1 -0
- package/lib/typescript/src/controller/approval.d.ts +66 -0
- package/lib/typescript/src/controller/approval.d.ts.map +1 -0
- package/lib/typescript/src/controller/coordinatorBase.d.ts +37 -0
- package/lib/typescript/src/controller/coordinatorBase.d.ts.map +1 -0
- package/lib/typescript/src/controller/dndSession.d.ts +152 -0
- package/lib/typescript/src/controller/dndSession.d.ts.map +1 -0
- package/lib/typescript/src/controller/dndState.d.ts +27 -0
- package/lib/typescript/src/controller/dndState.d.ts.map +1 -0
- package/lib/typescript/src/controller/gridAdapter.d.ts +44 -0
- package/lib/typescript/src/controller/gridAdapter.d.ts.map +1 -0
- package/lib/typescript/src/controller/gridState.d.ts +18 -0
- package/lib/typescript/src/controller/gridState.d.ts.map +1 -0
- package/lib/typescript/src/controller/locations.d.ts +9 -0
- package/lib/typescript/src/controller/locations.d.ts.map +1 -0
- package/lib/typescript/src/controller/previewPath.d.ts +49 -0
- package/lib/typescript/src/controller/previewPath.d.ts.map +1 -0
- package/lib/typescript/src/controller/sessionCore.d.ts +106 -0
- package/lib/typescript/src/controller/sessionCore.d.ts.map +1 -0
- package/lib/typescript/src/controller/useDndState.d.ts +8 -0
- package/lib/typescript/src/controller/useDndState.d.ts.map +1 -0
- package/lib/typescript/src/controller/useGridState.d.ts +8 -0
- package/lib/typescript/src/controller/useGridState.d.ts.map +1 -0
- package/lib/typescript/src/controller/useStoreState.d.ts +16 -0
- package/lib/typescript/src/controller/useStoreState.d.ts.map +1 -0
- package/lib/typescript/src/defaults.d.ts +5 -0
- package/lib/typescript/src/defaults.d.ts.map +1 -0
- package/lib/typescript/src/diagnostics.d.ts +9 -0
- package/lib/typescript/src/diagnostics.d.ts.map +1 -0
- package/lib/typescript/src/engine/gridPlacements.d.ts +22 -0
- package/lib/typescript/src/engine/gridPlacements.d.ts.map +1 -0
- package/lib/typescript/src/engine/index.d.ts +28 -0
- package/lib/typescript/src/engine/index.d.ts.map +1 -0
- package/lib/typescript/src/engine/layout.d.ts +4 -0
- package/lib/typescript/src/engine/layout.d.ts.map +1 -0
- package/lib/typescript/src/engine/layoutMove.d.ts +46 -0
- package/lib/typescript/src/engine/layoutMove.d.ts.map +1 -0
- package/lib/typescript/src/engine/layoutState.d.ts +22 -0
- package/lib/typescript/src/engine/layoutState.d.ts.map +1 -0
- package/lib/typescript/src/engine/list.d.ts +68 -0
- package/lib/typescript/src/engine/list.d.ts.map +1 -0
- package/lib/typescript/src/engine/listIndex.d.ts +32 -0
- package/lib/typescript/src/engine/listIndex.d.ts.map +1 -0
- package/lib/typescript/src/engine/move.d.ts +10 -0
- package/lib/typescript/src/engine/move.d.ts.map +1 -0
- package/lib/typescript/src/engine/movementPolicy.d.ts +34 -0
- package/lib/typescript/src/engine/movementPolicy.d.ts.map +1 -0
- package/lib/typescript/src/engine/orderedTarget.d.ts +32 -0
- package/lib/typescript/src/engine/orderedTarget.d.ts.map +1 -0
- package/lib/typescript/src/engine/pack.d.ts +3 -0
- package/lib/typescript/src/engine/pack.d.ts.map +1 -0
- package/lib/typescript/src/engine/rectangles.d.ts +9 -0
- package/lib/typescript/src/engine/rectangles.d.ts.map +1 -0
- package/lib/typescript/src/engine/sameLayout.d.ts +4 -0
- package/lib/typescript/src/engine/sameLayout.d.ts.map +1 -0
- package/lib/typescript/src/engine/search.d.ts +28 -0
- package/lib/typescript/src/engine/search.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatial.d.ts +16 -0
- package/lib/typescript/src/engine/spatial.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialAppRotation.d.ts +4 -0
- package/lib/typescript/src/engine/spatialAppRotation.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialExchange.d.ts +5 -0
- package/lib/typescript/src/engine/spatialExchange.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialInsertion.d.ts +5 -0
- package/lib/typescript/src/engine/spatialInsertion.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialPolicy.d.ts +9 -0
- package/lib/typescript/src/engine/spatialPolicy.d.ts.map +1 -0
- package/lib/typescript/src/engine/spatialRotation.d.ts +8 -0
- package/lib/typescript/src/engine/spatialRotation.d.ts.map +1 -0
- package/lib/typescript/src/engine/validation.d.ts +9 -0
- package/lib/typescript/src/engine/validation.d.ts.map +1 -0
- package/lib/typescript/src/gesture/DndGestureGroup.d.ts +33 -0
- package/lib/typescript/src/gesture/DndGestureGroup.d.ts.map +1 -0
- package/lib/typescript/src/gesture/DndGestureHost.d.ts +12 -0
- package/lib/typescript/src/gesture/DndGestureHost.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureConfig.d.ts +15 -0
- package/lib/typescript/src/gesture/gestureConfig.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureGrouping.d.ts +66 -0
- package/lib/typescript/src/gesture/gestureGrouping.d.ts.map +1 -0
- package/lib/typescript/src/gesture/gestureHost.d.ts +23 -0
- package/lib/typescript/src/gesture/gestureHost.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +38 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/pointer/dndTarget.d.ts +14 -0
- package/lib/typescript/src/pointer/dndTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/geometry.d.ts +28 -0
- package/lib/typescript/src/pointer/geometry.d.ts.map +1 -0
- package/lib/typescript/src/pointer/layoutTarget.d.ts +43 -0
- package/lib/typescript/src/pointer/layoutTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/listCellMotion.d.ts +43 -0
- package/lib/typescript/src/pointer/listCellMotion.d.ts.map +1 -0
- package/lib/typescript/src/pointer/listTarget.d.ts +7 -0
- package/lib/typescript/src/pointer/listTarget.d.ts.map +1 -0
- package/lib/typescript/src/pointer/motion.d.ts +20 -0
- package/lib/typescript/src/pointer/motion.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndPresentation.d.ts +37 -0
- package/lib/typescript/src/runtime/dndPresentation.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndRenderStore.d.ts +46 -0
- package/lib/typescript/src/runtime/dndRenderStore.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndRuntime.d.ts +138 -0
- package/lib/typescript/src/runtime/dndRuntime.d.ts.map +1 -0
- package/lib/typescript/src/runtime/dndSettlement.d.ts +18 -0
- package/lib/typescript/src/runtime/dndSettlement.d.ts.map +1 -0
- package/lib/typescript/src/runtime/gridRuntime.d.ts +54 -0
- package/lib/typescript/src/runtime/gridRuntime.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +180 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/package.json +136 -0
- package/src/adapters/coordinates.ts +181 -0
- package/src/adapters/scroll.ts +147 -0
- package/src/adapters/virtualizedList.ts +112 -0
- package/src/components/DndProvider.tsx +1836 -0
- package/src/components/DragHandle.tsx +89 -0
- package/src/components/GridController.tsx +213 -0
- package/src/components/GridDragHandle.tsx +11 -0
- package/src/components/GridZoneView.tsx +57 -0
- package/src/components/SortableGrid.tsx +449 -0
- package/src/components/SortableList.tsx +1028 -0
- package/src/components/dndTypes.ts +102 -0
- package/src/components/gridTypes.ts +90 -0
- package/src/components/handleViewProps.ts +35 -0
- package/src/contracts.ts +149 -0
- package/src/controller/approval.ts +179 -0
- package/src/controller/coordinatorBase.ts +118 -0
- package/src/controller/dndSession.ts +1058 -0
- package/src/controller/dndState.ts +198 -0
- package/src/controller/gridAdapter.ts +268 -0
- package/src/controller/gridState.ts +187 -0
- package/src/controller/locations.ts +67 -0
- package/src/controller/previewPath.ts +90 -0
- package/src/controller/sessionCore.ts +390 -0
- package/src/controller/useDndState.ts +26 -0
- package/src/controller/useGridState.ts +22 -0
- package/src/controller/useStoreState.ts +27 -0
- package/src/defaults.ts +4 -0
- package/src/diagnostics.ts +23 -0
- package/src/engine/gridPlacements.ts +85 -0
- package/src/engine/index.ts +99 -0
- package/src/engine/layout.ts +29 -0
- package/src/engine/layoutMove.ts +401 -0
- package/src/engine/layoutState.ts +490 -0
- package/src/engine/list.ts +307 -0
- package/src/engine/listIndex.ts +174 -0
- package/src/engine/move.ts +274 -0
- package/src/engine/movementPolicy.ts +151 -0
- package/src/engine/orderedTarget.ts +131 -0
- package/src/engine/pack.ts +24 -0
- package/src/engine/rectangles.ts +18 -0
- package/src/engine/sameLayout.ts +50 -0
- package/src/engine/search.ts +174 -0
- package/src/engine/spatial.ts +36 -0
- package/src/engine/spatialAppRotation.ts +53 -0
- package/src/engine/spatialExchange.ts +212 -0
- package/src/engine/spatialInsertion.ts +157 -0
- package/src/engine/spatialPolicy.ts +48 -0
- package/src/engine/spatialRotation.ts +56 -0
- package/src/engine/validation.ts +358 -0
- package/src/gesture/DndGestureGroup.tsx +357 -0
- package/src/gesture/DndGestureHost.tsx +50 -0
- package/src/gesture/gestureConfig.ts +123 -0
- package/src/gesture/gestureGrouping.ts +210 -0
- package/src/gesture/gestureHost.tsx +163 -0
- package/src/index.ts +162 -0
- package/src/pointer/dndTarget.ts +213 -0
- package/src/pointer/geometry.ts +584 -0
- package/src/pointer/layoutTarget.ts +515 -0
- package/src/pointer/listCellMotion.ts +174 -0
- package/src/pointer/listTarget.ts +56 -0
- package/src/pointer/motion.ts +66 -0
- package/src/runtime/dndPresentation.ts +113 -0
- package/src/runtime/dndRenderStore.ts +246 -0
- package/src/runtime/dndRuntime.ts +311 -0
- package/src/runtime/dndSettlement.ts +117 -0
- package/src/runtime/gridRuntime.ts +73 -0
- 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":[]}
|