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,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Declarative configuration shared by the JS engine and UI worklets. */
|
|
4
|
+
|
|
5
|
+
const DEFAULT_CANDIDATES = Object.freeze(['row-rotation', 'insert', 'exchange']);
|
|
6
|
+
|
|
7
|
+
/** Neutral placement rules; caller data and item size never imply home behavior. */
|
|
8
|
+
export const DEFAULT_GRID_MOVEMENT_POLICY = Object.freeze({
|
|
9
|
+
rowRotation: 'disabled',
|
|
10
|
+
adjacentInsertExchange: 'disabled',
|
|
11
|
+
candidateOrder: DEFAULT_CANDIDATES,
|
|
12
|
+
pointer: Object.freeze({
|
|
13
|
+
cellHysteresis: 0.12,
|
|
14
|
+
exchangeThreshold: 0.8,
|
|
15
|
+
boundaryHysteresis: 4
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
/** Explicit compatibility with the extracted home grid's reversible movements. */
|
|
20
|
+
export const HOME_GRID_MOVEMENT_POLICY = Object.freeze({
|
|
21
|
+
...DEFAULT_GRID_MOVEMENT_POLICY,
|
|
22
|
+
rowRotation: 'full-width',
|
|
23
|
+
adjacentInsertExchange: 'single-cell'
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
/** Copy configuration when starting a session so later caller edits cannot change it. */
|
|
27
|
+
export function resolveGridMovementPolicy(policy) {
|
|
28
|
+
'worklet';
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
rowRotation: policy?.rowRotation ?? DEFAULT_GRID_MOVEMENT_POLICY.rowRotation,
|
|
32
|
+
adjacentInsertExchange: policy?.adjacentInsertExchange ?? DEFAULT_GRID_MOVEMENT_POLICY.adjacentInsertExchange,
|
|
33
|
+
candidateOrder: [...(policy?.candidateOrder ?? DEFAULT_GRID_MOVEMENT_POLICY.candidateOrder)],
|
|
34
|
+
pointer: {
|
|
35
|
+
cellHysteresis: policy?.pointer?.cellHysteresis ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.cellHysteresis,
|
|
36
|
+
exchangeThreshold: policy?.pointer?.exchangeThreshold ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.exchangeThreshold,
|
|
37
|
+
boundaryHysteresis: policy?.pointer?.boundaryHysteresis ?? DEFAULT_GRID_MOVEMENT_POLICY.pointer.boundaryHysteresis
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function record(value) {
|
|
42
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Invalid policies reject the complete move before any candidate is computed. */
|
|
46
|
+
export function validateGridMovementPolicy(policy) {
|
|
47
|
+
if (policy === undefined) return {
|
|
48
|
+
valid: true
|
|
49
|
+
};
|
|
50
|
+
const invalid = message => ({
|
|
51
|
+
valid: false,
|
|
52
|
+
issues: [{
|
|
53
|
+
code: 'invalid-configuration',
|
|
54
|
+
message
|
|
55
|
+
}]
|
|
56
|
+
});
|
|
57
|
+
if (!record(policy)) return invalid('movementPolicy must be an object.');
|
|
58
|
+
if (policy.rowRotation !== undefined && policy.rowRotation !== 'disabled' && policy.rowRotation !== 'full-width') return invalid('movementPolicy.rowRotation must be disabled or full-width.');
|
|
59
|
+
if (policy.adjacentInsertExchange !== undefined && policy.adjacentInsertExchange !== 'disabled' && policy.adjacentInsertExchange !== 'single-cell') return invalid('movementPolicy.adjacentInsertExchange must be disabled or single-cell.');
|
|
60
|
+
if (policy.candidateOrder !== undefined && (!Array.isArray(policy.candidateOrder) || policy.candidateOrder.length === 0 || Array.from(policy.candidateOrder).some(candidate => !DEFAULT_CANDIDATES.includes(candidate)) || new Set(policy.candidateOrder).size !== policy.candidateOrder.length)) return invalid('movementPolicy.candidateOrder must contain distinct supported candidates.');
|
|
61
|
+
if (policy.pointer !== undefined) {
|
|
62
|
+
if (!record(policy.pointer)) return invalid('movementPolicy.pointer must be an object.');
|
|
63
|
+
const limits = {
|
|
64
|
+
cellHysteresis: [0, 0.5],
|
|
65
|
+
exchangeThreshold: [0.5, 1],
|
|
66
|
+
boundaryHysteresis: [0, Infinity]
|
|
67
|
+
};
|
|
68
|
+
for (const [key, [min, max]] of Object.entries(limits)) {
|
|
69
|
+
const value = policy.pointer[key];
|
|
70
|
+
if (value !== undefined && (typeof value !== 'number' || !Number.isFinite(value) || value < min || value > max)) return invalid(`movementPolicy.pointer.${key} must be finite and between ${min} and ${max}.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
valid: true
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=movementPolicy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_CANDIDATES","Object","freeze","DEFAULT_GRID_MOVEMENT_POLICY","rowRotation","adjacentInsertExchange","candidateOrder","pointer","cellHysteresis","exchangeThreshold","boundaryHysteresis","HOME_GRID_MOVEMENT_POLICY","resolveGridMovementPolicy","policy","record","value","Array","isArray","validateGridMovementPolicy","undefined","valid","invalid","message","issues","code","length","from","some","candidate","includes","Set","size","limits","Infinity","key","min","max","entries","Number","isFinite"],"sourceRoot":"../../../src","sources":["engine/movementPolicy.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { isCellSpan, isPositiveInteger, isRecord } from "./validation.js";
|
|
4
|
+
/**
|
|
5
|
+
* Raw ordered boundary. The caller first hit-tests the pointer against actual zones,
|
|
6
|
+
* removes the active item, and then applies the same hysteresis for preview and drop.
|
|
7
|
+
*/
|
|
8
|
+
export function computeOrderedIndex(input) {
|
|
9
|
+
const fail = (code, message) => ({
|
|
10
|
+
status: 'invalid',
|
|
11
|
+
issues: [{
|
|
12
|
+
code,
|
|
13
|
+
message
|
|
14
|
+
}]
|
|
15
|
+
});
|
|
16
|
+
if (!isRecord(input)) return fail('invalid-structure', 'Expected ordered target geometry.');
|
|
17
|
+
if (!isPositiveInteger(input.rows) || !isPositiveInteger(input.columns)) return fail('invalid-dimension', 'Grid dimensions must be positive safe integers.');
|
|
18
|
+
if (input.itemSpan === undefined) return fail('missing-item-span', 'Ordered targeting requires itemSpan.');
|
|
19
|
+
if (!isCellSpan(input.itemSpan)) return fail('invalid-span', 'itemSpan must contain positive safe integers.');
|
|
20
|
+
if (!Number.isSafeInteger(input.itemCount) || input.itemCount < 0) return fail('invalid-structure', 'itemCount must be a non-negative safe integer.');
|
|
21
|
+
if (!isRecord(input.center) || !Number.isFinite(input.center.x) || !Number.isFinite(input.center.y) || !Number.isFinite(input.cellWidth) || input.cellWidth <= 0 || !Number.isFinite(input.cellHeight) || input.cellHeight <= 0 || !Number.isFinite(input.rowGap) || input.rowGap < 0 || !Number.isFinite(input.columnGap) || input.columnGap < 0) return fail('invalid-geometry', 'Center, cell sizes and gaps must be finite valid geometry.');
|
|
22
|
+
const {
|
|
23
|
+
rows,
|
|
24
|
+
columns,
|
|
25
|
+
itemSpan,
|
|
26
|
+
itemCount,
|
|
27
|
+
cellWidth,
|
|
28
|
+
cellHeight,
|
|
29
|
+
rowGap,
|
|
30
|
+
columnGap
|
|
31
|
+
} = input;
|
|
32
|
+
const slotsPerRow = Math.floor(columns / itemSpan.cols);
|
|
33
|
+
const slotRows = Math.floor(rows / itemSpan.rows);
|
|
34
|
+
const width = columns * cellWidth + (columns - 1) * columnGap;
|
|
35
|
+
const height = rows * cellHeight + (rows - 1) * rowGap;
|
|
36
|
+
const slotWidth = itemSpan.cols * cellWidth + (itemSpan.cols - 1) * columnGap;
|
|
37
|
+
const slotHeight = itemSpan.rows * cellHeight + (itemSpan.rows - 1) * rowGap;
|
|
38
|
+
const strideX = slotWidth + columnGap;
|
|
39
|
+
const strideY = slotHeight + rowGap;
|
|
40
|
+
if (![width, height, slotWidth, slotHeight, strideX, strideY].every(n => Number.isFinite(n) && n > 0)) return fail('invalid-geometry', 'Computed content and slot dimensions must be finite and positive.');
|
|
41
|
+
if (!slotsPerRow || !slotRows) return {
|
|
42
|
+
status: 'impossible'
|
|
43
|
+
};
|
|
44
|
+
if (Math.ceil(itemCount / slotsPerRow) > slotRows) return fail('capacity-exceeded', 'itemCount exceeds the ordered capacity.');
|
|
45
|
+
const x = Math.max(0, Math.min(width, input.center.x));
|
|
46
|
+
const y = Math.max(0, Math.min(height, input.center.y));
|
|
47
|
+
|
|
48
|
+
// Unfillable bottom rows are after the whole array, including a partly filled last row.
|
|
49
|
+
if (rows % itemSpan.rows !== 0 && y >= slotRows * strideY - rowGap) return {
|
|
50
|
+
status: 'ok',
|
|
51
|
+
index: itemCount
|
|
52
|
+
};
|
|
53
|
+
const row = Math.max(0, Math.min(slotRows - 1, Math.floor((y - slotHeight / 2) / strideY + 0.5)));
|
|
54
|
+
// Right-hand remainder belongs to this row's end, not the whole array's end.
|
|
55
|
+
if (columns % itemSpan.cols !== 0 && x >= slotsPerRow * strideX - columnGap) return {
|
|
56
|
+
status: 'ok',
|
|
57
|
+
index: Math.min(itemCount, (row + 1) * slotsPerRow)
|
|
58
|
+
};
|
|
59
|
+
const col = Math.max(0, Math.min(slotsPerRow - 1, Math.floor((x - slotWidth / 2) / strideX + 0.5)));
|
|
60
|
+
const slot = row * slotsPerRow + col;
|
|
61
|
+
if (slot >= itemCount) return {
|
|
62
|
+
status: 'ok',
|
|
63
|
+
index: itemCount
|
|
64
|
+
};
|
|
65
|
+
const after = slotsPerRow === 1 ? y >= row * strideY + slotHeight / 2 : x >= col * strideX + slotWidth / 2;
|
|
66
|
+
return {
|
|
67
|
+
status: 'ok',
|
|
68
|
+
index: Math.min(itemCount, slot + Number(after))
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=orderedTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["isCellSpan","isPositiveInteger","isRecord","computeOrderedIndex","input","fail","code","message","status","issues","rows","columns","itemSpan","undefined","Number","isSafeInteger","itemCount","center","isFinite","x","y","cellWidth","cellHeight","rowGap","columnGap","slotsPerRow","Math","floor","cols","slotRows","width","height","slotWidth","slotHeight","strideX","strideY","every","n","ceil","max","min","index","row","col","slot","after"],"sourceRoot":"../../../src","sources":["engine/orderedTarget.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createPlacementSearch } from "./search.js";
|
|
4
|
+
import { validatePackInput } from "./validation.js";
|
|
5
|
+
export function packItems(input) {
|
|
6
|
+
const validation = validatePackInput(input);
|
|
7
|
+
if (!validation.valid) {
|
|
8
|
+
return {
|
|
9
|
+
status: 'invalid',
|
|
10
|
+
issues: validation.issues
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
const result = createPlacementSearch({
|
|
14
|
+
items: input.items,
|
|
15
|
+
rows: input.rows,
|
|
16
|
+
columns: input.columns,
|
|
17
|
+
searchBudget: input.searchBudget
|
|
18
|
+
}).advance(input.searchBudget);
|
|
19
|
+
if (result.status === 'ok') {
|
|
20
|
+
return {
|
|
21
|
+
status: 'ok',
|
|
22
|
+
placements: result.placements
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// A chunk containing the entire global budget always resolves its status.
|
|
26
|
+
return {
|
|
27
|
+
status: result.status === 'impossible' ? 'impossible' : 'unresolved'
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createPlacementSearch","validatePackInput","packItems","input","validation","valid","status","issues","result","items","rows","columns","searchBudget","advance","placements"],"sourceRoot":"../../../src","sources":["engine/pack.ts"],"mappings":";;AAEA,SAASA,qBAAqB,QAAQ,aAAU;AAChD,SAASC,iBAAiB,QAAQ,iBAAc;AAEhD,OAAO,SAASC,SAASA,CAAIC,KAAmB,EAAiB;EAC/D,MAAMC,UAAU,GAAGH,iBAAiB,CAACE,KAAK,CAAC;EAC3C,IAAI,CAACC,UAAU,CAACC,KAAK,EAAE;IACrB,OAAO;MAAEC,MAAM,EAAE,SAAS;MAAEC,MAAM,EAAEH,UAAU,CAACG;IAAO,CAAC;EACzD;EACA,MAAMC,MAAM,GAAGR,qBAAqB,CAAC;IACnCS,KAAK,EAAEN,KAAK,CAACM,KAAK;IAClBC,IAAI,EAAEP,KAAK,CAACO,IAAI;IAChBC,OAAO,EAAER,KAAK,CAACQ,OAAO;IACtBC,YAAY,EAAET,KAAK,CAACS;EACtB,CAAC,CAAC,CAACC,OAAO,CAACV,KAAK,CAACS,YAAY,CAAC;EAC9B,IAAIJ,MAAM,CAACF,MAAM,KAAK,IAAI,EAAE;IAC1B,OAAO;MAAEA,MAAM,EAAE,IAAI;MAAEQ,UAAU,EAAEN,MAAM,CAACM;IAAW,CAAC;EACxD;EACA;EACA,OAAO;IACLR,MAAM,EAAEE,MAAM,CAACF,MAAM,KAAK,YAAY,GAAG,YAAY,GAAG;EAC1D,CAAC;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Internal: rectangles have validated nonnegative anchors and positive spans. */
|
|
4
|
+
export function rectanglesOverlap(a, b) {
|
|
5
|
+
'worklet';
|
|
6
|
+
|
|
7
|
+
// Anchor differences stay exact without adding a span to a large coordinate.
|
|
8
|
+
const rowsOverlap = a.position.row <= b.position.row ? b.position.row - a.position.row < a.span.rows : a.position.row - b.position.row < b.span.rows;
|
|
9
|
+
const colsOverlap = a.position.col <= b.position.col ? b.position.col - a.position.col < a.span.cols : a.position.col - b.position.col < b.span.cols;
|
|
10
|
+
return rowsOverlap && colsOverlap;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=rectangles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["rectanglesOverlap","a","b","rowsOverlap","position","row","span","rows","colsOverlap","col","cols"],"sourceRoot":"../../../src","sources":["engine/rectangles.ts"],"mappings":";;AAIA;AACA,OAAO,SAASA,iBAAiBA,CAACC,CAAgB,EAAEC,CAAgB,EAAW;EAC7E,SAAS;;EACT;EACA,MAAMC,WAAW,GACfF,CAAC,CAACG,QAAQ,CAACC,GAAG,IAAIH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAC5BH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAAGJ,CAAC,CAACG,QAAQ,CAACC,GAAG,GAAGJ,CAAC,CAACK,IAAI,CAACC,IAAI,GAC7CN,CAAC,CAACG,QAAQ,CAACC,GAAG,GAAGH,CAAC,CAACE,QAAQ,CAACC,GAAG,GAAGH,CAAC,CAACI,IAAI,CAACC,IAAI;EACnD,MAAMC,WAAW,GACfP,CAAC,CAACG,QAAQ,CAACK,GAAG,IAAIP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAC5BP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAAGR,CAAC,CAACG,QAAQ,CAACK,GAAG,GAAGR,CAAC,CAACK,IAAI,CAACI,IAAI,GAC7CT,CAAC,CAACG,QAAQ,CAACK,GAAG,GAAGP,CAAC,CAACE,QAAQ,CAACK,GAAG,GAAGP,CAAC,CAACI,IAAI,CAACI,IAAI;EACnD,OAAOP,WAAW,IAAIK,WAAW;AACnC","ignoreList":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function sameZone(a, b) {
|
|
4
|
+
if (a.strategy !== b.strategy || a.rows !== b.rows || a.columns !== b.columns || a.items.length !== b.items.length) return false;
|
|
5
|
+
if (a.strategy === 'ordered' && b.strategy === 'ordered') {
|
|
6
|
+
return a.itemSpan.rows === b.itemSpan.rows && a.itemSpan.cols === b.itemSpan.cols && a.items.every((item, index) => {
|
|
7
|
+
const other = b.items[index];
|
|
8
|
+
return item.id === other.id && (item.placement ?? 'exchange') === (other.placement ?? 'exchange') && item.span.rows === other.span.rows && item.span.cols === other.span.cols;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
if (a.strategy !== 'spatial' || b.strategy !== 'spatial') return false;
|
|
12
|
+
const byId = new Map(b.items.map(item => [item.id, item]));
|
|
13
|
+
return a.items.every(item => {
|
|
14
|
+
const other = byId.get(item.id);
|
|
15
|
+
return other !== undefined && (item.placement ?? 'exchange') === (other.placement ?? 'exchange') && item.span.rows === other.span.rows && item.span.cols === other.span.cols && item.position.row === other.position.row && item.position.col === other.position.col;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Compare validated layouts. Data, responses and spatial array order are not layout. */
|
|
20
|
+
export function hasSameLayout(a, b) {
|
|
21
|
+
if (a === b) return true;
|
|
22
|
+
if (a.zones.length !== b.zones.length) return false;
|
|
23
|
+
const byId = new Map(b.zones.map(zone => [zone.id, zone]));
|
|
24
|
+
return a.zones.every(zone => {
|
|
25
|
+
const other = byId.get(zone.id);
|
|
26
|
+
return other !== undefined && sameZone(zone, other);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=sameLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["sameZone","a","b","strategy","rows","columns","items","length","itemSpan","cols","every","item","index","other","id","placement","span","byId","Map","map","get","undefined","position","row","col","hasSameLayout","zones","zone"],"sourceRoot":"../../../src","sources":["engine/sameLayout.ts"],"mappings":";;AAEA,SAASA,QAAQA,CAAIC,CAAc,EAAEC,CAAc,EAAW;EAC5D,IACED,CAAC,CAACE,QAAQ,KAAKD,CAAC,CAACC,QAAQ,IACzBF,CAAC,CAACG,IAAI,KAAKF,CAAC,CAACE,IAAI,IACjBH,CAAC,CAACI,OAAO,KAAKH,CAAC,CAACG,OAAO,IACvBJ,CAAC,CAACK,KAAK,CAACC,MAAM,KAAKL,CAAC,CAACI,KAAK,CAACC,MAAM,EAEjC,OAAO,KAAK;EACd,IAAIN,CAAC,CAACE,QAAQ,KAAK,SAAS,IAAID,CAAC,CAACC,QAAQ,KAAK,SAAS,EAAE;IACxD,OACEF,CAAC,CAACO,QAAQ,CAACJ,IAAI,KAAKF,CAAC,CAACM,QAAQ,CAACJ,IAAI,IACnCH,CAAC,CAACO,QAAQ,CAACC,IAAI,KAAKP,CAAC,CAACM,QAAQ,CAACC,IAAI,IACnCR,CAAC,CAACK,KAAK,CAACI,KAAK,CAAC,CAACC,IAAI,EAAEC,KAAK,KAAK;MAC7B,MAAMC,KAAK,GAAGX,CAAC,CAACI,KAAK,CAACM,KAAK,CAAC;MAC5B,OACED,IAAI,CAACG,EAAE,KAAKD,KAAK,CAACC,EAAE,IACpB,CAACH,IAAI,CAACI,SAAS,IAAI,UAAU,OAAOF,KAAK,CAACE,SAAS,IAAI,UAAU,CAAC,IAClEJ,IAAI,CAACK,IAAI,CAACZ,IAAI,KAAKS,KAAK,CAACG,IAAI,CAACZ,IAAI,IAClCO,IAAI,CAACK,IAAI,CAACP,IAAI,KAAKI,KAAK,CAACG,IAAI,CAACP,IAAI;IAEtC,CAAC,CAAC;EAEN;EACA,IAAIR,CAAC,CAACE,QAAQ,KAAK,SAAS,IAAID,CAAC,CAACC,QAAQ,KAAK,SAAS,EAAE,OAAO,KAAK;EACtE,MAAMc,IAAI,GAAG,IAAIC,GAAG,CAAChB,CAAC,CAACI,KAAK,CAACa,GAAG,CAACR,IAAI,IAAI,CAACA,IAAI,CAACG,EAAE,EAAEH,IAAI,CAAC,CAAC,CAAC;EAC1D,OAAOV,CAAC,CAACK,KAAK,CAACI,KAAK,CAACC,IAAI,IAAI;IAC3B,MAAME,KAAK,GAAGI,IAAI,CAACG,GAAG,CAACT,IAAI,CAACG,EAAE,CAAC;IAC/B,OACED,KAAK,KAAKQ,SAAS,IACnB,CAACV,IAAI,CAACI,SAAS,IAAI,UAAU,OAAOF,KAAK,CAACE,SAAS,IAAI,UAAU,CAAC,IAClEJ,IAAI,CAACK,IAAI,CAACZ,IAAI,KAAKS,KAAK,CAACG,IAAI,CAACZ,IAAI,IAClCO,IAAI,CAACK,IAAI,CAACP,IAAI,KAAKI,KAAK,CAACG,IAAI,CAACP,IAAI,IAClCE,IAAI,CAACW,QAAQ,CAACC,GAAG,KAAKV,KAAK,CAACS,QAAQ,CAACC,GAAG,IACxCZ,IAAI,CAACW,QAAQ,CAACE,GAAG,KAAKX,KAAK,CAACS,QAAQ,CAACE,GAAG;EAE5C,CAAC,CAAC;AACJ;;AAEA;AACA,OAAO,SAASC,aAAaA,CAAIxB,CAAe,EAAEC,CAAe,EAAW;EAC1E,IAAID,CAAC,KAAKC,CAAC,EAAE,OAAO,IAAI;EACxB,IAAID,CAAC,CAACyB,KAAK,CAACnB,MAAM,KAAKL,CAAC,CAACwB,KAAK,CAACnB,MAAM,EAAE,OAAO,KAAK;EACnD,MAAMU,IAAI,GAAG,IAAIC,GAAG,CAAChB,CAAC,CAACwB,KAAK,CAACP,GAAG,CAACQ,IAAI,IAAI,CAACA,IAAI,CAACb,EAAE,EAAEa,IAAI,CAAC,CAAC,CAAC;EAC1D,OAAO1B,CAAC,CAACyB,KAAK,CAAChB,KAAK,CAACiB,IAAI,IAAI;IAC3B,MAAMd,KAAK,GAAGI,IAAI,CAACG,GAAG,CAACO,IAAI,CAACb,EAAE,CAAC;IAC/B,OAAOD,KAAK,KAAKQ,SAAS,IAAIrB,QAAQ,CAAC2B,IAAI,EAAEd,KAAK,CAAC;EACrD,CAAC,CAAC;AACJ","ignoreList":[]}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { rectanglesOverlap } from "./rectangles.js";
|
|
4
|
+
function* rowMajorCandidates(maxRow, maxCol) {
|
|
5
|
+
for (let row = 0; row <= maxRow; row++) {
|
|
6
|
+
for (let col = 0; col <= maxCol; col++) {
|
|
7
|
+
yield {
|
|
8
|
+
row,
|
|
9
|
+
col
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Distance shells, then row/column order. No grid-sized array or sort. */
|
|
16
|
+
export function* nearestCandidates(maxRow, maxCol, origin) {
|
|
17
|
+
const colReach = Math.max(origin.col, maxCol - origin.col);
|
|
18
|
+
const maxDistance = Math.min(Number.MAX_SAFE_INTEGER, Math.max(origin.row, maxRow - origin.row) + colReach);
|
|
19
|
+
for (let distance = 0; distance <= maxDistance; distance++) {
|
|
20
|
+
const minRowDistance = Math.max(0, distance - colReach);
|
|
21
|
+
const firstRow = distance > origin.row ? 0 : origin.row - distance;
|
|
22
|
+
const lastRow = origin.row + Math.min(distance, maxRow - origin.row);
|
|
23
|
+
for (let row = firstRow; row <= lastRow; row++) {
|
|
24
|
+
// Skip the middle of a wide shell when the grid has very few columns.
|
|
25
|
+
if (Math.abs(row - origin.row) < minRowDistance) {
|
|
26
|
+
if (minRowDistance > maxRow - origin.row) {
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
row = origin.row + minRowDistance;
|
|
30
|
+
}
|
|
31
|
+
if (row > lastRow) {
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
const colDistance = distance - Math.abs(row - origin.row);
|
|
35
|
+
if (colDistance <= origin.col) {
|
|
36
|
+
yield {
|
|
37
|
+
row,
|
|
38
|
+
col: origin.col - colDistance
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (colDistance > 0 && colDistance <= maxCol - origin.col) {
|
|
42
|
+
yield {
|
|
43
|
+
row,
|
|
44
|
+
col: origin.col + colDistance
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function exceedsArea(items, fixedItems, rows, columns) {
|
|
51
|
+
let remaining = rows * columns;
|
|
52
|
+
// Area is only a shortcut. Avoid a rounded product becoming a proof.
|
|
53
|
+
if (!Number.isSafeInteger(remaining)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
for (const group of [fixedItems, items]) {
|
|
57
|
+
for (const item of group) {
|
|
58
|
+
const area = item.span.rows * item.span.cols;
|
|
59
|
+
if (area > remaining) {
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
remaining -= area;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Internal: inputs are validated by the caller; fixed rectangles never move. */
|
|
69
|
+
export function createPlacementSearch({
|
|
70
|
+
items,
|
|
71
|
+
fixedItems = [],
|
|
72
|
+
rows,
|
|
73
|
+
columns,
|
|
74
|
+
searchBudget
|
|
75
|
+
}) {
|
|
76
|
+
let attempts = 0;
|
|
77
|
+
let depth = 0;
|
|
78
|
+
let terminal;
|
|
79
|
+
const placements = [];
|
|
80
|
+
const cursors = [];
|
|
81
|
+
let nextPosition;
|
|
82
|
+
if (items.some(item => item.span.rows > rows || item.span.cols > columns) || exceedsArea(items, fixedItems, rows, columns)) {
|
|
83
|
+
terminal = {
|
|
84
|
+
status: 'impossible',
|
|
85
|
+
attempts
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function createCursor(index) {
|
|
89
|
+
const item = items[index];
|
|
90
|
+
const maxRow = rows - item.span.rows;
|
|
91
|
+
const maxCol = columns - item.span.cols;
|
|
92
|
+
return rowMajorCandidates(maxRow, maxCol);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
advance(maxAttempts) {
|
|
96
|
+
if (!Number.isSafeInteger(maxAttempts) || maxAttempts < 0) {
|
|
97
|
+
throw new RangeError('Search chunk size must be a nonnegative safe integer.');
|
|
98
|
+
}
|
|
99
|
+
let chunkAttempts = 0;
|
|
100
|
+
while (!terminal) {
|
|
101
|
+
if (depth === items.length) {
|
|
102
|
+
terminal = {
|
|
103
|
+
status: 'ok',
|
|
104
|
+
placements,
|
|
105
|
+
attempts
|
|
106
|
+
};
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
cursors[depth] ??= createCursor(depth);
|
|
110
|
+
if (!nextPosition) {
|
|
111
|
+
const candidate = cursors[depth].next();
|
|
112
|
+
if (candidate.done) {
|
|
113
|
+
// Exhaustion is free to inspect: at an exact budget boundary this
|
|
114
|
+
// distinguishes a proof of impossibility from unfinished search.
|
|
115
|
+
cursors.pop();
|
|
116
|
+
if (depth === 0) {
|
|
117
|
+
terminal = {
|
|
118
|
+
status: 'impossible',
|
|
119
|
+
attempts
|
|
120
|
+
};
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
depth--;
|
|
124
|
+
placements.pop();
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
nextPosition = candidate.value;
|
|
128
|
+
}
|
|
129
|
+
if (attempts === searchBudget) {
|
|
130
|
+
terminal = {
|
|
131
|
+
status: 'unresolved',
|
|
132
|
+
attempts
|
|
133
|
+
};
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (chunkAttempts === maxAttempts) {
|
|
137
|
+
return {
|
|
138
|
+
status: 'pending',
|
|
139
|
+
attempts
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
attempts++;
|
|
143
|
+
chunkAttempts++;
|
|
144
|
+
const candidate = {
|
|
145
|
+
...items[depth],
|
|
146
|
+
position: nextPosition
|
|
147
|
+
};
|
|
148
|
+
nextPosition = undefined;
|
|
149
|
+
if (fixedItems.some(item => rectanglesOverlap(candidate, item)) || placements.some(item => rectanglesOverlap(candidate, item))) {
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
placements.push(candidate);
|
|
153
|
+
depth++;
|
|
154
|
+
}
|
|
155
|
+
return terminal;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["rectanglesOverlap","rowMajorCandidates","maxRow","maxCol","row","col","nearestCandidates","origin","colReach","Math","max","maxDistance","min","Number","MAX_SAFE_INTEGER","distance","minRowDistance","firstRow","lastRow","abs","colDistance","exceedsArea","items","fixedItems","rows","columns","remaining","isSafeInteger","group","item","area","span","cols","createPlacementSearch","searchBudget","attempts","depth","terminal","placements","cursors","nextPosition","some","status","createCursor","index","advance","maxAttempts","RangeError","chunkAttempts","length","candidate","next","done","pop","value","position","undefined","push"],"sourceRoot":"../../../src","sources":["engine/search.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { exchangeSpatialRegions } from "./spatialExchange.js";
|
|
4
|
+
import { insertSpatialItem } from "./spatialInsertion.js";
|
|
5
|
+
import { rotateSpatialRows } from "./spatialRotation.js";
|
|
6
|
+
import { selectSpatialMove } from "./spatialPolicy.js";
|
|
7
|
+
/** Internal: target input is valid, and items excludes the active item. */
|
|
8
|
+
export function resolveSpatialMove(input) {
|
|
9
|
+
const {
|
|
10
|
+
move,
|
|
11
|
+
kind,
|
|
12
|
+
colliders
|
|
13
|
+
} = selectSpatialMove(input);
|
|
14
|
+
if (kind === 'row-rotation') return rotateSpatialRows(move);
|
|
15
|
+
if (kind === 'insert') return insertSpatialItem(move, colliders);
|
|
16
|
+
if (kind === 'exchange') return exchangeSpatialRegions(move);
|
|
17
|
+
if (kind === 'vacancy') return {
|
|
18
|
+
status: 'ok',
|
|
19
|
+
placements: [...move.items, move.active],
|
|
20
|
+
attempts: 0
|
|
21
|
+
};
|
|
22
|
+
return {
|
|
23
|
+
status: 'impossible',
|
|
24
|
+
attempts: 0
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=spatial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["exchangeSpatialRegions","insertSpatialItem","rotateSpatialRows","selectSpatialMove","resolveSpatialMove","input","move","kind","colliders","status","placements","items","active","attempts"],"sourceRoot":"../../../src","sources":["engine/spatial.ts"],"mappings":";;AAIA,SAASA,sBAAsB,QAAQ,sBAAmB;AAC1D,SAASC,iBAAiB,QAAQ,uBAAoB;AACtD,SAASC,iBAAiB,QAAQ,sBAAmB;AACrD,SAASC,iBAAiB,QAAQ,oBAAiB;AAanD;AACA,OAAO,SAASC,kBAAkBA,CAChCC,KAA0B,EACA;EAC1B,MAAM;IAAEC,IAAI;IAAEC,IAAI;IAAEC;EAAU,CAAC,GAAGL,iBAAiB,CAACE,KAAK,CAAC;EAC1D,IAAIE,IAAI,KAAK,cAAc,EAAE,OAAOL,iBAAiB,CAACI,IAAI,CAAC;EAC3D,IAAIC,IAAI,KAAK,QAAQ,EAAE,OAAON,iBAAiB,CAACK,IAAI,EAAEE,SAAS,CAAC;EAChE,IAAID,IAAI,KAAK,UAAU,EAAE,OAAOP,sBAAsB,CAACM,IAAI,CAAC;EAC5D,IAAIC,IAAI,KAAK,SAAS,EACpB,OAAO;IACLE,MAAM,EAAE,IAAI;IACZC,UAAU,EAAE,CAAC,GAAGJ,IAAI,CAACK,KAAK,EAAEL,IAAI,CAACM,MAAM,CAAC;IACxCC,QAAQ,EAAE;EACZ,CAAC;EACH,OAAO;IAAEJ,MAAM,EAAE,YAAY;IAAEI,QAAQ,EAAE;EAAE,CAAC;AAC9C","ignoreList":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { rectanglesOverlap } from "./rectangles.js";
|
|
4
|
+
/** Resolve an adjacent app drag through the same move as dragging its widget. */
|
|
5
|
+
export function normalizeAppWidgetMove(input) {
|
|
6
|
+
'worklet';
|
|
7
|
+
|
|
8
|
+
const {
|
|
9
|
+
items,
|
|
10
|
+
active,
|
|
11
|
+
origin
|
|
12
|
+
} = input;
|
|
13
|
+
if (!origin || active.placement !== 'insert' || active.span.rows !== 1 || active.span.cols !== 1) return null;
|
|
14
|
+
const widget = items.find(item => item.placement !== 'insert' && rectanglesOverlap(active, item));
|
|
15
|
+
if (!widget) return null;
|
|
16
|
+
const withinColumns = origin.position.col >= widget.position.col && origin.position.col < widget.position.col + widget.span.cols;
|
|
17
|
+
const withinRows = origin.position.row >= widget.position.row && origin.position.row < widget.position.row + widget.span.rows;
|
|
18
|
+
const above = withinColumns && origin.position.row === widget.position.row - 1;
|
|
19
|
+
const below = withinColumns && origin.position.row === widget.position.row + widget.span.rows;
|
|
20
|
+
const left = withinRows && origin.position.col === widget.position.col - 1;
|
|
21
|
+
const right = withinRows && origin.position.col === widget.position.col + widget.span.cols;
|
|
22
|
+
if (!above && !below && !left && !right) return null;
|
|
23
|
+
|
|
24
|
+
// Restore the picked-up app before resolving the widget's one-cell move.
|
|
25
|
+
// The ordinary widget policy then owns neighbor movement and boundary checks.
|
|
26
|
+
return {
|
|
27
|
+
...input,
|
|
28
|
+
items: [...items.filter(item => item !== widget), origin],
|
|
29
|
+
origin: widget,
|
|
30
|
+
active: {
|
|
31
|
+
...widget,
|
|
32
|
+
position: {
|
|
33
|
+
row: widget.position.row + (above ? -1 : below ? 1 : 0),
|
|
34
|
+
col: widget.position.col + (left ? -1 : right ? 1 : 0)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=spatialAppRotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["rectanglesOverlap","normalizeAppWidgetMove","input","items","active","origin","placement","span","rows","cols","widget","find","item","withinColumns","position","col","withinRows","row","above","below","left","right","filter"],"sourceRoot":"../../../src","sources":["engine/spatialAppRotation.ts"],"mappings":";;AAAA,SAASA,iBAAiB,QAAQ,iBAAc;AAGhD;AACA,OAAO,SAASC,sBAAsBA,CACpCC,KAA0B,EACE;EAC5B,SAAS;;EACT,MAAM;IAAEC,KAAK;IAAEC,MAAM;IAAEC;EAAO,CAAC,GAAGH,KAAK;EACvC,IACE,CAACG,MAAM,IACPD,MAAM,CAACE,SAAS,KAAK,QAAQ,IAC7BF,MAAM,CAACG,IAAI,CAACC,IAAI,KAAK,CAAC,IACtBJ,MAAM,CAACG,IAAI,CAACE,IAAI,KAAK,CAAC,EAEtB,OAAO,IAAI;EAEb,MAAMC,MAAM,GAAGP,KAAK,CAACQ,IAAI,CACvBC,IAAI,IAAIA,IAAI,CAACN,SAAS,KAAK,QAAQ,IAAIN,iBAAiB,CAACI,MAAM,EAAEQ,IAAI,CACvE,CAAC;EACD,IAAI,CAACF,MAAM,EAAE,OAAO,IAAI;EACxB,MAAMG,aAAa,GACjBR,MAAM,CAACS,QAAQ,CAACC,GAAG,IAAIL,MAAM,CAACI,QAAQ,CAACC,GAAG,IAC1CV,MAAM,CAACS,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACH,IAAI,CAACE,IAAI;EAC9D,MAAMO,UAAU,GACdX,MAAM,CAACS,QAAQ,CAACG,GAAG,IAAIP,MAAM,CAACI,QAAQ,CAACG,GAAG,IAC1CZ,MAAM,CAACS,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACH,IAAI,CAACC,IAAI;EAC9D,MAAMU,KAAK,GACTL,aAAa,IAAIR,MAAM,CAACS,QAAQ,CAACG,GAAG,KAAKP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAG,CAAC;EAClE,MAAME,KAAK,GACTN,aAAa,IACbR,MAAM,CAACS,QAAQ,CAACG,GAAG,KAAKP,MAAM,CAACI,QAAQ,CAACG,GAAG,GAAGP,MAAM,CAACH,IAAI,CAACC,IAAI;EAChE,MAAMY,IAAI,GAAGJ,UAAU,IAAIX,MAAM,CAACS,QAAQ,CAACC,GAAG,KAAKL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAG,CAAC;EAC1E,MAAMM,KAAK,GACTL,UAAU,IACVX,MAAM,CAACS,QAAQ,CAACC,GAAG,KAAKL,MAAM,CAACI,QAAQ,CAACC,GAAG,GAAGL,MAAM,CAACH,IAAI,CAACE,IAAI;EAChE,IAAI,CAACS,KAAK,IAAI,CAACC,KAAK,IAAI,CAACC,IAAI,IAAI,CAACC,KAAK,EAAE,OAAO,IAAI;;EAEpD;EACA;EACA,OAAO;IACL,GAAGnB,KAAK;IACRC,KAAK,EAAE,CAAC,GAAGA,KAAK,CAACmB,MAAM,CAACV,IAAI,IAAIA,IAAI,KAAKF,MAAM,CAAC,EAAEL,MAAM,CAAC;IACzDA,MAAM,EAAEK,MAAM;IACdN,MAAM,EAAE;MACN,GAAGM,MAAM;MACTI,QAAQ,EAAE;QACRG,GAAG,EAAEP,MAAM,CAACI,QAAQ,CAACG,GAAG,IAAIC,KAAK,GAAG,CAAC,CAAC,GAAGC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;QACvDJ,GAAG,EAAEL,MAAM,CAACI,QAAQ,CAACC,GAAG,IAAIK,IAAI,GAAG,CAAC,CAAC,GAAGC,KAAK,GAAG,CAAC,GAAG,CAAC;MACvD;IACF;EACF,CAAC;AACH","ignoreList":[]}
|