@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,13 +1,13 @@
|
|
|
1
1
|
import { DEFAULT_MAX_ZOOM as e, DEFAULT_MIN_ZOOM as t } from "../../../core/viewport/zoomBounds.js";
|
|
2
2
|
import { viewToTransform as n } from "../../../core/viewport/view.js";
|
|
3
3
|
import { screenToWorld as r } from "../../../core/viewport/viewTransform.js";
|
|
4
|
-
import {
|
|
4
|
+
import { axisZoomFactor as i, zoomAt as a } from "../../../core/viewport/zoomAt.js";
|
|
5
5
|
//#region src/interactions/actions/defaults/pinchZoom.ts
|
|
6
|
-
function
|
|
7
|
-
let
|
|
8
|
-
min:
|
|
9
|
-
max:
|
|
10
|
-
};
|
|
6
|
+
function o(o = {}) {
|
|
7
|
+
let s = {
|
|
8
|
+
min: o.min ?? t,
|
|
9
|
+
max: o.max ?? e
|
|
10
|
+
}, c = o.axis ?? "both";
|
|
11
11
|
return {
|
|
12
12
|
id: "viewport.pinchZoom",
|
|
13
13
|
label: "Pinch Zoom",
|
|
@@ -20,34 +20,34 @@ function a(a = {}) {
|
|
|
20
20
|
invoker: {
|
|
21
21
|
timing: "ongoing",
|
|
22
22
|
start(e, t) {
|
|
23
|
-
let
|
|
24
|
-
if (!
|
|
25
|
-
let
|
|
26
|
-
if (!
|
|
27
|
-
let
|
|
28
|
-
view:
|
|
29
|
-
startSpread:
|
|
30
|
-
centroid:
|
|
31
|
-
},
|
|
23
|
+
let o = e.deps.view;
|
|
24
|
+
if (!o) return {};
|
|
25
|
+
let l = e.multiTouch;
|
|
26
|
+
if (!l) return {};
|
|
27
|
+
let u = {
|
|
28
|
+
view: o,
|
|
29
|
+
startSpread: l.spread > 0 ? l.spread : 1,
|
|
30
|
+
centroid: l.centroid
|
|
31
|
+
}, d = e.deps.debug, f = o.get(), [p, m] = r(l.centroid.x, l.centroid.y, n(f));
|
|
32
32
|
return {
|
|
33
33
|
kind: "pinch",
|
|
34
34
|
onMove(e) {
|
|
35
35
|
let t = e.multiTouch;
|
|
36
36
|
if (!t?.pinch) return;
|
|
37
37
|
let { currentSpread: n, centroid: r } = t.pinch;
|
|
38
|
-
if (n <= 0 ||
|
|
39
|
-
let
|
|
40
|
-
|
|
41
|
-
let
|
|
42
|
-
|
|
43
|
-
let
|
|
44
|
-
scale:
|
|
45
|
-
x:
|
|
46
|
-
y:
|
|
38
|
+
if (n <= 0 || u.startSpread <= 0) return;
|
|
39
|
+
let o = n / u.startSpread;
|
|
40
|
+
u.startSpread = n;
|
|
41
|
+
let l = u.centroid;
|
|
42
|
+
u.centroid = r;
|
|
43
|
+
let h = u.view.get(), g = a(h, l, i(o, c), s), _ = {
|
|
44
|
+
scale: g.scale,
|
|
45
|
+
x: g.x - (r.x - l.x) / g.scale.x,
|
|
46
|
+
y: g.y - (r.y - l.y) / g.scale.y
|
|
47
47
|
};
|
|
48
|
-
|
|
49
|
-
x:
|
|
50
|
-
y:
|
|
48
|
+
u.view.set(_), d?.recordViewport("zoom", f, _, {
|
|
49
|
+
x: p,
|
|
50
|
+
y: m
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
53
|
};
|
|
@@ -56,8 +56,8 @@ function a(a = {}) {
|
|
|
56
56
|
enabled: () => !0
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
var
|
|
59
|
+
var s = o();
|
|
60
60
|
//#endregion
|
|
61
|
-
export {
|
|
61
|
+
export { o as makePinchZoomAction, s as pinchZoomAction };
|
|
62
62
|
|
|
63
63
|
//# sourceMappingURL=pinchZoom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pinchZoom.js","names":["makePinchZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","view","ctx","multiTouch","scratch","debug","startView","ax","ay","screenToWorld","viewToTransform","mt","moveCtx","currentSpread","factor","prev","centroid","current","zoomed","zoomAt","next","pinchZoomAction"],"sources":["../../../../src/interactions/actions/defaults/pinchZoom.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { zoomAt } from 'core/viewport/zoomAt';\nimport { viewToTransform } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\n\ninterface PinchScratch {\n view: ViewApi;\n startSpread: number;\n centroid: { x: number; y: number };\n}\n\n/**\n * @experimental\n * Tuning for {@link makePinchZoomAction}.\n */\nexport interface PinchZoomOptions {\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n}\n\n/**\n * @experimental\n * Build a `viewport.pinchZoom` Action descriptor with a configurable scale\n * clamp. The same two-finger gesture zooms and pans, applied each frame.\n */\n// No `eligible` field → pinch zoom is always eligible across all modes.\nexport function makePinchZoomAction(\n opts: PinchZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n return {\n id: 'viewport.pinchZoom',\n label: 'Pinch Zoom',\n group: 'viewport',\n defaultBinding: { kind: 'multiTouch', fingers: 2 },\n requires: ['view', 'debug'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const view = ctx.deps.view;\n if (!view) return {};\n\n const multiTouch = ctx.multiTouch;\n if (!multiTouch) return {};\n\n const startSpread = multiTouch.spread > 0 ? multiTouch.spread : 1;\n\n const scratch: PinchScratch = { view, startSpread, centroid: multiTouch.centroid };\n const debug = ctx.deps.debug;\n const startView = view.get();\n const [ax, ay] = screenToWorld(multiTouch.centroid.x, multiTouch.centroid.y, viewToTransform(startView));\n\n return {\n kind: 'pinch',\n onMove(moveCtx: InvocationCtx): void {\n const mt = moveCtx.multiTouch;\n if (!mt?.pinch) return;\n const { currentSpread, centroid } = mt.pinch;\n if (currentSpread <= 0 || scratch.startSpread <= 0) return;\n const factor = currentSpread / scratch.startSpread;\n // Rebase each frame so the factor is incremental.\n scratch.startSpread = currentSpread;\n const prev = scratch.centroid;\n scratch.centroid = centroid;\n const current = scratch.view.get();\n // Anchor the zoom on where the fingers *were*, then translate by how\n // far they travelled — together those pin the world point under the\n // centroid as it moves. Anchoring on the new centroid instead drops\n // the translation half, so a two-finger drag zooms without panning.\n const zoomed = zoomAt(current, prev, factor, clamp);\n const next = {\n scale: zoomed.scale,\n x: zoomed.x - (centroid.x - prev.x) / zoomed.scale.x,\n y: zoomed.y - (centroid.y - prev.y) / zoomed.scale.y,\n };\n scratch.view.set(next);\n debug?.recordViewport('zoom', startView, next, { x: ax, y: ay });\n },\n };\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.pinchZoom` descriptor: two-finger pinch with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makePinchZoomAction()`.\n */\nexport const pinchZoomAction: Action & { requires: string[] } = makePinchZoomAction();\n"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"pinchZoom.js","names":["makePinchZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","axis","view","ctx","multiTouch","scratch","debug","startView","ax","ay","screenToWorld","viewToTransform","mt","moveCtx","currentSpread","factor","prev","centroid","current","zoomed","zoomAt","axisZoomFactor","next","pinchZoomAction"],"sources":["../../../../src/interactions/actions/defaults/pinchZoom.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { axisZoomFactor, zoomAt, type ZoomAxis } from 'core/viewport/zoomAt';\nimport { viewToTransform } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\n\ninterface PinchScratch {\n view: ViewApi;\n startSpread: number;\n centroid: { x: number; y: number };\n}\n\n/**\n * @experimental\n * Tuning for {@link makePinchZoomAction}.\n */\nexport interface PinchZoomOptions {\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n /** Hold the zoom to one axis. Default `'both'`. The two fingers still pan\n * on both. */\n axis?: ZoomAxis;\n}\n\n/**\n * @experimental\n * Build a `viewport.pinchZoom` Action descriptor with a configurable scale\n * clamp. The same two-finger gesture zooms and pans, applied each frame.\n */\n// No `eligible` field → pinch zoom is always eligible across all modes.\nexport function makePinchZoomAction(\n opts: PinchZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n const axis = opts.axis ?? 'both';\n return {\n id: 'viewport.pinchZoom',\n label: 'Pinch Zoom',\n group: 'viewport',\n defaultBinding: { kind: 'multiTouch', fingers: 2 },\n requires: ['view', 'debug'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const view = ctx.deps.view;\n if (!view) return {};\n\n const multiTouch = ctx.multiTouch;\n if (!multiTouch) return {};\n\n const startSpread = multiTouch.spread > 0 ? multiTouch.spread : 1;\n\n const scratch: PinchScratch = { view, startSpread, centroid: multiTouch.centroid };\n const debug = ctx.deps.debug;\n const startView = view.get();\n const [ax, ay] = screenToWorld(multiTouch.centroid.x, multiTouch.centroid.y, viewToTransform(startView));\n\n return {\n kind: 'pinch',\n onMove(moveCtx: InvocationCtx): void {\n const mt = moveCtx.multiTouch;\n if (!mt?.pinch) return;\n const { currentSpread, centroid } = mt.pinch;\n if (currentSpread <= 0 || scratch.startSpread <= 0) return;\n const factor = currentSpread / scratch.startSpread;\n // Rebase each frame so the factor is incremental.\n scratch.startSpread = currentSpread;\n const prev = scratch.centroid;\n scratch.centroid = centroid;\n const current = scratch.view.get();\n // Anchor the zoom on where the fingers *were*, then translate by how\n // far they travelled — together those pin the world point under the\n // centroid as it moves. Anchoring on the new centroid instead drops\n // the translation half, so a two-finger drag zooms without panning.\n const zoomed = zoomAt(current, prev, axisZoomFactor(factor, axis), clamp);\n const next = {\n scale: zoomed.scale,\n x: zoomed.x - (centroid.x - prev.x) / zoomed.scale.x,\n y: zoomed.y - (centroid.y - prev.y) / zoomed.scale.y,\n };\n scratch.view.set(next);\n debug?.recordViewport('zoom', startView, next, { x: ax, y: ay });\n },\n };\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.pinchZoom` descriptor: two-finger pinch with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makePinchZoomAction()`.\n */\nexport const pinchZoomAction: Action & { requires: string[] } = makePinchZoomAction();\n"],"mappings":";;;;;AAkCA,SAAgBA,EACd,IAAyB,CAAC,GACO;CACjC,IAAMC,IAAQ;EAAE,KAAKC,EAAK,OAAOC;EAAkB,KAAKD,EAAK,OAAOE;CAAiB,GAC/EC,IAAOH,EAAK,QAAQ;CAC1B,OAAO;EACL,IAAI;EACJ,OAAO;EACP,OAAO;EACP,gBAAgB;GAAE,MAAM;GAAc,SAAS;EAAE;EACjD,UAAU,CAAC,QAAQ,OAAO;EAC1B,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAsB;IAC9C,IAAMI,IAAOC,EAAI,KAAK;IACtB,IAAI,CAACD,GAAM,OAAO,CAAC;IAEnB,IAAME,IAAaD,EAAI;IACvB,IAAI,CAACC,GAAY,OAAO,CAAC;IAIzB,IAAMC,IAAwB;KAAE;KAAM,aAFlBD,EAAW,SAAS,IAAIA,EAAW,SAAS;KAEb,UAAUA,EAAW;IAAS,GAC3EE,IAAQH,EAAI,KAAK,OACjBI,IAAYL,EAAK,IAAI,GACrB,CAACM,GAAIC,KAAMC,EAAcN,EAAW,SAAS,GAAGA,EAAW,SAAS,GAAGO,EAAgBJ,CAAS,CAAC;IAEvG,OAAO;KACL,MAAM;KACN,OAAO,GAA8B;MACnC,IAAMK,IAAKC,EAAQ;MACnB,IAAI,CAACD,GAAI,OAAO;MAChB,IAAM,EAAE,kBAAe,gBAAaA,EAAG;MACvC,IAAIE,KAAiB,KAAKT,EAAQ,eAAe,GAAG;MACpD,IAAMU,IAASD,IAAgBT,EAAQ;MAEvC,EAAQ,cAAcS;MACtB,IAAME,IAAOX,EAAQ;MACrB,EAAQ,WAAWY;MACnB,IAAMC,IAAUb,EAAQ,KAAK,IAAI,GAK3Bc,IAASC,EAAOF,GAASF,GAAMK,EAAeN,GAAQd,CAAI,GAAGJ,CAAK,GAClEyB,IAAO;OACX,OAAOH,EAAO;OACd,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;OACnD,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;MACrD;MAEA,AADAd,EAAQ,KAAK,IAAIiB,CAAI,GACrBhB,GAAO,eAAe,QAAQC,GAAWe,GAAM;OAAE,GAAGd;OAAI,GAAGC;MAAG,CAAC;KACjE;IACF;GACF;EACF;EACA,eAAe;CACjB;AACF;AAOA,IAAac,IAAmD3B,EAAoB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { pathToAnchors as e, segmentAt as t } from "@weasel-js/geom";
|
|
2
|
+
//#region src/interactions/actions/defaults/segmentUnder.ts
|
|
3
|
+
var n = 8;
|
|
4
|
+
function r(r, i, a) {
|
|
5
|
+
let o = r?.editAnchors;
|
|
6
|
+
if (!o?.editingId) return null;
|
|
7
|
+
let s = o.getEditablePath(o.editingId);
|
|
8
|
+
if (!s || s.kind !== "polygon") return null;
|
|
9
|
+
let c = r?.view?.get().scale, l = t(e(s), i, a, {
|
|
10
|
+
tolerancePx: n,
|
|
11
|
+
...c ? { scale: c } : {}
|
|
12
|
+
});
|
|
13
|
+
return l ? {
|
|
14
|
+
dep: o,
|
|
15
|
+
path: s,
|
|
16
|
+
hit: l
|
|
17
|
+
} : null;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { r as segmentUnder };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=segmentUnder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"segmentUnder.js","names":["SEGMENT_HIT_PX","segmentUnder","dep","deps","path","scale","hit","segmentAt","pathToAnchors","x","y"],"sources":["../../../../src/interactions/actions/defaults/segmentUnder.ts"],"sourcesContent":["import type { ActionDeps } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport { pathToAnchors, segmentAt, type AnchorSet, type PolygonPath, type SegmentHit } from '@weasel-js/geom';\n\n/** Screen-px reach of a segment, and the radius around each anchor that\n * stays the anchor's. Matches the path-anchor affordance's default hit\n * radius, so the two regions meet without a gap. */\nconst SEGMENT_HIT_PX = 8;\n\n/** The segment of the path being edited under world point `(x, y)`, or null\n * off every segment, on an anchor, or with no path in edit mode. */\nexport function segmentUnder(\n deps: ActionDeps | undefined,\n x: number,\n y: number,\n): { dep: EditAnchorsDep; path: PolygonPath; hit: SegmentHit } | null {\n const dep = deps?.editAnchors;\n if (!dep?.editingId) return null;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath | null | undefined;\n if (!path || path.kind !== 'polygon') return null;\n const scale = deps?.view?.get().scale;\n const hit = segmentAt(pathToAnchors(path) as AnchorSet, x, y, {\n tolerancePx: SEGMENT_HIT_PX,\n ...(scale ? { scale } : {}),\n });\n return hit ? { dep, path, hit } : null;\n}\n"],"mappings":";;AAOA,IAAMA,IAAiB;AAIvB,SAAgBC,EACd,GACA,GACA,GACoE;CACpE,IAAMC,IAAMC,GAAM;CAClB,IAAI,CAACD,GAAK,WAAW,OAAO;CAC5B,IAAME,IAAOF,EAAI,gBAAgBA,EAAI,SAAS;CAC9C,IAAI,CAACE,KAAQA,EAAK,SAAS,WAAW,OAAO;CAC7C,IAAMC,IAAQF,GAAM,MAAM,IAAI,CAAC,CAAC,OAC1BG,IAAMC,EAAUC,EAAcJ,CAAI,GAAgBK,GAAGC,GAAG;EAC5D,aAAaV;EACb,GAAIK,IAAQ,EAAE,SAAM,IAAI,CAAC;CAC3B,CAAC;CACD,OAAOC,IAAM;EAAE;EAAK;EAAM;CAAI,IAAI;AACpC"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { DEFAULT_MAX_ZOOM as e, DEFAULT_MIN_ZOOM as t } from "../../../core/viewport/zoomBounds.js";
|
|
2
2
|
import { viewToTransform as n } from "../../../core/viewport/view.js";
|
|
3
3
|
import { screenToWorld as r } from "../../../core/viewport/viewTransform.js";
|
|
4
|
-
import {
|
|
5
|
-
import { wheelZoomFactor as
|
|
4
|
+
import { axisZoomFactor as i, zoomAt as a } from "../../../core/viewport/zoomAt.js";
|
|
5
|
+
import { wheelZoomFactor as o } from "../../../core/viewport/wheelHandler.js";
|
|
6
6
|
//#region src/interactions/actions/defaults/viewportZoom.ts
|
|
7
|
-
var
|
|
8
|
-
function
|
|
7
|
+
var s = 1.25;
|
|
8
|
+
function c(e) {
|
|
9
9
|
let t = e.hostSize?.();
|
|
10
10
|
return t ? {
|
|
11
11
|
x: t.width / 2,
|
|
@@ -15,107 +15,110 @@ function s(e) {
|
|
|
15
15
|
y: 0
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
mods: { mod: !0 }
|
|
25
|
-
}, d = c.animate === !0 ? {} : c.animate || null, { resetMs: f, ...p } = d ?? {}, m = d ? p : null;
|
|
26
|
-
return {
|
|
27
|
-
id: "viewport.zoom",
|
|
28
|
-
label: "Zoom",
|
|
29
|
-
group: "viewport",
|
|
30
|
-
defaultBinding: [
|
|
31
|
-
{
|
|
32
|
-
spec: u,
|
|
33
|
-
opts: { params: { kind: "wheel" } }
|
|
18
|
+
function l(e) {
|
|
19
|
+
return [
|
|
20
|
+
{
|
|
21
|
+
spec: e === "plain" ? { kind: "wheel" } : {
|
|
22
|
+
kind: "wheel",
|
|
23
|
+
mods: { mod: !0 }
|
|
34
24
|
},
|
|
35
|
-
{
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
opts: { params: { kind: "wheel" } }
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
spec: {
|
|
29
|
+
kind: "wheel",
|
|
30
|
+
mods: { ctrl: !0 }
|
|
41
31
|
},
|
|
42
|
-
{
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
opts: { params: { kind: "wheel" } }
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
spec: { kind: "pinch" },
|
|
36
|
+
opts: { params: { kind: "pinch" } }
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
spec: {
|
|
40
|
+
kind: "key",
|
|
41
|
+
key: "=",
|
|
42
|
+
mods: {
|
|
43
|
+
mod: !0,
|
|
44
|
+
shift: "optional"
|
|
45
|
+
}
|
|
45
46
|
},
|
|
46
|
-
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
opts: { params: { kind: "in" } }
|
|
47
|
+
opts: { params: { kind: "in" } }
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
spec: {
|
|
51
|
+
kind: "key",
|
|
52
|
+
key: "-",
|
|
53
|
+
mods: { mod: !0 }
|
|
56
54
|
},
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
opts: { params: { kind: "out" } }
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
spec: {
|
|
59
|
+
kind: "key",
|
|
60
|
+
key: "0",
|
|
61
|
+
mods: { mod: !0 }
|
|
64
62
|
},
|
|
65
|
-
{
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
opts: { params: { kind: "reset" } }
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
function u(u = {}) {
|
|
68
|
+
let d = {
|
|
69
|
+
min: u.min ?? t,
|
|
70
|
+
max: u.max ?? e
|
|
71
|
+
}, f = u.axis ?? "both", p = u.animate === !0 ? {} : u.animate || null, { resetMs: m, ...h } = p ?? {}, g = p ? h : null;
|
|
72
|
+
return {
|
|
73
|
+
id: "viewport.zoom",
|
|
74
|
+
label: "Zoom",
|
|
75
|
+
group: "viewport",
|
|
76
|
+
defaultBinding: l(u.wheel),
|
|
74
77
|
requires: ["view", "debug"],
|
|
75
78
|
invoker: {
|
|
76
79
|
timing: "immediate",
|
|
77
80
|
run(e, t) {
|
|
78
|
-
let
|
|
79
|
-
if (!
|
|
80
|
-
let u = e.debug,
|
|
81
|
+
let l = e.view;
|
|
82
|
+
if (!l) return;
|
|
83
|
+
let u = e.debug, p = l.get(), h = (e, t, i) => {
|
|
81
84
|
if (!u) return;
|
|
82
85
|
let [a, o] = r(i.x, i.y, n(e));
|
|
83
86
|
u.recordViewport("zoom", e, t, {
|
|
84
87
|
x: a,
|
|
85
88
|
y: o
|
|
86
89
|
});
|
|
87
|
-
},
|
|
88
|
-
if (!
|
|
89
|
-
|
|
90
|
+
}, _ = t?.kind, v = g !== null && typeof l.animate == "function", y = (e, t) => {
|
|
91
|
+
if (!v) {
|
|
92
|
+
l.set(e);
|
|
90
93
|
return;
|
|
91
94
|
}
|
|
92
|
-
|
|
93
|
-
...
|
|
94
|
-
ms: t ??
|
|
95
|
+
l.animate(e, {
|
|
96
|
+
...g,
|
|
97
|
+
ms: t ?? g.ms
|
|
95
98
|
});
|
|
96
|
-
},
|
|
99
|
+
}, b = () => v && l.animationTarget?.() || p, x = () => ({
|
|
97
100
|
x: t?.clientX ?? 0,
|
|
98
101
|
y: t?.clientY ?? 0
|
|
99
|
-
}),
|
|
102
|
+
}), S = (e) => {
|
|
100
103
|
if (!(e > 0) || !Number.isFinite(e)) return;
|
|
101
|
-
let t =
|
|
102
|
-
|
|
104
|
+
let t = a(p, x(), i(e, f), d);
|
|
105
|
+
l.set(t), h(p, t, x());
|
|
103
106
|
};
|
|
104
|
-
switch (
|
|
107
|
+
switch (_) {
|
|
105
108
|
case "wheel":
|
|
106
|
-
|
|
109
|
+
S(o(t?.deltaY ?? 0));
|
|
107
110
|
break;
|
|
108
111
|
case "pinch":
|
|
109
|
-
|
|
112
|
+
S(t?.scale ?? NaN);
|
|
110
113
|
break;
|
|
111
114
|
case "in":
|
|
112
115
|
case "out": {
|
|
113
|
-
let e =
|
|
114
|
-
|
|
116
|
+
let e = b(), t = i(_ === "in" ? s : 1 / s, f), n = a(e, c(l), t, d);
|
|
117
|
+
y(n), h(e, n, c(l));
|
|
115
118
|
break;
|
|
116
119
|
}
|
|
117
120
|
case "reset": {
|
|
118
|
-
let e =
|
|
121
|
+
let e = l.recenter ? l.recenter() : {
|
|
119
122
|
x: 0,
|
|
120
123
|
y: 0,
|
|
121
124
|
scale: {
|
|
@@ -123,21 +126,21 @@ function c(c = {}) {
|
|
|
123
126
|
y: 1
|
|
124
127
|
}
|
|
125
128
|
};
|
|
126
|
-
e &&
|
|
129
|
+
e && y(e, m);
|
|
127
130
|
break;
|
|
128
131
|
}
|
|
129
|
-
default: t === void 0 &&
|
|
132
|
+
default: t === void 0 && l.set(a(p, {
|
|
130
133
|
x: 0,
|
|
131
134
|
y: 0
|
|
132
|
-
},
|
|
135
|
+
}, i(s, f), d));
|
|
133
136
|
}
|
|
134
137
|
}
|
|
135
138
|
},
|
|
136
139
|
enabled: () => !0
|
|
137
140
|
};
|
|
138
141
|
}
|
|
139
|
-
var
|
|
142
|
+
var d = u();
|
|
140
143
|
//#endregion
|
|
141
|
-
export {
|
|
144
|
+
export { u as makeViewportZoomAction, d as viewportZoomAction };
|
|
142
145
|
|
|
143
146
|
//# sourceMappingURL=viewportZoom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewportZoom.js","names":["KEY_STEP","keyAnchor","size","view","makeViewportZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","wheelSpec","rawAnimate","animateRest","tweenOpts","deps","debug","current","record","wx","wy","screenToWorld","anchor","viewToTransform","from","to","kind","params","canAnimate","stepTo","target","ms","stepFrom","focal","scaleBy","factor","next","zoomAt","wheelZoomFactor","resetMs","viewportZoomAction"],"sources":["../../../../src/interactions/actions/defaults/viewportZoom.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { zoomAt } from 'core/viewport/zoomAt';\nimport { wheelZoomFactor } from 'core/viewport/wheelHandler';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\nimport { viewToTransform, type View } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport type { ViewAnimationOptions } from 'core/viewport/useViewAnimation';\n\n// Multiplicative step for keyboard zoom (matches useKeyboardZoomTool default).\nconst KEY_STEP = 1.25;\n\n/** Keyboard-zoom anchor: the host center when the view dep can measure it,\n * else the canvas top-left origin. */\nfunction keyAnchor(view: ViewApi): { x: number; y: number } {\n const size = view.hostSize?.();\n return size ? { x: size.width / 2, y: size.height / 2 } : { x: 0, y: 0 };\n}\n\n/**\n * @experimental\n * Tuning for the animated form of the discrete zoom steps.\n */\nexport interface ViewportZoomAnimateOptions extends ViewAnimationOptions {\n /** Duration for the Cmd+0 reset branch. Defaults to `ms`. */\n resetMs?: number;\n}\n\n/**\n * @experimental\n * Tuning for {@link makeViewportZoomAction}.\n */\nexport interface ViewportZoomOptions {\n /**\n * Which wheel gesture triggers zoom.\n * - `'mod'` (default): Cmd/Ctrl+wheel — coexists with plain-wheel pan\n * (`viewport.wheelPan`).\n * - `'plain'`: bare wheel, no modifier. Pair with `viewport.pan: false`,\n * since plain wheel otherwise drives pan and the two would compete.\n */\n wheel?: 'plain' | 'mod';\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n /**\n * Glide the discrete steps (Cmd+=, Cmd+-, Cmd+0) instead of jumping.\n * `true` uses the kit defaults; an object tunes them. Wheel and pinch never\n * animate — their input already samples every frame. Requires a `view` dep\n * that implements `animate`; without one this is ignored.\n */\n animate?: boolean | ViewportZoomAnimateOptions;\n}\n\n/**\n * @experimental\n * Build a `viewport.zoom` Action descriptor with a configurable wheel trigger\n * and scale clamp. The keyboard bindings (Cmd+=/-/0) and the two trackpad\n * pinch bindings are fixed. A wheel or pinch sample zooms about its focal\n * point, which `zoomAt` expects in canvas-local pixels.\n */\nexport function makeViewportZoomAction(\n opts: ViewportZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n // 'plain': bare wheel (omitting `mods` forbids any modifier — see the\n // matcher's strict modifier check). 'mod': Cmd/Ctrl+wheel.\n const wheelSpec =\n opts.wheel === 'plain'\n ? { kind: 'wheel' as const }\n : { kind: 'wheel' as const, mods: { mod: true } };\n\n const rawAnimate: ViewportZoomAnimateOptions | null =\n opts.animate === true ? {} : (opts.animate || null);\n const { resetMs, ...animateRest } = rawAnimate ?? {};\n const tweenOpts: ViewAnimationOptions | null = rawAnimate ? animateRest : null;\n\n return {\n id: 'viewport.zoom',\n label: 'Zoom',\n group: 'viewport',\n defaultBinding: [\n {\n spec: wheelSpec,\n opts: { params: { kind: 'wheel' } },\n },\n // Trackpad pinch, which the browser delivers as ctrl+wheel. Distinct from\n // the `mod` binding on mac (`mod` is metaKey there), so without its own\n // binding nothing claims it and the page zooms instead. Elsewhere it\n // duplicates `mod`, and `matchBest` picks a single winner.\n {\n spec: { kind: 'wheel' as const, mods: { ctrl: true } },\n opts: { params: { kind: 'wheel' } },\n },\n // Safari's trackpad pinch, reported as a scale rather than a wheel. Safari\n // may send the same pinch as ctrl+wheel too; the dispatcher swallows that\n // copy while a claimed gesture is live.\n {\n spec: { kind: 'pinch' as const },\n opts: { params: { kind: 'pinch' } },\n },\n // Cmd+= → zoom in (also accepts Cmd+Shift+= which is Cmd++ on many keyboards)\n {\n spec: { kind: 'key', key: '=', mods: { mod: true, shift: 'optional' } },\n opts: { params: { kind: 'in' } },\n },\n {\n spec: { kind: 'key', key: '-', mods: { mod: true } },\n opts: { params: { kind: 'out' } },\n },\n {\n spec: { kind: 'key', key: '0', mods: { mod: true } },\n opts: { params: { kind: 'reset' } },\n },\n ],\n requires: ['view', 'debug'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const view = deps.view;\n if (!view) return;\n const debug = deps.debug;\n const current = view.get();\n // Report a zoom about `anchor` (canvas-local px) from `from` to `to`.\n const record = (from: View, to: View, anchor: { x: number; y: number }) => {\n if (!debug) return;\n const [wx, wy] = screenToWorld(anchor.x, anchor.y, viewToTransform(from));\n debug.recordViewport('zoom', from, to, { x: wx, y: wy });\n };\n const kind = params?.kind as string | undefined;\n\n const canAnimate = tweenOpts !== null && typeof view.animate === 'function';\n const stepTo = (target: View, ms?: number) => {\n if (!canAnimate) { view.set(target); return; }\n view.animate!(target, { ...tweenOpts!, ms: ms ?? tweenOpts!.ms });\n };\n // Successive presses compound off where the camera is heading, not off\n // whichever frame the tween happens to be on.\n const stepFrom = (): View => (canAnimate && view.animationTarget?.()) || current;\n\n const focal = () => ({\n x: (params?.clientX as number | undefined) ?? 0,\n y: (params?.clientY as number | undefined) ?? 0,\n });\n const scaleBy = (factor: number) => {\n if (!(factor > 0) || !Number.isFinite(factor)) return;\n const next = zoomAt(current, focal(), factor, clamp);\n view.set(next);\n record(current, next, focal());\n };\n\n switch (kind) {\n case 'wheel':\n scaleBy(wheelZoomFactor((params?.deltaY as number | undefined) ?? 0));\n break;\n case 'pinch':\n scaleBy((params?.scale as number | undefined) ?? Number.NaN);\n break;\n case 'in':\n case 'out': {\n const from = stepFrom();\n const target = zoomAt(from, keyAnchor(view), kind === 'in' ? KEY_STEP : 1 / KEY_STEP, clamp);\n stepTo(target);\n record(from, target, keyAnchor(view));\n break;\n }\n case 'reset': {\n // A recenter that returns its target can be animated; one that\n // returns nothing dispatched the view itself and is already done.\n const target = view.recenter\n ? view.recenter()\n : { x: 0, y: 0, scale: { x: 1, y: 1 } };\n if (target) stepTo(target, resetMs);\n break;\n }\n default:\n // Unknown kind — no-op. Legacy bridge calls with params=undefined;\n // default to zoom-in as a sensible fallback.\n if (params === undefined) {\n view.set(zoomAt(current, { x: 0, y: 0 }, KEY_STEP, clamp));\n }\n break;\n }\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.zoom` descriptor: Cmd/Ctrl+wheel zoom with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makeViewportZoomAction()`.\n */\nexport const viewportZoomAction: Action & { requires: string[] } = makeViewportZoomAction();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"viewportZoom.js","names":["KEY_STEP","keyAnchor","size","view","zoomBindings","wheel","makeViewportZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","axis","rawAnimate","animateRest","tweenOpts","deps","debug","current","record","wx","wy","screenToWorld","anchor","viewToTransform","from","to","kind","params","canAnimate","stepTo","target","ms","stepFrom","focal","scaleBy","factor","next","zoomAt","axisZoomFactor","wheelZoomFactor","step","resetMs","viewportZoomAction"],"sources":["../../../../src/interactions/actions/defaults/viewportZoom.ts"],"sourcesContent":["import type { Action, BoundGesture } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { axisZoomFactor, zoomAt, type ZoomAxis } from 'core/viewport/zoomAt';\nimport { wheelZoomFactor } from 'core/viewport/wheelHandler';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\nimport { viewToTransform, type View } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport type { ViewAnimationOptions } from 'core/viewport/useViewAnimation';\n\n// Multiplicative step for keyboard zoom (matches useKeyboardZoomTool default).\nconst KEY_STEP = 1.25;\n\n/** Keyboard-zoom anchor: the host center when the view dep can measure it,\n * else the canvas top-left origin. */\nfunction keyAnchor(view: ViewApi): { x: number; y: number } {\n const size = view.hostSize?.();\n return size ? { x: size.width / 2, y: size.height / 2 } : { x: 0, y: 0 };\n}\n\n/**\n * @experimental\n * Tuning for the animated form of the discrete zoom steps.\n */\nexport interface ViewportZoomAnimateOptions extends ViewAnimationOptions {\n /** Duration for the Cmd+0 reset branch. Defaults to `ms`. */\n resetMs?: number;\n}\n\n/**\n * @experimental\n * Tuning for {@link makeViewportZoomAction}.\n */\nexport interface ViewportZoomOptions {\n /**\n * Which wheel gesture triggers zoom.\n * - `'mod'` (default): Cmd/Ctrl+wheel — coexists with plain-wheel pan\n * (`viewport.wheelPan`).\n * - `'plain'`: bare wheel, no modifier. Pair with `viewport.pan: false`,\n * since plain wheel otherwise drives pan and the two would compete.\n */\n wheel?: 'plain' | 'mod';\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n /** Hold wheel, trackpad-pinch, and key zoom to one axis; the other keeps its\n * scale and its translation. Default `'both'`. Cmd+0 still resets both. */\n axis?: ZoomAxis;\n /**\n * Glide the discrete steps (Cmd+=, Cmd+-, Cmd+0) instead of jumping.\n * `true` uses the kit defaults; an object tunes them. Wheel and pinch never\n * animate — their input already samples every frame. Requires a `view` dep\n * that implements `animate`; without one this is ignored.\n */\n animate?: boolean | ViewportZoomAnimateOptions;\n}\n\n/** The gestures `viewport.zoom` answers: the configurable wheel trigger, then\n * the fixed pinch and key bindings. */\nfunction zoomBindings(wheel: ViewportZoomOptions['wheel']): BoundGesture[] {\n // 'plain': bare wheel (omitting `mods` forbids any modifier — see the\n // matcher's strict modifier check). 'mod': Cmd/Ctrl+wheel.\n const wheelSpec =\n wheel === 'plain'\n ? { kind: 'wheel' as const }\n : { kind: 'wheel' as const, mods: { mod: true } };\n return [\n {\n spec: wheelSpec,\n opts: { params: { kind: 'wheel' } },\n },\n // Trackpad pinch, which the browser delivers as ctrl+wheel. Distinct from\n // the `mod` binding on mac (`mod` is metaKey there), so without its own\n // binding nothing claims it and the page zooms instead. Elsewhere it\n // duplicates `mod`, and `matchBest` picks a single winner.\n {\n spec: { kind: 'wheel' as const, mods: { ctrl: true } },\n opts: { params: { kind: 'wheel' } },\n },\n // Safari's trackpad pinch, reported as a scale rather than a wheel. Safari\n // may send the same pinch as ctrl+wheel too; the dispatcher swallows that\n // copy while a claimed gesture is live.\n {\n spec: { kind: 'pinch' as const },\n opts: { params: { kind: 'pinch' } },\n },\n // Cmd+= → zoom in (also accepts Cmd+Shift+= which is Cmd++ on many keyboards)\n {\n spec: { kind: 'key', key: '=', mods: { mod: true, shift: 'optional' } },\n opts: { params: { kind: 'in' } },\n },\n {\n spec: { kind: 'key', key: '-', mods: { mod: true } },\n opts: { params: { kind: 'out' } },\n },\n {\n spec: { kind: 'key', key: '0', mods: { mod: true } },\n opts: { params: { kind: 'reset' } },\n },\n ];\n}\n\n/**\n * @experimental\n * Build a `viewport.zoom` Action descriptor with a configurable wheel trigger\n * and scale clamp. The keyboard bindings (Cmd+=/-/0) and the two trackpad\n * pinch bindings are fixed. A wheel or pinch sample zooms about its focal\n * point, which `zoomAt` expects in canvas-local pixels.\n */\nexport function makeViewportZoomAction(\n opts: ViewportZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n const axis = opts.axis ?? 'both';\n\n const rawAnimate: ViewportZoomAnimateOptions | null =\n opts.animate === true ? {} : (opts.animate || null);\n const { resetMs, ...animateRest } = rawAnimate ?? {};\n const tweenOpts: ViewAnimationOptions | null = rawAnimate ? animateRest : null;\n\n return {\n id: 'viewport.zoom',\n label: 'Zoom',\n group: 'viewport',\n defaultBinding: zoomBindings(opts.wheel),\n requires: ['view', 'debug'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const view = deps.view;\n if (!view) return;\n const debug = deps.debug;\n const current = view.get();\n // Report a zoom about `anchor` (canvas-local px) from `from` to `to`.\n const record = (from: View, to: View, anchor: { x: number; y: number }) => {\n if (!debug) return;\n const [wx, wy] = screenToWorld(anchor.x, anchor.y, viewToTransform(from));\n debug.recordViewport('zoom', from, to, { x: wx, y: wy });\n };\n const kind = params?.kind as string | undefined;\n\n const canAnimate = tweenOpts !== null && typeof view.animate === 'function';\n const stepTo = (target: View, ms?: number) => {\n if (!canAnimate) { view.set(target); return; }\n view.animate!(target, { ...tweenOpts!, ms: ms ?? tweenOpts!.ms });\n };\n // Successive presses compound off where the camera is heading, not off\n // whichever frame the tween happens to be on.\n const stepFrom = (): View => (canAnimate && view.animationTarget?.()) || current;\n\n const focal = () => ({\n x: (params?.clientX as number | undefined) ?? 0,\n y: (params?.clientY as number | undefined) ?? 0,\n });\n const scaleBy = (factor: number) => {\n if (!(factor > 0) || !Number.isFinite(factor)) return;\n const next = zoomAt(current, focal(), axisZoomFactor(factor, axis), clamp);\n view.set(next);\n record(current, next, focal());\n };\n\n switch (kind) {\n case 'wheel':\n scaleBy(wheelZoomFactor((params?.deltaY as number | undefined) ?? 0));\n break;\n case 'pinch':\n scaleBy((params?.scale as number | undefined) ?? Number.NaN);\n break;\n case 'in':\n case 'out': {\n const from = stepFrom();\n const step = axisZoomFactor(kind === 'in' ? KEY_STEP : 1 / KEY_STEP, axis);\n const target = zoomAt(from, keyAnchor(view), step, clamp);\n stepTo(target);\n record(from, target, keyAnchor(view));\n break;\n }\n case 'reset': {\n // A recenter that returns its target can be animated; one that\n // returns nothing dispatched the view itself and is already done.\n const target = view.recenter\n ? view.recenter()\n : { x: 0, y: 0, scale: { x: 1, y: 1 } };\n if (target) stepTo(target, resetMs);\n break;\n }\n default:\n // Unknown kind — no-op. Legacy bridge calls with params=undefined;\n // default to zoom-in as a sensible fallback.\n if (params === undefined) {\n view.set(zoomAt(current, { x: 0, y: 0 }, axisZoomFactor(KEY_STEP, axis), clamp));\n }\n break;\n }\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.zoom` descriptor: Cmd/Ctrl+wheel zoom with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makeViewportZoomAction()`.\n */\nexport const viewportZoomAction: Action & { requires: string[] } = makeViewportZoomAction();\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { IDENTITY_POSE_COMPOSITION as e } from "../../../core/scene/composeFrame.js";
|
|
2
2
|
import { RECT_POSE_DESCRIPTOR as t, translatePoseViaDescriptor as n, visualBoundsViaDescriptor as r } from "../../../core/geometry/poseDescriptor.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { dispatchApplyBatch as i } from "../../../core/applyOps.js";
|
|
4
|
+
import { createTransformOp as a } from "../../../core/ops/transform.js";
|
|
5
|
+
import { poseFrame as o } from "../poseFrame.js";
|
|
6
6
|
import { planDistribute as s } from "./plan.js";
|
|
7
7
|
import { useCallback as c } from "react";
|
|
8
8
|
import { useLatest as l } from "@weasel-js/react";
|
|
@@ -12,9 +12,9 @@ function u(u, d = {}) {
|
|
|
12
12
|
return { distribute: c((c, l) => {
|
|
13
13
|
let u = f.current, d = p.current, m = u.getSelection();
|
|
14
14
|
if (m.length < 3) return;
|
|
15
|
-
let h = d.geometry ?? t, g = l ?? d.defaultMode ?? "centers", _ =
|
|
15
|
+
let h = d.geometry ?? t, g = l ?? d.defaultMode ?? "centers", _ = o({
|
|
16
16
|
getPose: (e) => u.getPose(e),
|
|
17
|
-
getParent: (e) => u.getParent
|
|
17
|
+
getParent: (e) => u.getParent(e)
|
|
18
18
|
}, d.composition ?? e), v = m.map((e) => {
|
|
19
19
|
let t = _.world(e);
|
|
20
20
|
return {
|
|
@@ -26,14 +26,14 @@ function u(u, d = {}) {
|
|
|
26
26
|
for (let e = 0; e < v.length; e++) {
|
|
27
27
|
let t = v[e], r = y[e] - (c === "x" ? t.b.x : t.b.y);
|
|
28
28
|
if (r === 0) continue;
|
|
29
|
-
let
|
|
30
|
-
b.push(
|
|
29
|
+
let i = c === "x" ? r : 0, o = c === "y" ? r : 0, s = n(t.pose, i, o, h);
|
|
30
|
+
b.push(a({
|
|
31
31
|
id: t.id,
|
|
32
32
|
from: u.getPose(t.id),
|
|
33
33
|
to: _.local(t.id, s)
|
|
34
34
|
}));
|
|
35
35
|
}
|
|
36
|
-
b.length !== 0 &&
|
|
36
|
+
b.length !== 0 && i(u, b, d.label ?? "Distribute");
|
|
37
37
|
}, [f, p]) };
|
|
38
38
|
}
|
|
39
39
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribute.js","names":["useDistribute","adapterRef","useLatest","adapter","optsRef","options","useCallback","a","o","sel","geom","RECT_POSE_DESCRIPTOR","m","mode","frame","poseFrame","id","IDENTITY_POSE_COMPOSITION","items","pose","visualBoundsViaDescriptor","targets","planDistribute","it","axis","ops","i","delta","dx","dy","to","translatePoseViaDescriptor","createTransformOp","dispatchApplyBatch"],"sources":["../../../../src/interactions/actions/distribute/distribute.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport type { NodeId } from 'core/scene/types';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../resize/geometry';\nimport { translatePoseViaDescriptor, visualBoundsViaDescriptor } from '../align/align';\nimport { planDistribute } from './plan';\nimport { poseFrame } from '../poseFrame';\nimport { IDENTITY_POSE_COMPOSITION, type PoseComposition } from 'core/scene/composePose';\n\n/** Axis along which selection is distributed. `'x'` spreads horizontally. */\nexport type DistributeAxis = 'x' | 'y';\n\n/** `'centers'` spaces centers equally; `'gaps'` makes the gap between\n * consecutive items equal. Both measure a rotated item by its ink extent.\n * Endpoints stay put in both modes. */\nexport type DistributeMode = 'centers' | 'gaps';\n\n/** Adapter for `useDistribute`. */\nexport interface DistributeAdapter<TPose> {\n getSelection(): NodeId[];\n /** The pose as stored — local to the node's parent. */\n getPose(id: NodeId): TPose;\n /** The
|
|
1
|
+
{"version":3,"file":"distribute.js","names":["useDistribute","adapterRef","useLatest","adapter","optsRef","options","useCallback","a","o","sel","geom","RECT_POSE_DESCRIPTOR","m","mode","frame","poseFrame","id","IDENTITY_POSE_COMPOSITION","items","pose","visualBoundsViaDescriptor","targets","planDistribute","it","axis","ops","i","delta","dx","dy","to","translatePoseViaDescriptor","createTransformOp","dispatchApplyBatch"],"sources":["../../../../src/interactions/actions/distribute/distribute.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport type { NodeId } from 'core/scene/types';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../resize/geometry';\nimport { translatePoseViaDescriptor, visualBoundsViaDescriptor } from '../align/align';\nimport { planDistribute } from './plan';\nimport { poseFrame } from '../poseFrame';\nimport { IDENTITY_POSE_COMPOSITION, type PoseComposition } from 'core/scene/composePose';\n\n/** Axis along which selection is distributed. `'x'` spreads horizontally. */\nexport type DistributeAxis = 'x' | 'y';\n\n/** `'centers'` spaces centers equally; `'gaps'` makes the gap between\n * consecutive items equal. Both measure a rotated item by its ink extent.\n * Endpoints stay put in both modes. */\nexport type DistributeMode = 'centers' | 'gaps';\n\n/** Adapter for `useDistribute`. */\nexport interface DistributeAdapter<TPose> {\n getSelection(): NodeId[];\n /** The pose as stored — local to the node's parent. */\n getPose(id: NodeId): TPose;\n /** The node's container, `null` for a root: the chain a pose is composed\n * through when container poses define a frame. */\n getParent(id: NodeId): NodeId | null;\n applyOps?(ops: Op[], label?: string): void;\n}\n\n/** Options for `useDistribute`. */\nexport interface UseDistributeOptions<TPose> {\n /** Projection between `TPose` and bounds. Defaults to `RECT_POSE_DESCRIPTOR`\n * for `{x,y,width,height}` poses. */\n geometry?: PoseDescriptor<TPose>;\n /** Default mode when `distribute(axis)` is called without one. Default 'centers'. */\n defaultMode?: DistributeMode;\n /** Label passed to applyOps. Default 'Distribute'. */\n label?: string;\n /** How local poses fold up to world. Default IDENTITY, where the two are\n * the same value and the spread runs entirely in stored coordinates. */\n composition?: PoseComposition<TPose>;\n}\n\n/** Return shape of `useDistribute`. */\nexport interface UseDistributeReturn {\n /** Imperative trigger. No-op when fewer than 3 items selected. */\n distribute(axis: DistributeAxis, mode?: DistributeMode): void;\n}\n\n/** Distribute the current multi-selection along `axis`. Requires ≥3 items;\n * no-op otherwise. Endpoints (min and max along the axis) stay put; the\n * remaining items are repositioned. Single batch — one undo step.\n *\n * The span being divided is a world span: bounds are measured and translated\n * in world, and each result is stored back in its own parent's frame. */\nexport function useDistribute<TPose>(\n adapter: DistributeAdapter<TPose>,\n options: UseDistributeOptions<TPose> = {},\n): UseDistributeReturn {\n const adapterRef = useLatest(adapter);\n const optsRef = useLatest(options);\n\n const distribute = useCallback((axis: DistributeAxis, mode?: DistributeMode): void => {\n const a = adapterRef.current;\n const o = optsRef.current;\n const sel = a.getSelection();\n if (sel.length < 3) return;\n const geom =\n o.geometry ??\n (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>);\n const m = mode ?? o.defaultMode ?? 'centers';\n\n const frame = poseFrame<TPose>(\n {\n getPose: (id) => a.getPose(id as NodeId),\n getParent: (id) => a.getParent(id as NodeId) as string | null,\n },\n o.composition ?? (IDENTITY_POSE_COMPOSITION as PoseComposition<TPose>),\n );\n const items = sel.map((id) => {\n const pose = frame.world(id);\n return { id, pose, b: visualBoundsViaDescriptor(pose, geom) };\n });\n const targets = planDistribute(items.map((it) => it.b), axis, m);\n\n const ops: Op[] = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const delta = targets[i] - (axis === 'x' ? it.b.x : it.b.y);\n if (delta === 0) continue;\n const dx = axis === 'x' ? delta : 0;\n const dy = axis === 'y' ? delta : 0;\n const to = translatePoseViaDescriptor(it.pose, dx, dy, geom);\n ops.push(createTransformOp<TPose>({\n id: it.id,\n from: a.getPose(it.id),\n to: frame.local(it.id, to),\n }));\n }\n if (ops.length === 0) return;\n dispatchApplyBatch(a, ops, o.label ?? 'Distribute');\n }, [adapterRef, optsRef]);\n\n return { distribute };\n}\n"],"mappings":";;;;;;;;;AAyDA,SAAgBA,EACd,GACA,IAAuC,CAAC,GACnB;CACrB,IAAMC,IAAaC,EAAUC,CAAO,GAC9BC,IAAUF,EAAUG,CAAO;CA2CjC,OAAO,EAAE,YAzCUC,GAAa,GAAsB,MAAgC;EACpF,IAAMC,IAAIN,EAAW,SACfO,IAAIJ,EAAQ,SACZK,IAAMF,EAAE,aAAa;EAC3B,IAAIE,EAAI,SAAS,GAAG;EACpB,IAAMC,IACJF,EAAE,YACDG,GACGC,IAAIC,KAAQL,EAAE,eAAe,WAE7BM,IAAQC,EACZ;GACE,UAAU,MAAOR,EAAE,QAAQS,CAAY;GACvC,YAAY,MAAOT,EAAE,UAAUS,CAAY;EAC7C,GACAR,EAAE,eAAgBS,CACpB,GACMC,IAAQT,EAAI,KAAK,MAAO;GAC5B,IAAMU,IAAOL,EAAM,MAAME,CAAE;GAC3B,OAAO;IAAE;IAAI;IAAM,GAAGI,EAA0BD,GAAMT,CAAI;GAAE;EAC9D,CAAC,GACKW,IAAUC,EAAeJ,EAAM,KAAK,MAAOK,EAAG,CAAC,GAAGC,GAAMZ,CAAC,GAEzDa,IAAY,CAAC;EACnB,KAAK,IAAIC,IAAI,GAAGA,IAAIR,EAAM,QAAQ,KAAK;GACrC,IAAMK,IAAKL,EAAMQ,IACXC,IAAQN,EAAQK,MAAMF,MAAS,MAAMD,EAAG,EAAE,IAAIA,EAAG,EAAE;GACzD,IAAII,MAAU,GAAG;GACjB,IAAMC,IAAKJ,MAAS,MAAMG,IAAQ,GAC5BE,IAAKL,MAAS,MAAMG,IAAQ,GAC5BG,IAAKC,EAA2BR,EAAG,MAAMK,GAAIC,GAAInB,CAAI;GAC3D,EAAI,KAAKsB,EAAyB;IAChC,IAAIT,EAAG;IACP,MAAMhB,EAAE,QAAQgB,EAAG,EAAE;IACrB,IAAIT,EAAM,MAAMS,EAAG,IAAIO,CAAE;GAC3B,CAAC,CAAC;EACJ;EACA,AAAIL,EAAI,WAAW,KACnBQ,EAAmB1B,GAAGkB,GAAKjB,EAAE,SAAS,YAAY;CACpD,GAAG,CAACP,GAAYG,CAAO,CAEd,EAAW;AACtB"}
|