@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
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { shapeSources as e } from "../selectionSubtree.js";
|
|
2
|
+
import { storedPreviews as t } from "./frame.js";
|
|
3
|
+
import { rotateOps as n } from "./commit.js";
|
|
4
|
+
import { captureTurn as r } from "./session.js";
|
|
5
|
+
//#region src/interactions/actions/rotate/replay.ts
|
|
6
|
+
function i(i, a, o, s, c, l, u) {
|
|
7
|
+
let d = e(i, a);
|
|
8
|
+
if (d.length === 0 || c === 0) return [];
|
|
9
|
+
let f = r(i, d, o, s, l);
|
|
10
|
+
if (!f) return [];
|
|
11
|
+
let { turn: p, originPoses: m, poseFrame: h } = f, g = t({
|
|
12
|
+
scene: i,
|
|
13
|
+
turn: p,
|
|
14
|
+
poseFrame: h,
|
|
15
|
+
view: o
|
|
16
|
+
}, c);
|
|
17
|
+
return n([...p.origins.keys()], m, g, u);
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { i as rotateSelectionOps };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","names":["rotateSelectionOps","ids","shapeSources","scene","selected","angle","captured","captureTurn","view","poseDescriptor","pivot","previews","storedPreviews","rotateOps","turn","originPoses","label"],"sources":["../../../../src/interactions/actions/rotate/replay.ts"],"sourcesContent":["import type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { shapeSources } from '../selectionSubtree';\nimport { rotateOps } from './commit';\nimport { storedPreviews } from './frame';\nimport { captureTurn } from './session';\n\n/** The ops that turn `selected` by `angle` radians the way a rotate drag\n * would: about the selection's center, or each node about its own. */\nexport function rotateSelectionOps(\n scene: Scene<unknown, string, unknown>,\n selected: readonly string[],\n view: unknown,\n poseDescriptor: unknown,\n angle: number,\n pivot: 'union' | 'each',\n label: string,\n): Op[] {\n const ids = shapeSources(scene, selected) as NodeId[];\n if (ids.length === 0 || angle === 0) return [];\n const captured = captureTurn(scene, ids, view, poseDescriptor, pivot);\n if (!captured) return [];\n const { turn, originPoses, poseFrame } = captured;\n const previews = storedPreviews({ scene, turn, poseFrame, view }, angle);\n return rotateOps([...turn.origins.keys()], originPoses, previews, label);\n}\n"],"mappings":";;;;;AASA,SAAgBA,EACd,GACA,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAMC,EAAaC,GAAOC,CAAQ;CACxC,IAAIH,EAAI,WAAW,KAAKI,MAAU,GAAG,OAAO,CAAC;CAC7C,IAAMC,IAAWC,EAAYJ,GAAOF,GAAKO,GAAMC,GAAgBC,CAAK;CACpE,IAAI,CAACJ,GAAU,OAAO,CAAC;CACvB,IAAM,EAAE,SAAM,gBAAa,iBAAcA,GACnCK,IAAWC,EAAe;EAAE;EAAO;EAAM;EAAW;CAAK,GAAGP,CAAK;CACvE,OAAOQ,EAAU,CAAC,GAAGC,EAAK,QAAQ,KAAK,CAAC,GAAGC,GAAaJ,GAAUK,CAAK;AACzE"}
|
|
@@ -20,7 +20,7 @@ function g(e, n, o, s, c) {
|
|
|
20
20
|
let p = s(f);
|
|
21
21
|
if (!p.withRotation || p.supportsRotation?.(o.pose) === !1) continue;
|
|
22
22
|
l.set(f, o.pose);
|
|
23
|
-
let m = r(p, c.world(f), i(a(e
|
|
23
|
+
let m = r(p, c.world(f), i(a(e, o.layer))), h = p.getBounds(m);
|
|
24
24
|
u.set(f, {
|
|
25
25
|
world: m,
|
|
26
26
|
center: {
|
|
@@ -51,42 +51,52 @@ function _(e, t, n, r, i) {
|
|
|
51
51
|
scratch: {}
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
function v(t, r) {
|
|
55
|
-
let
|
|
56
|
-
if (
|
|
57
|
-
let
|
|
58
|
-
if (p.length === 0) return null;
|
|
59
|
-
let v = s(a, c(t.deps.poseDescriptor)), y = d(a), { originPoses: b, origins: x, visual: S } = g(t, a, p, v, y);
|
|
60
|
-
if (b.size === 0) return null;
|
|
61
|
-
let C = e(S), w = {
|
|
62
|
-
x: C.x + C.width / 2,
|
|
63
|
-
y: C.y + C.height / 2
|
|
64
|
-
}, T = o(t.deps), E = _(t, a, x, T, i.adapterMethods);
|
|
65
|
-
for (let e of f) e.onStart?.(E);
|
|
54
|
+
function v(t, n, r, i, a) {
|
|
55
|
+
let o = s(t, c(i)), l = d(t), { originPoses: u, origins: f, visual: p } = g(r, t, n, o, l);
|
|
56
|
+
if (u.size === 0) return null;
|
|
57
|
+
let m = e(p);
|
|
66
58
|
return {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
pivot: w,
|
|
73
|
-
useUnionPivot: p.length > 1 && u?.pivot !== "each",
|
|
74
|
-
descriptorOf: v
|
|
59
|
+
turn: {
|
|
60
|
+
origins: f,
|
|
61
|
+
pivot: {
|
|
62
|
+
x: m.x + m.width / 2,
|
|
63
|
+
y: m.y + m.height / 2
|
|
75
64
|
},
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
65
|
+
useUnionPivot: n.length > 1 && a !== "each",
|
|
66
|
+
descriptorOf: o
|
|
67
|
+
},
|
|
68
|
+
originPoses: u,
|
|
69
|
+
poseFrame: l
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function y(e, t) {
|
|
73
|
+
let r = e.deps.selection, i = e.deps.scene, a = h(t?.params), s = t?.behaviors ?? m;
|
|
74
|
+
if (!r || !i) return null;
|
|
75
|
+
let c = l(i, r.get());
|
|
76
|
+
if (c.length === 0) return null;
|
|
77
|
+
let u = v(i, c, e.deps.view, e.deps.poseDescriptor, a?.pivot === "each" ? "each" : "union");
|
|
78
|
+
if (!u) return null;
|
|
79
|
+
let { turn: d, originPoses: f, poseFrame: p } = u, { origins: g, pivot: y } = d, b = o(e.deps), x = _(e, i, g, b, r.adapterMethods);
|
|
80
|
+
for (let e of s) e.onStart?.(x);
|
|
81
|
+
return {
|
|
82
|
+
session: {
|
|
83
|
+
scene: i,
|
|
84
|
+
ids: c,
|
|
85
|
+
turn: d,
|
|
86
|
+
poseFrame: p,
|
|
87
|
+
view: e.deps.view,
|
|
88
|
+
originPoses: f,
|
|
89
|
+
startPointerAngle: Math.atan2(e.world.y - y.y, e.world.x - y.x),
|
|
90
|
+
behaviors: s,
|
|
91
|
+
gestureCtx: x,
|
|
92
|
+
applyOps: e.deps.applyOps,
|
|
93
|
+
selectionMethods: r.adapterMethods,
|
|
94
|
+
lifecycle: n(a, "Rotate", s)
|
|
85
95
|
},
|
|
86
|
-
readers:
|
|
96
|
+
readers: b
|
|
87
97
|
};
|
|
88
98
|
}
|
|
89
99
|
//#endregion
|
|
90
|
-
export {
|
|
100
|
+
export { y as beginRotate, v as captureTurn };
|
|
91
101
|
|
|
92
102
|
//# sourceMappingURL=session.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":["captureOrigins","originPoses","origins","visual","id","ids","node","scene","g","descriptorOf","world","carryPose","poseFrame","invertPlane","planeOf","ctx","b","visualBoundsViaDescriptor","buildGestureContext","o","pointerStateOf","readers","sceneGestureFrames","moveGestureAdapter","selectionMethods","beginRotate","selection","params","resolveParams","opts","behaviors","DEFAULT_ROTATE_BEHAVIORS","shapeSources","nodeDescriptors","poseDescriptorOf","scenePoseFrame","union","unionAABB","pivot","gestureReaders","gestureCtx","\"pivot\"","readGestureLifecycle"],"sources":["../../../../src/interactions/actions/rotate/session.ts"],"sourcesContent":["import type { BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { resolveParams } from '@weasel-js/routing';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, RotateBehavior } from '../../gestures/types';\nimport { readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { DEFAULT_ROTATE_BEHAVIORS } from './behaviors';\nimport { moveGestureAdapter } from '../move/gestureAdapter';\nimport { carryPose, invertPlane, planeOf } from '../planeInput';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport { visualBoundsViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport { shapeSources } from '../selectionSubtree';\n\n/** One rotated node as the press found it, in the plane the pointer's angle\n * is read in. */\nexport interface TurnOrigin {\n readonly world: unknown;\n /** Center of `world`'s bounds. */\n readonly center: { x: number; y: number };\n readonly rotation: number;\n}\n\n/** What a turn by some delta is computed from. */\nexport interface Turn {\n readonly origins: ReadonlyMap<NodeId, TurnOrigin>;\n /** The point the pointer orbits: the center of what the selection draws. */\n readonly pivot: { x: number; y: number };\n /** Orbit each node's center around `pivot`, for a multi-selection. Off,\n * each node turns about its own center. */\n readonly useUnionPivot: boolean;\n readonly descriptorOf: (id: NodeId) => PoseDescriptor<unknown>;\n}\n\n/** What a rotate captured at press. Nothing here changes during the drag. */\nexport interface RotateSession {\n readonly scene: Scene<unknown, string, unknown>;\n readonly ids: readonly NodeId[];\n readonly turn: Turn;\n /** World reads and local writes over the scene's composition strategy. */\n readonly poseFrame: PoseFrame<unknown>;\n readonly view: unknown;\n /** Each rotated node's pose as stored: the `from` of its op. */\n readonly originPoses: ReadonlyMap<NodeId, unknown>;\n /** Pointer angle around the pivot at press. */\n readonly startPointerAngle: number;\n readonly behaviors: readonly RotateBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly applyOps?: (ops: Op[], label: string) => void;\n readonly selectionMethods: SelectionApi['adapterMethods'] | undefined;\n readonly lifecycle: GestureLifecycle;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface RotateFrame {\n /** Radians turned since press, as the behaviors shaped it. */\n readonly delta: number;\n /** Stored-frame pose of every rotated id; empty at a zero delta. */\n readonly previews: Map<NodeId, unknown>;\n}\n\nfunction captureOrigins(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>,\n poseFrame: PoseFrame<unknown>,\n): { originPoses: Map<NodeId, unknown>; origins: Map<NodeId, TurnOrigin>; visual: Bounds[] } {\n const originPoses = new Map<NodeId, unknown>();\n const origins = new Map<NodeId, TurnOrigin>();\n const visual: Bounds[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n const g = descriptorOf(id);\n if (!g.withRotation || g.supportsRotation?.(node.pose) === false) continue;\n originPoses.set(id, node.pose);\n // The pivot is a world point, so every measurement the gesture orbits\n // is taken from the world pose, not the stored one — carried into the\n // plane the edit is measured in, where the pointer's angle is read.\n const world = carryPose(g, poseFrame.world(id), invertPlane(planeOf(ctx.deps.view, node.layer)));\n const b = g.getBounds(world);\n origins.set(id, {\n world,\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n rotation: g.getRotation?.(world) ?? 0,\n });\n visual.push(visualBoundsViaDescriptor(world, g));\n }\n return { originPoses, origins, visual };\n}\n\nfunction buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n origins: ReadonlyMap<NodeId, TurnOrigin>,\n readers: GestureReaders,\n selectionMethods: SelectionApi['adapterMethods'],\n): GestureContext<unknown> {\n return {\n draggedIds: [...origins.keys()] as string[],\n origin: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n current: new Map([...origins].map(([id, o]) => [id as string, o.world])),\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: moveGestureAdapter(scene, undefined, selectionMethods) as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n}\n\n/** Capture a rotate at press. Null when nothing selected can turn. Runs each\n * behavior's `onStart`. */\nexport function beginRotate(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n): { session: RotateSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const params = resolveParams(opts?.params);\n const behaviors = (opts?.behaviors ?? DEFAULT_ROTATE_BEHAVIORS) as readonly RotateBehavior<unknown>[];\n\n if (!selection || !scene) return null;\n\n // A group whose pose derives from its children turns by turning them.\n const ids = shapeSources(scene, selection.get()) as NodeId[];\n if (ids.length === 0) return null;\n\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(ctx.deps.poseDescriptor));\n // The pivot the pointer orbits is a world point, so every pose the\n // gesture turns is a world pose. Each turned result is stored back in\n // the node's own parent frame at preview and commit alike.\n const poseFrame = scenePoseFrame(scene);\n const { originPoses, origins, visual } = captureOrigins(ctx, scene, ids, descriptorOf, poseFrame);\n if (originPoses.size === 0) return null;\n\n const union = unionAABB(visual)!;\n const pivot = { x: union.x + union.width / 2, y: union.y + union.height / 2 };\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, origins, readers, selection.adapterMethods);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n\n const session: RotateSession = {\n scene,\n ids,\n turn: {\n origins,\n pivot,\n useUnionPivot: ids.length > 1 && params?.['pivot'] !== 'each',\n descriptorOf,\n },\n poseFrame,\n view: ctx.deps.view,\n originPoses,\n startPointerAngle: Math.atan2(ctx.world.y - pivot.y, ctx.world.x - pivot.x),\n behaviors,\n gestureCtx,\n applyOps: ctx.deps.applyOps,\n selectionMethods: selection.adapterMethods,\n lifecycle: readGestureLifecycle(params, 'Rotate', behaviors),\n };\n return { session, readers };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":["captureOrigins","originPoses","origins","visual","id","ids","node","scene","g","descriptorOf","world","carryPose","poseFrame","invertPlane","planeOf","view","b","visualBoundsViaDescriptor","buildGestureContext","o","ctx","pointerStateOf","readers","sceneGestureFrames","moveGestureAdapter","selectionMethods","captureTurn","nodeDescriptors","poseDescriptorOf","poseDescriptor","scenePoseFrame","union","unionAABB","pivot","beginRotate","selection","params","resolveParams","opts","behaviors","DEFAULT_ROTATE_BEHAVIORS","shapeSources","captured","\"pivot\"","turn","gestureReaders","gestureCtx","readGestureLifecycle"],"sources":["../../../../src/interactions/actions/rotate/session.ts"],"sourcesContent":["import type { BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { resolveParams } from '@weasel-js/routing';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, RotateBehavior } from '../../gestures/types';\nimport { readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { DEFAULT_ROTATE_BEHAVIORS } from './behaviors';\nimport { moveGestureAdapter } from '../move/gestureAdapter';\nimport { carryPose, invertPlane, planeOf } from '../planeInput';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport { visualBoundsViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport { shapeSources } from '../selectionSubtree';\n\n/** One rotated node as the press found it, in the plane the pointer's angle\n * is read in. */\nexport interface TurnOrigin {\n readonly world: unknown;\n /** Center of `world`'s bounds. */\n readonly center: { x: number; y: number };\n readonly rotation: number;\n}\n\n/** What a turn by some delta is computed from. */\nexport interface Turn {\n readonly origins: ReadonlyMap<NodeId, TurnOrigin>;\n /** The point the pointer orbits: the center of what the selection draws. */\n readonly pivot: { x: number; y: number };\n /** Orbit each node's center around `pivot`, for a multi-selection. Off,\n * each node turns about its own center. */\n readonly useUnionPivot: boolean;\n readonly descriptorOf: (id: NodeId) => PoseDescriptor<unknown>;\n}\n\n/** What a rotate captured at press. Nothing here changes during the drag. */\nexport interface RotateSession {\n readonly scene: Scene<unknown, string, unknown>;\n readonly ids: readonly NodeId[];\n readonly turn: Turn;\n /** World reads and local writes over the scene's composition strategy. */\n readonly poseFrame: PoseFrame<unknown>;\n readonly view: unknown;\n /** Each rotated node's pose as stored: the `from` of its op. */\n readonly originPoses: ReadonlyMap<NodeId, unknown>;\n /** Pointer angle around the pivot at press. */\n readonly startPointerAngle: number;\n readonly behaviors: readonly RotateBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly applyOps?: (ops: Op[], label: string) => void;\n readonly selectionMethods: SelectionApi['adapterMethods'] | undefined;\n readonly lifecycle: GestureLifecycle;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface RotateFrame {\n /** Radians turned since press, as the behaviors shaped it. */\n readonly delta: number;\n /** Stored-frame pose of every rotated id; empty at a zero delta. */\n readonly previews: Map<NodeId, unknown>;\n}\n\nfunction captureOrigins(\n view: unknown,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>,\n poseFrame: PoseFrame<unknown>,\n): { originPoses: Map<NodeId, unknown>; origins: Map<NodeId, TurnOrigin>; visual: Bounds[] } {\n const originPoses = new Map<NodeId, unknown>();\n const origins = new Map<NodeId, TurnOrigin>();\n const visual: Bounds[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n const g = descriptorOf(id);\n if (!g.withRotation || g.supportsRotation?.(node.pose) === false) continue;\n originPoses.set(id, node.pose);\n // The pivot is a world point, so every measurement the gesture orbits\n // is taken from the world pose, not the stored one — carried into the\n // plane the edit is measured in, where the pointer's angle is read.\n const world = carryPose(g, poseFrame.world(id), invertPlane(planeOf(view, node.layer)));\n const b = g.getBounds(world);\n origins.set(id, {\n world,\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n rotation: g.getRotation?.(world) ?? 0,\n });\n visual.push(visualBoundsViaDescriptor(world, g));\n }\n return { originPoses, origins, visual };\n}\n\nfunction buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n origins: ReadonlyMap<NodeId, TurnOrigin>,\n readers: GestureReaders,\n selectionMethods: SelectionApi['adapterMethods'],\n): GestureContext<unknown> {\n return {\n draggedIds: [...origins.keys()] as string[],\n origin: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n current: new Map([...origins].map(([id, o]) => [id as string, o.world])),\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: moveGestureAdapter(scene, undefined, selectionMethods) as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n}\n\n/** What turning `ids` (already resolved to shape sources) is computed from,\n * with each one's pose as stored. Null when none of them can turn. */\nexport function captureTurn(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n view: unknown,\n poseDescriptor: Parameters<typeof poseDescriptorOf>[0],\n pivot: 'union' | 'each',\n): { turn: Turn; originPoses: Map<NodeId, unknown>; poseFrame: PoseFrame<unknown> } | null {\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(poseDescriptor));\n // The pivot the pointer orbits is a world point, so every pose the\n // gesture turns is a world pose. Each turned result is stored back in\n // the node's own parent frame at preview and commit alike.\n const poseFrame = scenePoseFrame(scene);\n const { originPoses, origins, visual } = captureOrigins(view, scene, ids, descriptorOf, poseFrame);\n if (originPoses.size === 0) return null;\n const union = unionAABB(visual)!;\n return {\n turn: {\n origins,\n pivot: { x: union.x + union.width / 2, y: union.y + union.height / 2 },\n useUnionPivot: ids.length > 1 && pivot !== 'each',\n descriptorOf,\n },\n originPoses,\n poseFrame,\n };\n}\n\n/** Capture a rotate at press. Null when nothing selected can turn. Runs each\n * behavior's `onStart`. */\nexport function beginRotate(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n): { session: RotateSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const params = resolveParams(opts?.params);\n const behaviors = (opts?.behaviors ?? DEFAULT_ROTATE_BEHAVIORS) as readonly RotateBehavior<unknown>[];\n\n if (!selection || !scene) return null;\n\n // A group whose pose derives from its children turns by turning them.\n const ids = shapeSources(scene, selection.get()) as NodeId[];\n if (ids.length === 0) return null;\n\n const captured = captureTurn(\n scene, ids, ctx.deps.view, ctx.deps.poseDescriptor, params?.['pivot'] === 'each' ? 'each' : 'union',\n );\n if (!captured) return null;\n const { turn, originPoses, poseFrame } = captured;\n const { origins, pivot } = turn;\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, origins, readers, selection.adapterMethods);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n\n const session: RotateSession = {\n scene,\n ids,\n turn,\n poseFrame,\n view: ctx.deps.view,\n originPoses,\n startPointerAngle: Math.atan2(ctx.world.y - pivot.y, ctx.world.x - pivot.x),\n behaviors,\n gestureCtx,\n applyOps: ctx.deps.applyOps,\n selectionMethods: selection.adapterMethods,\n lifecycle: readGestureLifecycle(params, 'Rotate', behaviors),\n };\n return { session, readers };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { poseDescriptorOf as e } from "../poseDescriptorDep.js";
|
|
2
|
+
import { defaultCommitAdapter as t } from "../defaultCommitAdapter.js";
|
|
3
|
+
import { lastTransform as n, recordTransform as r } from "./memory.js";
|
|
4
|
+
import { resizeSelectionOps as i } from "../resize/replay.js";
|
|
5
|
+
import { TransformAgainIcon as a } from "../defaults/icons/editIcons.js";
|
|
6
|
+
import { requiresSelection as o } from "../defaults/requiresSelection.js";
|
|
7
|
+
import { DUPLICATE_OFFSET as s, duplicateSelection as c } from "../defaults/duplicate.js";
|
|
8
|
+
import { translateSelection as l } from "../defaults/nudge.js";
|
|
9
|
+
import { rotateSelectionOps as u } from "../rotate/replay.js";
|
|
10
|
+
import { createElement as d } from "react";
|
|
11
|
+
//#region src/interactions/actions/transform-again/action.ts
|
|
12
|
+
var f = "Transform Again", p = {
|
|
13
|
+
kind: "duplicate",
|
|
14
|
+
dx: s,
|
|
15
|
+
dy: s
|
|
16
|
+
};
|
|
17
|
+
function m(e, n, r) {
|
|
18
|
+
return r.length !== 0 && (e.applyOps ? e.applyOps(r, f) : n.applyBatch(r, f, t(n, e.selection?.adapterMethods)), !0);
|
|
19
|
+
}
|
|
20
|
+
function h(t, n, r) {
|
|
21
|
+
let a = t.selection, o = a.get();
|
|
22
|
+
switch (r.kind) {
|
|
23
|
+
case "duplicate": return c(t, r.dx, r.dy, f);
|
|
24
|
+
case "translate": return l(a, n, r.dx, r.dy, t.applyOps, t.geometryProjection, e(t.poseDescriptor), f) ? o : null;
|
|
25
|
+
case "rotate": return m(t, n, u(n, o, t.view, t.poseDescriptor, r.angle, r.pivot, f)) ? o : null;
|
|
26
|
+
case "scale": return m(t, n, i(n, o, r.anchor, r.to, t, f)) ? o : null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
var g = {
|
|
30
|
+
id: "transformAgain",
|
|
31
|
+
label: f,
|
|
32
|
+
icon: d(a),
|
|
33
|
+
group: "edit",
|
|
34
|
+
defaultBinding: {
|
|
35
|
+
kind: "key",
|
|
36
|
+
key: "d",
|
|
37
|
+
mods: { mod: !0 }
|
|
38
|
+
},
|
|
39
|
+
eligible: { capability: "transforms-selection" },
|
|
40
|
+
requires: [
|
|
41
|
+
"scene",
|
|
42
|
+
"selection",
|
|
43
|
+
"applyOps",
|
|
44
|
+
"poseDescriptor",
|
|
45
|
+
"geometryProjection",
|
|
46
|
+
"resizePolicy",
|
|
47
|
+
"view"
|
|
48
|
+
],
|
|
49
|
+
invoker: {
|
|
50
|
+
timing: "immediate",
|
|
51
|
+
run: (e) => {
|
|
52
|
+
let t = e.scene;
|
|
53
|
+
if (!t || !e.selection || e.selection.get().length === 0) return;
|
|
54
|
+
let i = n(t) ?? p, a = h(e, t, i);
|
|
55
|
+
a && r(t, i, a);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
enabled: o
|
|
59
|
+
};
|
|
60
|
+
//#endregion
|
|
61
|
+
export { g as transformAgainAction };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.js","names":["LABEL","FIRST","DUPLICATE_OFFSET","commit","ops","deps","scene","defaultCommitAdapter","replay","selection","selected","t","duplicateSelection","translateSelection","poseDescriptorOf","rotateSelectionOps","resizeSelectionOps","transformAgainAction","createElement","TransformAgainIcon","lastTransform","subject","recordTransform","requiresSelection"],"sources":["../../../../src/interactions/actions/transform-again/action.ts"],"sourcesContent":["import type { Action, ActionDeps } from '@weasel-js/routing';\nimport type { Op } from 'core/ops/types';\nimport type { Scene } from 'core/scene/types';\nimport { createElement } from 'react';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { DUPLICATE_OFFSET, duplicateSelection } from '../defaults/duplicate';\nimport { TransformAgainIcon } from '../defaults/icons/editIcons';\nimport { translateSelection } from '../defaults/nudge';\nimport { requiresSelection } from '../defaults/requiresSelection';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { resizeSelectionOps } from '../resize/replay';\nimport { rotateSelectionOps } from '../rotate/replay';\nimport { lastTransform, recordTransform, type RepeatableTransform } from './memory';\n\nconst LABEL = 'Transform Again';\n\n/** With nothing recorded yet, a repeat is a plain duplicate. */\nconst FIRST: RepeatableTransform = { kind: 'duplicate', dx: DUPLICATE_OFFSET, dy: DUPLICATE_OFFSET };\n\nfunction commit(deps: ActionDeps, scene: Scene<unknown, string, unknown>, ops: Op[]): boolean {\n if (ops.length === 0) return false;\n if (deps.applyOps) deps.applyOps(ops, LABEL);\n else scene.applyBatch(ops, LABEL, defaultCommitAdapter(scene, deps.selection?.adapterMethods));\n return true;\n}\n\n/** Apply `t` to the selection as one undo entry. Returns the ids selected\n * afterwards, or null when nothing changed. */\nfunction replay(deps: ActionDeps, scene: Scene<unknown, string, unknown>, t: RepeatableTransform): readonly string[] | null {\n const selection = deps.selection!;\n const selected = selection.get() as string[];\n switch (t.kind) {\n case 'duplicate':\n return duplicateSelection(deps, t.dx, t.dy, LABEL);\n case 'translate':\n return translateSelection(\n selection, scene, t.dx, t.dy, deps.applyOps, deps.geometryProjection,\n poseDescriptorOf(deps.poseDescriptor), LABEL,\n ) ? selected : null;\n case 'rotate':\n return commit(deps, scene, rotateSelectionOps(\n scene, selected, deps.view, deps.poseDescriptor, t.angle, t.pivot, LABEL,\n )) ? selected : null;\n case 'scale':\n return commit(deps, scene, resizeSelectionOps(scene, selected, t.anchor, t.to, deps, LABEL)) ? selected : null;\n }\n}\n\n/**\n * @experimental\n * Repeat the last move, rotate, resize, nudge, duplicate, or Alt-drag clone on\n * the current selection, as one undo entry. A repeated duplicate copies the\n * selection — the last copies — again by the same offset, so pressing it over\n * and over makes a step-and-repeat; moving the copies between a duplicate and\n * its repeat changes that offset. With nothing to repeat it duplicates.\n */\nexport const transformAgainAction: Action & { requires: string[] } = {\n id: 'transformAgain',\n label: LABEL,\n icon: createElement(TransformAgainIcon),\n group: 'edit',\n defaultBinding: { kind: 'key', key: 'd', mods: { mod: true } },\n eligible: { capability: 'transforms-selection' },\n requires: [\n 'scene', 'selection', 'applyOps', 'poseDescriptor', 'geometryProjection', 'resizePolicy', 'view',\n ],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const scene = deps.scene;\n if (!scene || !deps.selection || deps.selection.get().length === 0) return;\n const t = lastTransform(scene) ?? FIRST;\n const subject = replay(deps, scene, t);\n if (subject) recordTransform(scene, t, subject);\n },\n },\n enabled: requiresSelection,\n};\n"],"mappings":";;;;;;;;;;;AAcA,IAAMA,IAAQ,mBAGRC,IAA6B;CAAE,MAAM;CAAa,IAAIC;CAAkB,IAAIA;AAAiB;AAEnG,SAASC,EAAO,GAAkB,GAAwC,GAAoB;CAI5F,OAHIC,EAAI,WAAW,MACfC,EAAK,WAAUA,EAAK,SAASD,GAAKJ,CAAK,IACtCM,EAAM,WAAWF,GAAKJ,GAAOO,EAAqBD,GAAOD,EAAK,WAAW,cAAc,CAAC,GACtF;AACT;AAIA,SAASG,EAAO,GAAkB,GAAwC,GAAkD;CAC1H,IAAMC,IAAYJ,EAAK,WACjBK,IAAWD,EAAU,IAAI;CAC/B,QAAQE,EAAE,MAAV;EACE,KAAK,aACH,OAAOC,EAAmBP,GAAMM,EAAE,IAAIA,EAAE,IAAIX,CAAK;EACnD,KAAK,aACH,OAAOa,EACLJ,GAAWH,GAAOK,EAAE,IAAIA,EAAE,IAAIN,EAAK,UAAUA,EAAK,oBAClDS,EAAiBT,EAAK,cAAc,GAAGL,CACzC,IAAIU,IAAW;EACjB,KAAK,UACH,OAAOP,EAAOE,GAAMC,GAAOS,EACzBT,GAAOI,GAAUL,EAAK,MAAMA,EAAK,gBAAgBM,EAAE,OAAOA,EAAE,OAAOX,CACrE,CAAC,IAAIU,IAAW;EAClB,KAAK,SACH,OAAOP,EAAOE,GAAMC,GAAOU,EAAmBV,GAAOI,GAAUC,EAAE,QAAQA,EAAE,IAAIN,GAAML,CAAK,CAAC,IAAIU,IAAW;CAC9G;AACF;AAUA,IAAaO,IAAwD;CACnE,IAAI;CACJ,OAAOjB;CACP,MAAMkB,EAAcC,CAAkB;CACtC,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAC7D,UAAU,EAAE,YAAY,uBAAuB;CAC/C,UAAU;EACR;EAAS;EAAa;EAAY;EAAkB;EAAsB;EAAgB;CAC5F;CACA,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMb,IAAQD,EAAK;GACnB,IAAI,CAACC,KAAS,CAACD,EAAK,aAAaA,EAAK,UAAU,IAAI,CAAC,CAAC,WAAW,GAAG;GACpE,IAAMM,IAAIS,EAAcd,CAAK,KAAKL,GAC5BoB,IAAUb,EAAOH,GAAMC,GAAOK,CAAC;GACrC,AAAIU,KAASC,EAAgBhB,GAAOK,GAAGU,CAAO;EAChD;CACF;CACA,SAASE;AACX"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/interactions/actions/transform-again/memory.ts
|
|
2
|
+
var e = /* @__PURE__ */ new WeakMap();
|
|
3
|
+
function t(e, t) {
|
|
4
|
+
if (e.length !== t.length) return !1;
|
|
5
|
+
let n = new Set(e);
|
|
6
|
+
return t.every((e) => n.has(e));
|
|
7
|
+
}
|
|
8
|
+
function n(t) {
|
|
9
|
+
return e.get(t)?.transform;
|
|
10
|
+
}
|
|
11
|
+
function r(n, r, i) {
|
|
12
|
+
let a = e.get(n);
|
|
13
|
+
if (r.kind === "translate" && a?.transform.kind === "duplicate" && t(a.subject, i)) {
|
|
14
|
+
e.set(n, {
|
|
15
|
+
transform: {
|
|
16
|
+
kind: "duplicate",
|
|
17
|
+
dx: a.transform.dx + r.dx,
|
|
18
|
+
dy: a.transform.dy + r.dy
|
|
19
|
+
},
|
|
20
|
+
subject: [...i]
|
|
21
|
+
});
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
e.set(n, {
|
|
25
|
+
transform: r,
|
|
26
|
+
subject: [...i]
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function i(t) {
|
|
30
|
+
e.delete(t);
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { i as forgetTransform, n as lastTransform, r as recordTransform };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","names":["LAST","sameIds","a","b","set","id","lastTransform","scene","recordTransform","prev","transform","subject","forgetTransform"],"sources":["../../../../src/interactions/actions/transform-again/memory.ts"],"sourcesContent":["import type { ResizeAnchor } from '@weasel-js/routing';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\n\n/**\n * @experimental\n * A transform the selection underwent, kept relative so it can be applied to\n * whatever is selected next.\n *\n * - `translate`: a world offset.\n * - `rotate`: radians about the selection's center, or about each node's own\n * center (`pivot: 'each'`).\n * - `scale`: the box the selection was resized to, in units of the box it\n * started as (`{ x: 0, y: 0, width: 1, height: 1 }` is no change), and the\n * anchor the resize held fixed.\n * - `duplicate`: copy the selection, offset by `(dx, dy)`, and select the copies.\n */\nexport type RepeatableTransform =\n | { readonly kind: 'translate'; readonly dx: number; readonly dy: number }\n | { readonly kind: 'rotate'; readonly angle: number; readonly pivot: 'union' | 'each' }\n | { readonly kind: 'scale'; readonly to: Bounds; readonly anchor: ResizeAnchor }\n | { readonly kind: 'duplicate'; readonly dx: number; readonly dy: number };\n\ninterface Entry {\n readonly transform: RepeatableTransform;\n /** The ids selected once it landed. */\n readonly subject: readonly string[];\n}\n\nconst LAST = new WeakMap<object, Entry>();\n\nfunction sameIds(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const set = new Set(a);\n return b.every((id) => set.has(id));\n}\n\n/**\n * @experimental\n * The last transform recorded against `scene`, which `transformAgain` repeats.\n */\nexport function lastTransform(scene: object): RepeatableTransform | undefined {\n return LAST.get(scene)?.transform;\n}\n\n/**\n * @experimental\n * Remember `transform` as the last one `scene` underwent, `subject` being the\n * ids selected once it landed. A translate of exactly the copies a\n * `duplicate` just made folds into it, so the copies' offset from their\n * sources is what repeats: duplicate, drag the copy, and each repeat steps\n * one more copy along.\n */\nexport function recordTransform(\n scene: object,\n transform: RepeatableTransform,\n subject: readonly string[],\n): void {\n const prev = LAST.get(scene);\n if (\n transform.kind === 'translate'\n && prev?.transform.kind === 'duplicate'\n && sameIds(prev.subject, subject)\n ) {\n LAST.set(scene, {\n transform: { kind: 'duplicate', dx: prev.transform.dx + transform.dx, dy: prev.transform.dy + transform.dy },\n subject: [...subject],\n });\n return;\n }\n LAST.set(scene, { transform, subject: [...subject] });\n}\n\n/** @experimental Drop what `scene` remembers, so `transformAgain` has nothing to repeat. */\nexport function forgetTransform(scene: object): void {\n LAST.delete(scene);\n}\n"],"mappings":";AA4BA,IAAMA,oBAAO,IAAI,QAAuB;AAExC,SAASC,EAAQ,GAAsB,GAA+B;CACpE,IAAIC,EAAE,WAAWC,EAAE,QAAQ,OAAO;CAClC,IAAMC,IAAM,IAAI,IAAIF,CAAC;CACrB,OAAOC,EAAE,OAAO,MAAOC,EAAI,IAAIC,CAAE,CAAC;AACpC;AAMA,SAAgBC,EAAc,GAAgD;CAC5E,OAAON,EAAK,IAAIO,CAAK,CAAC,EAAE;AAC1B;AAUA,SAAgBC,EACd,GACA,GACA,GACM;CACN,IAAMC,IAAOT,EAAK,IAAIO,CAAK;CAC3B,IACEG,EAAU,SAAS,eAChBD,GAAM,UAAU,SAAS,eACzBR,EAAQQ,EAAK,SAASE,CAAO,GAChC;EACA,EAAK,IAAIJ,GAAO;GACd,WAAW;IAAE,MAAM;IAAa,IAAIE,EAAK,UAAU,KAAKC,EAAU;IAAI,IAAID,EAAK,UAAU,KAAKC,EAAU;GAAG;GAC3G,SAAS,CAAC,GAAGC,CAAO;EACtB,CAAC;EACD;CACF;CACA,EAAK,IAAIJ,GAAO;EAAE;EAAW,SAAS,CAAC,GAAGI,CAAO;CAAE,CAAC;AACtD;AAGA,SAAgBC,EAAgB,GAAqB;CACnD,EAAK,OAAOL,CAAK;AACnB"}
|
|
@@ -3,116 +3,134 @@ import { resizeAction as t } from "./resize/action.js";
|
|
|
3
3
|
import { rotateAction as n } from "./rotate/action.js";
|
|
4
4
|
import { areaSelectAction as r } from "./defaults/areaSelect.js";
|
|
5
5
|
import { insertAction as i } from "./insert/action.js";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import {
|
|
34
|
-
import {
|
|
35
|
-
import {
|
|
36
|
-
import {
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
39
|
-
import {
|
|
40
|
-
import {
|
|
6
|
+
import { insertRepositionAction as a } from "./insert/repositionAction.js";
|
|
7
|
+
import { clearSelectionAction as o } from "./defaults/clearSelection.js";
|
|
8
|
+
import { cloneAction as ee } from "./clone/action.js";
|
|
9
|
+
import { viewportDragPanAction as te } from "./defaults/viewportDragPan.js";
|
|
10
|
+
import { editAnchorsAction as ne } from "./edit-anchors/action.js";
|
|
11
|
+
import { lassoSelectAction as re } from "./lasso-select/action.js";
|
|
12
|
+
import { pinchZoomAction as s } from "./defaults/pinchZoom.js";
|
|
13
|
+
import { deleteAction as c } from "./defaults/delete.js";
|
|
14
|
+
import { ingestAction as l } from "./defaults/ingest.js";
|
|
15
|
+
import { clipboardCopyAction as u, clipboardCutAction as d, clipboardPasteAction as f, clipboardPasteEventAction as p } from "./clipboard/action.js";
|
|
16
|
+
import { enterTextEditAction as m } from "./defaults/enterTextEdit.js";
|
|
17
|
+
import { escapeAction as h } from "./defaults/escape.js";
|
|
18
|
+
import { cancelGestureAction as g } from "./defaults/cancelGesture.js";
|
|
19
|
+
import { selectAllAction as _ } from "./defaults/selectAll.js";
|
|
20
|
+
import { duplicateAction as v } from "./defaults/duplicate.js";
|
|
21
|
+
import { nudgeDownAction as y, nudgeLeftAction as b, nudgeRightAction as x, nudgeUpAction as S } from "./defaults/nudge.js";
|
|
22
|
+
import { transformAgainAction as C } from "./transform-again/action.js";
|
|
23
|
+
import { groupAction as w, ungroupAction as T } from "./defaults/group.js";
|
|
24
|
+
import { redoAction as E, undoAction as D } from "./defaults/undoRedo.js";
|
|
25
|
+
import { flipAction as O } from "./flip/action.js";
|
|
26
|
+
import { reorderBackwardAction as k, reorderForwardAction as A } from "./defaults/reorder.js";
|
|
27
|
+
import { alignBottomAction as j, alignCenterXAction as M, alignCenterYAction as N, alignLeftAction as P, alignRightAction as F, alignTopAction as I } from "./align/action.js";
|
|
28
|
+
import { distributeHorizontalAction as L, distributeVerticalAction as R } from "./distribute/action.js";
|
|
29
|
+
import { pathfinderCropAction as z, pathfinderDivideAction as B, pathfinderExcludeAction as V, pathfinderIntersectAction as H, pathfinderMergeAction as U, pathfinderSubtractAction as W, pathfinderTrimAction as G, pathfinderUnionAction as K } from "./booleans/action.js";
|
|
30
|
+
import { createOutlinesAction as ie } from "./outlines/createOutlinesAction.js";
|
|
31
|
+
import { outlineStrokeAction as q } from "./outlines/outlineStrokeAction.js";
|
|
32
|
+
import { insertRotateAction as J } from "./insert/rotateAction.js";
|
|
33
|
+
import { enterPathEditAction as Y } from "./defaults/enterPathEdit.js";
|
|
34
|
+
import { exitPathEditAction as ae } from "./defaults/exitPathEdit.js";
|
|
35
|
+
import { insertPathAnchorAction as oe } from "./defaults/insertPathAnchor.js";
|
|
36
|
+
import { bendSegmentAction as se } from "./defaults/bendSegment.js";
|
|
37
|
+
import { cutPathAtAnchorAction as ce, deleteAnchorsAction as le, marqueeAnchorsAction as ue, nudgeAnchorsDownAction as de, nudgeAnchorsLeftAction as fe, nudgeAnchorsRightAction as pe, nudgeAnchorsUpAction as me, selectAnchorAction as he } from "./defaults/anchorEditing.js";
|
|
38
|
+
import { makeHandlesSymmetricAction as ge, retractHandlesAction as _e } from "./defaults/anchorHandles.js";
|
|
39
|
+
import { averageAnchorsAction as ve, joinAnchorsAction as ye } from "./defaults/anchorJoin.js";
|
|
40
|
+
import { offsetPathAction as be, simplifyPathAction as xe } from "./pathCommands/simplifyOffset.js";
|
|
41
|
+
import { joinPathsAction as Se, snipAtCrossingsAction as Ce } from "./pathCommands/cutJoin.js";
|
|
42
|
+
import { setFillAction as X } from "./defaults/setFill.js";
|
|
43
|
+
import { setStrokeAction as we } from "./defaults/setStroke.js";
|
|
44
|
+
import { setFillOpacityAction as Te } from "./defaults/setFillOpacity.js";
|
|
45
|
+
import { setStrokeOpacityAction as Ee } from "./defaults/setStrokeOpacity.js";
|
|
46
|
+
import { useEffect as Z } from "react";
|
|
47
|
+
import { useLatest as Q } from "@weasel-js/react";
|
|
41
48
|
import "@weasel-js/routing";
|
|
42
|
-
import { useActionsRegistry as
|
|
49
|
+
import { useActionsRegistry as De, useOptionalActiveToolContext as Oe, useOptionalDepRegistry as ke } from "@weasel-js/routing/react";
|
|
43
50
|
//#region src/interactions/actions/useStandardActions.ts
|
|
44
51
|
var $ = [
|
|
45
|
-
m,
|
|
46
52
|
h,
|
|
47
53
|
g,
|
|
48
54
|
_,
|
|
49
|
-
s,
|
|
50
55
|
v,
|
|
51
|
-
y,
|
|
52
|
-
x,
|
|
53
|
-
b,
|
|
54
|
-
S,
|
|
55
|
-
E,
|
|
56
56
|
C,
|
|
57
|
+
me,
|
|
58
|
+
de,
|
|
59
|
+
fe,
|
|
60
|
+
pe,
|
|
61
|
+
le,
|
|
62
|
+
c,
|
|
57
63
|
w,
|
|
58
64
|
T,
|
|
59
|
-
O,
|
|
60
65
|
D,
|
|
61
|
-
|
|
66
|
+
E,
|
|
67
|
+
O,
|
|
68
|
+
S,
|
|
69
|
+
y,
|
|
70
|
+
b,
|
|
71
|
+
x,
|
|
62
72
|
A,
|
|
63
|
-
N,
|
|
64
|
-
P,
|
|
65
|
-
j,
|
|
66
73
|
k,
|
|
74
|
+
P,
|
|
75
|
+
M,
|
|
67
76
|
F,
|
|
68
77
|
I,
|
|
69
|
-
|
|
78
|
+
N,
|
|
79
|
+
j,
|
|
80
|
+
L,
|
|
81
|
+
R,
|
|
82
|
+
K,
|
|
83
|
+
W,
|
|
70
84
|
H,
|
|
85
|
+
V,
|
|
71
86
|
B,
|
|
72
87
|
z,
|
|
73
|
-
R,
|
|
74
|
-
L,
|
|
75
|
-
ie,
|
|
76
|
-
V,
|
|
77
|
-
W,
|
|
78
88
|
G,
|
|
89
|
+
U,
|
|
90
|
+
ie,
|
|
91
|
+
q,
|
|
79
92
|
e,
|
|
80
93
|
t,
|
|
81
94
|
n,
|
|
82
95
|
r,
|
|
83
96
|
i,
|
|
84
|
-
K,
|
|
85
|
-
o,
|
|
86
|
-
te,
|
|
87
|
-
q,
|
|
88
97
|
J,
|
|
98
|
+
a,
|
|
99
|
+
ee,
|
|
100
|
+
ne,
|
|
89
101
|
Y,
|
|
90
|
-
de,
|
|
91
|
-
ce,
|
|
92
|
-
le,
|
|
93
|
-
ue,
|
|
94
|
-
oe,
|
|
95
102
|
ae,
|
|
103
|
+
oe,
|
|
96
104
|
se,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
re,
|
|
100
|
-
ee,
|
|
101
|
-
a,
|
|
102
|
-
p,
|
|
103
|
-
pe,
|
|
104
|
-
me,
|
|
105
|
-
he,
|
|
105
|
+
ce,
|
|
106
|
+
_e,
|
|
106
107
|
ge,
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
ve,
|
|
109
|
+
ye,
|
|
110
|
+
xe,
|
|
111
|
+
be,
|
|
112
|
+
Ce,
|
|
113
|
+
Se,
|
|
114
|
+
ue,
|
|
115
|
+
he,
|
|
116
|
+
re,
|
|
117
|
+
s,
|
|
118
|
+
te,
|
|
119
|
+
o,
|
|
120
|
+
m,
|
|
121
|
+
X,
|
|
122
|
+
we,
|
|
123
|
+
Te,
|
|
124
|
+
Ee,
|
|
109
125
|
l,
|
|
110
126
|
d,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
127
|
+
u,
|
|
128
|
+
f,
|
|
129
|
+
p
|
|
130
|
+
], Ae = $.map((e) => e.id), je = { "clipboard.pasteEvent": "ingest" };
|
|
131
|
+
function Me(e) {
|
|
132
|
+
let t = Q(e), n = Oe(), r = Q(n), i = ke();
|
|
133
|
+
Z(() => {
|
|
116
134
|
if (!i) return;
|
|
117
135
|
let e = [];
|
|
118
136
|
for (let n of [
|
|
@@ -129,11 +147,11 @@ function xe(e) {
|
|
|
129
147
|
t,
|
|
130
148
|
r
|
|
131
149
|
]);
|
|
132
|
-
let a =
|
|
133
|
-
|
|
150
|
+
let a = De(), o = e.exclude ? [...e.exclude].join("\0") : "";
|
|
151
|
+
Z(() => {
|
|
134
152
|
if (!a || !i) return;
|
|
135
153
|
let e = new Set(o ? o.split("\0") : []), t = $.filter((t) => !e.has(t.id)).filter((t) => {
|
|
136
|
-
let n =
|
|
154
|
+
let n = je[t.id];
|
|
137
155
|
return n === void 0 || e.has(n);
|
|
138
156
|
}).map((e) => a.register(e));
|
|
139
157
|
return () => {
|
|
@@ -146,6 +164,6 @@ function xe(e) {
|
|
|
146
164
|
]);
|
|
147
165
|
}
|
|
148
166
|
//#endregion
|
|
149
|
-
export {
|
|
167
|
+
export { Ae as KIT_STANDARD_ACTION_IDS, Me as useStandardActions };
|
|
150
168
|
|
|
151
169
|
//# sourceMappingURL=useStandardActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStandardActions.js","names":["KIT_STANDARD_DESCRIPTORS","escapeAction","cancelGestureAction","selectAllAction","duplicateAction","deleteAction","groupAction","ungroupAction","undoAction","redoAction","flipAction","nudgeUpAction","nudgeDownAction","nudgeLeftAction","nudgeRightAction","reorderForwardAction","reorderBackwardAction","alignLeftAction","alignCenterXAction","alignRightAction","alignTopAction","alignCenterYAction","alignBottomAction","distributeHorizontalAction","distributeVerticalAction","pathfinderUnionAction","pathfinderSubtractAction","pathfinderIntersectAction","pathfinderExcludeAction","pathfinderDivideAction","pathfinderCropAction","pathfinderTrimAction","pathfinderMergeAction","createOutlinesAction","outlineStrokeAction","moveAction","resizeAction","rotateAction","areaSelectAction","insertAction","insertRotateAction","cloneAction","editAnchorsAction","enterPathEditAction","exitPathEditAction","insertPathAnchorAction","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","cutPathAtAnchorAction","marqueeAnchorsAction","selectAnchorAction","lassoSelectAction","pinchZoomAction","viewportDragPanAction","clearSelectionAction","enterTextEditAction","setFillAction","setStrokeAction","setFillOpacityAction","setStrokeOpacityAction","ingestAction","clipboardCutAction","clipboardCopyAction","clipboardPasteAction","clipboardPasteEventAction","KIT_STANDARD_ACTION_IDS","a","YIELDS_TO","useStandardActions","optsRef","useLatest","opts","activeToolCtx","useOptionalActiveToolContext","activeToolCtxRef","depReg","useOptionalDepRegistry","unregisters","key","u","reg","useActionsRegistry","excludeKey","excluded","over"],"sources":["../../../src/interactions/actions/useStandardActions.ts"],"sourcesContent":["/**\n * @experimental\n * `useStandardActions` — register the kit-standard action descriptors into the\n * nearest `<ActionsProvider>` and publish dep sources into the nearest\n * `<DepRegistryProvider>`. Falls back silently to a no-op when either is\n * not in scope.\n */\nimport { useEffect } from 'react';\nimport type { Action } from '@weasel-js/routing';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport { type DepName, type DepSchema } from '@weasel-js/routing';\nimport { useOptionalDepRegistry } from '@weasel-js/routing/react';\n// Reaches depSchema.ts so tsup's per-entry dts compiler resolves `DepSchema['selection']`\n// here; `tsc --noEmit` happens to pick it up via test files, tsup does not. It MUST be\n// `import type` — a bare `import './depSchema'` makes esbuild emit a runtime import that it\n// then drops under the package's `sideEffects: false`, warning on every build.\nimport type {} from './depSchema';\nimport { useOptionalActiveToolContext } from '@weasel-js/routing/react';\n\nimport { escapeAction } from './defaults/escape';\nimport { cancelGestureAction } from './defaults/cancelGesture';\nimport { selectAllAction } from './defaults/selectAll';\nimport { deleteAction } from './defaults/delete';\nimport { duplicateAction } from './defaults/duplicate';\nimport { groupAction, ungroupAction } from './defaults/group';\nimport { undoAction, redoAction } from './defaults/undoRedo';\nimport { flipAction } from './flip/action';\nimport {\n nudgeUpAction, nudgeDownAction, nudgeLeftAction, nudgeRightAction,\n} from './defaults/nudge';\nimport { reorderForwardAction, reorderBackwardAction } from './defaults/reorder';\nimport {\n alignLeftAction, alignRightAction, alignTopAction, alignBottomAction,\n alignCenterXAction, alignCenterYAction,\n} from './align/action';\nimport {\n distributeHorizontalAction, distributeVerticalAction,\n} from './distribute/action';\nimport {\n pathfinderUnionAction, pathfinderSubtractAction, pathfinderIntersectAction,\n pathfinderExcludeAction, pathfinderDivideAction, pathfinderCropAction,\n pathfinderTrimAction, pathfinderMergeAction,\n} from './booleans/action';\nimport { createOutlinesAction } from './outlines/createOutlinesAction';\nimport { outlineStrokeAction } from './outlines/outlineStrokeAction';\nimport { moveAction } from './move/action';\nimport { resizeAction } from './resize/action';\nimport { rotateAction } from './rotate/action';\nimport { areaSelectAction } from './defaults/areaSelect';\nimport { insertAction } from './insert/action';\nimport { insertRotateAction } from './insert/rotateAction';\nimport { clearSelectionAction } from './defaults/clearSelection';\nimport { cloneAction } from './clone/action';\nimport { editAnchorsAction } from './edit-anchors/action';\nimport { enterPathEditAction } from './defaults/enterPathEdit';\nimport { exitPathEditAction } from './defaults/exitPathEdit';\nimport { insertPathAnchorAction } from './defaults/insertPathAnchor';\nimport {\n nudgeAnchorsUpAction,\n nudgeAnchorsDownAction,\n nudgeAnchorsLeftAction,\n nudgeAnchorsRightAction,\n deleteAnchorsAction,\n cutPathAtAnchorAction,\n marqueeAnchorsAction,\n selectAnchorAction,\n} from './defaults/anchorEditing';\nimport { lassoSelectAction } from './lasso-select/action';\nimport { pinchZoomAction } from './defaults/pinchZoom';\nimport { viewportDragPanAction } from './defaults/viewportDragPan';\nimport { enterTextEditAction } from './defaults/enterTextEdit';\nimport { setFillAction } from './defaults/setFill';\nimport { setStrokeAction } from './defaults/setStroke';\nimport { setFillOpacityAction } from './defaults/setFillOpacity';\nimport { setStrokeOpacityAction } from './defaults/setStrokeOpacity';\nimport { ingestAction } from './defaults/ingest';\nimport {\n clipboardCopyAction, clipboardCutAction, clipboardPasteAction, clipboardPasteEventAction,\n} from './clipboard/action';\n\n/** @experimental */\nexport interface UseStandardActionsOptions {\n /** Kit selection state — ids of currently selected nodes. */\n selection?: DepSchema['selection'];\n /** Current viewport — camera position + scale. */\n view?: DepSchema['view'];\n /** Scene tree — structural reads + undoable mutations. */\n scene?: DepSchema['scene'];\n /** Undo/redo history bound to the current scene. */\n history?: DepSchema['history'];\n /** Currently active tool id + hotkey-hold stack. */\n activeTool?: DepSchema['activeTool'];\n /**\n * Ids of kit-standard actions to leave unregistered, so a consumer can bind\n * its own. Ids that name no kit action are ignored;\n * `KIT_STANDARD_ACTION_IDS` is the full list.\n */\n exclude?: Iterable<string>;\n}\n\n/**\n * The ordered list of all kit-standard action descriptors. `viewport.pan`\n * and `viewport.zoom` are NOT in this list — they're registered conditionally\n * by SceneCanvas's `useViewportActions` based on the `viewport.pan` /\n * `viewport.zoom` flags.\n */\nconst KIT_STANDARD_DESCRIPTORS: Action[] = [\n escapeAction,\n cancelGestureAction,\n selectAllAction,\n duplicateAction,\n deleteAction,\n groupAction,\n ungroupAction,\n undoAction,\n redoAction,\n flipAction,\n nudgeUpAction,\n nudgeDownAction,\n nudgeLeftAction,\n nudgeRightAction,\n reorderForwardAction,\n reorderBackwardAction,\n alignLeftAction,\n alignCenterXAction,\n alignRightAction,\n alignTopAction,\n alignCenterYAction,\n alignBottomAction,\n distributeHorizontalAction,\n distributeVerticalAction,\n pathfinderUnionAction,\n pathfinderSubtractAction,\n pathfinderIntersectAction,\n pathfinderExcludeAction,\n pathfinderDivideAction,\n pathfinderCropAction,\n pathfinderTrimAction,\n pathfinderMergeAction,\n createOutlinesAction,\n outlineStrokeAction,\n moveAction,\n resizeAction,\n rotateAction,\n areaSelectAction,\n insertAction,\n insertRotateAction,\n cloneAction,\n editAnchorsAction,\n enterPathEditAction,\n exitPathEditAction,\n insertPathAnchorAction,\n nudgeAnchorsUpAction,\n nudgeAnchorsDownAction,\n nudgeAnchorsLeftAction,\n nudgeAnchorsRightAction,\n deleteAnchorsAction,\n cutPathAtAnchorAction,\n marqueeAnchorsAction,\n selectAnchorAction,\n lassoSelectAction,\n pinchZoomAction,\n viewportDragPanAction,\n clearSelectionAction,\n enterTextEditAction,\n setFillAction,\n setStrokeAction,\n setFillOpacityAction,\n setStrokeOpacityAction,\n ingestAction,\n clipboardCutAction,\n clipboardCopyAction,\n clipboardPasteAction,\n clipboardPasteEventAction,\n];\n\n/** Every id `useStandardActions` can register, in registration order. It\n * holds `clipboard.pasteEvent` back unless `ingest` is excluded. */\nexport const KIT_STANDARD_ACTION_IDS: readonly string[] =\n KIT_STANDARD_DESCRIPTORS.map((a) => a.id);\n\n/**\n * Kit-standard actions that stay unregistered while another one is\n * registered, because that one binds the same gesture and does everything\n * this one does: both answering it would act twice. Keyed by the action that\n * yields.\n */\nconst YIELDS_TO: Readonly<Record<string, string>> = {\n 'clipboard.pasteEvent': 'ingest',\n};\n\n/**\n * @experimental\n * Register each kit-standard dep source and action descriptor into the\n * surrounding `<ActionsProvider>` and `<DepRegistryProvider>` (typically\n * provided by `<SceneCanvas>`); a silent no-op when either is absent.\n *\n * Each option is published as a live source in the dep registry under its\n * canonical name (`selection`, `scene`, …). The source reads the latest\n * option value at invocation time, so consumers don't have to memoize their\n * dep objects.\n */\nexport function useStandardActions(opts: UseStandardActionsOptions): void {\n // --- Stabilize opts via ref ---\n const optsRef = useLatest(opts);\n\n // --- activeTool fallback: read from context when not supplied in opts ---\n const activeToolCtx = useOptionalActiveToolContext();\n const activeToolCtxRef = useLatest(activeToolCtx);\n\n // --- Dep source registration ---\n const depReg = useOptionalDepRegistry();\n\n useEffect(() => {\n if (!depReg) return;\n const unregisters: Array<() => void> = [];\n const keys = ['selection', 'view', 'scene', 'history'] as const;\n for (const key of keys) {\n unregisters.push(\n depReg.register(key as DepName, () => optsRef.current[key] as DepSchema[DepName]),\n );\n }\n // activeTool: prefer the explicit opt; fall back to the context value so\n // SceneCanvas doesn't need to thread it through StandardActionsRegistrar.\n unregisters.push(\n depReg.register('activeTool' as DepName, () =>\n (optsRef.current.activeTool ?? activeToolCtxRef.current) as DepSchema[DepName],\n ),\n );\n return () => { for (const u of unregisters) u(); };\n }, [depReg, optsRef, activeToolCtxRef]);\n\n // --- Action descriptor registration ---\n const reg = useActionsRegistry();\n\n // Joined so a fresh array of the same ids does not re-register every render.\n const excludeKey = opts.exclude ? [...opts.exclude].join('\\u0000') : '';\n\n useEffect(() => {\n if (!reg || !depReg) return;\n const excluded = new Set(excludeKey ? excludeKey.split('\\u0000') : []);\n const unregisters = KIT_STANDARD_DESCRIPTORS\n .filter((a) => !excluded.has(a.id))\n .filter((a) => {\n const over = YIELDS_TO[a.id];\n return over === undefined || excluded.has(over);\n })\n .map((a) => reg.register(a));\n return () => { for (const u of unregisters) u(); };\n }, [reg, depReg, excludeKey]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GA,IAAMA,IAAqC;CACzCC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;AACF,GAIaC,KACXpE,EAAyB,KAAK,MAAMqE,EAAE,EAAE,GAQpCC,KAA8C,EAClD,wBAAwB,SAC1B;AAaA,SAAgBC,GAAmB,GAAuC;CAExE,IAAMC,IAAUC,EAAUC,CAAI,GAGxBC,IAAgBC,EAA6B,GAC7CC,IAAmBJ,EAAUE,CAAa,GAG1CG,IAASC,GAAuB;CAEtC,QAAgB;EACd,IAAI,CAACD,GAAQ;EACb,IAAME,IAAiC,CAAC;EAExC,KAAK,IAAMC,KAAO;GADJ;GAAa;GAAQ;GAAS;EAC1B,GAChB,EAAY,KACVH,EAAO,SAASG,SAAsBT,EAAQ,QAAQS,EAA0B,CAClF;EASF,OALAD,EAAY,KACVF,EAAO,SAAS,oBACbN,EAAQ,QAAQ,cAAcK,EAAiB,OAClD,CACF,SACa;GAAE,KAAK,IAAMK,KAAKF,GAAa,EAAE;EAAG;CACnD,GAAG;EAACF;EAAQN;EAASK;CAAgB,CAAC;CAGtC,IAAMM,IAAMC,GAAmB,GAGzBC,IAAaX,EAAK,UAAU,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC,KAAK,IAAQ,IAAI;CAErE,QAAgB;EACd,IAAI,CAACS,KAAO,CAACL,GAAQ;EACrB,IAAMQ,IAAW,IAAI,IAAID,IAAaA,EAAW,MAAM,IAAQ,IAAI,CAAC,CAAC,GAC/DL,IAAchF,EACjB,QAAQ,MAAM,CAACsF,EAAS,IAAIjB,EAAE,EAAE,CAAC,CAAC,CAClC,QAAQ,MAAM;GACb,IAAMkB,IAAOjB,GAAUD,EAAE;GACzB,OAAOkB,MAAS,KAAA,KAAaD,EAAS,IAAIC,CAAI;EAChD,CAAC,CAAC,CACD,KAAK,MAAMJ,EAAI,SAASd,CAAC,CAAC;EAC7B,aAAa;GAAE,KAAK,IAAMa,KAAKF,GAAa,EAAE;EAAG;CACnD,GAAG;EAACG;EAAKL;EAAQO;CAAU,CAAC;AAC9B"}
|
|
1
|
+
{"version":3,"file":"useStandardActions.js","names":["KIT_STANDARD_DESCRIPTORS","escapeAction","cancelGestureAction","selectAllAction","duplicateAction","transformAgainAction","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","deleteAction","groupAction","ungroupAction","undoAction","redoAction","flipAction","nudgeUpAction","nudgeDownAction","nudgeLeftAction","nudgeRightAction","reorderForwardAction","reorderBackwardAction","alignLeftAction","alignCenterXAction","alignRightAction","alignTopAction","alignCenterYAction","alignBottomAction","distributeHorizontalAction","distributeVerticalAction","pathfinderUnionAction","pathfinderSubtractAction","pathfinderIntersectAction","pathfinderExcludeAction","pathfinderDivideAction","pathfinderCropAction","pathfinderTrimAction","pathfinderMergeAction","createOutlinesAction","outlineStrokeAction","moveAction","resizeAction","rotateAction","areaSelectAction","insertAction","insertRotateAction","insertRepositionAction","cloneAction","editAnchorsAction","enterPathEditAction","exitPathEditAction","insertPathAnchorAction","bendSegmentAction","cutPathAtAnchorAction","retractHandlesAction","makeHandlesSymmetricAction","averageAnchorsAction","joinAnchorsAction","simplifyPathAction","offsetPathAction","snipAtCrossingsAction","joinPathsAction","marqueeAnchorsAction","selectAnchorAction","lassoSelectAction","pinchZoomAction","viewportDragPanAction","clearSelectionAction","enterTextEditAction","setFillAction","setStrokeAction","setFillOpacityAction","setStrokeOpacityAction","ingestAction","clipboardCutAction","clipboardCopyAction","clipboardPasteAction","clipboardPasteEventAction","KIT_STANDARD_ACTION_IDS","a","YIELDS_TO","useStandardActions","optsRef","useLatest","opts","activeToolCtx","useOptionalActiveToolContext","activeToolCtxRef","depReg","useOptionalDepRegistry","unregisters","key","u","reg","useActionsRegistry","excludeKey","excluded","over"],"sources":["../../../src/interactions/actions/useStandardActions.ts"],"sourcesContent":["/**\n * @experimental\n * `useStandardActions` — register the kit-standard action descriptors into the\n * nearest `<ActionsProvider>` and publish dep sources into the nearest\n * `<DepRegistryProvider>`. Falls back silently to a no-op when either is\n * not in scope.\n */\nimport { useEffect } from 'react';\nimport type { Action } from '@weasel-js/routing';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport { type DepName, type DepSchema } from '@weasel-js/routing';\nimport { useOptionalDepRegistry } from '@weasel-js/routing/react';\n// Reaches depSchema.ts so tsup's per-entry dts compiler resolves `DepSchema['selection']`\n// here; `tsc --noEmit` happens to pick it up via test files, tsup does not. It MUST be\n// `import type` — a bare `import './depSchema'` makes esbuild emit a runtime import that it\n// then drops under the package's `sideEffects: false`, warning on every build.\nimport type {} from './depSchema';\nimport { useOptionalActiveToolContext } from '@weasel-js/routing/react';\n\nimport { escapeAction } from './defaults/escape';\nimport { cancelGestureAction } from './defaults/cancelGesture';\nimport { selectAllAction } from './defaults/selectAll';\nimport { deleteAction } from './defaults/delete';\nimport { duplicateAction } from './defaults/duplicate';\nimport { transformAgainAction } from './transform-again/action';\nimport { groupAction, ungroupAction } from './defaults/group';\nimport { undoAction, redoAction } from './defaults/undoRedo';\nimport { flipAction } from './flip/action';\nimport {\n nudgeUpAction, nudgeDownAction, nudgeLeftAction, nudgeRightAction,\n} from './defaults/nudge';\nimport { reorderForwardAction, reorderBackwardAction } from './defaults/reorder';\nimport {\n alignLeftAction, alignRightAction, alignTopAction, alignBottomAction,\n alignCenterXAction, alignCenterYAction,\n} from './align/action';\nimport {\n distributeHorizontalAction, distributeVerticalAction,\n} from './distribute/action';\nimport {\n pathfinderUnionAction, pathfinderSubtractAction, pathfinderIntersectAction,\n pathfinderExcludeAction, pathfinderDivideAction, pathfinderCropAction,\n pathfinderTrimAction, pathfinderMergeAction,\n} from './booleans/action';\nimport { createOutlinesAction } from './outlines/createOutlinesAction';\nimport { outlineStrokeAction } from './outlines/outlineStrokeAction';\nimport { moveAction } from './move/action';\nimport { resizeAction } from './resize/action';\nimport { rotateAction } from './rotate/action';\nimport { areaSelectAction } from './defaults/areaSelect';\nimport { insertAction } from './insert/action';\nimport { insertRotateAction } from './insert/rotateAction';\nimport { insertRepositionAction } from './insert/repositionAction';\nimport { clearSelectionAction } from './defaults/clearSelection';\nimport { cloneAction } from './clone/action';\nimport { editAnchorsAction } from './edit-anchors/action';\nimport { enterPathEditAction } from './defaults/enterPathEdit';\nimport { exitPathEditAction } from './defaults/exitPathEdit';\nimport { insertPathAnchorAction } from './defaults/insertPathAnchor';\nimport { bendSegmentAction } from './defaults/bendSegment';\nimport { makeHandlesSymmetricAction, retractHandlesAction } from './defaults/anchorHandles';\nimport { averageAnchorsAction, joinAnchorsAction } from './defaults/anchorJoin';\nimport {\n joinPathsAction, offsetPathAction, simplifyPathAction, snipAtCrossingsAction,\n} from './pathCommands';\nimport {\n nudgeAnchorsUpAction,\n nudgeAnchorsDownAction,\n nudgeAnchorsLeftAction,\n nudgeAnchorsRightAction,\n deleteAnchorsAction,\n cutPathAtAnchorAction,\n marqueeAnchorsAction,\n selectAnchorAction,\n} from './defaults/anchorEditing';\nimport { lassoSelectAction } from './lasso-select/action';\nimport { pinchZoomAction } from './defaults/pinchZoom';\nimport { viewportDragPanAction } from './defaults/viewportDragPan';\nimport { enterTextEditAction } from './defaults/enterTextEdit';\nimport { setFillAction } from './defaults/setFill';\nimport { setStrokeAction } from './defaults/setStroke';\nimport { setFillOpacityAction } from './defaults/setFillOpacity';\nimport { setStrokeOpacityAction } from './defaults/setStrokeOpacity';\nimport { ingestAction } from './defaults/ingest';\nimport {\n clipboardCopyAction, clipboardCutAction, clipboardPasteAction, clipboardPasteEventAction,\n} from './clipboard/action';\n\n/** @experimental */\nexport interface UseStandardActionsOptions {\n /** Kit selection state — ids of currently selected nodes. */\n selection?: DepSchema['selection'];\n /** Current viewport — camera position + scale. */\n view?: DepSchema['view'];\n /** Scene tree — structural reads + undoable mutations. */\n scene?: DepSchema['scene'];\n /** Undo/redo history bound to the current scene. */\n history?: DepSchema['history'];\n /** Currently active tool id + hotkey-hold stack. */\n activeTool?: DepSchema['activeTool'];\n /**\n * Ids of kit-standard actions to leave unregistered, so a consumer can bind\n * its own. Ids that name no kit action are ignored;\n * `KIT_STANDARD_ACTION_IDS` is the full list.\n */\n exclude?: Iterable<string>;\n}\n\n/**\n * The ordered list of all kit-standard action descriptors. `viewport.pan`\n * and `viewport.zoom` are NOT in this list — they're registered conditionally\n * by SceneCanvas's `useViewportActions` based on the `viewport.pan` /\n * `viewport.zoom` flags.\n */\nconst KIT_STANDARD_DESCRIPTORS: Action[] = [\n escapeAction,\n cancelGestureAction,\n selectAllAction,\n duplicateAction,\n transformAgainAction,\n // Ahead of their node-level twins: with no mode registry nothing filters\n // by capability, so a keystroke goes to the first of these that is enabled.\n nudgeAnchorsUpAction,\n nudgeAnchorsDownAction,\n nudgeAnchorsLeftAction,\n nudgeAnchorsRightAction,\n deleteAnchorsAction,\n deleteAction,\n groupAction,\n ungroupAction,\n undoAction,\n redoAction,\n flipAction,\n nudgeUpAction,\n nudgeDownAction,\n nudgeLeftAction,\n nudgeRightAction,\n reorderForwardAction,\n reorderBackwardAction,\n alignLeftAction,\n alignCenterXAction,\n alignRightAction,\n alignTopAction,\n alignCenterYAction,\n alignBottomAction,\n distributeHorizontalAction,\n distributeVerticalAction,\n pathfinderUnionAction,\n pathfinderSubtractAction,\n pathfinderIntersectAction,\n pathfinderExcludeAction,\n pathfinderDivideAction,\n pathfinderCropAction,\n pathfinderTrimAction,\n pathfinderMergeAction,\n createOutlinesAction,\n outlineStrokeAction,\n moveAction,\n resizeAction,\n rotateAction,\n areaSelectAction,\n insertAction,\n insertRotateAction,\n insertRepositionAction,\n cloneAction,\n editAnchorsAction,\n enterPathEditAction,\n exitPathEditAction,\n insertPathAnchorAction,\n bendSegmentAction,\n cutPathAtAnchorAction,\n retractHandlesAction,\n makeHandlesSymmetricAction,\n averageAnchorsAction,\n joinAnchorsAction,\n simplifyPathAction,\n offsetPathAction,\n snipAtCrossingsAction,\n joinPathsAction,\n marqueeAnchorsAction,\n selectAnchorAction,\n lassoSelectAction,\n pinchZoomAction,\n viewportDragPanAction,\n clearSelectionAction,\n enterTextEditAction,\n setFillAction,\n setStrokeAction,\n setFillOpacityAction,\n setStrokeOpacityAction,\n ingestAction,\n clipboardCutAction,\n clipboardCopyAction,\n clipboardPasteAction,\n clipboardPasteEventAction,\n];\n\n/** Every id `useStandardActions` can register, in registration order. It\n * holds `clipboard.pasteEvent` back unless `ingest` is excluded. */\nexport const KIT_STANDARD_ACTION_IDS: readonly string[] =\n KIT_STANDARD_DESCRIPTORS.map((a) => a.id);\n\n/**\n * Kit-standard actions that stay unregistered while another one is\n * registered, because that one binds the same gesture and does everything\n * this one does: both answering it would act twice. Keyed by the action that\n * yields.\n */\nconst YIELDS_TO: Readonly<Record<string, string>> = {\n 'clipboard.pasteEvent': 'ingest',\n};\n\n/**\n * @experimental\n * Register each kit-standard dep source and action descriptor into the\n * surrounding `<ActionsProvider>` and `<DepRegistryProvider>` (typically\n * provided by `<SceneCanvas>`); a silent no-op when either is absent.\n *\n * Each option is published as a live source in the dep registry under its\n * canonical name (`selection`, `scene`, …). The source reads the latest\n * option value at invocation time, so consumers don't have to memoize their\n * dep objects.\n */\nexport function useStandardActions(opts: UseStandardActionsOptions): void {\n // --- Stabilize opts via ref ---\n const optsRef = useLatest(opts);\n\n // --- activeTool fallback: read from context when not supplied in opts ---\n const activeToolCtx = useOptionalActiveToolContext();\n const activeToolCtxRef = useLatest(activeToolCtx);\n\n // --- Dep source registration ---\n const depReg = useOptionalDepRegistry();\n\n useEffect(() => {\n if (!depReg) return;\n const unregisters: Array<() => void> = [];\n const keys = ['selection', 'view', 'scene', 'history'] as const;\n for (const key of keys) {\n unregisters.push(\n depReg.register(key as DepName, () => optsRef.current[key] as DepSchema[DepName]),\n );\n }\n // activeTool: prefer the explicit opt; fall back to the context value so\n // SceneCanvas doesn't need to thread it through StandardActionsRegistrar.\n unregisters.push(\n depReg.register('activeTool' as DepName, () =>\n (optsRef.current.activeTool ?? activeToolCtxRef.current) as DepSchema[DepName],\n ),\n );\n return () => { for (const u of unregisters) u(); };\n }, [depReg, optsRef, activeToolCtxRef]);\n\n // --- Action descriptor registration ---\n const reg = useActionsRegistry();\n\n // Joined so a fresh array of the same ids does not re-register every render.\n const excludeKey = opts.exclude ? [...opts.exclude].join('\\u0000') : '';\n\n useEffect(() => {\n if (!reg || !depReg) return;\n const excluded = new Set(excludeKey ? excludeKey.split('\\u0000') : []);\n const unregisters = KIT_STANDARD_DESCRIPTORS\n .filter((a) => !excluded.has(a.id))\n .filter((a) => {\n const over = YIELDS_TO[a.id];\n return over === undefined || excluded.has(over);\n })\n .map((a) => reg.register(a));\n return () => { for (const u of unregisters) u(); };\n }, [reg, depReg, excludeKey]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmHA,IAAMA,IAAqC;CACzCC;CACAC;CACAC;CACAC;CACAC;CAGAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;CACAC;AACF,GAIaC,KACX/E,EAAyB,KAAK,MAAMgF,EAAE,EAAE,GAQpCC,KAA8C,EAClD,wBAAwB,SAC1B;AAaA,SAAgBC,GAAmB,GAAuC;CAExE,IAAMC,IAAUC,EAAUC,CAAI,GAGxBC,IAAgBC,GAA6B,GAC7CC,IAAmBJ,EAAUE,CAAa,GAG1CG,IAASC,GAAuB;CAEtC,QAAgB;EACd,IAAI,CAACD,GAAQ;EACb,IAAME,IAAiC,CAAC;EAExC,KAAK,IAAMC,KAAO;GADJ;GAAa;GAAQ;GAAS;EAC1B,GAChB,EAAY,KACVH,EAAO,SAASG,SAAsBT,EAAQ,QAAQS,EAA0B,CAClF;EASF,OALAD,EAAY,KACVF,EAAO,SAAS,oBACbN,EAAQ,QAAQ,cAAcK,EAAiB,OAClD,CACF,SACa;GAAE,KAAK,IAAMK,KAAKF,GAAa,EAAE;EAAG;CACnD,GAAG;EAACF;EAAQN;EAASK;CAAgB,CAAC;CAGtC,IAAMM,IAAMC,GAAmB,GAGzBC,IAAaX,EAAK,UAAU,CAAC,GAAGA,EAAK,OAAO,CAAC,CAAC,KAAK,IAAQ,IAAI;CAErE,QAAgB;EACd,IAAI,CAACS,KAAO,CAACL,GAAQ;EACrB,IAAMQ,IAAW,IAAI,IAAID,IAAaA,EAAW,MAAM,IAAQ,IAAI,CAAC,CAAC,GAC/DL,IAAc3F,EACjB,QAAQ,MAAM,CAACiG,EAAS,IAAIjB,EAAE,EAAE,CAAC,CAAC,CAClC,QAAQ,MAAM;GACb,IAAMkB,IAAOjB,GAAUD,EAAE;GACzB,OAAOkB,MAAS,KAAA,KAAaD,EAAS,IAAIC,CAAI;EAChD,CAAC,CAAC,CACD,KAAK,MAAMJ,EAAI,SAASd,CAAC,CAAC;EAC7B,aAAa;GAAE,KAAK,IAAMa,KAAKF,GAAa,EAAE;EAAG;CACnD,GAAG;EAACG;EAAKL;EAAQO;CAAU,CAAC;AAC9B"}
|
package/dist/move.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { O as OriginProjection } from './originProjection-
|
|
2
|
-
export { U as UseMoveOptions } from './originProjection-
|
|
3
|
-
import { S as SnapTarget } from './types-
|
|
4
|
-
import { M as MoveBehavior } from './clone-
|
|
1
|
+
import { O as OriginProjection } from './originProjection-CoNVpITV.js';
|
|
2
|
+
export { U as UseMoveOptions } from './originProjection-CoNVpITV.js';
|
|
3
|
+
import { S as SnapTarget } from './types-DBbbCy0i.js';
|
|
4
|
+
import { M as MoveBehavior } from './clone-C0eADtS0.js';
|
|
5
5
|
import '@weasel-js/history';
|
|
6
6
|
import '@weasel-js/geom';
|
|
7
7
|
import '@weasel-js/routing';
|