@weasel-js/core 1.9.3 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1106 -0
- package/README.md +7 -5
- package/dist/WeaselProvider.js +5 -7
- package/dist/WeaselProvider.js.map +1 -1
- package/dist/affordances/composeAffordanceLayer.js +91 -93
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/cornerResize.js +27 -18
- package/dist/affordances/cornerResize.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +65 -104
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotationHandle.js +22 -21
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/behaviors/coast.js +21 -0
- package/dist/animation/behaviors/coast.js.map +1 -0
- package/dist/animation/behaviors/coastByWrite.js +107 -0
- package/dist/animation/behaviors/coastByWrite.js.map +1 -0
- package/dist/animation/behaviors/coastOnTargets.js +94 -0
- package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +38 -88
- package/dist/animation/behaviors/momentum.js.map +1 -1
- package/dist/animation/clipTargets.js +12 -0
- package/dist/animation/clipTargets.js.map +1 -0
- package/dist/animation/index.js +15 -20
- package/dist/animation/poseHelpers.js +112 -33
- package/dist/animation/poseHelpers.js.map +1 -1
- package/dist/animation/poseTarget.js +115 -0
- package/dist/animation/poseTarget.js.map +1 -0
- package/dist/animation/reflow.js +113 -83
- package/dist/animation/reflow.js.map +1 -1
- package/dist/animation/rewind.js +66 -0
- package/dist/animation/rewind.js.map +1 -0
- package/dist/animation/rig/bindRig.js +85 -53
- package/dist/animation/rig/bindRig.js.map +1 -1
- package/dist/animation/rig/rigNode.js +93 -0
- package/dist/animation/rig/rigNode.js.map +1 -0
- package/dist/animation/rig/rigSeat.js +26 -0
- package/dist/animation/rig/rigSeat.js.map +1 -0
- package/dist/animation/rig/skinBinding.js +56 -0
- package/dist/animation/rig/skinBinding.js.map +1 -0
- package/dist/animation/rig/useRig.js +31 -16
- package/dist/animation/rig/useRig.js.map +1 -1
- package/dist/animation/wrappers/animateLifecycle.js +32 -24
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
- package/dist/animation/wrappers/animateOnSetPose.js +31 -29
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
- package/dist/animation/wrappers/instantPose.js +13 -0
- package/dist/animation/wrappers/instantPose.js.map +1 -0
- package/dist/animation/writtenPoseTarget.js +33 -0
- package/dist/animation/writtenPoseTarget.js.map +1 -0
- package/dist/{autoPoseDescriptor-vCdt55xm.d.ts → autoPoseDescriptor-DHg5KqaJ.d.ts} +1 -1
- package/dist/barrel/canvas.js +31 -0
- package/dist/barrel/chrome.js +16 -0
- package/dist/barrel/input.js +18 -0
- package/dist/barrel/interactions.js +38 -0
- package/dist/barrel/paint.js +11 -0
- package/dist/barrel/paths.js +12 -0
- package/dist/barrel/renderer.js +14 -0
- package/dist/barrel/routing.js +57 -0
- package/dist/barrel/scene.js +37 -0
- package/dist/barrel/text.js +9 -0
- package/dist/barrel/viewport.js +42 -0
- package/dist/canvas/Canvas.js +280 -559
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +147 -167
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +53 -49
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +40 -51
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/ModalityHud.js.map +1 -1
- package/dist/canvas/NodeShape.js +55 -374
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js +50 -47
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
- package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +126 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +64 -0
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +16 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/coordTrace.js +46 -0
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +138 -85
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +9 -8
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +74 -43
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/isDev.js +12 -0
- package/dist/canvas/SceneCanvas/isDev.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +31 -34
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/poseRegistrars.js +13 -0
- package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -0
- package/dist/canvas/SceneCanvas/props.js +39 -0
- package/dist/canvas/SceneCanvas/props.js.map +1 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +21 -62
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
- package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
- package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +48 -48
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +74 -78
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +311 -969
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +42 -46
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/adapterDerivedPath.js +26 -0
- package/dist/canvas/adapterDerivedPath.js.map +1 -0
- package/dist/canvas/affordanceAt.js +11 -1
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +111 -0
- package/dist/canvas/buildSceneLayer.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +16 -19
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +67 -55
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/colorOverrides.js.map +1 -1
- package/dist/canvas/defaultDrawOne.js +12 -12
- package/dist/canvas/defaultDrawOne.js.map +1 -1
- package/dist/canvas/deps/areaSelect.js +4 -4
- package/dist/canvas/deps/areaSelect.js.map +1 -1
- package/dist/canvas/deps/changes.js +13 -0
- package/dist/canvas/deps/changes.js.map +1 -0
- package/dist/canvas/deps/debug.js.map +1 -1
- package/dist/canvas/deps/editAnchors.js +38 -57
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/geometryProjection.js.map +1 -1
- package/dist/canvas/deps/hitTestArea.js +31 -26
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/insert.js +130 -91
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/lassoSelect.js +5 -5
- package/dist/canvas/deps/lassoSelect.js.map +1 -1
- package/dist/canvas/deps/poseDescriptor.js +1 -1
- package/dist/canvas/deps/poseDescriptor.js.map +1 -1
- package/dist/canvas/deps/resizePolicy.js.map +1 -1
- package/dist/canvas/deps/slice.js +26 -26
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +6 -5
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/deps/view.js.map +1 -1
- package/dist/canvas/derivedPath.js +47 -22
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/drawEnvelope.js +8 -4
- package/dist/canvas/drawEnvelope.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +4 -8
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/hud.module.js +1 -1
- package/dist/canvas/hud.module.js.map +1 -1
- package/dist/canvas/insertPreviewExtent.js.map +1 -1
- package/dist/canvas/kitRequirements.js +2 -2
- package/dist/canvas/kitRequirements.js.map +1 -1
- package/dist/canvas/layerOrder.js +13 -6
- package/dist/canvas/layerOrder.js.map +1 -1
- package/dist/canvas/layerSlots.js +6 -1
- package/dist/canvas/layerSlots.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +34 -0
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/imagePainter.js +87 -0
- package/dist/canvas/nodeShapes/imagePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/memo.js +9 -0
- package/dist/canvas/nodeShapes/memo.js.map +1 -0
- package/dist/canvas/nodeShapes/nodePaint.js +68 -0
- package/dist/canvas/nodeShapes/nodePaint.js.map +1 -0
- package/dist/canvas/nodeShapes/pathPainter.js +39 -0
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/poseBox.js +20 -0
- package/dist/canvas/nodeShapes/poseBox.js.map +1 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +38 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/shapePainter.js +72 -0
- package/dist/canvas/nodeShapes/shapePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/textPainter.js +55 -0
- package/dist/canvas/nodeShapes/textPainter.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/paintCull.js +11 -14
- package/dist/canvas/paintCull.js.map +1 -1
- package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
- package/dist/canvas/paintedCursorLayer.js.map +1 -0
- package/dist/canvas/pickWalk.js +59 -68
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/planeClips.js +18 -19
- package/dist/canvas/planeClips.js.map +1 -1
- package/dist/canvas/poseCascade.js +41 -0
- package/dist/canvas/poseCascade.js.map +1 -0
- package/dist/canvas/poseRotation.js +9 -23
- package/dist/canvas/poseRotation.js.map +1 -1
- package/dist/canvas/rasterReadback.js +22 -0
- package/dist/canvas/rasterReadback.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +11 -11
- package/dist/canvas/renderDebugSnapshot.js.map +1 -1
- package/dist/canvas/renderNeeds.js +3 -3
- package/dist/canvas/renderNeeds.js.map +1 -1
- package/dist/canvas/renderSceneToPixels.js +64 -81
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +68 -214
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +112 -0
- package/dist/canvas/sceneClipboard.js.map +1 -0
- package/dist/canvas/sceneLayerPaint.js +4 -4
- package/dist/canvas/sceneLayerPaint.js.map +1 -1
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +39 -39
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/slopsDebugLayer.js +4 -4
- package/dist/canvas/slopsDebugLayer.js.map +1 -1
- package/dist/canvas/surface.module.js +6 -0
- package/dist/canvas/surface.module.js.map +1 -0
- package/dist/canvas/surfaceBox.js +16 -0
- package/dist/canvas/surfaceBox.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +26 -6
- package/dist/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/canvas/useCanvasSurface.js +31 -0
- package/dist/canvas/useCanvasSurface.js.map +1 -0
- package/dist/canvas/useCanvasView.js +67 -0
- package/dist/canvas/useCanvasView.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +39 -31
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useHostAnchor.js +35 -33
- package/dist/canvas/useHostAnchor.js.map +1 -1
- package/dist/canvas/useLateContentRedraw.js +8 -8
- package/dist/canvas/useLateContentRedraw.js.map +1 -1
- package/dist/canvas/useSceneLayerList.js +11 -0
- package/dist/canvas/useSceneLayerList.js.map +1 -0
- package/dist/canvas/useSurfaceInput.js +42 -0
- package/dist/canvas/useSurfaceInput.js.map +1 -0
- package/dist/canvas/useToolCursor.js +29 -0
- package/dist/canvas/useToolCursor.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +46 -85
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/canvas/viewInputs.js.map +1 -1
- package/dist/canvas/viewRegistry.js +25 -27
- package/dist/canvas/viewRegistry.js.map +1 -1
- package/dist/canvas/watchElementMove.js +43 -0
- package/dist/canvas/watchElementMove.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -1
- package/dist/clipboard.d.ts +16 -19
- package/dist/{types-B_9g6hMM.d.ts → clone-2a5hVbBd.d.ts} +123 -74
- package/dist/clone.d.ts +4 -7
- package/dist/clone.js +0 -2
- package/dist/core/device/index.js +5 -4
- package/dist/core/device/targets.js.map +1 -1
- package/dist/core/device/useDeviceProfile.js +38 -44
- package/dist/core/device/useDeviceProfile.js.map +1 -1
- package/dist/core/device/watchDevicePixelRatio.js +17 -0
- package/dist/core/device/watchDevicePixelRatio.js.map +1 -0
- package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
- package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/pathPoseDescriptor.js +88 -0
- package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +68 -19
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/regionHit.js +31 -34
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/targetFrame.js +94 -0
- package/dist/core/geometry/targetFrame.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +30 -29
- package/dist/core/geometry/unionBounds.js.map +1 -1
- package/dist/core/isPlainObject.js +2 -11
- package/dist/core/layers/backgroundFill.js +31 -0
- package/dist/core/layers/backgroundFill.js.map +1 -0
- package/dist/{features/groups → core/layers}/children.js +1 -1
- package/dist/core/layers/children.js.map +1 -0
- package/dist/core/layers/gateLayer.js +13 -0
- package/dist/core/layers/gateLayer.js.map +1 -0
- package/dist/core/layers/layerGroup.js +40 -0
- package/dist/core/layers/layerGroup.js.map +1 -0
- package/dist/core/layers/render.js +50 -76
- package/dist/core/layers/render.js.map +1 -1
- package/dist/core/ops/arrange.js +1 -0
- package/dist/core/ops/arrange.js.map +1 -1
- package/dist/core/ops/create.js +10 -5
- package/dist/core/ops/create.js.map +1 -1
- package/dist/core/ops/createHistory.js +9 -9
- package/dist/core/ops/createHistory.js.map +1 -1
- package/dist/core/ops/delete.js +12 -24
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/ops/reorder/index.js +43 -40
- package/dist/core/ops/reorder/index.js.map +1 -1
- package/dist/core/ops/reorder/setChildOrder.js +34 -0
- package/dist/core/ops/reorder/setChildOrder.js.map +1 -0
- package/dist/core/paint/meshKind.js +16 -0
- package/dist/core/paint/meshKind.js.map +1 -0
- package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +282 -105
- package/dist/core/paint/meshKindLazy.js.map +1 -0
- package/dist/core/paint/paintKindEntry.js +8 -0
- package/dist/core/paint/paintKindEntry.js.map +1 -0
- package/dist/core/paint/paintKinds.js +144 -0
- package/dist/core/paint/paintKinds.js.map +1 -0
- package/dist/core/paint/registerMesh.js +7 -0
- package/dist/core/paint/registerMesh.js.map +1 -0
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/NodeRouting.js.map +1 -1
- package/dist/core/scene/appliedLog.js +37 -0
- package/dist/core/scene/appliedLog.js.map +1 -0
- package/dist/core/scene/arrivalWindow.js +102 -0
- package/dist/core/scene/arrivalWindow.js.map +1 -0
- package/dist/core/scene/boundOps.js +40 -0
- package/dist/core/scene/boundOps.js.map +1 -0
- package/dist/core/scene/composeFrame.js +9 -6
- package/dist/core/scene/composeFrame.js.map +1 -1
- package/dist/{features/groups → core/scene}/composePose.js +18 -18
- package/dist/core/scene/composePose.js.map +1 -0
- package/dist/core/scene/depMemo.js +31 -6
- package/dist/core/scene/depMemo.js.map +1 -1
- package/dist/core/scene/derivedPath.js +19 -20
- package/dist/core/scene/derivedPath.js.map +1 -1
- package/dist/core/scene/editMode.js +26 -0
- package/dist/core/scene/editMode.js.map +1 -0
- package/dist/core/scene/effectivePose.js +38 -39
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/fieldEdits.js +98 -0
- package/dist/core/scene/fieldEdits.js.map +1 -0
- package/dist/core/scene/historyFacade.js +130 -0
- package/dist/core/scene/historyFacade.js.map +1 -0
- package/dist/core/scene/historyForm.js +6 -0
- package/dist/core/scene/historyForm.js.map +1 -0
- package/dist/core/scene/kitOps.js +185 -0
- package/dist/core/scene/kitOps.js.map +1 -0
- package/dist/core/scene/kitRegistry.js.map +1 -1
- package/dist/core/scene/layerStack.js +131 -0
- package/dist/core/scene/layerStack.js.map +1 -0
- package/dist/core/scene/layoutPass.js +58 -59
- package/dist/core/scene/layoutPass.js.map +1 -1
- package/dist/core/scene/lockGuard.js +37 -0
- package/dist/core/scene/lockGuard.js.map +1 -0
- package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
- package/dist/core/scene/nestedHit.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +10 -11
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/nodeMemo.js +45 -19
- package/dist/core/scene/nodeMemo.js.map +1 -1
- package/dist/core/scene/nodeStore.js +127 -0
- package/dist/core/scene/nodeStore.js.map +1 -0
- package/dist/core/scene/notifier.js +37 -0
- package/dist/core/scene/notifier.js.map +1 -0
- package/dist/core/scene/opTable.js +50 -0
- package/dist/core/scene/opTable.js.map +1 -0
- package/dist/core/scene/outerOps.js +66 -0
- package/dist/core/scene/outerOps.js.map +1 -0
- package/dist/core/scene/poseFeed.js +38 -38
- package/dist/core/scene/poseFeed.js.map +1 -1
- package/dist/core/scene/poseHold.js +39 -0
- package/dist/core/scene/poseHold.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +44 -40
- package/dist/core/scene/poseOverrides.js.map +1 -1
- package/dist/core/scene/poseSnapshot.js.map +1 -1
- package/dist/core/scene/reconcileSpecs.js +3 -2
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/recorder.js +86 -0
- package/dist/core/scene/recorder.js.map +1 -0
- package/dist/core/scene/renderOrder.js +84 -0
- package/dist/core/scene/renderOrder.js.map +1 -0
- package/dist/core/scene/scene.js +80 -1266
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneEdits.js +58 -0
- package/dist/core/scene/sceneEdits.js.map +1 -0
- package/dist/core/scene/sceneMutators.js +49 -0
- package/dist/core/scene/sceneMutators.js.map +1 -0
- package/dist/core/scene/scenePoseAdapter.js +16 -0
- package/dist/core/scene/scenePoseAdapter.js.map +1 -0
- package/dist/core/scene/sceneRecording.js +90 -0
- package/dist/core/scene/sceneRecording.js.map +1 -0
- package/dist/core/scene/sceneSelection.js +28 -0
- package/dist/core/scene/sceneSelection.js.map +1 -0
- package/dist/core/scene/sceneState.js +49 -0
- package/dist/core/scene/sceneState.js.map +1 -0
- package/dist/core/scene/serialization.js +71 -0
- package/dist/core/scene/serialization.js.map +1 -0
- package/dist/core/scene/staleReplay.js +51 -0
- package/dist/core/scene/staleReplay.js.map +1 -0
- package/dist/core/scene/statedFields.js +9 -0
- package/dist/core/scene/statedFields.js.map +1 -0
- package/dist/core/scene/treeEdits.js +127 -0
- package/dist/core/scene/treeEdits.js.map +1 -0
- package/dist/core/scene/treeOrder.js +13 -0
- package/dist/core/scene/treeOrder.js.map +1 -0
- package/dist/core/scene/treeReads.js +26 -0
- package/dist/core/scene/treeReads.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
- package/dist/core/scene/unionOfChildren.js.map +1 -0
- package/dist/core/scene/unitScopes.js +13 -0
- package/dist/core/scene/unitScopes.js.map +1 -0
- package/dist/core/scene/useScene.js.map +1 -1
- package/dist/core/selection/readOnlySelection.js +32 -0
- package/dist/core/selection/readOnlySelection.js.map +1 -0
- package/dist/core/selection/usePublishSceneSelection.js +26 -0
- package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
- package/dist/core/selection/useSelection.js +34 -25
- package/dist/core/selection/useSelection.js.map +1 -1
- package/dist/core/shapeKinds.js.map +1 -1
- package/dist/core/stylus/stylus.js.map +1 -1
- package/dist/core/stylus/usePointerStylus.js.map +1 -1
- package/dist/core/usePaintKinds.js +1 -1
- package/dist/core/usePaintKinds.js.map +1 -1
- package/dist/core/viewport/clientToWorld.js.map +1 -1
- package/dist/core/viewport/fitViewToBounds.js.map +1 -1
- package/dist/core/viewport/parallax.js.map +1 -1
- package/dist/core/viewport/screenSlop.js +11 -11
- package/dist/core/viewport/screenSlop.js.map +1 -1
- package/dist/core/viewport/useCanvasSize.js.map +1 -1
- package/dist/core/viewport/useDecayLoop.js +8 -8
- package/dist/core/viewport/useDecayLoop.js.map +1 -1
- package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
- package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +102 -43
- package/dist/core/viewport/useViewAnimation.js.map +1 -1
- package/dist/core/viewport/view.js +9 -9
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/wheelHandler.js.map +1 -1
- package/dist/core/viewport/zoomBounds.js +10 -8
- package/dist/core/viewport/zoomBounds.js.map +1 -1
- package/dist/{cornerHandles-BCrDp_mH.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
- package/dist/debug/createDebugOverlayLayer.js +97 -97
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/createDebugSink.js.map +1 -1
- package/dist/debug/flag.js +2 -41
- package/dist/debug/frameStats.js.map +1 -1
- package/dist/debug/useDebugSink.js +52 -0
- package/dist/debug/useDebugSink.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
- package/dist/features/chrome-caps/conditions.js.map +1 -1
- package/dist/features/chrome-caps/defaults.js.map +1 -1
- package/dist/features/chrome-caps/resolve.js.map +1 -1
- package/dist/features/chrome-caps/useChromeCaps.js +54 -0
- package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js +22 -17
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +28 -19
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/ingestion/imageHandler.js +21 -24
- package/dist/features/ingestion/imageHandler.js.map +1 -1
- package/dist/features/ingestion/openFilePicker.js.map +1 -1
- package/dist/features/ingestion/placement.js +16 -0
- package/dist/features/ingestion/placement.js.map +1 -0
- package/dist/features/ingestion/registerKitHandlers.js +7 -7
- package/dist/features/ingestion/svgHandler.js +5 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -1
- package/dist/features/ingestion/textHandler.js +28 -0
- package/dist/features/ingestion/textHandler.js.map +1 -0
- package/dist/features/ingestion/useCanvasIngestion.js +48 -0
- package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +22 -14
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
- package/dist/features/longPress/longPressFeedback.js.map +1 -1
- package/dist/features/modes/modeLayers.js +7 -7
- package/dist/features/modes/modeLayers.js.map +1 -1
- package/dist/features/paths/editablePath.js +47 -0
- package/dist/features/paths/editablePath.js.map +1 -0
- package/dist/features/paths/index.js +9 -14
- package/dist/features/paths/pathEditState.js +41 -0
- package/dist/features/paths/pathEditState.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
- package/dist/features/paths/pathLayer.js +3 -2
- package/dist/features/paths/pathLayer.js.map +1 -1
- package/dist/features/paths/penPreviewLayer.js +86 -88
- package/dist/features/paths/penPreviewLayer.js.map +1 -1
- package/dist/features/paths/usePathEdit.js +34 -0
- package/dist/features/paths/usePathEdit.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +44 -52
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/selection/overlay.js +171 -179
- package/dist/features/selection/overlay.js.map +1 -1
- package/dist/features/text/index.js +6 -0
- package/dist/features/text/textLayer.js +1 -1
- package/dist/features/text/textLayer.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +100 -93
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/viewports/viewportLayer.js +25 -36
- package/dist/features/viewports/viewportLayer.js.map +1 -1
- package/dist/index.d.ts +8473 -9141
- package/dist/index.js +269 -307
- package/dist/input/keyState.js +38 -39
- package/dist/input/keyState.js.map +1 -1
- package/dist/input/useKeyModifiers.js +11 -0
- package/dist/input/useKeyModifiers.js.map +1 -0
- package/dist/interactions/actions/actionShortcuts.js.map +1 -1
- package/dist/interactions/actions/{defaults/align.js → align/action.js} +18 -20
- package/dist/interactions/actions/align/action.js.map +1 -0
- package/dist/interactions/actions/align/align.js +20 -20
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/action.js +65 -0
- package/dist/interactions/actions/booleans/action.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +69 -78
- package/dist/interactions/actions/booleans/booleans.js.map +1 -1
- package/dist/interactions/actions/booleans/operands.js +40 -0
- package/dist/interactions/actions/booleans/operands.js.map +1 -0
- package/dist/interactions/actions/booleans/pieces.js +45 -0
- package/dist/interactions/actions/booleans/pieces.js.map +1 -0
- package/dist/interactions/actions/booleans/placement.js +24 -0
- package/dist/interactions/actions/booleans/placement.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +11 -9
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
- package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +31 -15
- package/dist/interactions/actions/clipboard/action.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +44 -42
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/materializePaste.js +10 -7
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
- package/dist/interactions/actions/clone/action.js +98 -0
- package/dist/interactions/actions/clone/action.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors.js +52 -0
- package/dist/interactions/actions/clone/behaviors.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +7 -32
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +60 -84
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/areaSelect.js +35 -38
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/copySubtree.js +40 -0
- package/dist/interactions/actions/defaults/copySubtree.js.map +1 -0
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
- package/dist/interactions/actions/defaults/delete.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +13 -53
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +40 -50
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +44 -38
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +11 -12
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +40 -69
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/nudgeSteps.js +37 -0
- package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -0
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
- package/dist/interactions/actions/defaults/reorder.js +2 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -1
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/setFill.js +14 -8
- package/dist/interactions/actions/defaults/setFill.js.map +1 -1
- package/dist/interactions/actions/defaults/setFillOpacity.js +7 -4
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
- package/dist/interactions/actions/defaults/setStroke.js +12 -12
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +6 -6
- package/dist/interactions/actions/defaults/sliceOps.js +8 -10
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportDragPan.js +37 -26
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
- package/dist/interactions/actions/distribute/action.js +66 -0
- package/dist/interactions/actions/distribute/action.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +11 -11
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +7 -9
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +30 -27
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/flip/action.js +124 -0
- package/dist/interactions/actions/flip/action.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +30 -17
- package/dist/interactions/actions/flip/helpers.js.map +1 -1
- package/dist/interactions/actions/gestureFrames.js +18 -0
- package/dist/interactions/actions/gestureFrames.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +47 -20
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
- package/dist/interactions/actions/hitSelection.js +8 -0
- package/dist/interactions/actions/hitSelection.js.map +1 -0
- package/dist/interactions/actions/insert/action.js +72 -0
- package/dist/interactions/actions/insert/action.js.map +1 -0
- package/dist/interactions/actions/insert/commit.js +28 -0
- package/dist/interactions/actions/insert/commit.js.map +1 -0
- package/dist/interactions/actions/insert/extras.js +65 -0
- package/dist/interactions/actions/insert/extras.js.map +1 -0
- package/dist/interactions/actions/insert/frame.js +48 -0
- package/dist/interactions/actions/insert/frame.js.map +1 -0
- package/dist/interactions/actions/insert/geometry.js +35 -0
- package/dist/interactions/actions/insert/geometry.js.map +1 -0
- package/dist/interactions/actions/insert/rotateAction.js +21 -0
- package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
- package/dist/interactions/actions/insert/session.js +59 -0
- package/dist/interactions/actions/insert/session.js.map +1 -0
- package/dist/interactions/actions/insert/shape.js +34 -0
- package/dist/interactions/actions/insert/shape.js.map +1 -0
- package/dist/interactions/actions/lasso-select/action.js +143 -0
- package/dist/interactions/actions/lasso-select/action.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +14 -18
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
- package/dist/interactions/actions/move/action.js +87 -0
- package/dist/interactions/actions/move/action.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +5 -5
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +39 -27
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +99 -0
- package/dist/interactions/actions/move/capture.js.map +1 -0
- package/dist/interactions/actions/move/commit/index.js +41 -0
- package/dist/interactions/actions/move/commit/index.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
- package/dist/interactions/actions/move/commit/rebase.js +18 -0
- package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
- package/dist/interactions/actions/move/commit/reparent.js +65 -0
- package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
- package/dist/interactions/actions/move/delta.js +51 -0
- package/dist/interactions/actions/move/delta.js.map +1 -0
- package/dist/interactions/actions/move/frame.js +59 -0
- package/dist/interactions/actions/move/frame.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +22 -30
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +33 -0
- package/dist/interactions/actions/move/landedDescendants.js.map +1 -0
- package/dist/interactions/actions/move/layout/container.js +94 -0
- package/dist/interactions/actions/move/layout/container.js.map +1 -0
- package/dist/interactions/actions/move/layout/dragged.js +58 -0
- package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
- package/dist/interactions/actions/move/layout/dropPass.js +122 -0
- package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
- package/dist/interactions/actions/move/layout/exits.js +38 -0
- package/dist/interactions/actions/move/layout/exits.js.map +1 -0
- package/dist/interactions/actions/move/layout/glide.js +48 -0
- package/dist/interactions/actions/move/layout/glide.js.map +1 -0
- package/dist/interactions/actions/move/session.js +63 -0
- package/dist/interactions/actions/move/session.js.map +1 -0
- package/dist/interactions/actions/move/translate.js +61 -0
- package/dist/interactions/actions/move/translate.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +16 -63
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
- package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
- package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
- package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
- package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
- package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
- package/dist/interactions/actions/planeInput.js.map +1 -1
- package/dist/interactions/actions/pointerState.js +12 -0
- package/dist/interactions/actions/pointerState.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +16 -4
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +25 -20
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/resize/action.js +55 -0
- package/dist/interactions/actions/resize/action.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
- package/dist/interactions/actions/resize/boxFrame.js +16 -0
- package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
- package/dist/interactions/actions/resize/capture.js +85 -0
- package/dist/interactions/actions/resize/capture.js.map +1 -0
- package/dist/interactions/actions/resize/commit.js +69 -0
- package/dist/interactions/actions/resize/commit.js.map +1 -0
- package/dist/interactions/actions/resize/frame.js +74 -0
- package/dist/interactions/actions/resize/frame.js.map +1 -0
- package/dist/interactions/actions/resize/pointSnap.js +111 -0
- package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
- package/dist/interactions/actions/resize/ruleBounds.js +9 -0
- package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
- package/dist/interactions/actions/resize/session.js +49 -0
- package/dist/interactions/actions/resize/session.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -1
- package/dist/interactions/actions/resolvePreviews.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +56 -0
- package/dist/interactions/actions/rotate/action.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
- package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
- package/dist/interactions/actions/rotate/commit.js +40 -0
- package/dist/interactions/actions/rotate/commit.js.map +1 -0
- package/dist/interactions/actions/rotate/frame.js +65 -0
- package/dist/interactions/actions/rotate/frame.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +12 -12
- package/dist/interactions/actions/rotate/handle.js.map +1 -1
- package/dist/interactions/actions/rotate/session.js +92 -0
- package/dist/interactions/actions/rotate/session.js.map +1 -0
- package/dist/interactions/actions/selectionSubtree.js +69 -0
- package/dist/interactions/actions/selectionSubtree.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -1
- package/dist/interactions/actions/useStandardActions.js +87 -78
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragGesture.js +4 -7
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragPointOf.js +23 -0
- package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +21 -26
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +62 -41
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
- package/dist/interactions/gestures/shared/originProjection.js +1 -1
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
- package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
- package/dist/interactions/gestures/shared/snap.js.map +1 -1
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +8 -4
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
- package/dist/layout/arrivals.js +20 -23
- package/dist/layout/arrivals.js.map +1 -1
- package/dist/math-CYUjoyyU.d.ts +33 -0
- package/dist/math.d.ts +5 -3
- package/dist/math.js +6 -6
- package/dist/mesh.d.ts +4 -268
- package/dist/mesh.js +3 -7
- package/dist/move.d.ts +14 -11
- package/dist/{originProjection-DEklpDc_.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
- package/dist/patterns-builtin.d.ts +1 -118
- package/dist/patterns-builtin.js +2 -3
- package/dist/{poseDescriptor-D-OH-tu5.d.ts → poseDescriptor-Bqk-11Rl.d.ts} +26 -36
- package/dist/renderer.d.ts +1 -91
- package/dist/renderer.js +2 -18
- package/dist/resize.d.ts +10 -22
- package/dist/resize.js +6 -6
- package/dist/style.css +1 -1
- package/dist/test-hook/install.js +12 -6
- package/dist/test-hook/install.js.map +1 -1
- package/dist/test-hook/useTestHook.js +22 -0
- package/dist/test-hook/useTestHook.js.map +1 -0
- package/dist/test-seams-D0pyV3pR.d.ts +149 -0
- package/dist/test-seams.d.ts +4 -4
- package/dist/test-seams.js +2 -2
- package/dist/tools/builtin/bone/boneActions.js +130 -0
- package/dist/tools/builtin/bone/boneActions.js.map +1 -0
- package/dist/tools/builtin/bone/boneOverlay.js +58 -0
- package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
- package/dist/tools/builtin/bone/placedRig.js +24 -0
- package/dist/tools/builtin/bone/placedRig.js.map +1 -0
- package/dist/tools/builtin/bone/rigEditState.js +21 -0
- package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
- package/dist/tools/builtin/bone/useBoneTool.js +98 -0
- package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
- package/dist/tools/builtin/hand/useHandTool.js +1 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
- package/dist/tools/builtin/image/useImageTool.js.map +1 -1
- package/dist/tools/builtin/lasso/useLassoTool.js +11 -11
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js +1 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +198 -150
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +13 -8
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js +1 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
- package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +25 -24
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +42 -67
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/shared/pointerFollower.js +17 -0
- package/dist/tools/builtin/shared/pointerFollower.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +72 -82
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +22 -16
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +9 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/tools/builtin/weight/useWeightTool.js +77 -0
- package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
- package/dist/tools/builtin/weight/weightActions.js +112 -0
- package/dist/tools/builtin/weight/weightActions.js.map +1 -0
- package/dist/tools/builtin/weight/weightOverlay.js +61 -0
- package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
- package/dist/tools/overlayBinding.js.map +1 -1
- package/dist/tools/useKeybindings.js +12 -22
- package/dist/tools/useKeybindings.js.map +1 -1
- package/dist/{types-A37hYkeR.d.ts → types-CIKDwlsP.d.ts} +113 -169
- package/dist/util/color.js +3 -3
- package/dist/util/color.js.map +1 -1
- package/dist/util/paint.js +1 -1
- package/dist/util/paint.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +28 -21
- package/dist/animation/colorHelpers.js +0 -135
- package/dist/animation/colorHelpers.js.map +0 -1
- package/dist/animation/colorRegistry.js +0 -37
- package/dist/animation/colorRegistry.js.map +0 -1
- package/dist/animation/engine/axes.js +0 -36
- package/dist/animation/engine/axes.js.map +0 -1
- package/dist/animation/engine/codec.js +0 -170
- package/dist/animation/engine/codec.js.map +0 -1
- package/dist/animation/engine/integrator.js +0 -12
- package/dist/animation/engine/integrator.js.map +0 -1
- package/dist/animation/loop.js +0 -62
- package/dist/animation/loop.js.map +0 -1
- package/dist/animation/observe.js +0 -23
- package/dist/animation/observe.js.map +0 -1
- package/dist/animation/rig/blendPoses.js +0 -43
- package/dist/animation/rig/blendPoses.js.map +0 -1
- package/dist/animation/rig/mirrorPose.js +0 -19
- package/dist/animation/rig/mirrorPose.js.map +0 -1
- package/dist/animation/rig/resolveSkeleton.js +0 -33
- package/dist/animation/rig/resolveSkeleton.js.map +0 -1
- package/dist/animation/rig/solveIk.js +0 -103
- package/dist/animation/rig/solveIk.js.map +0 -1
- package/dist/animation/rig/types.js +0 -12
- package/dist/animation/rig/types.js.map +0 -1
- package/dist/animation/slew.js +0 -27
- package/dist/animation/slew.js.map +0 -1
- package/dist/animation/stagger.js +0 -138
- package/dist/animation/stagger.js.map +0 -1
- package/dist/animation/timeline/booking.js +0 -106
- package/dist/animation/timeline/booking.js.map +0 -1
- package/dist/animation/timeline/createTimeline.js +0 -116
- package/dist/animation/timeline/createTimeline.js.map +0 -1
- package/dist/animation/timeline/sampleTrack.js +0 -71
- package/dist/animation/timeline/sampleTrack.js.map +0 -1
- package/dist/animation/useAnimator.js +0 -378
- package/dist/animation/useAnimator.js.map +0 -1
- package/dist/builtins-C-VgUlWI.d.ts +0 -4514
- package/dist/canvas/MinimapCanvas.js +0 -139
- package/dist/canvas/MinimapCanvas.js.map +0 -1
- package/dist/canvas/deps/poseComposition.js +0 -11
- package/dist/canvas/deps/poseComposition.js.map +0 -1
- package/dist/canvas/minimapMath.js +0 -80
- package/dist/canvas/minimapMath.js.map +0 -1
- package/dist/canvas/toolPreview.js +0 -39
- package/dist/canvas/toolPreview.js.map +0 -1
- package/dist/core/adapters/arrayAdapter.js +0 -85
- package/dist/core/adapters/arrayAdapter.js.map +0 -1
- package/dist/core/adapters/useArrayAdapter.js +0 -13
- package/dist/core/adapters/useArrayAdapter.js.map +0 -1
- package/dist/core/fillInPoseFrame.js +0 -102
- package/dist/core/fillInPoseFrame.js.map +0 -1
- package/dist/core/geometry/poseRotation.js +0 -58
- package/dist/core/geometry/poseRotation.js.map +0 -1
- package/dist/core/gradient.js +0 -136
- package/dist/core/gradient.js.map +0 -1
- package/dist/core/isPlainObject.js.map +0 -1
- package/dist/core/markerInset.js +0 -24
- package/dist/core/markerInset.js.map +0 -1
- package/dist/core/mixed.js +0 -6
- package/dist/core/mixed.js.map +0 -1
- package/dist/core/paintKinds.js +0 -156
- package/dist/core/paintKinds.js.map +0 -1
- package/dist/core/strokeMarkerShapes.js +0 -139
- package/dist/core/strokeMarkerShapes.js.map +0 -1
- package/dist/core/strokeMarkers.js +0 -28
- package/dist/core/strokeMarkers.js.map +0 -1
- package/dist/core/viewport/meanScale.js +0 -8
- package/dist/core/viewport/meanScale.js.map +0 -1
- package/dist/core/viewport/pxExtent.js +0 -42
- package/dist/core/viewport/pxExtent.js.map +0 -1
- package/dist/debug/flag.js.map +0 -1
- package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
- package/dist/features/focus/gateLayer.js +0 -14
- package/dist/features/focus/gateLayer.js.map +0 -1
- package/dist/features/focus/useCanvasFocus.js +0 -29
- package/dist/features/focus/useCanvasFocus.js.map +0 -1
- package/dist/features/groups/children.js.map +0 -1
- package/dist/features/groups/composePose.js.map +0 -1
- package/dist/features/groups/nestedHit.js.map +0 -1
- package/dist/features/groups/unionOfChildren.js.map +0 -1
- package/dist/features/images/imageCache.js +0 -94
- package/dist/features/images/imageCache.js.map +0 -1
- package/dist/features/ingestion/index.js +0 -8
- package/dist/features/meshPaint/bake.js +0 -79
- package/dist/features/meshPaint/bake.js.map +0 -1
- package/dist/features/meshPaint/bakeCache.js +0 -59
- package/dist/features/meshPaint/bakeCache.js.map +0 -1
- package/dist/features/meshPaint/handles.js +0 -86
- package/dist/features/meshPaint/handles.js.map +0 -1
- package/dist/features/meshPaint/lazyKind.js.map +0 -1
- package/dist/features/meshPaint/meshPaint.js +0 -236
- package/dist/features/meshPaint/meshPaint.js.map +0 -1
- package/dist/features/meshPaint/meshShader.js +0 -6
- package/dist/features/meshPaint/meshShader.js.map +0 -1
- package/dist/features/meshPaint/register.js +0 -7
- package/dist/features/meshPaint/register.js.map +0 -1
- package/dist/features/meshPaint/surface.js +0 -110
- package/dist/features/meshPaint/surface.js.map +0 -1
- package/dist/features/minimap/actions.js +0 -53
- package/dist/features/minimap/actions.js.map +0 -1
- package/dist/features/minimap/createMinimapContribution.js +0 -96
- package/dist/features/minimap/createMinimapContribution.js.map +0 -1
- package/dist/features/minimap/layers.js +0 -103
- package/dist/features/minimap/layers.js.map +0 -1
- package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
- package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
- package/dist/features/parallax/createParallaxLayer.js +0 -26
- package/dist/features/parallax/createParallaxLayer.js.map +0 -1
- package/dist/features/parallax/createParallaxPlane.js +0 -26
- package/dist/features/parallax/createParallaxPlane.js.map +0 -1
- package/dist/features/paths/anchorEdits.js +0 -156
- package/dist/features/paths/anchorEdits.js.map +0 -1
- package/dist/features/paths/anchors.js +0 -154
- package/dist/features/paths/anchors.js.map +0 -1
- package/dist/features/paths/booleans.js +0 -2
- package/dist/features/paths/markerCommands.js +0 -148
- package/dist/features/paths/markerCommands.js.map +0 -1
- package/dist/features/paths/markerSites.js +0 -59
- package/dist/features/paths/markerSites.js.map +0 -1
- package/dist/features/paths/markers.js +0 -95
- package/dist/features/paths/markers.js.map +0 -1
- package/dist/features/paths/nearestAnchor.js +0 -36
- package/dist/features/paths/nearestAnchor.js.map +0 -1
- package/dist/features/paths/pathInWorld.js +0 -41
- package/dist/features/paths/pathInWorld.js.map +0 -1
- package/dist/features/paths/poseDescriptor.js +0 -39
- package/dist/features/paths/poseDescriptor.js.map +0 -1
- package/dist/features/paths/tessellate/dash.js +0 -52
- package/dist/features/paths/tessellate/dash.js.map +0 -1
- package/dist/features/paths/tessellate/insets.js +0 -32
- package/dist/features/paths/tessellate/insets.js.map +0 -1
- package/dist/features/paths/tessellate/metric.js +0 -72
- package/dist/features/paths/tessellate/metric.js.map +0 -1
- package/dist/features/paths/tessellate/stroke.js +0 -170
- package/dist/features/paths/tessellate/stroke.js.map +0 -1
- package/dist/features/paths/tessellate/vertexWidths.js +0 -32
- package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
- package/dist/features/patterns/index.js +0 -23
- package/dist/features/patterns/index.js.map +0 -1
- package/dist/features/patterns/patterns-builtin.js +0 -38
- package/dist/features/patterns/patterns-builtin.js.map +0 -1
- package/dist/features/patterns/resolveSpec.js +0 -57
- package/dist/features/patterns/resolveSpec.js.map +0 -1
- package/dist/features/patterns/tileGeometry.js +0 -158
- package/dist/features/patterns/tileGeometry.js.map +0 -1
- package/dist/features/pointer/PointerContext.js +0 -45
- package/dist/features/pointer/PointerContext.js.map +0 -1
- package/dist/features/selection/SelectionContext.js +0 -46
- package/dist/features/selection/SelectionContext.js.map +0 -1
- package/dist/features/simulation/createSimulation.js +0 -61
- package/dist/features/simulation/createSimulation.js.map +0 -1
- package/dist/features/simulation/types.js +0 -6
- package/dist/features/simulation/types.js.map +0 -1
- package/dist/features/simulation/useSimulation.js +0 -74
- package/dist/features/simulation/useSimulation.js.map +0 -1
- package/dist/features/text/domRuns.js +0 -258
- package/dist/features/text/domRuns.js.map +0 -1
- package/dist/features/text/fitTextPose.js +0 -38
- package/dist/features/text/fitTextPose.js.map +0 -1
- package/dist/features/text/hitTest.js +0 -45
- package/dist/features/text/hitTest.js.map +0 -1
- package/dist/features/text/renderLabel.js +0 -14
- package/dist/features/text/renderLabel.js.map +0 -1
- package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
- package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
- package/dist/features/text/runs/flagRange.js +0 -53
- package/dist/features/text/runs/flagRange.js.map +0 -1
- package/dist/features/text/runs/rangeStyle.js +0 -135
- package/dist/features/text/runs/rangeStyle.js.map +0 -1
- package/dist/features/text/textCommand.js +0 -59
- package/dist/features/text/textCommand.js.map +0 -1
- package/dist/features/text/textToPath.js +0 -181
- package/dist/features/text/textToPath.js.map +0 -1
- package/dist/features/text/useTextEdit.js +0 -467
- package/dist/features/text/useTextEdit.js.map +0 -1
- package/dist/features/tiling/createTiledLayer.js +0 -63
- package/dist/features/tiling/createTiledLayer.js.map +0 -1
- package/dist/features/tiling/tiledProject.js +0 -14
- package/dist/features/tiling/tiledProject.js.map +0 -1
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
- package/dist/interactions/actions/defaults/align.js.map +0 -1
- package/dist/interactions/actions/defaults/booleans.js +0 -52
- package/dist/interactions/actions/defaults/booleans.js.map +0 -1
- package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
- package/dist/interactions/actions/defaults/clone.js +0 -107
- package/dist/interactions/actions/defaults/clone.js.map +0 -1
- package/dist/interactions/actions/defaults/createOutlines.js +0 -47
- package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
- package/dist/interactions/actions/defaults/distribute.js +0 -66
- package/dist/interactions/actions/defaults/distribute.js.map +0 -1
- package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
- package/dist/interactions/actions/defaults/flip.js +0 -119
- package/dist/interactions/actions/defaults/flip.js.map +0 -1
- package/dist/interactions/actions/defaults/freshNodeId.js +0 -10
- package/dist/interactions/actions/defaults/freshNodeId.js.map +0 -1
- package/dist/interactions/actions/defaults/insert.js +0 -288
- package/dist/interactions/actions/defaults/insert.js.map +0 -1
- package/dist/interactions/actions/defaults/lassoSelect.js +0 -156
- package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
- package/dist/interactions/actions/defaults/move.js +0 -760
- package/dist/interactions/actions/defaults/move.js.map +0 -1
- package/dist/interactions/actions/defaults/resize.js +0 -335
- package/dist/interactions/actions/defaults/resize.js.map +0 -1
- package/dist/interactions/actions/defaults/rotate.js +0 -184
- package/dist/interactions/actions/defaults/rotate.js.map +0 -1
- package/dist/interactions/actions/previewOverrides.js +0 -25
- package/dist/interactions/actions/previewOverrides.js.map +0 -1
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
- package/dist/math-Drrw4ewZ.d.ts +0 -160
- package/dist/registerProgram-BMZRDgrh.d.ts +0 -197
- package/dist/renderer/DrawCommand.js +0 -6
- package/dist/renderer/DrawCommand.js.map +0 -1
- package/dist/renderer/WeaselRenderer.js +0 -331
- package/dist/renderer/WeaselRenderer.js.map +0 -1
- package/dist/renderer/batchClip.js +0 -46
- package/dist/renderer/batchClip.js.map +0 -1
- package/dist/renderer/cache/GLImageCache.js +0 -64
- package/dist/renderer/cache/GLImageCache.js.map +0 -1
- package/dist/renderer/cache/GLMeshCache.js +0 -102
- package/dist/renderer/cache/GLMeshCache.js.map +0 -1
- package/dist/renderer/cache/GLTextureCache.js +0 -51
- package/dist/renderer/cache/GLTextureCache.js.map +0 -1
- package/dist/renderer/cache/GradientRampAtlas.js +0 -82
- package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
- package/dist/renderer/cache/cache.js +0 -13
- package/dist/renderer/cache/cache.js.map +0 -1
- package/dist/renderer/cache/markerCommandCache.js +0 -63
- package/dist/renderer/cache/markerCommandCache.js.map +0 -1
- package/dist/renderer/cache/outlineMeshCache.js +0 -15
- package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
- package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
- package/dist/renderer/cache/strokeMeshCache.js +0 -55
- package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
- package/dist/renderer/cullDrawCommands.js +0 -90
- package/dist/renderer/cullDrawCommands.js.map +0 -1
- package/dist/renderer/draw.js +0 -1135
- package/dist/renderer/draw.js.map +0 -1
- package/dist/renderer/drawBatch.js +0 -198
- package/dist/renderer/drawBatch.js.map +0 -1
- package/dist/renderer/effects/EffectTargets.js +0 -45
- package/dist/renderer/effects/EffectTargets.js.map +0 -1
- package/dist/renderer/effects/builtins.js +0 -31
- package/dist/renderer/effects/builtins.js.map +0 -1
- package/dist/renderer/effects/composite.js +0 -9
- package/dist/renderer/effects/composite.js.map +0 -1
- package/dist/renderer/effects/effectPrelude.js +0 -10
- package/dist/renderer/effects/effectPrelude.js.map +0 -1
- package/dist/renderer/effects/types.js +0 -10
- package/dist/renderer/effects/types.js.map +0 -1
- package/dist/renderer/glyphOutlineMesh.js +0 -67
- package/dist/renderer/glyphOutlineMesh.js.map +0 -1
- package/dist/renderer/index.js +0 -19
- package/dist/renderer/math/color.js +0 -341
- package/dist/renderer/math/color.js.map +0 -1
- package/dist/renderer/math/mat3.js +0 -76
- package/dist/renderer/math/mat3.js.map +0 -1
- package/dist/renderer/math/patternSpace.js +0 -22
- package/dist/renderer/math/patternSpace.js.map +0 -1
- package/dist/renderer/math/viewToMat3.js +0 -19
- package/dist/renderer/math/viewToMat3.js.map +0 -1
- package/dist/renderer/paintResources.js +0 -18
- package/dist/renderer/paintResources.js.map +0 -1
- package/dist/renderer/paintScratch.js +0 -37
- package/dist/renderer/paintScratch.js.map +0 -1
- package/dist/renderer/shaders/ShaderProgram.js +0 -74
- package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
- package/dist/renderer/shaders/batchFill.js +0 -119
- package/dist/renderer/shaders/batchFill.js.map +0 -1
- package/dist/renderer/shaders/customPrelude.js +0 -34
- package/dist/renderer/shaders/customPrelude.js.map +0 -1
- package/dist/renderer/shaders/extractUniformNames.js +0 -184
- package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
- package/dist/renderer/shaders/glyphPaint.js +0 -61
- package/dist/renderer/shaders/glyphPaint.js.map +0 -1
- package/dist/renderer/shaders/gradFill.js +0 -30
- package/dist/renderer/shaders/gradFill.js.map +0 -1
- package/dist/renderer/shaders/imageFill.js +0 -14
- package/dist/renderer/shaders/imageFill.js.map +0 -1
- package/dist/renderer/shaders/pathFill.js +0 -13
- package/dist/renderer/shaders/pathFill.js.map +0 -1
- package/dist/renderer/shaders/patternFill.js +0 -24
- package/dist/renderer/shaders/patternFill.js.map +0 -1
- package/dist/renderer/shaders/registerProgram.js +0 -18
- package/dist/renderer/shaders/registerProgram.js.map +0 -1
- package/dist/renderer/spriteSheet.js +0 -14
- package/dist/renderer/spriteSheet.js.map +0 -1
- package/dist/renderer/state/GroupState.js +0 -77
- package/dist/renderer/state/GroupState.js.map +0 -1
- package/dist/renderer/strokeLengths.js +0 -50
- package/dist/renderer/strokeLengths.js.map +0 -1
- package/dist/renderer/syntheticItalic.js +0 -6
- package/dist/renderer/syntheticItalic.js.map +0 -1
- package/dist/renderer/textures/registerTexture.js +0 -14
- package/dist/renderer/textures/registerTexture.js.map +0 -1
- package/dist/scheduling/useVisibleRaf.js +0 -69
- package/dist/scheduling/useVisibleRaf.js.map +0 -1
- package/dist/test-seams-CuIxe0xY.d.ts +0 -356
- package/dist/tools/prefs.js +0 -62
- package/dist/tools/prefs.js.map +0 -1
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
import { editingLayer as e, inPlane as t } from "../planeInput.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { ActionDisabledReason as
|
|
2
|
+
import { selectionAfterAnchorPress as n } from "../edit-anchors/action.js";
|
|
3
|
+
import { NUDGE_KEY as r, NUDGE_LABEL as i, nudgeDelta as a } from "./nudgeSteps.js";
|
|
4
|
+
import { anchorsInRect as o, deleteAnchorsAt as s, editAnchorSet as c, openSubpathAt as l, pathToAnchors as u, pxExtent as d, translateAnchorBy as f } from "@weasel-js/geom";
|
|
5
|
+
import { ActionDisabledReason as p } from "@weasel-js/routing";
|
|
6
6
|
//#region src/interactions/actions/defaults/anchorEditing.ts
|
|
7
|
-
var
|
|
8
|
-
function
|
|
7
|
+
var m = 10;
|
|
8
|
+
function h(e) {
|
|
9
|
+
let t = e?.view?.get().scale;
|
|
10
|
+
if (!t) return m;
|
|
11
|
+
let n = d(m, t);
|
|
12
|
+
return Math.max(n.x, n.y);
|
|
13
|
+
}
|
|
14
|
+
function g(e) {
|
|
9
15
|
let t = e?.editAnchors;
|
|
10
16
|
return !t || !t.editingId ? null : t;
|
|
11
17
|
}
|
|
12
|
-
function
|
|
18
|
+
function _(e) {
|
|
13
19
|
let t = e.getEditablePath(e.editingId);
|
|
14
20
|
return !t || t.kind !== "polygon" ? null : t;
|
|
15
21
|
}
|
|
16
|
-
function
|
|
17
|
-
let r =
|
|
22
|
+
function v(e, t, n) {
|
|
23
|
+
let r = _(e);
|
|
18
24
|
if (!r) return !1;
|
|
19
|
-
let i =
|
|
25
|
+
let i = c(r, n);
|
|
20
26
|
return i ? (e.applyEdit(e.editingId, i, t), !0) : !1;
|
|
21
27
|
}
|
|
22
|
-
function
|
|
23
|
-
let t =
|
|
24
|
-
return !t || t.selectedAnchors.size === 0 ?
|
|
28
|
+
function y(e) {
|
|
29
|
+
let t = g(e);
|
|
30
|
+
return !t || t.selectedAnchors.size === 0 ? p.SelectionRequired : !0;
|
|
25
31
|
}
|
|
26
|
-
var
|
|
32
|
+
var b = t({
|
|
27
33
|
id: "selectAnchor",
|
|
28
34
|
label: "Select anchor",
|
|
29
35
|
defaultBinding: [{
|
|
@@ -40,71 +46,41 @@ var _ = t({
|
|
|
40
46
|
opts: { params: { additive: !0 } }
|
|
41
47
|
}],
|
|
42
48
|
eligible: { capability: "edits-anchors" },
|
|
43
|
-
requires: ["editAnchors"],
|
|
49
|
+
requires: ["editAnchors", "view"],
|
|
44
50
|
invoker: {
|
|
45
51
|
timing: "immediate",
|
|
46
52
|
run: (e, t) => {
|
|
47
|
-
let
|
|
48
|
-
if (!
|
|
49
|
-
let
|
|
50
|
-
if (typeof
|
|
51
|
-
let
|
|
52
|
-
if (!
|
|
53
|
-
let
|
|
54
|
-
if (
|
|
55
|
-
|
|
53
|
+
let r = g(e);
|
|
54
|
+
if (!r) return;
|
|
55
|
+
let i = t?.worldX, a = t?.worldY;
|
|
56
|
+
if (typeof i != "number" || typeof a != "number") return;
|
|
57
|
+
let o = _(r);
|
|
58
|
+
if (!o) return;
|
|
59
|
+
let s = O(o, i, a, h(e)), c = t?.additive === !0;
|
|
60
|
+
if (s === -1) {
|
|
61
|
+
c || r.setSelectedAnchors([]);
|
|
56
62
|
return;
|
|
57
63
|
}
|
|
58
|
-
|
|
64
|
+
r.setSelectedAnchors(n(r.selectedAnchors, s, c));
|
|
59
65
|
}
|
|
60
66
|
},
|
|
61
|
-
enabled: (e) =>
|
|
62
|
-
}, e)
|
|
63
|
-
up: "ArrowUp",
|
|
64
|
-
down: "ArrowDown",
|
|
65
|
-
left: "ArrowLeft",
|
|
66
|
-
right: "ArrowRight"
|
|
67
|
-
}, y = {
|
|
68
|
-
up: "Up",
|
|
69
|
-
down: "Down",
|
|
70
|
-
left: "Left",
|
|
71
|
-
right: "Right"
|
|
72
|
-
};
|
|
73
|
-
function b(e, t) {
|
|
74
|
-
switch (e) {
|
|
75
|
-
case "up": return {
|
|
76
|
-
dx: 0,
|
|
77
|
-
dy: -t
|
|
78
|
-
};
|
|
79
|
-
case "down": return {
|
|
80
|
-
dx: 0,
|
|
81
|
-
dy: t
|
|
82
|
-
};
|
|
83
|
-
case "left": return {
|
|
84
|
-
dx: -t,
|
|
85
|
-
dy: 0
|
|
86
|
-
};
|
|
87
|
-
case "right": return {
|
|
88
|
-
dx: t,
|
|
89
|
-
dy: 0
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
}
|
|
67
|
+
enabled: (e) => g(e) ? !0 : p.SelectionRequired
|
|
68
|
+
}, e);
|
|
93
69
|
function x(e) {
|
|
94
70
|
return {
|
|
95
71
|
id: `nudgeAnchors.${e}`,
|
|
96
|
-
label: `Nudge Anchors ${
|
|
72
|
+
label: `Nudge Anchors ${i[e]}`,
|
|
97
73
|
group: "nudgeAnchors",
|
|
98
74
|
defaultBinding: [{
|
|
99
75
|
spec: {
|
|
100
76
|
kind: "key",
|
|
101
|
-
key:
|
|
77
|
+
key: r[e]
|
|
102
78
|
},
|
|
103
79
|
opts: { params: { magnitude: "small" } }
|
|
104
80
|
}, {
|
|
105
81
|
spec: {
|
|
106
82
|
kind: "key",
|
|
107
|
-
key:
|
|
83
|
+
key: r[e],
|
|
108
84
|
mods: { shift: !0 }
|
|
109
85
|
},
|
|
110
86
|
opts: { params: { magnitude: "big" } }
|
|
@@ -114,17 +90,17 @@ function x(e) {
|
|
|
114
90
|
invoker: {
|
|
115
91
|
timing: "immediate",
|
|
116
92
|
run: (t, n) => {
|
|
117
|
-
let r =
|
|
93
|
+
let r = g(t);
|
|
118
94
|
if (!r || r.selectedAnchors.size === 0) return;
|
|
119
|
-
let { dx: i, dy:
|
|
120
|
-
|
|
95
|
+
let { dx: i, dy: o } = a(e, n?.magnitude), s = [...r.selectedAnchors];
|
|
96
|
+
v(r, "Nudge anchor", (e) => {
|
|
121
97
|
let t = !1;
|
|
122
|
-
for (let n of
|
|
98
|
+
for (let n of s) t = f(e, n, i, o) || t;
|
|
123
99
|
return t;
|
|
124
100
|
});
|
|
125
101
|
}
|
|
126
102
|
},
|
|
127
|
-
enabled:
|
|
103
|
+
enabled: y
|
|
128
104
|
};
|
|
129
105
|
}
|
|
130
106
|
var S = x("up"), C = x("down"), w = x("left"), T = x("right"), E = {
|
|
@@ -143,13 +119,13 @@ var S = x("up"), C = x("down"), w = x("left"), T = x("right"), E = {
|
|
|
143
119
|
invoker: {
|
|
144
120
|
timing: "immediate",
|
|
145
121
|
run: (e) => {
|
|
146
|
-
let t =
|
|
122
|
+
let t = g(e);
|
|
147
123
|
if (!t || t.selectedAnchors.size === 0) return;
|
|
148
124
|
let n = [...t.selectedAnchors];
|
|
149
|
-
|
|
125
|
+
v(t, "Delete anchor", (e) => s(e, n)) && t.setSelectedAnchors([]);
|
|
150
126
|
}
|
|
151
127
|
},
|
|
152
|
-
enabled:
|
|
128
|
+
enabled: y
|
|
153
129
|
}, D = t({
|
|
154
130
|
id: "cutPathAtAnchor",
|
|
155
131
|
label: "Cut path at anchor",
|
|
@@ -161,29 +137,29 @@ var S = x("up"), C = x("down"), w = x("left"), T = x("right"), E = {
|
|
|
161
137
|
}
|
|
162
138
|
},
|
|
163
139
|
eligible: { capability: "edits-anchors" },
|
|
164
|
-
requires: ["editAnchors"],
|
|
140
|
+
requires: ["editAnchors", "view"],
|
|
165
141
|
invoker: {
|
|
166
142
|
timing: "immediate",
|
|
167
143
|
run: (e, t) => {
|
|
168
|
-
let n =
|
|
144
|
+
let n = g(e);
|
|
169
145
|
if (!n) return;
|
|
170
146
|
let r = t?.worldX, i = t?.worldY;
|
|
171
147
|
if (typeof r != "number" || typeof i != "number") return;
|
|
172
|
-
let a =
|
|
148
|
+
let a = _(n);
|
|
173
149
|
if (!a) return;
|
|
174
|
-
let
|
|
175
|
-
|
|
150
|
+
let o = O(a, r, i, h(e));
|
|
151
|
+
o !== -1 && v(n, "Cut path", (e) => l(e, o)) && n.setSelectedAnchors([]);
|
|
176
152
|
}
|
|
177
153
|
},
|
|
178
|
-
enabled: (e) =>
|
|
154
|
+
enabled: (e) => g(e) ? !0 : p.SelectionRequired
|
|
179
155
|
}, e);
|
|
180
|
-
function O(e, t,
|
|
181
|
-
let
|
|
182
|
-
for (let
|
|
183
|
-
let
|
|
184
|
-
c <=
|
|
156
|
+
function O(e, t, n, r) {
|
|
157
|
+
let i = -1, a = r * r, o = 0;
|
|
158
|
+
for (let r of u(e).anchors) for (let e of r) {
|
|
159
|
+
let r = e.x - t, s = e.y - n, c = r * r + s * s;
|
|
160
|
+
c <= a && (i === -1 || c < a) && (a = c, i = o), o++;
|
|
185
161
|
}
|
|
186
|
-
return
|
|
162
|
+
return i;
|
|
187
163
|
}
|
|
188
164
|
var k = t({
|
|
189
165
|
id: "marqueeAnchors",
|
|
@@ -197,9 +173,9 @@ var k = t({
|
|
|
197
173
|
invoker: {
|
|
198
174
|
timing: "ongoing",
|
|
199
175
|
start(e) {
|
|
200
|
-
let t =
|
|
176
|
+
let t = g(e.deps);
|
|
201
177
|
if (!t) return {};
|
|
202
|
-
let n =
|
|
178
|
+
let n = _(t);
|
|
203
179
|
if (!n) return {};
|
|
204
180
|
let r = e.modifiers.shift, i = new Set(t.selectedAnchors), a = {
|
|
205
181
|
x: e.world.x,
|
|
@@ -227,9 +203,9 @@ var k = t({
|
|
|
227
203
|
enabled: () => !0
|
|
228
204
|
}, e);
|
|
229
205
|
function A(e, t) {
|
|
230
|
-
return
|
|
206
|
+
return o(u(e), t);
|
|
231
207
|
}
|
|
232
208
|
//#endregion
|
|
233
|
-
export { D as cutPathAtAnchorAction, E as deleteAnchorsAction, k as marqueeAnchorsAction, C as nudgeAnchorsDownAction, w as nudgeAnchorsLeftAction, T as nudgeAnchorsRightAction, S as nudgeAnchorsUpAction,
|
|
209
|
+
export { D as cutPathAtAnchorAction, E as deleteAnchorsAction, k as marqueeAnchorsAction, C as nudgeAnchorsDownAction, w as nudgeAnchorsLeftAction, T as nudgeAnchorsRightAction, S as nudgeAnchorsUpAction, b as selectAnchorAction };
|
|
234
210
|
|
|
235
211
|
//# sourceMappingURL=anchorEditing.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchorEditing.js","names":["SMALL_STEP","BIG_STEP","ANCHOR_CLICK_SLOP","depOf","dep","deps","worldPathOf","p","commitAnchorEdit","worldPath","next","editAnchorSet","edit","label","requiresAnchorSelection","ActionDisabledReason","selectAnchorAction","inPlane","wx","params","wy","hit","nearestAnchorIndex","additive","selectionAfterAnchorPress","editingLayer","KEY_FOR","LABEL_FOR","delta","dir","step","makeNudgeAnchorsAction","selected","any","flat","translateAnchorBy","set","dx","dy","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","doomed","deleteAnchorsAt","cutPathAtAnchorAction","nearest","openSubpathAt","best","bestD2","slop","sub","pathToAnchors","path","a","d2","marqueeAnchorsAction","ctx","base","start","rectFrom","cx","cy","rect","moveCtx","hits","anchorsOfPathInRect","reason","anchorsInRect"],"sources":["../../../../src/interactions/actions/defaults/anchorEditing.ts"],"sourcesContent":["/**\n * Anchor-editing Actions beyond the drag itself — the keyboard and\n * marquee half of path editing.\n *\n * These were previously only reachable through the pen tool's private\n * edit mode, which no consumer could actually enter (its `getPathObj`\n * hook needed a `pose.kind` that no kit-created node has). Porting them\n * onto the Action layer puts them behind the same `editAnchors` dep,\n * `edits-anchors` capability, and undo path as `editAnchorsAction`.\n *\n * ## Why these don't collide with their node-level counterparts\n *\n * Each has a node-level twin bound to the same gesture: `deleteAction`\n * (Delete/Backspace), `nudge.*` (arrows), `areaSelectAction` (drag on\n * empty). Two mechanisms keep them apart, and both are needed:\n *\n * - **Capability eligibility**, when a mode registry is wired. The\n * node-level twins gate on `edits-page` / `transforms-selection` /\n * `creates-selection`, none of which `path-edit` mode allows, so the\n * dispatcher filters them out before matching.\n * - **`enabled` fall-through**, for the many consumers with no mode\n * registry at all. There the eligibility filter is skipped entirely,\n * so these actions report themselves disabled unless a path is\n * actually being edited with anchors selected, and the dispatcher\n * moves on to the node-level twin.\n *\n * Relying on eligibility alone would break every non-modal consumer;\n * relying on `enabled` alone would let a node-level action fire inside\n * path-edit mode. See `anchorEditing.test.ts`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { ImmediateInvoker, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport {\n anchorsInRect,\n deleteAnchorsAt,\n editAnchorSet,\n openSubpathAt,\n translateAnchorBy,\n type AnchorSet,\n} from 'features/paths/anchorEdits';\nimport { pathToAnchors } from 'features/paths/anchors';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { selectionAfterAnchorPress } from './editAnchors';\nimport { inPlane, editingLayer } from '../planeInput';\n\n// ---------------------------------------------------------------------------\n// Shared plumbing\n// ---------------------------------------------------------------------------\n\n/** Nudge step sizes — mirror `nudge.ts` so anchors and nodes move alike. */\nconst SMALL_STEP = 1;\nconst BIG_STEP = 10;\n\n/** World-unit radius for \"this click landed on an anchor\". Matches the\n * affordance hit radius closely enough that anything the user can see as\n * an anchor marker is cuttable. */\nconst ANCHOR_CLICK_SLOP = 10;\n\nfunction depOf(deps: ActionDeps | undefined): EditAnchorsDep | null {\n const dep = deps?.editAnchors;\n if (!dep || !dep.editingId) return null;\n return dep;\n}\n\n/** The edited node's world-space polygon, or null when unavailable. */\nfunction worldPathOf(dep: EditAnchorsDep): PolygonPath | null {\n const p = dep.getEditablePath(dep.editingId) as PolygonPath | undefined;\n if (!p || p.kind !== 'polygon') return null;\n return p;\n}\n\n/**\n * Decode → mutate → encode → commit, in one history entry. Returns false\n * when the edit changed nothing, so callers can skip the commit rather\n * than push an empty undo step.\n */\nfunction commitAnchorEdit(\n dep: EditAnchorsDep,\n label: string,\n edit: (set: Parameters<Parameters<typeof editAnchorSet>[1]>[0]) => boolean | void,\n): boolean {\n const worldPath = worldPathOf(dep);\n if (!worldPath) return false;\n const next = editAnchorSet(worldPath, edit);\n if (!next) return false;\n dep.applyEdit(dep.editingId, next, label);\n return true;\n}\n\n/** Enabled only while a path is in edit mode with anchors selected. */\nfunction requiresAnchorSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return ActionDisabledReason.SelectionRequired;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// selectAnchor\n// ---------------------------------------------------------------------------\n\n/**\n * Click an anchor to select it; Shift-click to toggle it in or out of the\n * selection. Clicking away from every anchor clears the anchor selection.\n *\n * ## Why this is a click action and not part of the drag\n *\n * The obvious home for \"pressing an anchor selects it\" is\n * `editAnchorsAction.start`, since that's the handler that receives the\n * anchor affordance. It can't live there: the dispatcher only dispatches\n * a drag binding once the pointer crosses the drag threshold, so a press\n * that never moves never reaches `start` at all. Verified in the running\n * app — down/up on an anchor logs a bare `click`, and down/move-3px/up\n * logs the same; only a real drag logs `pointerdown → editAnchors`.\n *\n * Clicks, in turn, carry no affordance (the dispatcher attaches those to\n * `pointerdown` only), so this resolves the anchor from the click's world\n * coords — the same thing `insertPathAnchorAction` does for segments.\n * `editAnchorsAction` still syncs the selection when a drag begins on an\n * unselected anchor, so drag-without-clicking-first behaves too.\n *\n * **Non-modal caveat:** `useSelectTool` binds `clearSelection` to\n * `{ click, target: 'empty', mods: {} }` at active scope, which outranks\n * this ambient binding. In path-edit mode that action is filtered out by\n * capability, so anchor clicks win. In a consumer with no mode registry\n * there's no filtering, so clicking an anchor that happens to sit over\n * empty canvas clears the node selection instead of selecting the anchor.\n * Anchors over the path body are unaffected.\n */\nexport const selectAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'selectAnchor',\n label: 'Select anchor',\n defaultBinding: [\n { spec: { kind: 'click', mods: {} }, opts: { params: { additive: false } } },\n { spec: { kind: 'click', mods: { shift: true } }, opts: { params: { additive: true } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n const hit = nearestAnchorIndex(worldPath, wx, wy, ANCHOR_CLICK_SLOP);\n const additive = params?.additive === true;\n if (hit === -1) {\n // Missed every anchor. A bare click clears; a shift-click leaves\n // the selection alone so a stray miss mid-multi-select doesn't\n // undo the work.\n if (!additive) dep.setSelectedAnchors([]);\n return;\n }\n dep.setSelectedAnchors(selectionAfterAnchorPress(dep.selectedAnchors, hit, additive));\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n// ---------------------------------------------------------------------------\n// nudgeAnchors\n// ---------------------------------------------------------------------------\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\nconst KEY_FOR: Record<Direction, string> = {\n up: 'ArrowUp', down: 'ArrowDown', left: 'ArrowLeft', right: 'ArrowRight',\n};\nconst LABEL_FOR: Record<Direction, string> = {\n up: 'Up', down: 'Down', left: 'Left', right: 'Right',\n};\nfunction delta(dir: Direction, step: number): { dx: number; dy: number } {\n switch (dir) {\n case 'up': return { dx: 0, dy: -step };\n case 'down': return { dx: 0, dy: step };\n case 'left': return { dx: -step, dy: 0 };\n case 'right': return { dx: step, dy: 0 };\n }\n}\n\n/**\n * Move the selected anchors by one step. Shift multiplies the step, same\n * as node nudging.\n *\n * Every keystroke is its own history entry, matching node nudge — hold an\n * arrow down and undo walks back one step at a time rather than\n * collapsing the run.\n */\nfunction makeNudgeAnchorsAction(dir: Direction): Action & { requires: string[] } {\n return {\n id: `nudgeAnchors.${dir}`,\n label: `Nudge Anchors ${LABEL_FOR[dir]}`,\n group: 'nudgeAnchors',\n defaultBinding: [\n { spec: { kind: 'key', key: KEY_FOR[dir] }, opts: { params: { magnitude: 'small' } } },\n { spec: { kind: 'key', key: KEY_FOR[dir], mods: { shift: true } }, opts: { params: { magnitude: 'big' } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const step = params?.magnitude === 'big' ? BIG_STEP : SMALL_STEP;\n const { dx, dy } = delta(dir, step);\n const selected = [...dep.selectedAnchors];\n commitAnchorEdit(dep, 'Nudge anchor', (set) => {\n let any = false;\n for (const flat of selected) any = translateAnchorBy(set, flat, dx, dy) || any;\n return any;\n });\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n };\n}\n\nexport const nudgeAnchorsUpAction = makeNudgeAnchorsAction('up');\nexport const nudgeAnchorsDownAction = makeNudgeAnchorsAction('down');\nexport const nudgeAnchorsLeftAction = makeNudgeAnchorsAction('left');\nexport const nudgeAnchorsRightAction = makeNudgeAnchorsAction('right');\n\n// ---------------------------------------------------------------------------\n// deleteAnchors\n// ---------------------------------------------------------------------------\n\n/**\n * Delete the selected anchors, refitting the surrounding curve through\n * each gap so the path keeps its shape.\n *\n * Deleting renumbers every anchor after the lowest deleted index, so the\n * selection is cleared rather than left pointing at whatever slid into\n * those slots.\n */\nexport const deleteAnchorsAction: Action & { requires: string[] } = {\n id: 'deleteAnchors',\n label: 'Delete Anchors',\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const doomed = [...dep.selectedAnchors];\n const changed = commitAnchorEdit(dep, 'Delete anchor', (set) =>\n deleteAnchorsAt(set, doomed),\n );\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n};\n\n// ---------------------------------------------------------------------------\n// cutPathAtAnchor (scissors)\n// ---------------------------------------------------------------------------\n\n/**\n * Open a closed subpath at the alt+shift-clicked anchor — the scissors\n * operation the pen tool used to own.\n *\n * Bound to Alt+Shift+click rather than plain Alt+click so it doesn't\n * collide with `insertPathAnchorAction`, which is already Alt+click on\n * the same path. Both are \"alt-click surgery on the edited path\"; the\n * extra modifier picks which one, instead of the two actions racing on an\n * identical binding where only one could ever win.\n *\n * No-ops on an open subpath: there's nothing to cut.\n */\nexport const cutPathAtAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'cutPathAtAnchor',\n label: 'Cut path at anchor',\n defaultBinding: { kind: 'click', mods: { alt: true, shift: true } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n // Find the anchor under the click. Clicks carry no affordance (only\n // pointerdown does), so this resolves the hit itself — the same\n // approach insertPathAnchorAction takes for segments.\n const nearest = nearestAnchorIndex(worldPath, wx, wy, ANCHOR_CLICK_SLOP);\n if (nearest === -1) return;\n\n const changed = commitAnchorEdit(dep, 'Cut path', (set) => openSubpathAt(set, nearest));\n // Cutting rotates the subpath's anchor order, so held indices are stale.\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/** Flat index of the anchor nearest `(wx, wy)` within `slop`, else -1. */\nfunction nearestAnchorIndex(\n path: PolygonPath,\n wx: number,\n wy: number,\n slop: number,\n): number {\n let best = -1;\n let bestD2 = slop * slop;\n let flat = 0;\n for (const sub of (pathToAnchors(path) as AnchorSet).anchors) {\n for (const a of sub) {\n const dx = a.x - wx;\n const dy = a.y - wy;\n const d2 = dx * dx + dy * dy;\n // `<=` so an exact-slop hit counts; ties go to the earlier anchor.\n if (d2 <= bestD2 && (best === -1 || d2 < bestD2)) {\n bestD2 = d2;\n best = flat;\n }\n flat++;\n }\n }\n return best;\n}\n\n// ---------------------------------------------------------------------------\n// marqueeAnchors\n// ---------------------------------------------------------------------------\n\n/**\n * Rubber-band select anchors by dragging on empty canvas while a path is\n * in edit mode.\n *\n * Shift adds to the existing anchor selection instead of replacing it.\n * The in-flight rect goes on the `editAnchors` dep so the path-editing\n * overlay can draw it — same \"ongoing action owns the state, chrome\n * draws it\" split the move ghosts and the node marquee use.\n */\nexport const marqueeAnchorsAction: Action & { requires: string[] } = inPlane({\n id: 'marqueeAnchors',\n label: 'Marquee-select anchors',\n defaultBinding: { kind: 'drag', target: 'empty' },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const dep = depOf(ctx.deps);\n // Not editing → decline so the dispatcher falls through to the\n // node-level areaSelect. This is what keeps non-modal consumers\n // (no eligibility filtering) behaving normally.\n if (!dep) return {};\n const worldPath = worldPathOf(dep);\n if (!worldPath) return {};\n\n const additive = ctx.modifiers.shift;\n const base = new Set(dep.selectedAnchors);\n const start = { x: ctx.world.x, y: ctx.world.y };\n\n const rectFrom = (cx: number, cy: number) => ({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n width: Math.abs(cx - start.x),\n height: Math.abs(cy - start.y),\n });\n\n return {\n kind: 'marquee-anchors',\n onMove(moveCtx: InvocationCtx): void {\n const rect = rectFrom(moveCtx.world.x, moveCtx.world.y);\n dep.setMarquee(rect);\n // Live selection preview: the user sees anchors light up as the\n // band sweeps them, rather than only on release.\n const hits = anchorsOfPathInRect(worldPath, rect);\n dep.setSelectedAnchors(additive ? new Set([...base, ...hits]) : hits);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n dep.setMarquee(null);\n if (reason === 'cancel') dep.setSelectedAnchors(base);\n },\n };\n },\n },\n enabled: () => true,\n}, editingLayer);\n\n// ---------------------------------------------------------------------------\n// Local geometry helper\n// ---------------------------------------------------------------------------\n\n/** Flat indices of `path`'s anchors inside `rect`. */\nfunction anchorsOfPathInRect(\n path: PolygonPath,\n rect: { x: number; y: number; width: number; height: number },\n): number[] {\n return anchorsInRect(pathToAnchors(path) as AnchorSet, rect);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"anchorEditing.js","names":["ANCHOR_CLICK_PX","anchorClickSlop","scale","deps","extent","pxExtent","depOf","dep","worldPathOf","p","commitAnchorEdit","worldPath","next","editAnchorSet","edit","label","requiresAnchorSelection","ActionDisabledReason","selectAnchorAction","inPlane","wx","params","wy","hit","nearestAnchorIndex","additive","selectionAfterAnchorPress","editingLayer","makeNudgeAnchorsAction","dir","NUDGE_LABEL","NUDGE_KEY","nudgeDelta","selected","any","flat","translateAnchorBy","set","dx","dy","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","doomed","deleteAnchorsAt","cutPathAtAnchorAction","nearest","openSubpathAt","best","bestD2","slop","sub","pathToAnchors","path","a","d2","marqueeAnchorsAction","ctx","base","start","rectFrom","cx","cy","rect","moveCtx","hits","anchorsOfPathInRect","reason","anchorsInRect"],"sources":["../../../../src/interactions/actions/defaults/anchorEditing.ts"],"sourcesContent":["/**\n * Anchor-editing Actions beyond the drag itself — the keyboard and\n * marquee half of path editing.\n *\n * ## Why these don't collide with their node-level counterparts\n *\n * Each has a node-level twin bound to the same gesture: `deleteAction`\n * (Delete/Backspace), `nudge.*` (arrows), `areaSelectAction` (drag on\n * empty). Two mechanisms keep them apart, and both are needed:\n *\n * - **Capability eligibility**, when a mode registry is wired. The\n * node-level twins gate on `edits-page` / `transforms-selection` /\n * `creates-selection`, none of which `path-edit` mode allows, so the\n * dispatcher filters them out before matching.\n * - **`enabled` fall-through**, for the many consumers with no mode\n * registry at all. There the eligibility filter is skipped entirely,\n * so these actions report themselves disabled unless a path is\n * actually being edited with anchors selected, and the dispatcher\n * moves on to the node-level twin.\n *\n * Relying on eligibility alone would break every non-modal consumer;\n * relying on `enabled` alone would let a node-level action fire inside\n * path-edit mode. See `anchorEditing.test.ts`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { ImmediateInvoker, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport {\n anchorsInRect,\n deleteAnchorsAt,\n editAnchorSet,\n openSubpathAt,\n translateAnchorBy,\n type AnchorSet,\n} from '@weasel-js/geom';\nimport { pathToAnchors, type PolygonPath } from '@weasel-js/geom';\nimport { pxExtent } from '@weasel-js/geom';\nimport { selectionAfterAnchorPress } from '../edit-anchors/action';\nimport { inPlane, editingLayer } from '../planeInput';\nimport { NUDGE_KEY, NUDGE_LABEL, nudgeDelta, type NudgeDirection } from './nudgeSteps';\n\n/** Screen-pixel radius for \"this click landed on an anchor\". */\nconst ANCHOR_CLICK_PX = 10;\n\n/** `ANCHOR_CLICK_PX` in world units through the view; with no view, one\n * pixel is one unit. */\nfunction anchorClickSlop(deps: ActionDeps | undefined): number {\n const scale = deps?.view?.get().scale;\n if (!scale) return ANCHOR_CLICK_PX;\n const extent = pxExtent(ANCHOR_CLICK_PX, scale);\n return Math.max(extent.x, extent.y);\n}\n\nfunction depOf(deps: ActionDeps | undefined): EditAnchorsDep | null {\n const dep = deps?.editAnchors;\n if (!dep || !dep.editingId) return null;\n return dep;\n}\n\n/** The edited node's world-space polygon, or null when unavailable. */\nfunction worldPathOf(dep: EditAnchorsDep): PolygonPath | null {\n const p = dep.getEditablePath(dep.editingId) as PolygonPath | undefined;\n if (!p || p.kind !== 'polygon') return null;\n return p;\n}\n\n/**\n * Decode → mutate → encode → commit, in one history entry. Returns false\n * when the edit changed nothing, so callers can skip the commit rather\n * than push an empty undo step.\n */\nfunction commitAnchorEdit(\n dep: EditAnchorsDep,\n label: string,\n edit: (set: Parameters<Parameters<typeof editAnchorSet>[1]>[0]) => boolean | void,\n): boolean {\n const worldPath = worldPathOf(dep);\n if (!worldPath) return false;\n const next = editAnchorSet(worldPath, edit);\n if (!next) return false;\n dep.applyEdit(dep.editingId, next, label);\n return true;\n}\n\n/** Enabled only while a path is in edit mode with anchors selected. */\nfunction requiresAnchorSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return ActionDisabledReason.SelectionRequired;\n return true;\n}\n\n/**\n * Click an anchor to select it; Shift-click to toggle it in or out of the\n * selection. Clicking away from every anchor clears the anchor selection.\n *\n * A click action and not part of `editAnchorsAction.start`: the dispatcher\n * only dispatches a drag binding once the pointer crosses the drag\n * threshold, so a press that never moves never reaches `start` at all.\n * Clicks, in turn, carry no affordance (the dispatcher attaches those to\n * `pointerdown` only), so this resolves the anchor from the click's world\n * coords.\n *\n * **Non-modal caveat:** `useSelectTool` binds `clearSelection` to\n * `{ click, target: 'empty', mods: {} }` at active scope, which outranks\n * this ambient binding. In path-edit mode that action is filtered out by\n * capability, so anchor clicks win. In a consumer with no mode registry\n * there's no filtering, so clicking an anchor that happens to sit over\n * empty canvas clears the node selection instead of selecting the anchor.\n * Anchors over the path body are unaffected.\n */\nexport const selectAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'selectAnchor',\n label: 'Select anchor',\n defaultBinding: [\n { spec: { kind: 'click', mods: {} }, opts: { params: { additive: false } } },\n { spec: { kind: 'click', mods: { shift: true } }, opts: { params: { additive: true } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n const hit = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n const additive = params?.additive === true;\n if (hit === -1) {\n // Missed every anchor. A bare click clears; a shift-click leaves\n // the selection alone.\n if (!additive) dep.setSelectedAnchors([]);\n return;\n }\n dep.setSelectedAnchors(selectionAfterAnchorPress(dep.selectedAnchors, hit, additive));\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/**\n * Move the selected anchors by one step. Shift multiplies the step. Every\n * keystroke is its own history entry.\n */\nfunction makeNudgeAnchorsAction(dir: NudgeDirection): Action & { requires: string[] } {\n return {\n id: `nudgeAnchors.${dir}`,\n label: `Nudge Anchors ${NUDGE_LABEL[dir]}`,\n group: 'nudgeAnchors',\n defaultBinding: [\n { spec: { kind: 'key', key: NUDGE_KEY[dir] }, opts: { params: { magnitude: 'small' } } },\n { spec: { kind: 'key', key: NUDGE_KEY[dir], mods: { shift: true } }, opts: { params: { magnitude: 'big' } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const { dx, dy } = nudgeDelta(dir, params?.magnitude);\n const selected = [...dep.selectedAnchors];\n commitAnchorEdit(dep, 'Nudge anchor', (set) => {\n let any = false;\n for (const flat of selected) any = translateAnchorBy(set, flat, dx, dy) || any;\n return any;\n });\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n };\n}\n\nexport const nudgeAnchorsUpAction = makeNudgeAnchorsAction('up');\nexport const nudgeAnchorsDownAction = makeNudgeAnchorsAction('down');\nexport const nudgeAnchorsLeftAction = makeNudgeAnchorsAction('left');\nexport const nudgeAnchorsRightAction = makeNudgeAnchorsAction('right');\n\n/**\n * Delete the selected anchors, refitting the surrounding curve through\n * each gap so the path keeps its shape.\n *\n * Deleting renumbers every anchor after the lowest deleted index, so the\n * selection is cleared rather than left pointing at whatever slid into\n * those slots.\n */\nexport const deleteAnchorsAction: Action & { requires: string[] } = {\n id: 'deleteAnchors',\n label: 'Delete Anchors',\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const doomed = [...dep.selectedAnchors];\n const changed = commitAnchorEdit(dep, 'Delete anchor', (set) =>\n deleteAnchorsAt(set, doomed),\n );\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n};\n\n/**\n * Open a closed subpath at the alt+shift-clicked anchor.\n *\n * Bound to Alt+Shift+click rather than plain Alt+click so it doesn't\n * collide with `insertPathAnchorAction`, which is already Alt+click on\n * the same path.\n *\n * No-ops on an open subpath: there's nothing to cut.\n */\nexport const cutPathAtAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'cutPathAtAnchor',\n label: 'Cut path at anchor',\n defaultBinding: { kind: 'click', mods: { alt: true, shift: true } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n // Clicks carry no affordance (only pointerdown does), so this resolves\n // the hit itself.\n const nearest = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n if (nearest === -1) return;\n\n const changed = commitAnchorEdit(dep, 'Cut path', (set) => openSubpathAt(set, nearest));\n // Cutting rotates the subpath's anchor order, so held indices are stale.\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/** Flat index of the anchor nearest `(wx, wy)` within `slop`, else -1. */\nfunction nearestAnchorIndex(\n path: PolygonPath,\n wx: number,\n wy: number,\n slop: number,\n): number {\n let best = -1;\n let bestD2 = slop * slop;\n let flat = 0;\n for (const sub of (pathToAnchors(path) as AnchorSet).anchors) {\n for (const a of sub) {\n const dx = a.x - wx;\n const dy = a.y - wy;\n const d2 = dx * dx + dy * dy;\n // `<=` so an exact-slop hit counts; ties go to the earlier anchor.\n if (d2 <= bestD2 && (best === -1 || d2 < bestD2)) {\n bestD2 = d2;\n best = flat;\n }\n flat++;\n }\n }\n return best;\n}\n\n/**\n * Rubber-band select anchors by dragging on empty canvas while a path is\n * in edit mode.\n *\n * Shift adds to the existing anchor selection instead of replacing it.\n * The in-flight rect goes on the `editAnchors` dep so the path-editing\n * overlay can draw it.\n */\nexport const marqueeAnchorsAction: Action & { requires: string[] } = inPlane({\n id: 'marqueeAnchors',\n label: 'Marquee-select anchors',\n defaultBinding: { kind: 'drag', target: 'empty' },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const dep = depOf(ctx.deps);\n // Not editing → decline so the dispatcher falls through to the\n // node-level areaSelect.\n if (!dep) return {};\n const worldPath = worldPathOf(dep);\n if (!worldPath) return {};\n\n const additive = ctx.modifiers.shift;\n const base = new Set(dep.selectedAnchors);\n const start = { x: ctx.world.x, y: ctx.world.y };\n\n const rectFrom = (cx: number, cy: number) => ({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n width: Math.abs(cx - start.x),\n height: Math.abs(cy - start.y),\n });\n\n return {\n kind: 'marquee-anchors',\n onMove(moveCtx: InvocationCtx): void {\n const rect = rectFrom(moveCtx.world.x, moveCtx.world.y);\n dep.setMarquee(rect);\n // Live selection preview: the user sees anchors light up as the\n // band sweeps them, rather than only on release.\n const hits = anchorsOfPathInRect(worldPath, rect);\n dep.setSelectedAnchors(additive ? new Set([...base, ...hits]) : hits);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n dep.setMarquee(null);\n if (reason === 'cancel') dep.setSelectedAnchors(base);\n },\n };\n },\n },\n enabled: () => true,\n}, editingLayer);\n\n/** Flat indices of `path`'s anchors inside `rect`. */\nfunction anchorsOfPathInRect(\n path: PolygonPath,\n rect: { x: number; y: number; width: number; height: number },\n): number[] {\n return anchorsInRect(pathToAnchors(path) as AnchorSet, rect);\n}\n"],"mappings":";;;;;;AA6CA,IAAMA,IAAkB;AAIxB,SAASC,EAAgB,GAAsC;CAC7D,IAAMC,IAAQC,GAAM,MAAM,IAAI,CAAC,CAAC;CAChC,IAAI,CAACD,GAAO,OAAOF;CACnB,IAAMI,IAASC,EAASL,GAAiBE,CAAK;CAC9C,OAAO,KAAK,IAAIE,EAAO,GAAGA,EAAO,CAAC;AACpC;AAEA,SAASE,EAAM,GAAqD;CAClE,IAAMC,IAAMJ,GAAM;CAElB,OADI,CAACI,KAAO,CAACA,EAAI,YAAkB,OAC5BA;AACT;AAGA,SAASC,EAAY,GAAyC;CAC5D,IAAMC,IAAIF,EAAI,gBAAgBA,EAAI,SAAS;CAE3C,OADI,CAACE,KAAKA,EAAE,SAAS,YAAkB,OAChCA;AACT;AAOA,SAASC,EACP,GACA,GACA,GACS;CACT,IAAMC,IAAYH,EAAYD,CAAG;CACjC,IAAI,CAACI,GAAW,OAAO;CACvB,IAAMC,IAAOC,EAAcF,GAAWG,CAAI;CAG1C,OAFKF,KACLL,EAAI,UAAUA,EAAI,WAAWK,GAAMG,CAAK,GACjC,MAFW;AAGpB;AAGA,SAASC,EAAwB,GAAgD;CAC/E,IAAMT,IAAMD,EAAMH,CAAI;CAEtB,OADI,CAACI,KAAOA,EAAI,gBAAgB,SAAS,IAAUU,EAAqB,oBACjE;AACT;AAqBA,IAAaC,IAAsDC,EAAQ;CACzE,IAAI;CACJ,OAAO;CACP,gBAAgB,CACd;EAAE,MAAM;GAAE,MAAM;GAAS,MAAM,CAAC;EAAE;EAAgB,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAM,EAAE;CAAE,GACxF;EAAE,MAAM;GAAE,MAAM;GAAS,MAAM,EAAE,OAAO,GAAK;EAAE;EAAG,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAK,EAAE;CAAE,CACzF;CACA,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,eAAe,MAAM;CAChC,SAAS;EACP,QAAQ;EACR,MAAM,GAAM,MAAW;GACrB,IAAMZ,IAAMD,EAAMH,CAAI;GACtB,IAAI,CAACI,GAAK;GACV,IAAMa,IAAKC,GAAQ,QACbC,IAAKD,GAAQ;GACnB,IAAI,OAAOD,KAAO,YAAY,OAAOE,KAAO,UAAU;GACtD,IAAMX,IAAYH,EAAYD,CAAG;GACjC,IAAI,CAACI,GAAW;GAEhB,IAAMY,IAAMC,EAAmBb,GAAWS,GAAIE,GAAIrB,EAAgBE,CAAI,CAAC,GACjEsB,IAAWJ,GAAQ,aAAa;GACtC,IAAIE,MAAQ,IAAI;IAGd,AAAKE,KAAUlB,EAAI,mBAAmB,CAAC,CAAC;IACxC;GACF;GACA,EAAI,mBAAmBmB,EAA0BnB,EAAI,iBAAiBgB,GAAKE,CAAQ,CAAC;EACtF;CACF;CACA,UAAU,MAAUnB,EAAMH,CAAI,IAAI,KAAOc,EAAqB;AAChE,GAAGU,CAAY;AAMf,SAASC,EAAuB,GAAsD;CACpF,OAAO;EACL,IAAI,gBAAgBC;EACpB,OAAO,iBAAiBC,EAAYD;EACpC,OAAO;EACP,gBAAgB,CACd;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;GAAK;GAA0B,MAAM,EAAE,QAAQ,EAAE,WAAW,QAAQ,EAAE;EAAE,GAC9G;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;IAAM,MAAM,EAAE,OAAO,GAAK;GAAE;GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,MAAM,EAAE;EAAE,CAC9G;EACA,UAAU,EAAE,YAAY,gBAAgB;EACxC,UAAU,CAAC,aAAa;EACxB,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMtB,IAAMD,EAAMH,CAAI;IACtB,IAAI,CAACI,KAAOA,EAAI,gBAAgB,SAAS,GAAG;IAC5C,IAAM,EAAE,OAAI,UAAOyB,EAAWH,GAAKR,GAAQ,SAAS,GAC9CY,IAAW,CAAC,GAAG1B,EAAI,eAAe;IACxC,EAAiBA,GAAK,iBAAiB,MAAQ;KAC7C,IAAI2B,IAAM;KACV,KAAK,IAAMC,KAAQF,GAAU,IAAMG,EAAkBC,GAAKF,GAAMG,GAAIC,CAAE,KAAKL;KAC3E,OAAOA;IACT,CAAC;GACH;EACF;EACA,SAASlB;CACX;AACF;AAEA,IAAawB,IAA0BZ,EAAuB,IAAI,GACrDa,IAA0Bb,EAAuB,MAAM,GACvDc,IAA0Bd,EAAuB,MAAM,GACvDe,IAA0Bf,EAAuB,OAAO,GAUxDgB,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,gBAAgB;EACd,MAAM;EACN,KAAK,CAAC,UAAU,WAAW;EAC3B,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,aAAa;CACxB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMrC,IAAMD,EAAMH,CAAI;GACtB,IAAI,CAACI,KAAOA,EAAI,gBAAgB,SAAS,GAAG;GAC5C,IAAMsC,IAAS,CAAC,GAAGtC,EAAI,eAAe;GAItC,AAHgBG,EAAiBH,GAAK,kBAAkB,MACtDuC,EAAgBT,GAAKQ,CAAM,CAEzB,KAAStC,EAAI,mBAAmB,CAAC,CAAC;EACxC;CACF;CACA,SAASS;AACX,GAWa+B,IAAyD5B,EAAQ;CAC5E,IAAI;CACJ,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAS,MAAM;GAAE,KAAK;GAAM,OAAO;EAAK;CAAE;CAClE,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,eAAe,MAAM;CAChC,SAAS;EACP,QAAQ;EACR,MAAM,GAAM,MAAW;GACrB,IAAMZ,IAAMD,EAAMH,CAAI;GACtB,IAAI,CAACI,GAAK;GACV,IAAMa,IAAKC,GAAQ,QACbC,IAAKD,GAAQ;GACnB,IAAI,OAAOD,KAAO,YAAY,OAAOE,KAAO,UAAU;GACtD,IAAMX,IAAYH,EAAYD,CAAG;GACjC,IAAI,CAACI,GAAW;GAIhB,IAAMqC,IAAUxB,EAAmBb,GAAWS,GAAIE,GAAIrB,EAAgBE,CAAI,CAAC;GAC3E,AAAI6C,MAAY,MAEAtC,EAAiBH,GAAK,aAAa,MAAQ0C,EAAcZ,GAAKW,CAAO,CAEjF,KAASzC,EAAI,mBAAmB,CAAC,CAAC;EACxC;CACF;CACA,UAAU,MAAUD,EAAMH,CAAI,IAAI,KAAOc,EAAqB;AAChE,GAAGU,CAAY;AAGf,SAASH,EACP,GACA,GACA,GACA,GACQ;CACR,IAAI0B,IAAO,IACPC,IAASC,IAAOA,GAChBjB,IAAO;CACX,KAAK,IAAMkB,KAAQC,EAAcC,CAAI,CAAC,CAAe,SACnD,KAAK,IAAMC,KAAKH,GAAK;EACnB,IAAMf,IAAKkB,EAAE,IAAIpC,GACXmB,IAAKiB,EAAE,IAAIlC,GACXmC,IAAKnB,IAAKA,IAAKC,IAAKA;EAM1B,AAJIkB,KAAMN,MAAWD,MAAS,MAAMO,IAAKN,OACvC,IAASM,GACT,IAAOtB,IAET;CACF;CAEF,OAAOe;AACT;AAUA,IAAaQ,IAAwDvC,EAAQ;CAC3E,IAAI;CACJ,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAQ,QAAQ;CAAQ;CAChD,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,aAAa;CACxB,SAAS;EACP,QAAQ;EACR,MAAM,GAAmC;GACvC,IAAMZ,IAAMD,EAAMqD,EAAI,IAAI;GAG1B,IAAI,CAACpD,GAAK,OAAO,CAAC;GAClB,IAAMI,IAAYH,EAAYD,CAAG;GACjC,IAAI,CAACI,GAAW,OAAO,CAAC;GAExB,IAAMc,IAAWkC,EAAI,UAAU,OACzBC,IAAO,IAAI,IAAIrD,EAAI,eAAe,GAClCsD,IAAQ;IAAE,GAAGF,EAAI,MAAM;IAAG,GAAGA,EAAI,MAAM;GAAE,GAEzCG,KAAY,GAAY,OAAgB;IAC5C,GAAG,KAAK,IAAID,EAAM,GAAGE,CAAE;IACvB,GAAG,KAAK,IAAIF,EAAM,GAAGG,CAAE;IACvB,OAAO,KAAK,IAAID,IAAKF,EAAM,CAAC;IAC5B,QAAQ,KAAK,IAAIG,IAAKH,EAAM,CAAC;GAC/B;GAEA,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KACnC,IAAMI,IAAOH,EAASI,EAAQ,MAAM,GAAGA,EAAQ,MAAM,CAAC;KACtD,EAAI,WAAWD,CAAI;KAGnB,IAAME,IAAOC,EAAoBzD,GAAWsD,CAAI;KAChD,EAAI,mBAAmBxC,oBAAW,IAAI,IAAI,CAAC,GAAGmC,GAAM,GAAGO,CAAI,CAAC,IAAIA,CAAI;IACtE;IACA,MAAM,GAAwB,GAAmC;KAE/D,AADA5D,EAAI,WAAW,IAAI,GACf8D,MAAW,YAAU9D,EAAI,mBAAmBqD,CAAI;IACtD;GACF;EACF;CACF;CACA,eAAe;AACjB,GAAGjC,CAAY;AAGf,SAASyC,EACP,GACA,GACU;CACV,OAAOE,EAAchB,EAAcC,CAAI,GAAgBU,CAAI;AAC7D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { selectionFromHits as e } from "../hitSelection.js";
|
|
1
2
|
//#region src/interactions/actions/defaults/areaSelect.ts
|
|
2
|
-
var
|
|
3
|
+
var t = {
|
|
3
4
|
id: "areaSelect",
|
|
4
5
|
label: "Area Select",
|
|
5
6
|
activeCursor: "crosshair",
|
|
@@ -11,58 +12,54 @@ var e = {
|
|
|
11
12
|
],
|
|
12
13
|
invoker: {
|
|
13
14
|
timing: "ongoing",
|
|
14
|
-
start(
|
|
15
|
-
let
|
|
16
|
-
if (!
|
|
17
|
-
let
|
|
18
|
-
if (typeof
|
|
19
|
-
let
|
|
20
|
-
dep:
|
|
21
|
-
view:
|
|
22
|
-
startX:
|
|
23
|
-
startY:
|
|
24
|
-
shiftHeld:
|
|
25
|
-
currentX:
|
|
26
|
-
currentY:
|
|
15
|
+
start(t, n) {
|
|
16
|
+
let r = t.deps.areaSelect;
|
|
17
|
+
if (!r) return {};
|
|
18
|
+
let i = t.drag?.affordance?.kind;
|
|
19
|
+
if (typeof i == "string" && /^(anchor|controlIn|controlOut):/.test(i) || t.deps.editAnchors?.editingId) return {};
|
|
20
|
+
let a = {
|
|
21
|
+
dep: r,
|
|
22
|
+
view: t.deps.view,
|
|
23
|
+
startX: t.world.x,
|
|
24
|
+
startY: t.world.y,
|
|
25
|
+
shiftHeld: t.modifiers.shift,
|
|
26
|
+
currentX: t.world.x,
|
|
27
|
+
currentY: t.world.y,
|
|
27
28
|
open: !0
|
|
28
29
|
};
|
|
29
30
|
return {
|
|
30
31
|
kind: "marquee",
|
|
31
32
|
onMove(e) {
|
|
32
|
-
|
|
33
|
+
a.currentX = e.world.x, a.currentY = e.world.y;
|
|
33
34
|
},
|
|
34
35
|
overlay() {
|
|
35
|
-
return
|
|
36
|
+
return a.open ? {
|
|
36
37
|
kind: "marquee",
|
|
37
38
|
start: {
|
|
38
|
-
x:
|
|
39
|
-
y:
|
|
39
|
+
x: a.startX,
|
|
40
|
+
y: a.startY
|
|
40
41
|
},
|
|
41
42
|
current: {
|
|
42
|
-
x:
|
|
43
|
-
y:
|
|
43
|
+
x: a.currentX,
|
|
44
|
+
y: a.currentY
|
|
44
45
|
},
|
|
45
|
-
shiftHeld:
|
|
46
|
+
shiftHeld: a.shiftHeld
|
|
46
47
|
} : null;
|
|
47
48
|
},
|
|
48
|
-
onEnd(
|
|
49
|
-
if (
|
|
50
|
-
let { dep:
|
|
51
|
-
if (
|
|
52
|
-
|
|
49
|
+
onEnd(t, n) {
|
|
50
|
+
if (a.open = !1, n === "cancel") return;
|
|
51
|
+
let { dep: r, view: i, startX: o, startY: s, currentX: c, currentY: l, shiftHeld: u } = a, d = Math.min(o, c), f = Math.min(s, l), p = Math.abs(c - o), m = Math.abs(l - s);
|
|
52
|
+
if (p === 0 || m === 0) {
|
|
53
|
+
u || r.setSelection([]);
|
|
53
54
|
return;
|
|
54
55
|
}
|
|
55
|
-
let
|
|
56
|
-
x:
|
|
57
|
-
y:
|
|
58
|
-
width:
|
|
59
|
-
height:
|
|
60
|
-
},
|
|
61
|
-
|
|
62
|
-
let e = [...n.getSelection()];
|
|
63
|
-
for (let t of m) e.includes(t) || e.push(t);
|
|
64
|
-
n.setSelection(e);
|
|
65
|
-
} else n.setSelection(m);
|
|
56
|
+
let h = r.hitTestArea({
|
|
57
|
+
x: d,
|
|
58
|
+
y: f,
|
|
59
|
+
width: p,
|
|
60
|
+
height: m
|
|
61
|
+
}, i);
|
|
62
|
+
r.setSelection(e(r.getSelection(), h, u));
|
|
66
63
|
}
|
|
67
64
|
};
|
|
68
65
|
}
|
|
@@ -70,6 +67,6 @@ var e = {
|
|
|
70
67
|
enabled: () => !0
|
|
71
68
|
};
|
|
72
69
|
//#endregion
|
|
73
|
-
export {
|
|
70
|
+
export { t as areaSelectAction };
|
|
74
71
|
|
|
75
72
|
//# sourceMappingURL=areaSelect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"areaSelect.js","names":["areaSelectAction","dep","ctx","affordanceKind","scratch","moveCtx","reason","d","x","startX","currentX","y","startY","currentY","width","height","shiftHeld","hits","view","
|
|
1
|
+
{"version":3,"file":"areaSelect.js","names":["areaSelectAction","dep","ctx","affordanceKind","scratch","moveCtx","reason","d","x","startX","currentX","y","startY","currentY","width","height","shiftHeld","hits","view","selectionFromHits"],"sources":["../../../../src/interactions/actions/defaults/areaSelect.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, OngoingOverlay } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport type { AreaSelectDep, ViewApi } from '../depSchema';\nimport { selectionFromHits } from '../hitSelection';\n\ninterface AreaSelectScratch {\n dep: AreaSelectDep;\n /** The view the marquee started in: what it does not paint is not taken. */\n view: ViewApi | undefined;\n startX: number;\n startY: number;\n shiftHeld: boolean;\n currentX: number;\n currentY: number;\n /** Cleared once `onEnd` runs, so a consumer that retains the handle gets\n * no marquee from `overlay()`. */\n open: boolean;\n}\n\n/**\n * @experimental\n * Marquee selection: replace, or extend with shift held. Hit-testing and\n * selection writes are delegated to the `areaSelect` dep, and the selection\n * write makes no undo entry.\n */\nexport const areaSelectAction: Action & { requires: string[] } = {\n id: 'areaSelect',\n label: 'Area Select',\n activeCursor: 'crosshair',\n eligible: { capability: 'creates-selection' },\n requires: ['areaSelect', 'editAnchors', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const dep = ctx.deps.areaSelect;\n if (!dep) return {};\n\n // Decline on anchor / control-handle affordances: the select tool's\n // `{ kind: 'drag', target: 'empty' }` binding also matches an anchor hit\n // on top of empty body, and would beat editAnchors via scope priority.\n const affordanceKind = ctx.drag?.affordance?.kind;\n if (\n typeof affordanceKind === 'string'\n && /^(anchor|controlIn|controlOut):/.test(affordanceKind)\n ) {\n return {};\n }\n\n // Decline while a path is in anchor-edit mode, where an empty-canvas\n // drag is `marqueeAnchorsAction`'s. Capability eligibility filters this\n // only for consumers that wired a mode registry; without one\n // areaSelect's active scope would beat marqueeAnchors' ambient scope.\n const editAnchors = ctx.deps.editAnchors;\n if (editAnchors?.editingId) return {};\n\n const scratch: AreaSelectScratch = {\n dep,\n view: ctx.deps.view,\n startX: ctx.world.x,\n startY: ctx.world.y,\n shiftHeld: ctx.modifiers.shift,\n currentX: ctx.world.x,\n currentY: ctx.world.y,\n open: true,\n };\n\n return {\n kind: 'marquee',\n onMove(moveCtx: InvocationCtx): void {\n scratch.currentX = moveCtx.world.x;\n scratch.currentY = moveCtx.world.y;\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n return {\n kind: 'marquee',\n start: { x: scratch.startX, y: scratch.startY },\n current: { x: scratch.currentX, y: scratch.currentY },\n shiftHeld: scratch.shiftHeld,\n };\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n\n const { dep: d, view, startX, startY, currentX, currentY, shiftHeld } = scratch;\n\n const x = Math.min(startX, currentX);\n const y = Math.min(startY, currentY);\n const width = Math.abs(currentX - startX);\n const height = Math.abs(currentY - startY);\n\n // Zero-size marquee (click without drag) → clear selection (or no-op with shift).\n if (width === 0 || height === 0) {\n if (!shiftHeld) d.setSelection([]);\n return;\n }\n\n const hits = d.hitTestArea({ x, y, width, height }, view) as NodeId[];\n\n d.setSelection(selectionFromHits(d.getSelection(), hits, shiftHeld));\n },\n };\n },\n },\n /** Always enabled: the dispatcher treats anything `!== true` as \"skip this\n * match\", so a disabled reason would let lower-specificity ambient bindings win. */\n enabled: () => true,\n};\n"],"mappings":";;AA0BA,IAAaA,IAAoD;CAC/D,IAAI;CACJ,OAAO;CACP,cAAc;CACd,UAAU,EAAE,YAAY,oBAAoB;CAC5C,UAAU;EAAC;EAAc;EAAe;CAAM;CAC9C,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAMC,EAAI,KAAK;GACrB,IAAI,CAACD,GAAK,OAAO,CAAC;GAKlB,IAAME,IAAiBD,EAAI,MAAM,YAAY;GAa7C,IAXE,OAAOC,KAAmB,YACvB,kCAAkC,KAAKA,CAAc,KAStCD,EAAI,KAAK,aACZ,WAAW,OAAO,CAAC;GAEpC,IAAME,IAA6B;IACjC;IACA,MAAMF,EAAI,KAAK;IACf,QAAQA,EAAI,MAAM;IAClB,QAAQA,EAAI,MAAM;IAClB,WAAWA,EAAI,UAAU;IACzB,UAAUA,EAAI,MAAM;IACpB,UAAUA,EAAI,MAAM;IACpB,MAAM;GACR;GAEA,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KAEnC,AADA,EAAQ,WAAWG,EAAQ,MAAM,GACjC,EAAQ,WAAWA,EAAQ,MAAM;IACnC;IACA,UAAiC;KAE/B,OADKD,EAAQ,OACN;MACL,MAAM;MACN,OAAO;OAAE,GAAGA,EAAQ;OAAQ,GAAGA,EAAQ;MAAO;MAC9C,SAAS;OAAE,GAAGA,EAAQ;OAAU,GAAGA,EAAQ;MAAS;MACpD,WAAWA,EAAQ;KACrB,IAN0B;IAO5B;IACA,MAAM,GAAwB,GAAmC;KAE/D,IADA,EAAQ,OAAO,IACXE,MAAW,UAAU;KAEzB,IAAM,EAAE,KAAKC,GAAG,SAAM,WAAQ,WAAQ,aAAU,aAAU,iBAAcH,GAElEI,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAQ,KAAK,IAAIJ,IAAWD,CAAM,GAClCM,IAAS,KAAK,IAAIF,IAAWD,CAAM;KAGzC,IAAIE,MAAU,KAAKC,MAAW,GAAG;MAC/B,AAAKC,KAAWT,EAAE,aAAa,CAAC,CAAC;MACjC;KACF;KAEA,IAAMU,IAAOV,EAAE,YAAY;MAAE;MAAG;MAAG;MAAO;KAAO,GAAGW,CAAI;KAExD,EAAE,aAAaC,EAAkBZ,EAAE,aAAa,GAAGU,GAAMD,CAAS,CAAC;IACrE;GACF;EACF;CACF;CAGA,eAAe;AACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancelGesture.js","names":["cancelGestureAction"],"sources":["../../../../src/interactions/actions/defaults/cancelGesture.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\n\n/**\n * @experimental\n *
|
|
1
|
+
{"version":3,"file":"cancelGesture.js","names":["cancelGestureAction"],"sources":["../../../../src/interactions/actions/defaults/cancelGesture.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Escape mid-drag tells the dispatcher to abort every in-flight handle\n * (`onEnd('cancel')` on each, no scene mutation).\n *\n * Phase-gated to `[*:engaged]` so it fires only when a handle is in flight,\n * leaving the idle-phase `escape` action (clears selection) without conflict.\n */\n// No `eligible` field: canceling an in-flight gesture must work in every mode.\nexport const cancelGestureAction: Action & { requires: string[] } = {\n id: 'cancelGesture',\n label: 'Cancel gesture',\n defaultBinding: {\n kind: 'key',\n key: 'Escape',\n phase: [{ channel: '*', phase: 'engaged' }],\n },\n requires: ['dispatcher'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const d = deps.dispatcher;\n d?.cancelAll('cancel');\n },\n },\n};\n"],"mappings":";AAWA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,gBAAgB;EACd,MAAM;EACN,KAAK;EACL,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,CAAC,YAAY;CACvB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GAEb,EADe,YACZ,UAAU,QAAQ;EACvB;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clearSelection.js","names":["clearSelectionAction","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clearSelection.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"clearSelection.js","names":["clearSelectionAction","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clearSelection.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Clears the selection on a click on empty canvas. It has no ambient\n * `defaultBinding`: it fires only through `useSelectTool`'s bindings.\n *\n * `enabled` declines while a path is in anchor-edit mode, so the dispatcher\n * falls through to `selectAnchorAction`. `useSelectTool` binds this action at\n * **active** scope while `selectAnchor` is **ambient**, so without the gate an\n * anchor that sits over empty canvas clears the node selection instead of\n * selecting the anchor. Capability eligibility covers only consumers that\n * wired a mode registry.\n */\nexport const clearSelectionAction: Action & { requires: string[] } = {\n id: 'clearSelection',\n label: 'Clear selection',\n eligible: { capability: 'creates-selection' },\n // `editAnchors` is required for the `enabled` gate below, not for the run.\n requires: ['selection', 'editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n deps.selection?.set([]);\n },\n },\n enabled: (deps?: ActionDeps) => {\n const editAnchors = deps?.editAnchors;\n // Absent dep means the consumer never wired anchor editing — nothing to\n // defer to, so the click is ours.\n if (editAnchors?.editingId) return ActionDisabledReason.NotApplicable;\n return true;\n },\n};\n"],"mappings":";;AAgBA,IAAaA,IAAwD;CACnE,IAAI;CACJ,OAAO;CACP,UAAU,EAAE,YAAY,oBAAoB;CAE5C,UAAU,CAAC,aAAa,aAAa;CACrC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAK,WAAW,IAAI,CAAC,CAAC;EACxB;CACF;CACA,UAAU,MAIR,CAHoBC,GAAM,aAGT,aAAkBC,EAAqB;AAG5D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { selectedRoots as e } from "../selectionSubtree.js";
|
|
2
|
+
import { createInsertOp as t } from "../../../core/ops/create.js";
|
|
3
|
+
//#region src/interactions/actions/defaults/copySubtree.ts
|
|
4
|
+
function n(e, r, i, a, o, s, c, l) {
|
|
5
|
+
let u = e.get(r);
|
|
6
|
+
if (!u) return null;
|
|
7
|
+
let d = e.mintId();
|
|
8
|
+
l.set(r, d);
|
|
9
|
+
let f = {
|
|
10
|
+
...u,
|
|
11
|
+
id: d,
|
|
12
|
+
pose: o(r, u, a),
|
|
13
|
+
parent: i
|
|
14
|
+
};
|
|
15
|
+
c.push(t({
|
|
16
|
+
node: f,
|
|
17
|
+
label: s
|
|
18
|
+
}));
|
|
19
|
+
for (let t of e.childrenOf(r)) n(e, t, d, !1, o, s, c, l);
|
|
20
|
+
return d;
|
|
21
|
+
}
|
|
22
|
+
function r(t, r, i, a) {
|
|
23
|
+
let o = [], s = [], c = /* @__PURE__ */ new Map();
|
|
24
|
+
for (let l of e(t, r)) {
|
|
25
|
+
let e = n(t, l, t.get(l)?.parent ?? null, !0, i, a, o, c);
|
|
26
|
+
e && s.push(e);
|
|
27
|
+
}
|
|
28
|
+
for (let e of o) {
|
|
29
|
+
let t = e.args.node, n = t.dependsOn;
|
|
30
|
+
Array.isArray(n) && n.every((e) => c.has(e)) && (t.dependsOn = n.map((e) => c.get(e)));
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
ops: o,
|
|
34
|
+
copies: s
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { r as copySelection };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=copySubtree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copySubtree.js","names":["copySubtree","node","scene","id","newId","copy","poseOf","isRoot","createInsertOp","child","label","ops","copyOf","copySelection","copies","selectedRoots","ids","op","deps","dep"],"sources":["../../../../src/interactions/actions/defaults/copySubtree.ts"],"sourcesContent":["import type { Node, NodeId, Scene } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { selectedRoots } from '../selectionSubtree';\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype AnyNode = Node<unknown, string, unknown>;\n\n/** The pose a copy of `node` is stored with. `isRoot` is true for a selected\n * node and false for one copied because an ancestor was. */\nexport type CopyPose = (id: NodeId, node: AnyNode, isRoot: boolean) => unknown;\n\nfunction copySubtree(\n scene: AnyScene,\n id: NodeId,\n parent: NodeId | null,\n isRoot: boolean,\n poseOf: CopyPose,\n label: string,\n ops: Op[],\n copyOf: Map<NodeId, NodeId>,\n): NodeId | null {\n const node = scene.get(id);\n if (!node) return null;\n const newId = scene.mintId();\n copyOf.set(id, newId);\n const copy = { ...node, id: newId, pose: poseOf(id, node, isRoot), parent } as AnyNode;\n ops.push(createInsertOp<AnyNode>({ node: copy, label }));\n for (const child of scene.childrenOf(id)) {\n copySubtree(scene, child, newId, false, poseOf, label, ops, copyOf);\n }\n return newId;\n}\n\n/**\n * Insert ops copying each of `ids` with its whole subtree, so copying a group\n * produces a populated group. Ops are in pre-order: a parent is inserted\n * before its children. A copied root keeps its source's parent.\n *\n * A copy that derives from an id list follows the copies when every node in\n * the list was copied with it, and keeps the original list otherwise.\n */\nexport function copySelection(\n scene: AnyScene,\n ids: readonly string[],\n poseOf: CopyPose,\n label: string,\n): { ops: Op[]; copies: NodeId[] } {\n const ops: Op[] = [];\n const copies: NodeId[] = [];\n const copyOf = new Map<NodeId, NodeId>();\n for (const id of selectedRoots(scene, ids)) {\n const newId = copySubtree(scene, id, scene.get(id)?.parent ?? null, true, poseOf, label, ops, copyOf);\n if (newId) copies.push(newId);\n }\n for (const op of ops) {\n const node = (op.args as { node: AnyNode }).node;\n const deps = node.dependsOn;\n if (!Array.isArray(deps) || !deps.every((dep) => copyOf.has(dep))) continue;\n (node as { dependsOn?: readonly NodeId[] }).dependsOn = deps.map((dep) => copyOf.get(dep)!);\n }\n return { ops, copies };\n}\n"],"mappings":";;;AAYA,SAASA,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACe;CACf,IAAMC,IAAOC,EAAM,IAAIC,CAAE;CACzB,IAAI,CAACF,GAAM,OAAO;CAClB,IAAMG,IAAQF,EAAM,OAAO;CAC3B,EAAO,IAAIC,GAAIC,CAAK;CACpB,IAAMC,IAAO;EAAE,GAAGJ;EAAM,IAAIG;EAAO,MAAME,EAAOH,GAAIF,GAAMM,CAAM;EAAG;CAAO;CAC1E,EAAI,KAAKC,EAAwB;EAAE,MAAMH;EAAM;CAAM,CAAC,CAAC;CACvD,KAAK,IAAMI,KAASP,EAAM,WAAWC,CAAE,GACrC,EAAYD,GAAOO,GAAOL,GAAO,IAAOE,GAAQI,GAAOC,GAAKC,CAAM;CAEpE,OAAOR;AACT;AAUA,SAAgBS,EACd,GACA,GACA,GACA,GACiC;CACjC,IAAMF,IAAY,CAAC,GACbG,IAAmB,CAAC,GACpBF,oBAAS,IAAI,IAAoB;CACvC,KAAK,IAAMT,KAAMY,EAAcb,GAAOc,CAAG,GAAG;EAC1C,IAAMZ,IAAQJ,EAAYE,GAAOC,GAAID,EAAM,IAAIC,CAAE,CAAC,EAAE,UAAU,MAAM,IAAMG,GAAQI,GAAOC,GAAKC,CAAM;EACpG,AAAIR,KAAOU,EAAO,KAAKV,CAAK;CAC9B;CACA,KAAK,IAAMa,KAAMN,GAAK;EACpB,IAAMV,IAAQgB,EAAG,KAA2B,MACtCC,IAAOjB,EAAK;EAClB,AAAK,MAAM,QAAQiB,CAAI,KAAMA,EAAK,OAAO,MAAQN,EAAO,IAAIO,CAAG,CAAC,MAChE,EAA4C,YAAYD,EAAK,KAAK,MAAQN,EAAO,IAAIO,CAAG,CAAE;CAC5F;CACA,OAAO;EAAE;EAAK;CAAO;AACvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPaintAction.js","names":["createPaintAction","refreshPreviews","id","scratch","prev","next","spec","selection","ctx","scene","applyOps","ids","fallback","opts","pick","key","startData","node","moveCtx","reason","ops","merged","nodeNow","from","to","createSetDataOp","defaultCommitAdapter","sel","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createPaintAction.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createSetDataOp } from 'core/ops/setData';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/** The node data one paint action reads and writes: its own key, nothing else. */\ntype PaintData<K extends string, TValue> = { [P in K]?: TValue | null };\n\ntype Params = Record<string, unknown> | undefined;\n\n/** Read a param from the invocation, falling back to the binding's. */\nexport type PickParam = <T>(key: string) => T | undefined;\n\n/**\n * What distinguishes one paint action from
|
|
1
|
+
{"version":3,"file":"createPaintAction.js","names":["createPaintAction","refreshPreviews","id","scratch","prev","next","spec","selection","ctx","scene","applyOps","ids","fallback","opts","pick","key","startData","node","moveCtx","reason","ops","merged","nodeNow","from","to","createSetDataOp","defaultCommitAdapter","sel","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createPaintAction.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createSetDataOp } from 'core/ops/setData';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/** The node data one paint action reads and writes: its own key, nothing else. */\ntype PaintData<K extends string, TValue> = { [P in K]?: TValue | null };\n\ntype Params = Record<string, unknown> | undefined;\n\n/** Read a param from the invocation, falling back to the binding's. */\nexport type PickParam = <T>(key: string) => T | undefined;\n\n/**\n * What distinguishes one paint action from another.\n *\n * `TState` is the action's gesture state. It is a reducer, not a paint:\n * `setFill` and `setStroke` supersede a paint with a later color, which no\n * per-field merge of the params can express.\n */\nexport interface PaintActionSpec<TState, TValue, K extends string> {\n id: string;\n label: string;\n /** The `data` key this action owns. */\n dataKey: K;\n /** Gesture state at start. */\n initialState(pick: PickParam): TState;\n /** The state one onMove tick moves to, or `null` when its params carry\n * nothing this action reads — the preview then stands. */\n readParams(prev: TState, params: Params): TState | null;\n /** The value to write for one node, from that node's value at gesture start.\n * `null` writes the absence of paint, which is a value like any other —\n * a node with `fill: null` paints no fill. */\n merge(prev: TValue | null | undefined, state: TState): TValue | null;\n}\n\ninterface Scratch<TState, TValue, K extends string> {\n ids: NodeId[];\n scene: Scene<PaintData<K, TValue>, string, unknown>;\n /** Data snapshot at gesture start, keyed by node id. */\n startData: Map<NodeId, PaintData<K, TValue>>;\n state: TState;\n /** Preview data entries — the merged value per selected node. */\n previews: Map<NodeId, PaintData<K, TValue>>;\n /** Consumer commit hook captured at gesture start; undefined falls back to\n * `scene.applyBatch`. */\n applyOps?: (ops: Op[], label: string) => void;\n}\n\n/**\n * The ongoing-action body the paint actions share: it previews without\n * touching the scene, and commits one batch (one undo entry) through the\n * consumer `applyOps` hook when present, else `scene.applyBatch`.\n *\n * The `from` data is re-read at commit rather than reused from the start\n * snapshot, so a concurrent edit to a field this action does not own is not\n * clobbered.\n */\nexport function createPaintAction<TState, TValue, K extends string>(\n spec: PaintActionSpec<TState, TValue, K>,\n): Action & { requires: string[] } {\n type Data = PaintData<K, TValue>;\n\n const refreshPreviews = (scratch: Scratch<TState, TValue, K>): void => {\n scratch.previews.clear();\n for (const id of scratch.ids) {\n const prev = scratch.startData.get(id);\n const next = spec.merge(prev?.[spec.dataKey], scratch.state);\n scratch.previews.set(id, { ...(prev ?? {}), [spec.dataKey]: next } as Data);\n }\n };\n\n return {\n id: spec.id,\n label: spec.label,\n eligible: { capability: 'applies-fill' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene as Scene<Data, string, unknown> | undefined;\n const applyOps = ctx.deps.applyOps;\n\n if (!selection || !scene) return {};\n\n const ids = selection.get() as NodeId[];\n if (ids.length === 0) return {};\n\n const fallback = opts?.params as Params;\n const pick = (<T>(key: string) =>\n (ctx.params?.[key] ?? fallback?.[key]) as T | undefined) as PickParam;\n\n const startData = new Map<NodeId, Data>();\n for (const id of ids) {\n const node = scene.get(id);\n if (node) startData.set(id, { ...(node.data as Data) });\n }\n\n const scratch: Scratch<TState, TValue, K> = {\n ids,\n scene,\n startData,\n state: spec.initialState(pick),\n previews: new Map(),\n applyOps,\n };\n refreshPreviews(scratch);\n\n return {\n onMove(moveCtx: InvocationCtx): void {\n const next = spec.readParams(scratch.state, moveCtx.params);\n if (next === null) return;\n scratch.state = next;\n refreshPreviews(scratch);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') {\n scratch.previews.clear();\n return;\n }\n const ops: Op[] = [];\n for (const id of scratch.ids) {\n const merged = spec.merge(\n scratch.startData.get(id)?.[spec.dataKey],\n scratch.state,\n );\n const nodeNow = scratch.scene.get(id);\n if (!nodeNow) continue;\n const from = { ...(nodeNow.data as object) } as Data;\n const to = { ...from, [spec.dataKey]: merged } as Data;\n ops.push(createSetDataOp<Data>({ id: id as string, from, to }));\n }\n if (ops.length > 0) {\n if (scratch.applyOps) scratch.applyOps(ops, spec.label);\n else scratch.scene.applyBatch(ops, spec.label, defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n }\n scratch.previews.clear();\n },\n previewIds: () => scratch.previews.keys(),\n previewData: (id: string) => scratch.previews.get(id as unknown as NodeId) ?? null,\n };\n },\n },\n enabled: (deps) => {\n const sel = deps?.selection;\n if (!sel || (sel.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n },\n };\n}\n"],"mappings":";;;;AA6DA,SAAgBA,EACd,GACiC;CAGjC,IAAMC,KAAmB,MAA8C;EACrE,EAAQ,SAAS,MAAM;EACvB,KAAK,IAAMC,KAAMC,EAAQ,KAAK;GAC5B,IAAMC,IAAOD,EAAQ,UAAU,IAAID,CAAE,GAC/BG,IAAOC,EAAK,MAAMF,IAAOE,EAAK,UAAUH,EAAQ,KAAK;GAC3D,EAAQ,SAAS,IAAID,GAAI;IAAE,GAAIE,KAAQ,CAAC;KAAKE,EAAK,UAAUD;GAAK,CAAS;EAC5E;CACF;CAEA,OAAO;EACL,IAAIC,EAAK;EACT,OAAOA,EAAK;EACZ,UAAU,EAAE,YAAY,eAAe;EACvC,UAAU;GAAC;GAAa;GAAS;EAAU;EAC3C,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAmC;IAC3D,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAWF,EAAI,KAAK;IAE1B,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO,CAAC;IAElC,IAAME,IAAMJ,EAAU,IAAI;IAC1B,IAAII,EAAI,WAAW,GAAG,OAAO,CAAC;IAE9B,IAAMC,IAAWC,GAAM,QACjBC,MAAY,MACfN,EAAI,SAASO,MAAQH,IAAWG,KAE7BC,oBAAY,IAAI,IAAkB;IACxC,KAAK,IAAMd,KAAMS,GAAK;KACpB,IAAMM,IAAOR,EAAM,IAAIP,CAAE;KACzB,AAAIe,KAAMD,EAAU,IAAId,GAAI,EAAE,GAAIe,EAAK,KAAc,CAAC;IACxD;IAEA,IAAMd,IAAsC;KAC1C;KACA;KACA;KACA,OAAOG,EAAK,aAAaQ,CAAI;KAC7B,0BAAU,IAAI,IAAI;KAClB;IACF;IAGA,OAFAb,EAAgBE,CAAO,GAEhB;KACL,OAAO,GAA8B;MACnC,IAAME,IAAOC,EAAK,WAAWH,EAAQ,OAAOe,EAAQ,MAAM;MAC1D,AAAIb,MAAS,SACb,EAAQ,QAAQA,GAChBJ,EAAgBE,CAAO;KACzB;KACA,MAAM,GAAwB,GAAmC;MAC/D,IAAIgB,MAAW,UAAU;OACvB,EAAQ,SAAS,MAAM;OACvB;MACF;MACA,IAAMC,IAAY,CAAC;MACnB,KAAK,IAAMlB,KAAMC,EAAQ,KAAK;OAC5B,IAAMkB,IAASf,EAAK,MAClBH,EAAQ,UAAU,IAAID,CAAE,CAAC,GAAGI,EAAK,UACjCH,EAAQ,KACV,GACMmB,IAAUnB,EAAQ,MAAM,IAAID,CAAE;OACpC,IAAI,CAACoB,GAAS;OACd,IAAMC,IAAO,EAAE,GAAID,EAAQ,KAAgB,GACrCE,IAAK;QAAE,GAAGD;SAAOjB,EAAK,UAAUe;OAAO;OAC7C,EAAI,KAAKI,EAAsB;QAAM;QAAc;QAAM;OAAG,CAAC,CAAC;MAChE;MAKA,AAJIL,EAAI,SAAS,MACXjB,EAAQ,WAAUA,EAAQ,SAASiB,GAAKd,EAAK,KAAK,IACjDH,EAAQ,MAAM,WAAWiB,GAAKd,EAAK,OAAOoB,EAAqBvB,EAAQ,OAAOI,EAAU,cAAc,CAAC,IAE9GJ,EAAQ,SAAS,MAAM;KACzB;KACA,kBAAkBA,EAAQ,SAAS,KAAK;KACxC,cAAc,MAAeA,EAAQ,SAAS,IAAID,CAAuB,KAAK;IAChF;GACF;EACF;EACA,UAAU,MAAS;GACjB,IAAMyB,IAAMC,GAAM;GAIlB,OAHI,CAACD,KAAQA,EAAI,IAAI,CAAC,CAAe,WAAW,IACvCE,EAAqB,oBAEvB;EACT;CACF;AACF"}
|