@weasel-js/core 1.10.0 → 1.10.1
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/CHANGELOG.md +168 -0
- package/README.md +33 -0
- package/dist/affordances/composeAffordanceLayer.js +21 -21
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +48 -32
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js +50 -28
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotateCursor.js +12 -0
- package/dist/affordances/rotateCursor.js.map +1 -0
- package/dist/affordances/rotationHandle.js +40 -43
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/rig/rigNode.js +9 -3
- package/dist/animation/rig/rigNode.js.map +1 -1
- package/dist/animation/rig/rigSeat.js +46 -13
- package/dist/animation/rig/rigSeat.js.map +1 -1
- package/dist/animation/rig/skinBinding.js +22 -14
- package/dist/animation/rig/skinBinding.js.map +1 -1
- package/dist/barrel/canvas.js +29 -28
- package/dist/barrel/interactions.js +33 -32
- package/dist/barrel/paths.js +11 -10
- package/dist/barrel/routing.js +49 -48
- package/dist/barrel/scene.js +10 -10
- package/dist/barrel/viewport.js +24 -21
- package/dist/canvas/Canvas.js +6 -17
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +34 -37
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +3 -3
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +3 -3
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +24 -23
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +40 -49
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +297 -259
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +3 -24
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/insertPreviewCommands.js +97 -0
- package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/props.js.map +1 -1
- package/dist/canvas/SceneCanvas/scenePointQuery.js +50 -0
- package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -0
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +52 -0
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionTunings.js +17 -0
- package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js +37 -29
- package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +11 -11
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +45 -109
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +49 -41
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +64 -96
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/worldPointAt.js +3 -4
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
- package/dist/canvas/SceneCanvas.js +77 -80
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +3 -3
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/SurfaceCanvas.js +40 -0
- package/dist/canvas/SurfaceCanvas.js.map +1 -0
- package/dist/canvas/adapterDerivedPath.js +13 -13
- package/dist/canvas/adapterDerivedPath.js.map +1 -1
- package/dist/canvas/adapterPickSource.js +34 -0
- package/dist/canvas/adapterPickSource.js.map +1 -0
- package/dist/canvas/affordanceAt.js +1 -1
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js.map +1 -1
- package/dist/canvas/buildSceneTree.js +56 -34
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/copiesAbove.js +27 -0
- package/dist/canvas/copiesAbove.js.map +1 -0
- package/dist/canvas/defaultDrawOne.js +24 -23
- package/dist/canvas/defaultDrawOne.js.map +1 -1
- package/dist/canvas/deps/editAnchors.js +45 -50
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/hitTestArea.js +30 -15
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/insert.js +134 -100
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/layout.js +9 -15
- package/dist/canvas/deps/layout.js.map +1 -1
- package/dist/canvas/derivedPath.js +53 -29
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/insertPreviewExtent.js +33 -31
- package/dist/canvas/insertPreviewExtent.js.map +1 -1
- package/dist/canvas/overChildren.js +29 -0
- package/dist/canvas/overChildren.js.map +1 -0
- package/dist/canvas/paintedCursorLayer.js.map +1 -1
- package/dist/canvas/pickReach.js +23 -0
- package/dist/canvas/pickReach.js.map +1 -0
- package/dist/canvas/pickWalk.js +51 -80
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +14 -35
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneSlotWiring.js +11 -10
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +38 -44
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/useCanvasView.js +42 -44
- package/dist/canvas/useCanvasView.js.map +1 -1
- package/dist/canvas/useSceneAdapter.js +22 -0
- package/dist/canvas/useSceneAdapter.js.map +1 -0
- package/dist/canvas/useSurfaceInput.js +13 -16
- package/dist/canvas/useSurfaceInput.js.map +1 -1
- package/dist/canvas/viewRegistry.js +31 -23
- package/dist/canvas/viewRegistry.js.map +1 -1
- package/dist/canvas/wrapNodeOutput.js +7 -2
- package/dist/canvas/wrapNodeOutput.js.map +1 -1
- package/dist/clipboard.d.ts +1 -1
- package/dist/{clone-2a5hVbBd.d.ts → clone-C0eADtS0.d.ts} +13 -13
- package/dist/clone.d.ts +2 -2
- package/dist/core/geometry/poseDescriptor.js +49 -23
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/regionHit.js +2 -2
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/targetFrame.js.map +1 -1
- package/dist/core/layers/children.js +1 -3
- package/dist/core/layers/children.js.map +1 -1
- package/dist/core/ops/create.js +2 -2
- package/dist/core/ops/create.js.map +1 -1
- package/dist/core/ops/delete.js +19 -23
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/ops/reorder/index.js +3 -7
- package/dist/core/ops/reorder/index.js.map +1 -1
- package/dist/core/ops/reorder/setChildOrder.js +2 -4
- package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
- package/dist/core/ops/reparent.js +0 -1
- package/dist/core/ops/reparent.js.map +1 -1
- package/dist/core/ops/slot.js +3 -6
- package/dist/core/ops/slot.js.map +1 -1
- package/dist/core/pages/fitViewToPage.js +15 -0
- package/dist/core/pages/fitViewToPage.js.map +1 -0
- package/dist/core/pages/pages.js +65 -0
- package/dist/core/pages/pages.js.map +1 -0
- package/dist/core/pages/pagesLayer.js +27 -0
- package/dist/core/pages/pagesLayer.js.map +1 -0
- package/dist/core/paint/meshKindLazy.js +2 -2
- package/dist/core/paint/meshKindLazy.js.map +1 -1
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/composeFrame.js.map +1 -1
- package/dist/core/scene/composePose.js +58 -20
- package/dist/core/scene/composePose.js.map +1 -1
- package/dist/core/scene/effectivePose.js +5 -1
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/historyFacade.js +19 -13
- package/dist/core/scene/historyFacade.js.map +1 -1
- package/dist/core/scene/nodeFnFields.js +7 -0
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/outerOps.js +2 -1
- package/dist/core/scene/outerOps.js.map +1 -1
- package/dist/core/scene/reconcileSpecs.js +1 -1
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/sceneRecording.js +2 -1
- package/dist/core/scene/sceneRecording.js.map +1 -1
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/viewport/screenSlop.js.map +1 -1
- package/dist/core/viewport/useDecayLoop.js +28 -30
- package/dist/core/viewport/useDecayLoop.js.map +1 -1
- package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -1
- package/dist/core/viewport/useViewAnimation.js +70 -69
- package/dist/core/viewport/useViewAnimation.js.map +1 -1
- package/dist/core/viewport/view.js +8 -5
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/zoomAt.js +11 -2
- package/dist/core/viewport/zoomAt.js.map +1 -1
- package/dist/{cornerHandles-BEshc4z3.d.ts → cornerHandles-BSKbyuvQ.d.ts} +1 -1
- package/dist/features/paths/editablePath.js +24 -8
- package/dist/features/paths/editablePath.js.map +1 -1
- package/dist/features/paths/index.js +4 -4
- package/dist/features/paths/shapeGenerator.js +89 -0
- package/dist/features/paths/shapeGenerator.js.map +1 -0
- package/dist/features/paths/usePathEdit.js +13 -13
- package/dist/features/poseRun/usePoseRun.js +25 -25
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +82 -64
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/viewports/viewResolver.js +28 -24
- package/dist/features/viewports/viewResolver.js.map +1 -1
- package/dist/icons/SliceIcon.js +24 -0
- package/dist/icons/SliceIcon.js.map +1 -0
- package/dist/index.d.ts +956 -581
- package/dist/index.js +260 -251
- package/dist/interactions/actions/align/align.js +9 -9
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/booleans.js +18 -18
- package/dist/interactions/actions/booleans/booleans.js.map +1 -1
- package/dist/interactions/actions/booleans/operands.js.map +1 -1
- package/dist/interactions/actions/clone/action.js +35 -30
- package/dist/interactions/actions/clone/action.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +56 -59
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorHandles.js +42 -0
- package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -0
- package/dist/interactions/actions/defaults/anchorJoin.js +92 -0
- package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -0
- package/dist/interactions/actions/defaults/bendSegment.js +46 -0
- package/dist/interactions/actions/defaults/bendSegment.js.map +1 -0
- package/dist/interactions/actions/defaults/copySubtree.js +1 -1
- package/dist/interactions/actions/defaults/copySubtree.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +32 -17
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterPathEdit.js +19 -7
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/anchorIcons.js +75 -0
- package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js +35 -8
- package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +16 -31
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +28 -23
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/pinchZoom.js +29 -29
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
- package/dist/interactions/actions/defaults/segmentUnder.js +22 -0
- package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportZoom.js +82 -79
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
- package/dist/interactions/actions/distribute/distribute.js +8 -8
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/action.js +58 -55
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/preview.js +26 -0
- package/dist/interactions/actions/edit-anchors/preview.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/symmetry.js +11 -0
- package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -0
- package/dist/interactions/actions/flip/action.js.map +1 -1
- package/dist/interactions/actions/geometryProjection.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +37 -30
- package/dist/interactions/actions/insert/action.js.map +1 -1
- package/dist/interactions/actions/insert/frame.js +9 -2
- package/dist/interactions/actions/insert/frame.js.map +1 -1
- package/dist/interactions/actions/insert/repositionAction.js +31 -0
- package/dist/interactions/actions/insert/repositionAction.js.map +1 -0
- package/dist/interactions/actions/lasso-select/action.js +32 -32
- package/dist/interactions/actions/move/action.js +29 -25
- package/dist/interactions/actions/move/action.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +12 -6
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +32 -23
- package/dist/interactions/actions/move/capture.js.map +1 -1
- package/dist/interactions/actions/move/frame.js +2 -14
- package/dist/interactions/actions/move/frame.js.map +1 -1
- package/dist/interactions/actions/move/session.js +1 -1
- package/dist/interactions/actions/move/session.js.map +1 -1
- package/dist/interactions/actions/move/translate.js.map +1 -1
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
- package/dist/interactions/actions/outlines/replaceWithPaths.js +13 -13
- package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -1
- package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -1
- package/dist/interactions/actions/pathCommands/cutJoin.js +102 -0
- package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -0
- package/dist/interactions/actions/pathCommands/livePathEdit.js +64 -0
- package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -0
- package/dist/interactions/actions/pathCommands/pathNodes.js +99 -0
- package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -0
- package/dist/interactions/actions/pathCommands/simplifyOffset.js +42 -0
- package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -0
- package/dist/interactions/actions/resize/action.js +31 -20
- package/dist/interactions/actions/resize/action.js.map +1 -1
- package/dist/interactions/actions/resize/commit.js.map +1 -1
- package/dist/interactions/actions/resize/frame.js +29 -15
- package/dist/interactions/actions/resize/frame.js.map +1 -1
- package/dist/interactions/actions/resize/replay.js +47 -0
- package/dist/interactions/actions/resize/replay.js.map +1 -0
- package/dist/interactions/actions/resize/session.js +49 -35
- package/dist/interactions/actions/resize/session.js.map +1 -1
- package/dist/interactions/actions/resolveOverlays.js +2 -1
- package/dist/interactions/actions/resolveOverlays.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +40 -25
- package/dist/interactions/actions/rotate/action.js.map +1 -1
- package/dist/interactions/actions/rotate/frame.js +1 -1
- package/dist/interactions/actions/rotate/frame.js.map +1 -1
- package/dist/interactions/actions/rotate/replay.js +22 -0
- package/dist/interactions/actions/rotate/replay.js.map +1 -0
- package/dist/interactions/actions/rotate/session.js +42 -32
- package/dist/interactions/actions/rotate/session.js.map +1 -1
- package/dist/interactions/actions/transform-again/action.js +63 -0
- package/dist/interactions/actions/transform-again/action.js.map +1 -0
- package/dist/interactions/actions/transform-again/memory.js +35 -0
- package/dist/interactions/actions/transform-again/memory.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +101 -83
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/move.d.ts +4 -4
- package/dist/{originProjection-PPT88jZv.d.ts → originProjection-CoNVpITV.d.ts} +1 -1
- package/dist/resize.d.ts +3 -3
- package/dist/style.css +1 -1
- package/dist/tools/builtin/ellipse/useEllipseTool.js +16 -15
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js +16 -15
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +111 -111
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pickTopMostHit.js +11 -14
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +17 -15
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js +15 -14
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/adapterPointQuery.js +22 -18
- package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -1
- package/dist/tools/builtin/select/selectionContributions.js +1 -1
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +2 -1
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/slice/useSliceTool.js +42 -40
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +18 -16
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +2 -2
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/{types-CIKDwlsP.d.ts → types-DBbbCy0i.d.ts} +22 -15
- package/dist/version.js +1 -1
- package/package.json +22 -22
- package/dist/canvas/surface.module.js +0 -6
- package/dist/canvas/surface.module.js.map +0 -1
- package/dist/canvas/surfaceBox.js +0 -16
- package/dist/canvas/surfaceBox.js.map +0 -1
- package/dist/layout/arrivals.js +0 -33
- package/dist/layout/arrivals.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { applyOpsTo as e } from "../../../core/applyOps.js";
|
|
2
|
+
import { reduceBehaviorEnd as t, runBehaviorCancel as n, runBehaviorSettled as r } from "../gestureLifecycle.js";
|
|
3
|
+
import { gestureViewReader as i } from "../../gestures/shared/screenTolerance.js";
|
|
4
|
+
import { pointerStateOf as a } from "../pointerState.js";
|
|
5
|
+
import { selectionFromHits as o } from "../hitSelection.js";
|
|
6
6
|
import { LASSO_VERTICES as s } from "./behaviors/selectFromLasso.js";
|
|
7
7
|
import { resolveParams as c, setScratch as l } from "@weasel-js/routing";
|
|
8
8
|
//#region src/interactions/actions/lasso-select/action.ts
|
|
@@ -22,15 +22,15 @@ function d(e, t, n, r) {
|
|
|
22
22
|
let i = u(t);
|
|
23
23
|
return i ? e.hitTestArea(i, r) : [];
|
|
24
24
|
}
|
|
25
|
-
function f(
|
|
26
|
-
let
|
|
27
|
-
getSelection: () =>
|
|
28
|
-
setSelection: (
|
|
29
|
-
hitTestArea: (
|
|
30
|
-
hitTestLasso: (
|
|
31
|
-
applyOps: (
|
|
25
|
+
function f(t, n) {
|
|
26
|
+
let r = {
|
|
27
|
+
getSelection: () => t.getSelection(),
|
|
28
|
+
setSelection: (e) => t.setSelection(e),
|
|
29
|
+
hitTestArea: (e) => t.hitTestArea(e, n),
|
|
30
|
+
hitTestLasso: (e, r) => d(t, e, r, n),
|
|
31
|
+
applyOps: (t) => e(r, t)
|
|
32
32
|
};
|
|
33
|
-
return
|
|
33
|
+
return r;
|
|
34
34
|
}
|
|
35
35
|
var p = 2, m = {
|
|
36
36
|
id: "lassoSelect",
|
|
@@ -40,12 +40,12 @@ var p = 2, m = {
|
|
|
40
40
|
invoker: {
|
|
41
41
|
timing: "ongoing",
|
|
42
42
|
start(e, t) {
|
|
43
|
-
let
|
|
44
|
-
if (!
|
|
43
|
+
let n = e.deps.lassoSelect;
|
|
44
|
+
if (!n) return {};
|
|
45
45
|
let o = c(t?.params), u = e.deps.view, d = [{
|
|
46
46
|
x: e.world.x,
|
|
47
47
|
y: e.world.y
|
|
48
|
-
}], m = t?.behaviors ?? [], g = null, _ =
|
|
48
|
+
}], m = t?.behaviors ?? [], g = null, _ = i(e.deps);
|
|
49
49
|
if (m.length > 0) {
|
|
50
50
|
let t = {
|
|
51
51
|
worldX: e.world.x,
|
|
@@ -58,15 +58,15 @@ var p = 2, m = {
|
|
|
58
58
|
current: /* @__PURE__ */ new Map([["gesture", { ...t }]]),
|
|
59
59
|
snap: null,
|
|
60
60
|
modifiers: { ...e.modifiers },
|
|
61
|
-
pointer:
|
|
61
|
+
pointer: a(e.world, e),
|
|
62
62
|
view: _(),
|
|
63
|
-
adapter: f(
|
|
63
|
+
adapter: f(n, u),
|
|
64
64
|
scratch: {}
|
|
65
65
|
}, l(g.scratch, s, d);
|
|
66
66
|
for (let e of m) e.onStart?.(g);
|
|
67
67
|
}
|
|
68
68
|
let v = {
|
|
69
|
-
dep:
|
|
69
|
+
dep: n,
|
|
70
70
|
mode: o?.mode ?? "intersect",
|
|
71
71
|
minVertexSpacing: o?.minVertexSpacing ?? p,
|
|
72
72
|
view: u,
|
|
@@ -83,14 +83,14 @@ var p = 2, m = {
|
|
|
83
83
|
onMove(e) {
|
|
84
84
|
let { x: t, y: n } = e.world;
|
|
85
85
|
v.currentX = t, v.currentY = n;
|
|
86
|
-
let r = v.vertices[v.vertices.length - 1],
|
|
87
|
-
|
|
86
|
+
let r = v.vertices[v.vertices.length - 1], i = t - r.x, o = n - r.y, s = v.minVertexSpacing;
|
|
87
|
+
i * i + o * o >= s * s && v.vertices.push({
|
|
88
88
|
x: t,
|
|
89
89
|
y: n
|
|
90
90
|
});
|
|
91
91
|
let c = v.gesture;
|
|
92
92
|
if (c) {
|
|
93
|
-
c.modifiers = { ...e.modifiers }, c.pointer =
|
|
93
|
+
c.modifiers = { ...e.modifiers }, c.pointer = a(e.world, e), c.view = _(), c.current.set("gesture", {
|
|
94
94
|
worldX: t,
|
|
95
95
|
worldY: n,
|
|
96
96
|
shiftHeld: v.shiftHeld
|
|
@@ -114,11 +114,11 @@ var p = 2, m = {
|
|
|
114
114
|
} : null;
|
|
115
115
|
},
|
|
116
116
|
onEnd(e, t) {
|
|
117
|
-
let
|
|
117
|
+
let n = !1;
|
|
118
118
|
try {
|
|
119
|
-
|
|
119
|
+
n = h(v, t);
|
|
120
120
|
} finally {
|
|
121
|
-
v.gesture &&
|
|
121
|
+
v.gesture && r(v.behaviors, v.gesture, n);
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
};
|
|
@@ -126,16 +126,16 @@ var p = 2, m = {
|
|
|
126
126
|
},
|
|
127
127
|
enabled: () => !0
|
|
128
128
|
};
|
|
129
|
-
function h(
|
|
130
|
-
if (
|
|
131
|
-
let { dep: i, mode:
|
|
129
|
+
function h(e, r) {
|
|
130
|
+
if (e.open = !1, r === "cancel") return e.gesture && n(e.behaviors, e.gesture), !1;
|
|
131
|
+
let { dep: i, mode: a, view: s, vertices: c, shiftHeld: l, gesture: u } = e;
|
|
132
132
|
if (u) {
|
|
133
|
-
let
|
|
134
|
-
if (
|
|
133
|
+
let n = t(e.behaviors, u);
|
|
134
|
+
if (n !== void 0) return n !== null && u.adapter.applyOps(n), n !== null;
|
|
135
135
|
}
|
|
136
136
|
if (c.length < 3) return l || i.setSelection([]), !l;
|
|
137
|
-
let f = d(i, c,
|
|
138
|
-
return i.setSelection(
|
|
137
|
+
let f = d(i, c, a, s);
|
|
138
|
+
return i.setSelection(o(i.getSelection(), f, l)), !0;
|
|
139
139
|
}
|
|
140
140
|
//#endregion
|
|
141
141
|
export { m as lassoSelectAction };
|
|
@@ -3,9 +3,10 @@ import { inPlane as n, selectionLayer as r } from "../planeInput.js";
|
|
|
3
3
|
import { beginMove as i } from "./session.js";
|
|
4
4
|
import { nextFrame as a } from "./frame.js";
|
|
5
5
|
import { commitMove as o } from "./commit/index.js";
|
|
6
|
-
import {
|
|
6
|
+
import { recordTransform as s } from "../transform-again/memory.js";
|
|
7
|
+
import { pastDragThreshold as c } from "@weasel-js/routing";
|
|
7
8
|
//#region src/interactions/actions/move/action.ts
|
|
8
|
-
var
|
|
9
|
+
var l = n({
|
|
9
10
|
id: "move",
|
|
10
11
|
label: "Move",
|
|
11
12
|
activeCursor: "move",
|
|
@@ -27,61 +28,64 @@ var c = n({
|
|
|
27
28
|
invoker: {
|
|
28
29
|
timing: "ongoing",
|
|
29
30
|
start(n, r) {
|
|
30
|
-
let
|
|
31
|
+
let l = {
|
|
31
32
|
delta: {
|
|
32
33
|
dx: 0,
|
|
33
34
|
dy: 0
|
|
34
35
|
},
|
|
35
36
|
previews: /* @__PURE__ */ new Map(),
|
|
36
37
|
opaque: /* @__PURE__ */ new Set()
|
|
37
|
-
},
|
|
38
|
-
if (!
|
|
39
|
-
let { session:
|
|
38
|
+
}, u = i(n, r, () => l);
|
|
39
|
+
if (!u) return {};
|
|
40
|
+
let { session: d, readers: f } = u, p = [...n.deps.selection?.get() ?? []], m = d.scene.overrides.hold(), h = null;
|
|
40
41
|
return {
|
|
41
42
|
kind: "move",
|
|
42
43
|
onMove(e) {
|
|
43
44
|
if (e.drag) {
|
|
44
|
-
if (!
|
|
45
|
+
if (!h) {
|
|
45
46
|
let t = e.drag.screenDelta;
|
|
46
|
-
if (t && !
|
|
47
|
+
if (t && !c({
|
|
47
48
|
clientX: 0,
|
|
48
49
|
clientY: 0
|
|
49
50
|
}, {
|
|
50
51
|
clientX: t.x,
|
|
51
52
|
clientY: t.y
|
|
52
|
-
},
|
|
53
|
-
|
|
53
|
+
}, d.dragThresholdPx)) return;
|
|
54
|
+
d.lifecycle.start(d.ids);
|
|
54
55
|
}
|
|
55
|
-
|
|
56
|
+
h = e.world, l = a(d, f, e), m.set(l.previews);
|
|
56
57
|
}
|
|
57
58
|
},
|
|
58
59
|
onEnd(n, r) {
|
|
59
60
|
let i = !1;
|
|
60
61
|
try {
|
|
61
|
-
r === "commit" &&
|
|
62
|
-
session:
|
|
63
|
-
delta:
|
|
64
|
-
at: n.drag ? n.world :
|
|
65
|
-
})
|
|
62
|
+
r === "commit" && h ? (i = o({
|
|
63
|
+
session: d,
|
|
64
|
+
delta: l.delta,
|
|
65
|
+
at: n.drag ? n.world : h
|
|
66
|
+
}), i && s(d.scene, {
|
|
67
|
+
kind: "translate",
|
|
68
|
+
...l.delta
|
|
69
|
+
}, p)) : t(d.behaviors, d.gestureCtx);
|
|
66
70
|
} finally {
|
|
67
71
|
e({
|
|
68
|
-
hold:
|
|
69
|
-
previews:
|
|
70
|
-
behaviors:
|
|
71
|
-
ctx:
|
|
72
|
-
lifecycle:
|
|
72
|
+
hold: m,
|
|
73
|
+
previews: l.previews,
|
|
74
|
+
behaviors: d.behaviors,
|
|
75
|
+
ctx: d.gestureCtx,
|
|
76
|
+
lifecycle: d.lifecycle
|
|
73
77
|
}, i);
|
|
74
78
|
}
|
|
75
79
|
},
|
|
76
|
-
previewIds: () =>
|
|
77
|
-
previewPose: (e) =>
|
|
78
|
-
previewOpaqueIds: () =>
|
|
80
|
+
previewIds: () => l.previews.keys(),
|
|
81
|
+
previewPose: (e) => l.previews.get(e) ?? null,
|
|
82
|
+
previewOpaqueIds: () => l.opaque.size === 0 ? null : l.opaque
|
|
79
83
|
};
|
|
80
84
|
}
|
|
81
85
|
},
|
|
82
86
|
enabled: () => !0
|
|
83
87
|
}, r);
|
|
84
88
|
//#endregion
|
|
85
|
-
export {
|
|
89
|
+
export { l as moveAction };
|
|
86
90
|
|
|
87
91
|
//# sourceMappingURL=action.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","names":["moveAction","inPlane","frame","begun","beginMove","ctx","opts","hold","session","engaged","moveCtx","s","pastDragThreshold","nextFrame","readers","committed","reason","commitMove","endCtx","runBehaviorCancel","id","selectionLayer"],"sources":["../../../../src/interactions/actions/move/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { pastDragThreshold } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport { closeGesture, runBehaviorCancel } from '../gestureLifecycle';\nimport { inPlane, selectionLayer } from '../planeInput';\nimport { beginMove, type MoveFrame, type ReparentOnDrop } from './session';\nimport { nextFrame } from './frame';\nimport { commitMove } from './commit';\nexport type { ReparentOnDrop };\n\n/**\n * @experimental\n * Drag-translates the selection.\n *\n * Each frame's poses go to the scene's ephemeral override table, not the\n * document: `Scene.setPose` records an undo entry per call, and the overrides\n * are what let a node deriving its geometry from a dragged one follow the\n * drag. Release commits one batch — at most one undo entry, none when the\n * binding's params make it transient — and cancel drops the overrides.\n *\n * Behaviors from the binding's `opts.behaviors` fold into each frame; on\n * release the first non-`undefined` answer wins (`Op[]` commits, `null`\n * aborts). `beginMove` appends the action's own two: a layout drop and\n * reparent-on-drop.\n */\nexport const moveAction: Action & { requires: string[] } = inPlane({\n id: 'move',\n label: 'Move',\n // No hover `cursor`: pointing at a node shouldn't preemptively promise a move.\n activeCursor: 'move',\n // Ambient default targets `selected-body`, not a bare `{ kind: 'drag' }`,\n // which catches every drag in ambient scope and bleeds the move into\n // drawing-tool gestures wherever the higher-priority active match falls\n // through.\n defaultBinding: { kind: 'drag', target: 'selected-body' },\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'poseDescriptor', 'layout', 'applyOps', 'geometryProjection', 'nodeAtPoint', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n let frame: MoveFrame = { delta: { dx: 0, dy: 0 }, previews: new Map(), opaque: new Set() };\n const begun = beginMove(ctx, opts, () => frame);\n if (!begun) return {};\n const { session, readers } = begun;\n const hold = session.scene.overrides.hold();\n // Where the last move put the pointer, once the drag has passed its\n // threshold; null until then.\n let engaged: { x: number; y: number } | null = null;\n return {\n kind: 'move',\n onMove(moveCtx: InvocationCtx): void {\n if (!moveCtx.drag) return;\n if (!engaged) {\n const s = moveCtx.drag.screenDelta;\n if (s && !pastDragThreshold({ clientX: 0, clientY: 0 }, { clientX: s.x, clientY: s.y }, session.dragThresholdPx)) return;\n session.lifecycle.start(session.ids as unknown as string[]);\n }\n engaged = moveCtx.world;\n frame = nextFrame(session, readers, moveCtx);\n hold.set(frame.previews);\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n // A press that never traveled `dragThresholdPx` was never a move:\n // its behaviors started, so they are canceled, not asked to commit.\n if (reason === 'commit' && engaged) {\n committed = commitMove({\n session,\n delta: frame.delta,\n at: endCtx.drag ? endCtx.world : engaged,\n });\n } else runBehaviorCancel(session.behaviors, session.gestureCtx);\n } finally {\n // After the commit, so no frame can paint the pre-drag pose between\n // the override going away and the document catching up.\n closeGesture({ hold, previews: frame.previews, behaviors: session.behaviors, ctx: session.gestureCtx, lifecycle: session.lifecycle }, committed);\n }\n },\n previewIds: () => frame.previews.keys(),\n previewPose: (id: string) => frame.previews.get(id as NodeId) ?? null,\n previewOpaqueIds: () => (frame.opaque.size === 0 ? null : frame.opaque),\n };\n },\n },\n /**\n * Always enabled: the dispatcher treats anything `!== true` as \"fall\n * through to the next-best match\", so a disabled reason here loses every\n * drag-on-selected-body to a lower-specificity binding (a shape tool's\n * insert drag).\n */\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"action.js","names":["moveAction","inPlane","frame","begun","beginMove","ctx","opts","subject","hold","session","engaged","moveCtx","s","pastDragThreshold","nextFrame","readers","committed","reason","commitMove","endCtx","recordTransform","runBehaviorCancel","id","selectionLayer"],"sources":["../../../../src/interactions/actions/move/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { pastDragThreshold } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport { closeGesture, runBehaviorCancel } from '../gestureLifecycle';\nimport { inPlane, selectionLayer } from '../planeInput';\nimport { beginMove, type MoveFrame, type ReparentOnDrop } from './session';\nimport { nextFrame } from './frame';\nimport { commitMove } from './commit';\nimport { recordTransform } from '../transform-again/memory';\nexport type { ReparentOnDrop };\n\n/**\n * @experimental\n * Drag-translates the selection.\n *\n * Each frame's poses go to the scene's ephemeral override table, not the\n * document: `Scene.setPose` records an undo entry per call, and the overrides\n * are what let a node deriving its geometry from a dragged one follow the\n * drag. Release commits one batch — at most one undo entry, none when the\n * binding's params make it transient — and cancel drops the overrides.\n *\n * Behaviors from the binding's `opts.behaviors` fold into each frame; on\n * release the first non-`undefined` answer wins (`Op[]` commits, `null`\n * aborts). `beginMove` appends the action's own two: a layout drop and\n * reparent-on-drop.\n */\nexport const moveAction: Action & { requires: string[] } = inPlane({\n id: 'move',\n label: 'Move',\n // No hover `cursor`: pointing at a node shouldn't preemptively promise a move.\n activeCursor: 'move',\n // Ambient default targets `selected-body`, not a bare `{ kind: 'drag' }`,\n // which catches every drag in ambient scope and bleeds the move into\n // drawing-tool gestures wherever the higher-priority active match falls\n // through.\n defaultBinding: { kind: 'drag', target: 'selected-body' },\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'poseDescriptor', 'layout', 'applyOps', 'geometryProjection', 'nodeAtPoint', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n let frame: MoveFrame = { delta: { dx: 0, dy: 0 }, previews: new Map(), opaque: new Set() };\n const begun = beginMove(ctx, opts, () => frame);\n if (!begun) return {};\n const { session, readers } = begun;\n const subject = [...(ctx.deps.selection?.get() ?? [])] as string[];\n const hold = session.scene.overrides.hold();\n // Where the last move put the pointer, once the drag has passed its\n // threshold; null until then.\n let engaged: { x: number; y: number } | null = null;\n return {\n kind: 'move',\n onMove(moveCtx: InvocationCtx): void {\n if (!moveCtx.drag) return;\n if (!engaged) {\n const s = moveCtx.drag.screenDelta;\n if (s && !pastDragThreshold({ clientX: 0, clientY: 0 }, { clientX: s.x, clientY: s.y }, session.dragThresholdPx)) return;\n session.lifecycle.start(session.ids as unknown as string[]);\n }\n engaged = moveCtx.world;\n frame = nextFrame(session, readers, moveCtx);\n hold.set(frame.previews);\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n // A press that never traveled `dragThresholdPx` was never a move:\n // its behaviors started, so they are canceled, not asked to commit.\n if (reason === 'commit' && engaged) {\n committed = commitMove({\n session,\n delta: frame.delta,\n at: endCtx.drag ? endCtx.world : engaged,\n });\n if (committed) recordTransform(session.scene, { kind: 'translate', ...frame.delta }, subject);\n } else runBehaviorCancel(session.behaviors, session.gestureCtx);\n } finally {\n // After the commit, so no frame can paint the pre-drag pose between\n // the override going away and the document catching up.\n closeGesture({ hold, previews: frame.previews, behaviors: session.behaviors, ctx: session.gestureCtx, lifecycle: session.lifecycle }, committed);\n }\n },\n previewIds: () => frame.previews.keys(),\n previewPose: (id: string) => frame.previews.get(id as NodeId) ?? null,\n previewOpaqueIds: () => (frame.opaque.size === 0 ? null : frame.opaque),\n };\n },\n },\n /**\n * Always enabled: the dispatcher treats anything `!== true` as \"fall\n * through to the next-best match\", so a disabled reason here loses every\n * drag-on-selected-body to a lower-specificity binding (a shape tool's\n * insert drag).\n */\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":";;;;;;;;AA2BA,IAAaA,IAA8CC,EAAQ;CACjE,IAAI;CACJ,OAAO;CAEP,cAAc;CAKd,gBAAgB;EAAE,MAAM;EAAQ,QAAQ;CAAgB;CACxD,UAAU,EAAE,YAAY,uBAAuB;CAC/C,UAAU;EAAC;EAAa;EAAS;EAAkB;EAAU;EAAY;EAAsB;EAAe;CAAM;CACpH,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAmC;GAC3D,IAAIC,IAAmB;IAAE,OAAO;KAAE,IAAI;KAAG,IAAI;IAAE;IAAG,0BAAU,IAAI,IAAI;IAAG,wBAAQ,IAAI,IAAI;GAAE,GACnFC,IAAQC,EAAUC,GAAKC,SAAYJ,CAAK;GAC9C,IAAI,CAACC,GAAO,OAAO,CAAC;GACpB,IAAM,EAAE,YAAS,eAAYA,GACvBI,IAAU,CAAC,GAAIF,EAAI,KAAK,WAAW,IAAI,KAAK,CAAC,CAAE,GAC/CG,IAAOC,EAAQ,MAAM,UAAU,KAAK,GAGtCC,IAA2C;GAC/C,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KACnC,IAAKC,EAAQ,MACb;UAAI,CAACD,GAAS;OACZ,IAAME,IAAID,EAAQ,KAAK;OACvB,IAAIC,KAAK,CAACC,EAAkB;QAAE,SAAS;QAAG,SAAS;OAAE,GAAG;QAAE,SAASD,EAAE;QAAG,SAASA,EAAE;OAAE,GAAGH,EAAQ,eAAe,GAAG;OAClH,EAAQ,UAAU,MAAMA,EAAQ,GAA0B;MAC5D;MAGA,AAFA,IAAUE,EAAQ,OAClB,IAAQG,EAAUL,GAASM,GAASJ,CAAO,GAC3CH,EAAK,IAAIN,EAAM,QAAQ;KAHvB;IAIF;IACA,MAAM,GAAuB,GAAmC;KAC9D,IAAIc,IAAY;KAChB,IAAI;MAGF,AAAIC,MAAW,YAAYP,KACzB,IAAYQ,EAAW;OACrB;OACA,OAAOhB,EAAM;OACb,IAAIiB,EAAO,OAAOA,EAAO,QAAQT;MACnC,CAAC,GACGM,KAAWI,EAAgBX,EAAQ,OAAO;OAAE,MAAM;OAAa,GAAGP,EAAM;MAAM,GAAGK,CAAO,KACvFc,EAAkBZ,EAAQ,WAAWA,EAAQ,UAAU;KAChE,UAAU;MAGR,EAAa;OAAE;OAAM,UAAUP,EAAM;OAAU,WAAWO,EAAQ;OAAW,KAAKA,EAAQ;OAAY,WAAWA,EAAQ;MAAU,GAAGO,CAAS;KACjJ;IACF;IACA,kBAAkBd,EAAM,SAAS,KAAK;IACtC,cAAc,MAAeA,EAAM,SAAS,IAAIoB,CAAY,KAAK;IACjE,wBAAyBpB,EAAM,OAAO,SAAS,IAAI,OAAOA,EAAM;GAClE;EACF;CACF;CAOA,eAAe;AACjB,GAAGqB,CAAc"}
|
|
@@ -22,11 +22,17 @@ function c(n) {
|
|
|
22
22
|
r?.parentId === t.parentId && a.set(n, r.slotPose);
|
|
23
23
|
}
|
|
24
24
|
return a;
|
|
25
|
-
}, d = (e, t) =>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
}, d = (e, t) => {
|
|
26
|
+
let n = e.origin.get(e.draggedIds[0]), r = n === void 0 ? void 0 : e.offset?.(n, t.slotPose);
|
|
27
|
+
return {
|
|
28
|
+
...r ? { transform: {
|
|
29
|
+
kind: "translate",
|
|
30
|
+
...r
|
|
31
|
+
} } : {},
|
|
32
|
+
poses: u(e, t),
|
|
33
|
+
snap: t
|
|
34
|
+
};
|
|
35
|
+
};
|
|
30
36
|
return {
|
|
31
37
|
onMove(e, t) {
|
|
32
38
|
let n = o(e), c = i(e.draggedIds[0], e.pointer.worldX, e.pointer.worldY);
|
|
@@ -52,7 +58,7 @@ function c(n) {
|
|
|
52
58
|
let a = i.committedSnap ?? n.snap;
|
|
53
59
|
if (!a) return;
|
|
54
60
|
let d = [], f = (t) => {
|
|
55
|
-
let r = n.adapter.getParent
|
|
61
|
+
let r = n.adapter.getParent(t);
|
|
56
62
|
r !== a.parentId && d.push(e({
|
|
57
63
|
id: t,
|
|
58
64
|
fromParentId: r,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapToContainer.js","names":["STATE","scratchKey","getState","s","getScratch","ctx","setScratch","clearTimer","snapToContainer","args","slotsFor","primary","rest","slots","snap","id","own","findTarget","snapped","target","isInstant","dwellMs","ops","reparent","oldParent","createReparentOp","reparentLabel","to","createTransformOp","moveLabel","end"],"sources":["../../../../../src/interactions/actions/move/behaviors/snapToContainer.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { createReparentOp } from 'core/ops/reparent';\nimport type { Op } from 'core/ops/types';\nimport type { SnapTarget } from 'core/adapters/types';\nimport type { BehaviorResult, MoveBehavior, GestureContext } from '../../../gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\n\ninterface SnapState<TPose> {\n pendingTargetId: string | null;\n pendingTimer: ReturnType<typeof setTimeout> | null;\n committedSnap: SnapTarget<TPose> | null;\n}\n\n// The slot is generic over TPose; we keep the unknown-pose key at module\n// scope and project it through `as` at the read site (each consumer call\n// of `snapToContainer<TPose>` is the only writer of its own SnapState\n// instance, so the cast is safe at runtime).\nconst STATE = scratchKey<SnapState<unknown>>('snapToContainer');\n\nfunction getState<TPose>(ctx: GestureContext<TPose>): SnapState<TPose> {\n let s = getScratch(ctx.scratch, STATE) as SnapState<TPose> | undefined;\n if (!s) {\n s = { pendingTargetId: null, pendingTimer: null, committedSnap: null };\n setScratch(ctx.scratch, STATE, s as SnapState<unknown>);\n }\n return s;\n}\n\nfunction clearTimer<TPose>(s: SnapState<TPose>) {\n if (s.pendingTimer !== null) {\n clearTimeout(s.pendingTimer);\n s.pendingTimer = null;\n }\n s.pendingTargetId = null;\n}\n\n/**\n * Move behavior that drops the dragged nodes into a container the pointer\n * hovers over for `dwellMs`, reparenting each and giving it the slot\n * `findTarget` answers for its id. A node `findTarget` has no slot for in\n * that container rides along with the first, at its offset from it.\n *\n * The dwell is what keeps a drag that merely passes over a container from\n * being captured by it.\n */\nexport function snapToContainer<TPose>(args: {\n dwellMs: number;\n findTarget: (\n draggedId: string,\n worldX: number,\n worldY: number,\n ) => SnapTarget<TPose> | null;\n isInstant?: (target: SnapTarget<TPose>) => boolean;\n moveLabel?: string;\n reparentLabel?: string;\n}): MoveBehavior<TPose> {\n const { dwellMs, findTarget, isInstant, moveLabel = 'Move', reparentLabel = 'Move and reparent' } = args;\n\n /** Each dragged node's slot in the snapped container: the snapped slot for\n * the first, and for each other node the one `findTarget` answers for it. */\n const slotsFor = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): Map<string, TPose> => {\n const [primary, ...rest] = ctx.draggedIds;\n const slots = new Map<string, TPose>([[primary, snap.slotPose]]);\n for (const id of rest) {\n const own = findTarget(id, ctx.pointer.worldX, ctx.pointer.worldY);\n if (own?.parentId === snap.parentId) slots.set(id, own.slotPose);\n }\n return slots;\n };\n const snapped = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): BehaviorResult<TPose>
|
|
1
|
+
{"version":3,"file":"snapToContainer.js","names":["STATE","scratchKey","getState","s","getScratch","ctx","setScratch","clearTimer","snapToContainer","args","slotsFor","primary","rest","slots","snap","id","own","findTarget","snapped","start","toSlot","target","isInstant","dwellMs","ops","reparent","oldParent","createReparentOp","reparentLabel","to","createTransformOp","moveLabel","end"],"sources":["../../../../../src/interactions/actions/move/behaviors/snapToContainer.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { createReparentOp } from 'core/ops/reparent';\nimport type { Op } from 'core/ops/types';\nimport type { SnapTarget } from 'core/adapters/types';\nimport type { BehaviorResult, MoveBehavior, GestureContext } from '../../../gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\n\ninterface SnapState<TPose> {\n pendingTargetId: string | null;\n pendingTimer: ReturnType<typeof setTimeout> | null;\n committedSnap: SnapTarget<TPose> | null;\n}\n\n// The slot is generic over TPose; we keep the unknown-pose key at module\n// scope and project it through `as` at the read site (each consumer call\n// of `snapToContainer<TPose>` is the only writer of its own SnapState\n// instance, so the cast is safe at runtime).\nconst STATE = scratchKey<SnapState<unknown>>('snapToContainer');\n\nfunction getState<TPose>(ctx: GestureContext<TPose>): SnapState<TPose> {\n let s = getScratch(ctx.scratch, STATE) as SnapState<TPose> | undefined;\n if (!s) {\n s = { pendingTargetId: null, pendingTimer: null, committedSnap: null };\n setScratch(ctx.scratch, STATE, s as SnapState<unknown>);\n }\n return s;\n}\n\nfunction clearTimer<TPose>(s: SnapState<TPose>) {\n if (s.pendingTimer !== null) {\n clearTimeout(s.pendingTimer);\n s.pendingTimer = null;\n }\n s.pendingTargetId = null;\n}\n\n/**\n * Move behavior that drops the dragged nodes into a container the pointer\n * hovers over for `dwellMs`, reparenting each and giving it the slot\n * `findTarget` answers for its id. A node `findTarget` has no slot for in\n * that container rides along with the first, at its offset from it.\n *\n * The dwell is what keeps a drag that merely passes over a container from\n * being captured by it.\n */\nexport function snapToContainer<TPose>(args: {\n dwellMs: number;\n findTarget: (\n draggedId: string,\n worldX: number,\n worldY: number,\n ) => SnapTarget<TPose> | null;\n isInstant?: (target: SnapTarget<TPose>) => boolean;\n moveLabel?: string;\n reparentLabel?: string;\n}): MoveBehavior<TPose> {\n const { dwellMs, findTarget, isInstant, moveLabel = 'Move', reparentLabel = 'Move and reparent' } = args;\n\n /** Each dragged node's slot in the snapped container: the snapped slot for\n * the first, and for each other node the one `findTarget` answers for it. */\n const slotsFor = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): Map<string, TPose> => {\n const [primary, ...rest] = ctx.draggedIds;\n const slots = new Map<string, TPose>([[primary, snap.slotPose]]);\n for (const id of rest) {\n const own = findTarget(id, ctx.pointer.worldX, ctx.pointer.worldY);\n if (own?.parentId === snap.parentId) slots.set(id, own.slotPose);\n }\n return slots;\n };\n const snapped = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): BehaviorResult<TPose> => {\n const start = ctx.origin.get(ctx.draggedIds[0]);\n const toSlot = start !== undefined ? ctx.offset?.(start, snap.slotPose) : undefined;\n return {\n ...(toSlot ? { transform: { kind: 'translate' as const, ...toSlot } } : {}),\n poses: slotsFor(ctx, snap),\n snap,\n };\n };\n\n return {\n onMove(ctx, _proposed) {\n const s = getState<TPose>(ctx);\n const target = findTarget(ctx.draggedIds[0], ctx.pointer.worldX, ctx.pointer.worldY);\n\n if (s.committedSnap) {\n if (target && target.parentId === s.committedSnap.parentId) {\n return snapped(ctx, s.committedSnap);\n }\n s.committedSnap = null;\n }\n\n if (!target) {\n clearTimer(s);\n return;\n }\n\n if (isInstant?.(target)) {\n clearTimer(s);\n s.committedSnap = target;\n return snapped(ctx, target);\n }\n\n if (s.pendingTargetId === target.parentId) {\n return;\n }\n clearTimer(s);\n s.pendingTargetId = target.parentId;\n s.pendingTimer = setTimeout(() => {\n s.committedSnap = target;\n s.pendingTimer = null;\n }, dwellMs);\n return;\n },\n\n onCancel(ctx) { clearTimer(getState<TPose>(ctx)); },\n\n onEnd(ctx, end) {\n const s = getState<TPose>(ctx);\n clearTimer(s);\n const snap = s.committedSnap ?? ctx.snap;\n if (!snap) return;\n const ops: Op[] = [];\n const reparent = (id: string): void => {\n const oldParent = ctx.adapter.getParent(id);\n if (oldParent !== snap.parentId) {\n ops.push(createReparentOp({\n id,\n fromParentId: oldParent,\n toParentId: snap.parentId,\n label: reparentLabel,\n }));\n }\n };\n const slots = slotsFor(ctx, snap);\n for (const [id, to] of slots) {\n ops.push(createTransformOp<TPose>({ id, from: ctx.origin.get(id)!, to, label: moveLabel }));\n reparent(id);\n }\n // A node with no slot of its own lands where the preview drew it.\n const rest = ctx.draggedIds.filter((id) => !slots.has(id));\n ops.push(...end.translateOps(rest));\n for (const id of rest) reparent(id);\n return ops;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -2,17 +2,18 @@ import { toPlane as e } from "../../../core/viewport/parallax.js";
|
|
|
2
2
|
import { composeWorldPose as t, composesFrames as n, frameAtOrAbove as r } from "../../../core/scene/composeFrame.js";
|
|
3
3
|
import { effectivePose as i } from "../../../core/scene/effectivePose.js";
|
|
4
4
|
import { invertPlane as a, planeOf as o } from "../planeInput.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
5
|
+
import { poseDescriptorOf as s } from "../poseDescriptorDep.js";
|
|
6
|
+
import { translateTargets as c } from "../selectionSubtree.js";
|
|
7
|
+
import { scenePoseAdapter as l } from "../../../core/scene/scenePoseAdapter.js";
|
|
8
|
+
import { catchGliding as u } from "./layout/glide.js";
|
|
9
|
+
import { pointerStateOf as d } from "../pointerState.js";
|
|
10
|
+
import { scenePoseFrame as f } from "../poseFrame.js";
|
|
11
|
+
import { sceneGestureFrames as p } from "../gestureFrames.js";
|
|
11
12
|
//#region src/interactions/actions/move/capture.ts
|
|
12
|
-
function
|
|
13
|
-
let a = /* @__PURE__ */ new Map(), o = [], s = /* @__PURE__ */ new Set(), c = [],
|
|
14
|
-
let i =
|
|
15
|
-
i &&
|
|
13
|
+
function m(e, t, n, r) {
|
|
14
|
+
let a = /* @__PURE__ */ new Map(), o = [], s = /* @__PURE__ */ new Set(), c = [], l = /* @__PURE__ */ new Map(), d = (t) => {
|
|
15
|
+
let i = u(e, n, r, t);
|
|
16
|
+
i && l.set(t, i);
|
|
16
17
|
};
|
|
17
18
|
for (let n of t) {
|
|
18
19
|
let t = e.get(n);
|
|
@@ -30,33 +31,33 @@ function p(e, t, n, r) {
|
|
|
30
31
|
return {
|
|
31
32
|
startPoses: a,
|
|
32
33
|
cascadeIds: o,
|
|
33
|
-
caught:
|
|
34
|
+
caught: l
|
|
34
35
|
};
|
|
35
36
|
}
|
|
36
|
-
function
|
|
37
|
-
let o = /* @__PURE__ */ new Set(),
|
|
37
|
+
function h(e, i, a) {
|
|
38
|
+
let o = /* @__PURE__ */ new Set(), s = /* @__PURE__ */ new Map(), u = e.composition;
|
|
38
39
|
if (!n(u)) return {
|
|
39
40
|
carried: o,
|
|
40
|
-
frames:
|
|
41
|
+
frames: s
|
|
41
42
|
};
|
|
42
|
-
let
|
|
43
|
+
let d = new Set(c(e, f(e), i)), p = l(e);
|
|
43
44
|
for (let n of a.keys()) {
|
|
44
|
-
if (!
|
|
45
|
+
if (!d.has(n)) {
|
|
45
46
|
o.add(n);
|
|
46
47
|
continue;
|
|
47
48
|
}
|
|
48
49
|
let i = r(p, e.get(n)?.parent ?? null);
|
|
49
|
-
i !== null &&
|
|
50
|
+
i !== null && s.set(n, {
|
|
50
51
|
world: t(p, n, u.compose),
|
|
51
52
|
frameWorld: t(p, i, u.compose)
|
|
52
53
|
});
|
|
53
54
|
}
|
|
54
55
|
return {
|
|
55
56
|
carried: o,
|
|
56
|
-
frames:
|
|
57
|
+
frames: s
|
|
57
58
|
};
|
|
58
59
|
}
|
|
59
|
-
function
|
|
60
|
+
function g(t, n, r, i, s, c) {
|
|
60
61
|
let l = /* @__PURE__ */ new Map();
|
|
61
62
|
for (let u of n) {
|
|
62
63
|
let n = t.get(u)?.layer;
|
|
@@ -76,24 +77,32 @@ function h(t, n, r, i, s, c) {
|
|
|
76
77
|
}
|
|
77
78
|
return l;
|
|
78
79
|
}
|
|
79
|
-
function
|
|
80
|
+
function _(e, t, n, r, i, a) {
|
|
80
81
|
let o = /* @__PURE__ */ new Map();
|
|
81
82
|
for (let [e, t] of r) o.set(e, t);
|
|
83
|
+
let c = s(e.deps.poseDescriptor);
|
|
82
84
|
return {
|
|
83
85
|
draggedIds: n,
|
|
84
86
|
origin: o,
|
|
85
87
|
current: new Map(o),
|
|
86
88
|
snap: null,
|
|
87
89
|
modifiers: { ...e.modifiers },
|
|
88
|
-
pointer:
|
|
90
|
+
pointer: d(e.world, e),
|
|
89
91
|
view: a.view(),
|
|
90
92
|
plane: a.plane(),
|
|
91
|
-
frames:
|
|
93
|
+
frames: p(t, e.deps.view),
|
|
94
|
+
offset: (e, t) => {
|
|
95
|
+
let n = c.getBounds(e), r = c.getBounds(t);
|
|
96
|
+
return {
|
|
97
|
+
dx: r.x - n.x,
|
|
98
|
+
dy: r.y - n.y
|
|
99
|
+
};
|
|
100
|
+
},
|
|
92
101
|
adapter: i,
|
|
93
102
|
scratch: {}
|
|
94
103
|
};
|
|
95
104
|
}
|
|
96
105
|
//#endregion
|
|
97
|
-
export {
|
|
106
|
+
export { _ as buildGestureContext, h as captureFrames, g as capturePlaneRefs, m as captureStartPoses };
|
|
98
107
|
|
|
99
108
|
//# sourceMappingURL=capture.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","names":["captureStartPoses","startPoses","cascadeIds","seen","queue","caught","hold","held","catchGliding","scene","reflow","projection","id","ids","node","effectivePose","parent","childId","childNode","captureFrames","carried","frames","pc","composesFrames","written","translateTargets","scenePoseFrame","poseAdapter","scenePoseAdapter","frame","frameAtOrAbove","composeWorldPose","capturePlaneRefs","planeRefs","layer","m","planeOf","view","world","b","own","toPlane","invertPlane","buildGestureContext","origin","pose","ctx","pointerStateOf","readers","sceneGestureFrames"],"sources":["../../../../src/interactions/actions/move/capture.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport { effectivePose } from 'core/scene/effectivePose';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composesFrames, composeWorldPose, frameAtOrAbove } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { ReflowTransition } from '../../../layout/types';\nimport type { GestureContext } from '../../gestures/types';\nimport { invertPlane, planeOf } from '../planeInput';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { scenePoseFrame } from '../poseFrame';\nimport { translateTargets } from '../selectionSubtree';\nimport type { MoveGestureAdapter } from './gestureAdapter';\nimport { catchGliding } from './layout/glide';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\n\n/** Start pose of each root and descendant, the descendants in walk order, and\n * the offsets of any caught mid-glide. */\nexport function captureStartPoses(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n reflow: ReflowTransition | null,\n projection: PoseDescriptor<unknown>,\n): { startPoses: Map<NodeId, unknown>; cascadeIds: NodeId[]; caught: Map<NodeId, { dx: number; dy: number }> } {\n // Capture origin poses once at drag start. Walk descendants so\n // container drags can preview every displaced child — required by\n // `usePreviewGhostLayer.buildSubtree` which only recurses into ids\n // present in `previewIds()`.\n const startPoses = new Map<NodeId, unknown>();\n const cascadeIds: NodeId[] = [];\n const seen = new Set<NodeId>();\n const queue: NodeId[] = [];\n // A node still gliding from an earlier reflow is held where it is\n // shown, and the drag starts from there.\n const caught = new Map<NodeId, { dx: number; dy: number }>();\n const hold = (id: NodeId): void => {\n const held = catchGliding(scene, reflow, projection, id);\n if (held) caught.set(id, held);\n };\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n hold(id);\n startPoses.set(id, effectivePose(scene, node));\n seen.add(id);\n queue.push(id);\n }\n while (queue.length > 0) {\n const parent = queue.shift()!;\n for (const childId of scene.childrenOf(parent)) {\n if (seen.has(childId)) continue;\n seen.add(childId);\n const childNode = scene.get(childId);\n if (!childNode) continue;\n hold(childId);\n startPoses.set(childId, effectivePose(scene, childNode));\n cascadeIds.push(childId);\n queue.push(childId);\n }\n }\n return { startPoses, cascadeIds, caught };\n}\n\n/** Which ids ride a moving frame, and the world poses of the rest that sit under one. */\nexport function captureFrames(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n): { carried: Set<NodeId>; frames: Map<NodeId, { world: unknown; frameWorld: unknown }> } {\n const carried = new Set<NodeId>();\n const frames = new Map<NodeId, { world: unknown; frameWorld: unknown }>();\n const pc = scene.composition;\n if (!composesFrames(pc)) return { carried, frames };\n const written = new Set(translateTargets(scene, scenePoseFrame(scene), ids));\n const poseAdapter = scenePoseAdapter(scene);\n for (const id of startPoses.keys()) {\n if (!written.has(id)) {\n carried.add(id);\n continue;\n }\n const frame = frameAtOrAbove(poseAdapter, scene.get(id)?.parent ?? null);\n if (frame === null) continue;\n frames.set(id, {\n world: composeWorldPose(poseAdapter, id as string, pc.compose),\n frameWorld: composeWorldPose(poseAdapter, frame, pc.compose),\n });\n }\n return { carried, frames };\n}\n\n/** For each layer on another plane: a point of its first root, in its own world and the edited one. */\nexport function capturePlaneRefs(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n view: unknown,\n frames: ReadonlyMap<NodeId, { world: unknown }>,\n startPoses: ReadonlyMap<NodeId, unknown>,\n projection: PoseDescriptor<unknown>,\n): Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }> {\n const planeRefs = new Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }>();\n for (const id of ids) {\n const layer = scene.get(id)?.layer;\n if (layer === undefined || planeRefs.has(layer)) continue;\n const m = planeOf(view, layer);\n if (m === null) continue;\n const world = frames.get(id)?.world ?? startPoses.get(id);\n if (world === undefined) continue;\n const b = projection.getBounds(world);\n const own = { x: b.x, y: b.y };\n planeRefs.set(layer, { own, edited: toPlane(invertPlane(m)!, own) });\n }\n return planeRefs;\n}\n\nexport function buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n adapter: MoveGestureAdapter<unknown>,\n readers: GestureReaders,\n): GestureContext<unknown> {\n const origin = new Map<string, unknown>();\n for (const [id, pose] of startPoses) origin.set(id as string, pose);\n const gestureCtx: GestureContext<unknown> = {\n draggedIds: ids as unknown as string[],\n origin,\n current: new Map(origin),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n frames: sceneGestureFrames(scene, ctx.deps.view),\n adapter: adapter as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n return gestureCtx;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"capture.js","names":["captureStartPoses","startPoses","cascadeIds","seen","queue","caught","hold","held","catchGliding","scene","reflow","projection","id","ids","node","effectivePose","parent","childId","childNode","captureFrames","carried","frames","pc","composesFrames","written","translateTargets","scenePoseFrame","poseAdapter","scenePoseAdapter","frame","frameAtOrAbove","composeWorldPose","capturePlaneRefs","planeRefs","layer","m","planeOf","view","world","b","own","toPlane","invertPlane","buildGestureContext","origin","pose","poseDescriptorOf","ctx","pointerStateOf","readers","sceneGestureFrames","a","from","to"],"sources":["../../../../src/interactions/actions/move/capture.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport { effectivePose } from 'core/scene/effectivePose';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composesFrames, composeWorldPose, frameAtOrAbove } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { ReflowTransition } from '../../../layout/types';\nimport type { GestureContext } from '../../gestures/types';\nimport { invertPlane, planeOf } from '../planeInput';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame } from '../poseFrame';\nimport { translateTargets } from '../selectionSubtree';\nimport type { MoveGestureAdapter } from './gestureAdapter';\nimport { catchGliding } from './layout/glide';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\n\n/** Start pose of each root and descendant, the descendants in walk order, and\n * the offsets of any caught mid-glide. */\nexport function captureStartPoses(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n reflow: ReflowTransition | null,\n projection: PoseDescriptor<unknown>,\n): { startPoses: Map<NodeId, unknown>; cascadeIds: NodeId[]; caught: Map<NodeId, { dx: number; dy: number }> } {\n // Capture origin poses once at drag start. Walk descendants so\n // container drags can preview every displaced child — required by\n // `usePreviewGhostLayer.buildSubtree` which only recurses into ids\n // present in `previewIds()`.\n const startPoses = new Map<NodeId, unknown>();\n const cascadeIds: NodeId[] = [];\n const seen = new Set<NodeId>();\n const queue: NodeId[] = [];\n // A node still gliding from an earlier reflow is held where it is\n // shown, and the drag starts from there.\n const caught = new Map<NodeId, { dx: number; dy: number }>();\n const hold = (id: NodeId): void => {\n const held = catchGliding(scene, reflow, projection, id);\n if (held) caught.set(id, held);\n };\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n hold(id);\n startPoses.set(id, effectivePose(scene, node));\n seen.add(id);\n queue.push(id);\n }\n while (queue.length > 0) {\n const parent = queue.shift()!;\n for (const childId of scene.childrenOf(parent)) {\n if (seen.has(childId)) continue;\n seen.add(childId);\n const childNode = scene.get(childId);\n if (!childNode) continue;\n hold(childId);\n startPoses.set(childId, effectivePose(scene, childNode));\n cascadeIds.push(childId);\n queue.push(childId);\n }\n }\n return { startPoses, cascadeIds, caught };\n}\n\n/** Which ids ride a moving frame, and the world poses of the rest that sit under one. */\nexport function captureFrames(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n): { carried: Set<NodeId>; frames: Map<NodeId, { world: unknown; frameWorld: unknown }> } {\n const carried = new Set<NodeId>();\n const frames = new Map<NodeId, { world: unknown; frameWorld: unknown }>();\n const pc = scene.composition;\n if (!composesFrames(pc)) return { carried, frames };\n const written = new Set(translateTargets(scene, scenePoseFrame(scene), ids));\n const poseAdapter = scenePoseAdapter(scene);\n for (const id of startPoses.keys()) {\n if (!written.has(id)) {\n carried.add(id);\n continue;\n }\n const frame = frameAtOrAbove(poseAdapter, scene.get(id)?.parent ?? null);\n if (frame === null) continue;\n frames.set(id, {\n world: composeWorldPose(poseAdapter, id as string, pc.compose),\n frameWorld: composeWorldPose(poseAdapter, frame, pc.compose),\n });\n }\n return { carried, frames };\n}\n\n/** For each layer on another plane: a point of its first root, in its own world and the edited one. */\nexport function capturePlaneRefs(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n view: unknown,\n frames: ReadonlyMap<NodeId, { world: unknown }>,\n startPoses: ReadonlyMap<NodeId, unknown>,\n projection: PoseDescriptor<unknown>,\n): Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }> {\n const planeRefs = new Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }>();\n for (const id of ids) {\n const layer = scene.get(id)?.layer;\n if (layer === undefined || planeRefs.has(layer)) continue;\n const m = planeOf(view, layer);\n if (m === null) continue;\n const world = frames.get(id)?.world ?? startPoses.get(id);\n if (world === undefined) continue;\n const b = projection.getBounds(world);\n const own = { x: b.x, y: b.y };\n planeRefs.set(layer, { own, edited: toPlane(invertPlane(m)!, own) });\n }\n return planeRefs;\n}\n\nexport function buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n adapter: MoveGestureAdapter<unknown>,\n readers: GestureReaders,\n): GestureContext<unknown> {\n const origin = new Map<string, unknown>();\n for (const [id, pose] of startPoses) origin.set(id as string, pose);\n const projection = poseDescriptorOf(ctx.deps.poseDescriptor);\n const gestureCtx: GestureContext<unknown> = {\n draggedIds: ids as unknown as string[],\n origin,\n current: new Map(origin),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n frames: sceneGestureFrames(scene, ctx.deps.view),\n offset: (from, to) => {\n const a = projection.getBounds(from);\n const b = projection.getBounds(to);\n return { dx: b.x - a.x, dy: b.y - a.y };\n },\n adapter: adapter as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n return gestureCtx;\n}\n"],"mappings":"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"}
|
|
@@ -9,25 +9,13 @@ function n(n, r, i, a, o) {
|
|
|
9
9
|
kind: "translate",
|
|
10
10
|
dx: s,
|
|
11
11
|
dy: c
|
|
12
|
-
}
|
|
12
|
+
};
|
|
13
13
|
for (let e of n.behaviors) {
|
|
14
14
|
let t = e.onMove?.(d, f);
|
|
15
15
|
if (t) {
|
|
16
16
|
if (t.poses) for (let [e, n] of t.poses) l.set(e, n);
|
|
17
17
|
if (t.opaque) for (let e of t.opaque) u.add(e);
|
|
18
|
-
|
|
19
|
-
else if (t.pose !== void 0 && p !== void 0) {
|
|
20
|
-
let e = n.startPoses.get(p);
|
|
21
|
-
if (e !== void 0) {
|
|
22
|
-
let r = n.projection.getBounds(e), i = n.projection.getBounds(t.pose);
|
|
23
|
-
f = {
|
|
24
|
-
kind: "translate",
|
|
25
|
-
dx: i.x - r.x,
|
|
26
|
-
dy: i.y - r.y
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
t.snap !== void 0 && (d.snap = t.snap);
|
|
18
|
+
t.transform && t.transform.kind === "translate" && (f = t.transform), t.snap !== void 0 && (d.snap = t.snap);
|
|
31
19
|
}
|
|
32
20
|
}
|
|
33
21
|
return f.kind === "translate" && (s = f.dx, c = f.dy), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","names":["foldBehaviors","dx","dx0","dy","dy0","posed","opaque","gctx","session","moveCtx","pointerStateOf","readers","id","ori","draggedStoredPose","transform","
|
|
1
|
+
{"version":3,"file":"frame.js","names":["foldBehaviors","dx","dx0","dy","dy0","posed","opaque","gctx","session","moveCtx","pointerStateOf","readers","id","ori","draggedStoredPose","transform","b","r","pose","nextFrame","delta","previews","dragged"],"sources":["../../../../src/interactions/actions/move/frame.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { BehaviorResult, GroupTransform } from '../../gestures/types';\nimport { draggedStoredPose } from './delta';\nimport type { MoveFrame, MoveSession } from './session';\n\nfunction foldBehaviors(\n session: MoveSession,\n readers: GestureReaders,\n moveCtx: InvocationCtx,\n dx0: number,\n dy0: number,\n): { dx: number; dy: number; posed: Map<NodeId, unknown>; opaque: Set<NodeId> } {\n let dx = dx0;\n let dy = dy0;\n\n const posed = new Map<NodeId, unknown>();\n const opaque = new Set<NodeId>();\n const gctx = session.gestureCtx;\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.drag!.current, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n // `current` is pre-populated from the raw cursor delta BEFORE\n // any behavior shapes `transform`. Unlike `onEnd`, it is NOT\n // refreshed after each behavior runs — so onMove behaviors\n // should derive position from `origin` + the `proposed`\n // GroupTransform arg, NOT from `ctx.current` (which reflects\n // the unmodified delta at this frame's start).\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n let transform: GroupTransform = { kind: 'translate', dx, dy };\n for (const b of session.behaviors) {\n const r: BehaviorResult<unknown> | void = b.onMove?.(gctx, transform);\n if (!r) continue;\n if (r.poses) for (const [id, pose] of r.poses) posed.set(id as NodeId, pose);\n if (r.opaque) for (const id of r.opaque) opaque.add(id as NodeId);\n if (r.transform && r.transform.kind === 'translate') transform = r.transform;\n if (r.snap !== undefined) gctx.snap = r.snap;\n }\n if (transform.kind === 'translate') { dx = transform.dx; dy = transform.dy; }\n return { dx, dy, posed, opaque };\n}\n\n/** One move's delta and previews: the pointer's delta as the behaviors shaped\n * it, every displaced id's stored pose under it, and whatever else the\n * behaviors posed. */\nexport function nextFrame(session: MoveSession, readers: GestureReaders, moveCtx: InvocationCtx): MoveFrame {\n const { dx, dy, posed, opaque } = foldBehaviors(session, readers, moveCtx, moveCtx.drag!.delta.x, moveCtx.drag!.delta.y);\n\n // The delta stays in the frame — no scene writes, no history entries.\n const delta = { dx, dy };\n // Refresh preview poses for every displaced id (roots + cascade).\n // The preview-ghost layer reads these via `previewIds`/`previewPose`.\n const previews = new Map<NodeId, unknown>();\n for (const [id, ori] of session.startPoses) {\n const dragged = draggedStoredPose(session, id, ori, dx, dy);\n previews.set(id, session.carried.has(id) ? dragged : posed.get(id) ?? dragged);\n }\n for (const [id, pose] of posed) if (!session.startPoses.has(id)) previews.set(id, pose);\n return { delta, previews, opaque };\n}\n"],"mappings":";;;AAQA,SAASA,EACP,GACA,GACA,GACA,GACA,GAC8E;CAC9E,IAAIC,IAAKC,GACLC,IAAKC,GAEHC,oBAAQ,IAAI,IAAqB,GACjCC,oBAAS,IAAI,IAAY,GACzBC,IAAOC,EAAQ;CAIrB,AAHA,EAAK,YAAY,EAAE,GAAGC,EAAQ,UAAU,GACxC,EAAK,UAAUC,EAAeD,EAAQ,KAAM,SAASA,CAAO,GAC5D,EAAK,OAAOE,EAAQ,KAAK,GACzB,EAAK,QAAQA,EAAQ,MAAM;CAO3B,KAAK,IAAM,CAACC,GAAIC,MAAQL,EAAQ,YAC9B,EAAK,QAAQ,IAAII,GAAcE,EAAkBN,GAASI,GAAIC,GAAKZ,GAAIE,CAAE,CAAC;CAE5E,IAAIY,IAA4B;EAAE,MAAM;EAAa;EAAI;CAAG;CAC5D,KAAK,IAAMC,KAAKR,EAAQ,WAAW;EACjC,IAAMS,IAAoCD,EAAE,SAAST,GAAMQ,CAAS;EACpE,IAAKE,GACL;OAAIA,EAAE,OAAO,KAAK,IAAM,CAACL,GAAIM,MAASD,EAAE,OAAO,EAAM,IAAIL,GAAcM,CAAI;GAC3E,IAAID,EAAE,QAAQ,KAAK,IAAML,KAAMK,EAAE,QAAQ,EAAO,IAAIL,CAAY;GAEhE,AADIK,EAAE,aAAaA,EAAE,UAAU,SAAS,gBAAa,IAAYA,EAAE,YAC/DA,EAAE,SAAS,KAAA,MAAW,EAAK,OAAOA,EAAE;EAHmC;CAI7E;CAEA,OADIF,EAAU,SAAS,gBAAe,IAAKA,EAAU,IAAI,IAAKA,EAAU,KACjE;EAAE;EAAI;EAAI;EAAO;CAAO;AACjC;AAKA,SAAgBI,EAAU,GAAsB,GAAyB,GAAmC;CAC1G,IAAM,EAAE,OAAI,OAAI,UAAO,cAAWnB,EAAcQ,GAASG,GAASF,GAASA,EAAQ,KAAM,MAAM,GAAGA,EAAQ,KAAM,MAAM,CAAC,GAGjHW,IAAQ;EAAE;EAAI;CAAG,GAGjBC,oBAAW,IAAI,IAAqB;CAC1C,KAAK,IAAM,CAACT,GAAIC,MAAQL,EAAQ,YAAY;EAC1C,IAAMc,IAAUR,EAAkBN,GAASI,GAAIC,GAAKZ,GAAIE,CAAE;EAC1D,EAAS,IAAIS,GAAIJ,EAAQ,QAAQ,IAAII,CAAE,IAAIU,IAAUjB,EAAM,IAAIO,CAAE,KAAKU,CAAO;CAC/E;CACA,KAAK,IAAM,CAACV,GAAIM,MAASb,GAAO,AAAKG,EAAQ,WAAW,IAAII,CAAE,KAAGS,EAAS,IAAIT,GAAIM,CAAI;CACtF,OAAO;EAAE;EAAO;EAAU;CAAO;AACnC"}
|
|
@@ -6,7 +6,7 @@ import { layoutDrop as o } from "./behaviors/layoutDrop.js";
|
|
|
6
6
|
import { reparentOnDrop as s } from "./behaviors/reparentOnDrop.js";
|
|
7
7
|
import { buildGestureContext as c, captureFrames as l, capturePlaneRefs as u, captureStartPoses as d } from "./capture.js";
|
|
8
8
|
import { moveGestureAdapter as f } from "./gestureAdapter.js";
|
|
9
|
-
import { DRAG_THRESHOLD_PX as p,
|
|
9
|
+
import { DRAG_THRESHOLD_PX as p, isPathEditPart as m, resolveParams as h } from "@weasel-js/routing";
|
|
10
10
|
//#region src/interactions/actions/move/session.ts
|
|
11
11
|
function g(g, _, v) {
|
|
12
12
|
let y = g.deps.selection, b = g.deps.scene, x = i(g.deps.poseDescriptor), S = g.deps.layout, C = g.deps.applyOps, w = g.deps.geometryProjection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["beginMove","selection","ctx","scene","projection","poseDescriptorOf","layout","applyOps","geometryProjection","pc","isAnchorOrControl","params","resolveParams","opts","expandIds","\"expandIds\"","selected","ids","moveSources","reflow","captureStartPoses","captureFrames","startPoses","gesture","session","behaviors","layoutDrop","reparentOnDrop","dragThresholdPx","\"dragThresholdPx\"","DRAG_THRESHOLD_PX","lifecycle","readGestureLifecycle","adapter","moveGestureAdapter","commitGestureOps","through","ops","readers","gestureReaders","gestureCtx","buildGestureContext","b","capturePlaneRefs","frames","nodeDescriptors","\"reparentOnDrop\""],"sources":["../../../../src/interactions/actions/move/session.ts"],"sourcesContent":["import type { BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { DRAG_THRESHOLD_PX, isAnchorOrControl, resolveParams } from '@weasel-js/routing';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { PoseComposition } from 'core/scene/composePose';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, MoveBehavior } from '../../gestures/types';\nimport type { LayoutDep, NodeAtPointDep } from '../depSchema';\nimport type { GeometryProjection } from '../geometryProjection';\nimport { commitGestureOps, readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { moveSources } from '../selectionSubtree';\nimport { layoutDrop } from './behaviors/layoutDrop';\nimport { reparentOnDrop } from './behaviors/reparentOnDrop';\nimport { buildGestureContext, captureFrames, capturePlaneRefs, captureStartPoses } from './capture';\nimport { moveGestureAdapter, type MoveGestureAdapter } from './gestureAdapter';\n\n/** Allowed values for the `reparentOnDrop` binding param. `'off'` (the\n * default) preserves the legacy translate-only commit. `'top'` lands the\n * moved node at the top of the container under the cursor. `'above'`\n * lands it immediately above the hit sibling in z-order (falls back to\n * `'top'` semantics when the hit is itself a container or when the hit\n * and moved node share no parent). */\nexport type ReparentOnDrop = 'off' | 'top' | 'above';\n\n/** What a move captured at press. Nothing here changes during the drag. */\nexport interface MoveSession {\n readonly scene: Scene<unknown, string, unknown>;\n /** The drag roots. */\n readonly ids: readonly NodeId[];\n /** Descendants of the roots, previewed along with them. */\n readonly cascadeIds: readonly NodeId[];\n /** Start pose of every root and descendant. */\n readonly startPoses: ReadonlyMap<NodeId, unknown>;\n /** Ids whose frame is itself moving, so they ride it and are not translated. */\n readonly carried: ReadonlySet<NodeId>;\n /** For each moved id stored under a frame: its world pose and the frame's, at press. */\n readonly frames: ReadonlyMap<NodeId, { world: unknown; frameWorld: unknown }>;\n /** Ids grabbed mid-glide, with how far the pose shown stood from the document's. */\n readonly caught: ReadonlyMap<NodeId, { dx: number; dy: number }>;\n /** Per layer on another plane than the edited one: a point of its first root, in both. */\n readonly planeRefs: ReadonlyMap<string, { own: { x: number; y: number }; edited: { x: number; y: number } }>;\n readonly view: unknown;\n readonly projection: PoseDescriptor<unknown>;\n readonly descriptorOf: (id: NodeId | string) => PoseDescriptor<unknown>;\n readonly pc: PoseComposition<unknown>;\n /** The binding's behaviors, then the ones the action adds: a layout drop\n * when the `layout` dep is present, and reparent-on-drop. */\n readonly behaviors: readonly MoveBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly adapter: MoveGestureAdapter<unknown>;\n readonly layout: LayoutDep | undefined;\n readonly applyOps?: (ops: Op[], label: string) => void;\n readonly geometryProjection?: GeometryProjection;\n readonly lifecycle: GestureLifecycle;\n readonly nodeAtPoint: NodeAtPointDep | undefined;\n /** Read at release: a binding's params may be a thunk. */\n readonly reparentOnDrop: () => ReparentOnDrop;\n readonly dragThresholdPx: number;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface MoveFrame {\n readonly delta: { dx: number; dy: number };\n /** Stored-frame pose of every displaced id, roots and descendants, and of\n * any other id a behavior posed. */\n readonly previews: Map<NodeId, unknown>;\n /** Ids the behaviors asked to have painted at full opacity. */\n readonly opaque: ReadonlySet<NodeId>;\n}\n\n/** What the behaviors the action builds itself read of the drag they belong\n * to. Neither is readable from `onStart`, which runs before the session\n * exists. */\nexport interface MoveGesture {\n session(): MoveSession;\n /** The latest frame: the previous one while an `onMove` is running. */\n frame(): MoveFrame;\n}\n\n/** Capture a drag at press. Null when there is nothing to move. Runs each\n * behavior's `onStart`. `frame` reads the drag's latest frame, for the\n * behaviors appended to the binding's own. */\nexport function beginMove(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n frame: () => MoveFrame,\n): { session: MoveSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const projection = poseDescriptorOf(ctx.deps.poseDescriptor);\n const layout = ctx.deps.layout;\n const applyOps = ctx.deps.applyOps;\n const geometryProjection = ctx.deps.geometryProjection;\n\n if (!selection || !scene) return null;\n const pc = scene.composition;\n // Anchors sit on the selected body, and this binding ties editAnchors' on\n // specificity; with no mode registry to filter move out, declining is what lets it through.\n if (isAnchorOrControl(ctx.drag?.affordance)) return null;\n\n const params = resolveParams(opts?.params);\n const expandIds = params?.['expandIds'] as ((ids: string[]) => string[]) | undefined;\n const selected = [...selection.get()] as string[];\n const ids = moveSources(scene, expandIds ? expandIds(selected) : selected) as NodeId[];\n if (ids.length === 0) return null;\n\n const reflow = layout?.reflow ?? null;\n const { startPoses, cascadeIds, caught } = captureStartPoses(scene, ids, reflow, projection);\n const { carried, frames } = captureFrames(scene, ids, startPoses);\n\n // Everything a move does beyond translating is a behavior: the binding's\n // own, then the layout drop, then reparent-on-drop. On release the first to\n // answer owns the commit, so each preempts the ones after it.\n const gesture: MoveGesture = { session: () => session, frame };\n const behaviors: MoveBehavior<unknown>[] = [\n ...((opts?.behaviors ?? []) as MoveBehavior<unknown>[]),\n ...(layout ? [layoutDrop(gesture)] : []),\n reparentOnDrop(gesture),\n ];\n const dragThresholdPx = (params?.['dragThresholdPx'] as number | undefined)\n ?? DRAG_THRESHOLD_PX;\n const lifecycle = readGestureLifecycle(params, 'Move', behaviors);\n // A behavior that commits after the gesture has ended, a coast coming to\n // rest, lands its batch the way the gesture's own commit does.\n const adapter = moveGestureAdapter<unknown>(scene, (ops, _label, through) =>\n commitGestureOps({ scene, applyOps, adapter: through }, lifecycle, ops), selection.adapterMethods);\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, ids, startPoses, adapter, readers);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n\n const session: MoveSession = {\n startPoses,\n ids,\n cascadeIds,\n carried,\n frames,\n scene,\n view: ctx.deps.view,\n planeRefs: capturePlaneRefs(scene, ids, ctx.deps.view, frames, startPoses, projection),\n caught,\n projection,\n descriptorOf: nodeDescriptors(scene, projection),\n behaviors,\n gestureCtx,\n adapter,\n layout,\n pc,\n applyOps,\n geometryProjection,\n lifecycle,\n nodeAtPoint: ctx.deps.nodeAtPoint,\n reparentOnDrop: () => (resolveParams(opts?.params)?.['reparentOnDrop'] as ReparentOnDrop | undefined) ?? 'off',\n dragThresholdPx,\n };\n return { session, readers };\n}\n"],"mappings":";;;;;;;;;;AAqFA,SAAgBA,EACd,GACA,GACA,GAC0D;CAC1D,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAaC,EAAiBH,EAAI,KAAK,cAAc,GACrDI,IAASJ,EAAI,KAAK,QAClBK,IAAWL,EAAI,KAAK,UACpBM,IAAqBN,EAAI,KAAK;CAEpC,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO;CACjC,IAAMM,IAAKN,EAAM;CAGjB,IAAIO,EAAkBR,EAAI,MAAM,UAAU,GAAG,OAAO;CAEpD,IAAMS,IAASC,EAAcC,GAAM,MAAM,GACnCC,IAAYH,GAASI,WACrBC,IAAW,CAAC,GAAGf,EAAU,IAAI,CAAC,GAC9BgB,IAAMC,EAAYf,GAAOW,IAAYA,EAAUE,CAAQ,IAAIA,CAAQ;CACzE,IAAIC,EAAI,WAAW,GAAG,OAAO;CAE7B,IAAME,IAASb,GAAQ,UAAU,MAC3B,EAAE,eAAY,eAAY,cAAWc,EAAkBjB,GAAOc,GAAKE,GAAQf,CAAU,GACrF,EAAE,YAAS,cAAWiB,EAAclB,GAAOc,GAAKK,CAAU,GAK1DC,IAAuB;EAAE,eAAeC;EAAS;CAAM,GACvDC,IAAqC;EACzC,GAAKZ,GAAM,aAAa,CAAC;EACzB,GAAIP,IAAS,CAACoB,EAAWH,CAAO,CAAC,IAAI,CAAC;EACtCI,EAAeJ,CAAO;CACxB,GACMK,IAAmBjB,GAASkB,mBAC7BC,GACCC,IAAYC,EAAqBrB,GAAQ,QAAQc,CAAS,GAG1DQ,IAAUC,EAA4B/B,IAAQ,GAAK,GAAQ,MAC/DgC,EAAiB;EAAE;EAAO;EAAU,SAASC;CAAQ,GAAGL,GAAWM,CAAG,GAAGpC,EAAU,cAAc,GAC7FqC,IAAUC,EAAerC,EAAI,IAAI,GACjCsC,IAAaC,EAAoBvC,GAAKC,GAAOc,GAAKK,GAAYW,GAASK,CAAO;CACpF,KAAK,IAAMI,KAAKjB,GAAW,EAAE,UAAUe,CAAU;CAEjD,IAAMhB,IAAuB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA,MAAMtB,EAAI,KAAK;EACf,WAAWyC,EAAiBxC,GAAOc,GAAKf,EAAI,KAAK,MAAM0C,GAAQtB,GAAYlB,CAAU;EACrF;EACA;EACA,cAAcyC,EAAgB1C,GAAOC,CAAU;EAC/C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAaF,EAAI,KAAK;EACtB,sBAAuBU,EAAcC,GAAM,MAAM,CAAC,EAAGiC,kBAAoD;EACzG;CACF;CACA,OAAO;EAAE;EAAS;CAAQ;AAC5B"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["beginMove","selection","ctx","scene","projection","poseDescriptorOf","layout","applyOps","geometryProjection","pc","isPathEditPart","params","resolveParams","opts","expandIds","\"expandIds\"","selected","ids","moveSources","reflow","captureStartPoses","captureFrames","startPoses","gesture","session","behaviors","layoutDrop","reparentOnDrop","dragThresholdPx","\"dragThresholdPx\"","DRAG_THRESHOLD_PX","lifecycle","readGestureLifecycle","adapter","moveGestureAdapter","commitGestureOps","through","ops","readers","gestureReaders","gestureCtx","buildGestureContext","b","capturePlaneRefs","frames","nodeDescriptors","\"reparentOnDrop\""],"sources":["../../../../src/interactions/actions/move/session.ts"],"sourcesContent":["import type { BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { DRAG_THRESHOLD_PX, isPathEditPart, resolveParams } from '@weasel-js/routing';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { PoseComposition } from 'core/scene/composePose';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, MoveBehavior } from '../../gestures/types';\nimport type { LayoutDep, NodeAtPointDep } from '../depSchema';\nimport type { GeometryProjection } from '../geometryProjection';\nimport { commitGestureOps, readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { moveSources } from '../selectionSubtree';\nimport { layoutDrop } from './behaviors/layoutDrop';\nimport { reparentOnDrop } from './behaviors/reparentOnDrop';\nimport { buildGestureContext, captureFrames, capturePlaneRefs, captureStartPoses } from './capture';\nimport { moveGestureAdapter, type MoveGestureAdapter } from './gestureAdapter';\n\n/** Allowed values for the `reparentOnDrop` binding param. `'off'` (the\n * default) preserves the legacy translate-only commit. `'top'` lands the\n * moved node at the top of the container under the cursor. `'above'`\n * lands it immediately above the hit sibling in z-order (falls back to\n * `'top'` semantics when the hit is itself a container or when the hit\n * and moved node share no parent). */\nexport type ReparentOnDrop = 'off' | 'top' | 'above';\n\n/** What a move captured at press. Nothing here changes during the drag. */\nexport interface MoveSession {\n readonly scene: Scene<unknown, string, unknown>;\n /** The drag roots. */\n readonly ids: readonly NodeId[];\n /** Descendants of the roots, previewed along with them. */\n readonly cascadeIds: readonly NodeId[];\n /** Start pose of every root and descendant. */\n readonly startPoses: ReadonlyMap<NodeId, unknown>;\n /** Ids whose frame is itself moving, so they ride it and are not translated. */\n readonly carried: ReadonlySet<NodeId>;\n /** For each moved id stored under a frame: its world pose and the frame's, at press. */\n readonly frames: ReadonlyMap<NodeId, { world: unknown; frameWorld: unknown }>;\n /** Ids grabbed mid-glide, with how far the pose shown stood from the document's. */\n readonly caught: ReadonlyMap<NodeId, { dx: number; dy: number }>;\n /** Per layer on another plane than the edited one: a point of its first root, in both. */\n readonly planeRefs: ReadonlyMap<string, { own: { x: number; y: number }; edited: { x: number; y: number } }>;\n readonly view: unknown;\n readonly projection: PoseDescriptor<unknown>;\n readonly descriptorOf: (id: NodeId | string) => PoseDescriptor<unknown>;\n readonly pc: PoseComposition<unknown>;\n /** The binding's behaviors, then the ones the action adds: a layout drop\n * when the `layout` dep is present, and reparent-on-drop. */\n readonly behaviors: readonly MoveBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly adapter: MoveGestureAdapter<unknown>;\n readonly layout: LayoutDep | undefined;\n readonly applyOps?: (ops: Op[], label: string) => void;\n readonly geometryProjection?: GeometryProjection;\n readonly lifecycle: GestureLifecycle;\n readonly nodeAtPoint: NodeAtPointDep | undefined;\n /** Read at release: a binding's params may be a thunk. */\n readonly reparentOnDrop: () => ReparentOnDrop;\n readonly dragThresholdPx: number;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface MoveFrame {\n readonly delta: { dx: number; dy: number };\n /** Stored-frame pose of every displaced id, roots and descendants, and of\n * any other id a behavior posed. */\n readonly previews: Map<NodeId, unknown>;\n /** Ids the behaviors asked to have painted at full opacity. */\n readonly opaque: ReadonlySet<NodeId>;\n}\n\n/** What the behaviors the action builds itself read of the drag they belong\n * to. Neither is readable from `onStart`, which runs before the session\n * exists. */\nexport interface MoveGesture {\n session(): MoveSession;\n /** The latest frame: the previous one while an `onMove` is running. */\n frame(): MoveFrame;\n}\n\n/** Capture a drag at press. Null when there is nothing to move. Runs each\n * behavior's `onStart`. `frame` reads the drag's latest frame, for the\n * behaviors appended to the binding's own. */\nexport function beginMove(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n frame: () => MoveFrame,\n): { session: MoveSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const projection = poseDescriptorOf(ctx.deps.poseDescriptor);\n const layout = ctx.deps.layout;\n const applyOps = ctx.deps.applyOps;\n const geometryProjection = ctx.deps.geometryProjection;\n\n if (!selection || !scene) return null;\n const pc = scene.composition;\n // Anchors and segments sit on the selected body, and this binding ties editAnchors' and\n // bendSegment's on specificity; with no mode registry to filter move out, declining is what\n // lets them through.\n if (isPathEditPart(ctx.drag?.affordance)) return null;\n\n const params = resolveParams(opts?.params);\n const expandIds = params?.['expandIds'] as ((ids: string[]) => string[]) | undefined;\n const selected = [...selection.get()] as string[];\n const ids = moveSources(scene, expandIds ? expandIds(selected) : selected) as NodeId[];\n if (ids.length === 0) return null;\n\n const reflow = layout?.reflow ?? null;\n const { startPoses, cascadeIds, caught } = captureStartPoses(scene, ids, reflow, projection);\n const { carried, frames } = captureFrames(scene, ids, startPoses);\n\n // Everything a move does beyond translating is a behavior: the binding's\n // own, then the layout drop, then reparent-on-drop. On release the first to\n // answer owns the commit, so each preempts the ones after it.\n const gesture: MoveGesture = { session: () => session, frame };\n const behaviors: MoveBehavior<unknown>[] = [\n ...((opts?.behaviors ?? []) as MoveBehavior<unknown>[]),\n ...(layout ? [layoutDrop(gesture)] : []),\n reparentOnDrop(gesture),\n ];\n const dragThresholdPx = (params?.['dragThresholdPx'] as number | undefined)\n ?? DRAG_THRESHOLD_PX;\n const lifecycle = readGestureLifecycle(params, 'Move', behaviors);\n // A behavior that commits after the gesture has ended, a coast coming to\n // rest, lands its batch the way the gesture's own commit does.\n const adapter = moveGestureAdapter<unknown>(scene, (ops, _label, through) =>\n commitGestureOps({ scene, applyOps, adapter: through }, lifecycle, ops), selection.adapterMethods);\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, ids, startPoses, adapter, readers);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n\n const session: MoveSession = {\n startPoses,\n ids,\n cascadeIds,\n carried,\n frames,\n scene,\n view: ctx.deps.view,\n planeRefs: capturePlaneRefs(scene, ids, ctx.deps.view, frames, startPoses, projection),\n caught,\n projection,\n descriptorOf: nodeDescriptors(scene, projection),\n behaviors,\n gestureCtx,\n adapter,\n layout,\n pc,\n applyOps,\n geometryProjection,\n lifecycle,\n nodeAtPoint: ctx.deps.nodeAtPoint,\n reparentOnDrop: () => (resolveParams(opts?.params)?.['reparentOnDrop'] as ReparentOnDrop | undefined) ?? 'off',\n dragThresholdPx,\n };\n return { session, readers };\n}\n"],"mappings":";;;;;;;;;;AAqFA,SAAgBA,EACd,GACA,GACA,GAC0D;CAC1D,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAaC,EAAiBH,EAAI,KAAK,cAAc,GACrDI,IAASJ,EAAI,KAAK,QAClBK,IAAWL,EAAI,KAAK,UACpBM,IAAqBN,EAAI,KAAK;CAEpC,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO;CACjC,IAAMM,IAAKN,EAAM;CAIjB,IAAIO,EAAeR,EAAI,MAAM,UAAU,GAAG,OAAO;CAEjD,IAAMS,IAASC,EAAcC,GAAM,MAAM,GACnCC,IAAYH,GAASI,WACrBC,IAAW,CAAC,GAAGf,EAAU,IAAI,CAAC,GAC9BgB,IAAMC,EAAYf,GAAOW,IAAYA,EAAUE,CAAQ,IAAIA,CAAQ;CACzE,IAAIC,EAAI,WAAW,GAAG,OAAO;CAE7B,IAAME,IAASb,GAAQ,UAAU,MAC3B,EAAE,eAAY,eAAY,cAAWc,EAAkBjB,GAAOc,GAAKE,GAAQf,CAAU,GACrF,EAAE,YAAS,cAAWiB,EAAclB,GAAOc,GAAKK,CAAU,GAK1DC,IAAuB;EAAE,eAAeC;EAAS;CAAM,GACvDC,IAAqC;EACzC,GAAKZ,GAAM,aAAa,CAAC;EACzB,GAAIP,IAAS,CAACoB,EAAWH,CAAO,CAAC,IAAI,CAAC;EACtCI,EAAeJ,CAAO;CACxB,GACMK,IAAmBjB,GAASkB,mBAC7BC,GACCC,IAAYC,EAAqBrB,GAAQ,QAAQc,CAAS,GAG1DQ,IAAUC,EAA4B/B,IAAQ,GAAK,GAAQ,MAC/DgC,EAAiB;EAAE;EAAO;EAAU,SAASC;CAAQ,GAAGL,GAAWM,CAAG,GAAGpC,EAAU,cAAc,GAC7FqC,IAAUC,EAAerC,EAAI,IAAI,GACjCsC,IAAaC,EAAoBvC,GAAKC,GAAOc,GAAKK,GAAYW,GAASK,CAAO;CACpF,KAAK,IAAMI,KAAKjB,GAAW,EAAE,UAAUe,CAAU;CAEjD,IAAMhB,IAAuB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA,MAAMtB,EAAI,KAAK;EACf,WAAWyC,EAAiBxC,GAAOc,GAAKf,EAAI,KAAK,MAAM0C,GAAQtB,GAAYlB,CAAU;EACrF;EACA;EACA,cAAcyC,EAAgB1C,GAAOC,CAAU;EAC/C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAaF,EAAI,KAAK;EACtB,sBAAuBU,EAAcC,GAAM,MAAM,CAAC,EAAGiC,kBAAoD;EACzG;CACF;CACA,OAAO;EAAE;EAAS;CAAQ;AAC5B"}
|