@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,63 +0,0 @@
|
|
|
1
|
-
import { subscribeToSources as e } from "../../core/layers/render.js";
|
|
2
|
-
import { tiledProject as t } from "./tiledProject.js";
|
|
3
|
-
//#region src/features/tiling/createTiledLayer.ts
|
|
4
|
-
function n(e, t) {
|
|
5
|
-
return e === void 0 ? {
|
|
6
|
-
x: t,
|
|
7
|
-
y: t
|
|
8
|
-
} : typeof e == "number" ? {
|
|
9
|
-
x: e,
|
|
10
|
-
y: t
|
|
11
|
-
} : {
|
|
12
|
-
x: e.x ?? t,
|
|
13
|
-
y: e.y ?? t
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
function r(e, t) {
|
|
17
|
-
return new Float32Array([
|
|
18
|
-
1,
|
|
19
|
-
0,
|
|
20
|
-
0,
|
|
21
|
-
0,
|
|
22
|
-
1,
|
|
23
|
-
0,
|
|
24
|
-
e,
|
|
25
|
-
t,
|
|
26
|
-
1
|
|
27
|
-
]);
|
|
28
|
-
}
|
|
29
|
-
function i(i) {
|
|
30
|
-
let { id: a, label: o, source: s, period: c, bleed: l } = i;
|
|
31
|
-
return {
|
|
32
|
-
id: a,
|
|
33
|
-
label: o,
|
|
34
|
-
space: "world",
|
|
35
|
-
subscribe: e(s),
|
|
36
|
-
draw: (e, i, a) => {
|
|
37
|
-
let o = n(typeof c == "function" ? c(i, a) : c, Infinity), u = n(l, 0), d = a.width / i.scale.x, f = a.height / i.scale.y, p = t(i.x, i.x + d, o.x, u.x), m = t(i.y, i.y + f, o.y, u.y), h = [];
|
|
38
|
-
for (let t of s) (t.space ?? "world") === "screen" && h.push(...t.draw(e, i, a));
|
|
39
|
-
let g = s.filter((e) => (e.space ?? "world") !== "screen");
|
|
40
|
-
for (let t = p.from; t <= p.to; t++) for (let n = m.from; n <= m.to; n++) {
|
|
41
|
-
let s = Number.isFinite(o.x) ? t * o.x : 0, c = Number.isFinite(o.y) ? n * o.y : 0, l = {
|
|
42
|
-
...i,
|
|
43
|
-
x: i.x - s,
|
|
44
|
-
y: i.y - c
|
|
45
|
-
}, u = [];
|
|
46
|
-
for (let t of g) u.push(...t.draw(e, l, a));
|
|
47
|
-
u.length !== 0 && h.push(s === 0 && c === 0 ? {
|
|
48
|
-
kind: "group",
|
|
49
|
-
children: u
|
|
50
|
-
} : {
|
|
51
|
-
kind: "group",
|
|
52
|
-
transform: r(s, c),
|
|
53
|
-
children: u
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
return h;
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
//#endregion
|
|
61
|
-
export { i as createTiledLayer };
|
|
62
|
-
|
|
63
|
-
//# sourceMappingURL=createTiledLayer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createTiledLayer.js","names":["axes","v","fallback","translate","tx","ty","createTiledLayer","opts","subscribeToSources","source","p","period","view","dims","b","bleed","spanX","spanY","kx","tiledProject","ky","out","layer","data","tiles","i","j","shifted","children"],"sources":["../../../src/features/tiling/createTiledLayer.ts"],"sourcesContent":["import type { DrawCommand } from '../../renderer';\nimport { subscribeToSources, type Dims, type RenderLayer } from '../../core/layers/render';\nimport type { View } from '../../core/viewport/view';\nimport { tiledProject } from './tiledProject';\n\n/**\n * How far apart the copies sit, in world units. A bare number wraps the x\n * axis only — the side-scrolling backdrop this is usually reached for.\n * `{ x, y }` wraps both; naming one key wraps that axis alone.\n *\n * The period names the axes, so there is no separate `axis` option: two ways\n * to say which axes wrap is one way for them to disagree.\n */\nexport type TilePeriod = number | { x?: number; y?: number };\n\n/** How far the content reaches outside its own cell, in world units. */\nexport type TileBleed = number | { x?: number; y?: number };\n\n/** Options for {@link createTiledLayer}. */\nexport interface CreateTiledLayerOpts<TData> {\n id: string;\n label: string;\n /** Layers redrawn once per visible copy. */\n source: RenderLayer<TData>[];\n /**\n * The lattice. A function is read per draw, so the period can follow the\n * camera or the canvas — \"one screen wide\" is a period, not a constant.\n */\n period: TilePeriod | ((view: View, dims: Dims) => TilePeriod);\n /**\n * How far the source's content reaches outside the cell `[0, period)`, in\n * world units. Content that overhangs by more than it declares pops in at\n * the edge of the view instead of scrolling in. Default 0.\n */\n bleed?: TileBleed;\n}\n\ninterface Axes { x: number; y: number }\n\nfunction axes(v: TilePeriod | TileBleed | undefined, fallback: number): Axes {\n if (v === undefined) return { x: fallback, y: fallback };\n if (typeof v === 'number') return { x: v, y: fallback };\n return { x: v.x ?? fallback, y: v.y ?? fallback };\n}\n\n/** Column-major, the layout `Mat3` documents. */\nfunction translate(tx: number, ty: number): Float32Array {\n return new Float32Array([1, 0, 0, 0, 1, 0, tx, ty, 1]);\n}\n\n/**\n * Wrap source RenderLayers in a periodic lattice: the content is authored\n * once, in the cell `[0, period)`, and every copy of it the view can see is\n * drawn. Panning in either direction keeps producing copies, so the content\n * loops seamlessly with no state and no wrap-around bookkeeping.\n *\n * Each copy draws the source through a view shifted by `-k * period`, so a\n * source that culls against the view it is handed culls per copy and never\n * learns it is being tiled. The copy's commands are then translated by\n * `+k * period` in world space.\n *\n * The lattice is per layer, not per shape. Content on two different periods\n * is two tiled layers stacked, which keeps each source ignorant of the other\n * — a per-shape period would move the lattice into the source and make the\n * wrapper unable to cull.\n *\n * The plane is `space: 'world'`, which is what lets it be a `source` of\n * `createParallaxLayer`: the parallax plane hands it the derived inner view,\n * the lattice resolves against that, and the copies ride the plane.\n *\n * **A `space: 'screen'` source is drawn once, untiled** — it ignores the view\n * by definition, so every copy would land on top of the last. Same constraint\n * `createParallaxLayer` carries.\n */\nexport function createTiledLayer<TData>(\n opts: CreateTiledLayerOpts<TData>,\n): RenderLayer<TData> {\n const { id, label, source, period, bleed } = opts;\n return {\n id,\n label,\n space: 'world',\n subscribe: subscribeToSources(source),\n draw: (data, view, dims) => {\n const p = axes(typeof period === 'function' ? period(view, dims) : period, Infinity);\n const b = axes(bleed, 0);\n const spanX = dims.width / view.scale.x;\n const spanY = dims.height / view.scale.y;\n const kx = tiledProject(view.x, view.x + spanX, p.x, b.x);\n const ky = tiledProject(view.y, view.y + spanY, p.y, b.y);\n\n const out: DrawCommand[] = [];\n for (const layer of source) {\n if ((layer.space ?? 'world') === 'screen') out.push(...layer.draw(data, view, dims));\n }\n const tiles = source.filter((layer) => (layer.space ?? 'world') !== 'screen');\n\n for (let i = kx.from; i <= kx.to; i++) {\n for (let j = ky.from; j <= ky.to; j++) {\n const tx = Number.isFinite(p.x) ? i * p.x : 0;\n const ty = Number.isFinite(p.y) ? j * p.y : 0;\n const shifted: View = { ...view, x: view.x - tx, y: view.y - ty };\n const children: DrawCommand[] = [];\n for (const layer of tiles) children.push(...layer.draw(data, shifted, dims));\n if (children.length === 0) continue;\n out.push(tx === 0 && ty === 0\n ? { kind: 'group', children }\n : { kind: 'group', transform: translate(tx, ty), children });\n }\n }\n return out;\n },\n };\n}\n"],"mappings":";;;AAuCA,SAASA,EAAK,GAAuC,GAAwB;CAG3E,OAFIC,MAAM,KAAA,IAAkB;EAAE,GAAGC;EAAU,GAAGA;CAAS,IACnD,OAAOD,KAAM,WAAiB;EAAE,GAAGA;EAAG,GAAGC;CAAS,IAC/C;EAAE,GAAGD,EAAE,KAAKC;EAAU,GAAGD,EAAE,KAAKC;CAAS;AAClD;AAGA,SAASC,EAAU,GAAY,GAA0B;CACvD,OAAO,IAAI,aAAa;EAAC;EAAG;EAAG;EAAG;EAAG;EAAG;EAAGC;EAAIC;EAAI;CAAC,CAAC;AACvD;AA0BA,SAAgBC,EACd,GACoB;CACpB,IAAM,EAAE,OAAI,UAAO,WAAQ,WAAQ,aAAUC;CAC7C,OAAO;EACL;EACA;EACA,OAAO;EACP,WAAWC,EAAmBC,CAAM;EACpC,OAAO,GAAM,GAAM,MAAS;GAC1B,IAAMC,IAAIV,EAAK,OAAOW,KAAW,aAAaA,EAAOC,GAAMC,CAAI,IAAIF,GAAQ,QAAQ,GAC7EG,IAAId,EAAKe,GAAO,CAAC,GACjBC,IAAQH,EAAK,QAAQD,EAAK,MAAM,GAChCK,IAAQJ,EAAK,SAASD,EAAK,MAAM,GACjCM,IAAKC,EAAaP,EAAK,GAAGA,EAAK,IAAII,GAAON,EAAE,GAAGI,EAAE,CAAC,GAClDM,IAAKD,EAAaP,EAAK,GAAGA,EAAK,IAAIK,GAAOP,EAAE,GAAGI,EAAE,CAAC,GAElDO,IAAqB,CAAC;GAC5B,KAAK,IAAMC,KAASb,GAClB,CAAKa,EAAM,SAAS,aAAa,YAAUD,EAAI,KAAK,GAAGC,EAAM,KAAKC,GAAMX,GAAMC,CAAI,CAAC;GAErF,IAAMW,IAAQf,EAAO,QAAQ,OAAWa,EAAM,SAAS,aAAa,QAAQ;GAE5E,KAAK,IAAIG,IAAIP,EAAG,MAAMO,KAAKP,EAAG,IAAI,KAChC,KAAK,IAAIQ,IAAIN,EAAG,MAAMM,KAAKN,EAAG,IAAI,KAAK;IACrC,IAAMhB,IAAK,OAAO,SAASM,EAAE,CAAC,IAAIe,IAAIf,EAAE,IAAI,GACtCL,IAAK,OAAO,SAASK,EAAE,CAAC,IAAIgB,IAAIhB,EAAE,IAAI,GACtCiB,IAAgB;KAAE,GAAGf;KAAM,GAAGA,EAAK,IAAIR;KAAI,GAAGQ,EAAK,IAAIP;IAAG,GAC1DuB,IAA0B,CAAC;IACjC,KAAK,IAAMN,KAASE,GAAO,EAAS,KAAK,GAAGF,EAAM,KAAKC,GAAMI,GAASd,CAAI,CAAC;IAC3E,AAAIe,EAAS,WAAW,KACxBP,EAAI,KAAKjB,MAAO,KAAKC,MAAO,IACxB;KAAE,MAAM;KAAS;IAAS,IAC1B;KAAE,MAAM;KAAS,WAAWF,EAAUC,GAAIC,CAAE;KAAG;IAAS,CAAC;GAC/D;GAEF,OAAOgB;EACT;CACF;AACF"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//#region src/features/tiling/tiledProject.ts
|
|
2
|
-
function e(e, t, n, r = 0) {
|
|
3
|
-
return !Number.isFinite(n) || n <= 0 ? {
|
|
4
|
-
from: 0,
|
|
5
|
-
to: 0
|
|
6
|
-
} : {
|
|
7
|
-
from: Math.floor((e - r) / n),
|
|
8
|
-
to: Math.floor((t + r) / n)
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { e as tiledProject };
|
|
13
|
-
|
|
14
|
-
//# sourceMappingURL=tiledProject.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tiledProject.js","names":["tiledProject","period","visStart","bleed","visEnd"],"sources":["../../../src/features/tiling/tiledProject.ts"],"sourcesContent":["/**\n * Which copies of a periodic lattice a visible range touches.\n *\n * A tiled layer's content is authored once, in the cell `[0, period)`, and the\n * lattice repeats it at every multiple of `period`. This answers the only\n * question drawing it needs: the integer copies `k` whose cell overlaps\n * `[visStart, visEnd]`. Copy `k` draws the authored content shifted by\n * `k * period`.\n *\n * `bleed` is how far the content reaches outside its own cell, in world\n * units — the printing term, and the same idea. Content that overhangs by\n * more than it declares pops in at the edge of the view instead of scrolling\n * in.\n */\nexport interface TileRange {\n /** First copy index, inclusive. */\n from: number;\n /** Last copy index, inclusive. `to < from` means nothing is visible. */\n to: number;\n}\n\n/** The copies of a lattice with cell size `period` that `[visStart, visEnd]`\n * touches, widened by `bleed`. A non-positive or non-finite `period` answers\n * copy 0 alone. */\nexport function tiledProject(\n visStart: number,\n visEnd: number,\n period: number,\n bleed = 0,\n): TileRange {\n if (!Number.isFinite(period) || period <= 0) return { from: 0, to: 0 };\n return {\n from: Math.floor((visStart - bleed) / period),\n to: Math.floor((visEnd + bleed) / period),\n };\n}\n"],"mappings":";AAwBA,SAAgBA,EACd,GACA,GACA,GACA,IAAQ,GACG;CAEX,OADI,CAAC,OAAO,SAASC,CAAM,KAAKA,KAAU,IAAU;EAAE,MAAM;EAAG,IAAI;CAAE,IAC9D;EACL,MAAM,KAAK,OAAOC,IAAWC,KAASF,CAAM;EAC5C,IAAI,KAAK,OAAOG,IAASD,KAASF,CAAM;CAC1C;AACF"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { createInsertOp as e } from "../../../../core/ops/create.js";
|
|
2
|
-
import { createSetSelectionOp as t } from "../../../../core/ops/select.js";
|
|
3
|
-
//#region src/interactions/actions/clone/behaviors/cloneByAltDrag.ts
|
|
4
|
-
function n() {
|
|
5
|
-
return {
|
|
6
|
-
id: "cloneByAltDrag",
|
|
7
|
-
activates: (e) => e.alt === !0,
|
|
8
|
-
onEnd(n, r) {
|
|
9
|
-
if (!r.adapter.snapshotSelection || !r.adapter.commitPaste) return [];
|
|
10
|
-
let i = r.adapter.snapshotSelection(n.ids), a = r.adapter.commitPaste(i, n.offset, { dropPoint: {
|
|
11
|
-
worldX: n.worldX,
|
|
12
|
-
worldY: n.worldY
|
|
13
|
-
} });
|
|
14
|
-
if (a.length === 0) return [];
|
|
15
|
-
let o = a.map((e) => e.id), s = r.adapter.getSelection?.() ?? [];
|
|
16
|
-
return [...a.map((t) => e({ node: t })), t({
|
|
17
|
-
from: s,
|
|
18
|
-
to: o
|
|
19
|
-
})];
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
//#endregion
|
|
24
|
-
export { n as cloneByAltDrag };
|
|
25
|
-
|
|
26
|
-
//# sourceMappingURL=cloneByAltDrag.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloneByAltDrag.js","names":["cloneByAltDrag","mods","ctx","snap","pose","created","newIds","o","from","createInsertOp","createSetSelectionOp"],"sources":["../../../../../src/interactions/actions/clone/behaviors/cloneByAltDrag.ts"],"sourcesContent":["import { createInsertOp } from 'core/ops/create';\nimport { createSetSelectionOp } from 'core/ops/select';\nimport type { NodeId } from 'core/scene/types';\nimport type { CloneBehavior } from '../../../gestures/types';\n\n/** Clone-on-alt-drag behavior for `useClone`; activates when Alt/Option is held at drag start. */\nexport function cloneByAltDrag(): CloneBehavior {\n return {\n id: 'cloneByAltDrag',\n activates: (mods) => mods.alt === true,\n onEnd(pose, ctx) {\n if (!ctx.adapter.snapshotSelection || !ctx.adapter.commitPaste) return [];\n const snap = ctx.adapter.snapshotSelection(pose.ids);\n const created = ctx.adapter.commitPaste(snap, pose.offset, {\n dropPoint: { worldX: pose.worldX, worldY: pose.worldY },\n });\n if (created.length === 0) return [];\n const newIds = created.map((o: { id: string }) => o.id);\n const from = ctx.adapter.getSelection?.() ?? [];\n return [\n ...created.map((o) => createInsertOp({ node: o })),\n createSetSelectionOp({ from: from as NodeId[], to: newIds as NodeId[] }),\n ];\n },\n };\n}\n"],"mappings":";;;AAMA,SAAgBA,IAAgC;CAC9C,OAAO;EACL,IAAI;EACJ,YAAY,MAASC,EAAK,QAAQ;EAClC,MAAM,GAAM,GAAK;GACf,IAAI,CAACC,EAAI,QAAQ,qBAAqB,CAACA,EAAI,QAAQ,aAAa,OAAO,CAAC;GACxE,IAAMC,IAAOD,EAAI,QAAQ,kBAAkBE,EAAK,GAAG,GAC7CC,IAAUH,EAAI,QAAQ,YAAYC,GAAMC,EAAK,QAAQ,EACzD,WAAW;IAAE,QAAQA,EAAK;IAAQ,QAAQA,EAAK;GAAO,EACxD,CAAC;GACD,IAAIC,EAAQ,WAAW,GAAG,OAAO,CAAC;GAClC,IAAMC,IAASD,EAAQ,KAAK,MAAsBE,EAAE,EAAE,GAChDC,IAAON,EAAI,QAAQ,eAAe,KAAK,CAAC;GAC9C,OAAO,CACL,GAAGG,EAAQ,KAAK,MAAMI,EAAe,EAAE,MAAMF,EAAE,CAAC,CAAC,GACjDG,EAAqB;IAAQ;IAAkB,IAAIJ;GAAmB,CAAC,CACzE;EACF;CACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"align.js","names":["ID_FOR","\"left\"","\"right\"","\"top\"","\"bottom\"","LABEL_FOR","ICON_FOR","AlignLeftIcon","AlignRightIcon","AlignTopIcon","AlignBottomIcon","AlignCenterXIcon","AlignCenterYIcon","alignSelection","ids","selection","frame","scenePoseFrame","scene","poseComposition","poses","id","bounds","visualBoundsViaDescriptor","p","geom","target","alignTargetBounds","params","actionReferenceSources","pointer","i","alignDeltaFor","edge","dx","dy","to","translatePoseViaDescriptor","makeAlignAction","deps","poseDescriptorOf","ActionDisabledReason","alignLeftAction","alignRightAction","alignTopAction","alignBottomAction","alignCenterXAction","alignCenterYAction"],"sources":["../../../../src/interactions/actions/defaults/align.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { Scene } from 'core/scene/types';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport {\n alignDeltaFor,\n alignTargetBounds,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n type AlignEdge,\n type AlignReference,\n} from '../align/align';\nimport { actionReferenceSources } from '../spatialReference';\nimport type { PointerContextValue } from 'features/pointer/PointerContext';\nimport { scenePoseFrame } from '../poseFrame';\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\nimport {\n AlignLeftIcon,\n AlignRightIcon,\n AlignTopIcon,\n AlignBottomIcon,\n AlignCenterXIcon,\n AlignCenterYIcon,\n} from './icons/alignIcons';\nconst ID_FOR: Record<AlignEdge, string> = {\n 'left': 'align.left',\n 'right': 'align.right',\n 'top': 'align.top',\n 'bottom': 'align.bottom',\n 'center-x': 'align.centerX',\n 'center-y': 'align.centerY',\n};\nconst LABEL_FOR: Record<AlignEdge, string> = {\n 'left': 'Align Left',\n 'right': 'Align Right',\n 'top': 'Align Top',\n 'bottom': 'Align Bottom',\n 'center-x': 'Align Centers Horizontally',\n 'center-y': 'Align Centers Vertically',\n};\nconst ICON_FOR: Record<AlignEdge, ReactNode> = {\n 'left': <AlignLeftIcon />,\n 'right': <AlignRightIcon />,\n 'top': <AlignTopIcon />,\n 'bottom': <AlignBottomIcon />,\n 'center-x': <AlignCenterXIcon />,\n 'center-y': <AlignCenterYIcon />,\n};\n\n// ---------------------------------------------------------------------------\n// Shared helper for descriptor invokers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply an align operation to the current selection via the Scene API.\n * Reads poses through the `poseDescriptor` dep; what the selection aligns to\n * comes from `params.to` (an `AlignReference`, default `'union'`).\n *\n * The edge every member lines up on is a world edge, so the bounds are read\n * and translated in world and each result is stored back in its own parent's\n * frame.\n */\nfunction alignSelection(\n selection: SelectionApi,\n scene: Scene<unknown, string, unknown>,\n edge: AlignEdge,\n geom: PoseDescriptor<unknown>,\n poseComposition: unknown,\n params: Record<string, unknown> | undefined,\n pointer: PointerContextValue | undefined,\n): void {\n const ids = selection.get();\n const frame = scenePoseFrame(scene, poseComposition);\n const poses = ids.map((id) => frame.world(id));\n const bounds = poses.map((p) => visualBoundsViaDescriptor(p, geom));\n const target = alignTargetBounds(\n bounds,\n params?.to as AlignReference | undefined,\n actionReferenceSources(params, pointer, scene, frame, geom),\n );\n if (target === null) return;\n scene.batch('Align', () => {\n for (let i = 0; i < ids.length; i++) {\n const { dx, dy } = alignDeltaFor(bounds[i], target, edge);\n if (dx === 0 && dy === 0) continue;\n const to = translatePoseViaDescriptor(poses[i], dx, dy, geom);\n scene.setPose(ids[i], frame.local(ids[i], to));\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Static descriptors\n// ---------------------------------------------------------------------------\n\nfunction makeAlignAction(edge: AlignEdge): Action {\n return {\n id: ID_FOR[edge],\n label: LABEL_FOR[edge],\n icon: ICON_FOR[edge],\n group: 'align',\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'poseDescriptor', 'poseComposition', 'pointer'],\n // No default keybindings — six edges/centers don't fit a clean default\n // chord set. Wire bindings explicitly via the actions registry override map.\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const selection = deps.selection;\n const scene = deps.scene;\n if (!selection || !scene) return;\n alignSelection(\n selection, scene, edge, poseDescriptorOf(deps.poseDescriptor), deps.poseComposition,\n params, deps.pointer,\n );\n },\n } satisfies ImmediateInvoker,\n // One item is enough: `enabled` cannot see the binding's `to`, and every\n // reference but `'union'` aligns a single item. Deps-aware, since a\n // constant disabled reason greys the entry out forever (see\n // `requiresSelection`).\n enabled: (deps) => {\n const selection = deps?.selection;\n const count = selection?.get().length ?? 0;\n return count >= 1 ? true : ActionDisabledReason.SelectionRequired;\n },\n };\n}\n\n/** @experimental Static descriptor for align-left. */\nexport const alignLeftAction = makeAlignAction('left');\n/** @experimental Static descriptor for align-right. */\nexport const alignRightAction = makeAlignAction('right');\n/** @experimental Static descriptor for align-top. */\nexport const alignTopAction = makeAlignAction('top');\n/** @experimental Static descriptor for align-bottom. */\nexport const alignBottomAction = makeAlignAction('bottom');\n/** @experimental Static descriptor for align-center-x. */\nexport const alignCenterXAction = makeAlignAction('center-x');\n/** @experimental Static descriptor for align-center-y. */\nexport const alignCenterYAction = makeAlignAction('center-y');\n\n"],"mappings":";;;;;;;;;AA2BA,IAAMA,IAAoC;CACxCC,MAAQ;CACRC,OAAS;CACTC,KAAO;CACPC,QAAU;CACV,YAAY;CACZ,YAAY;AACd,GACMC,IAAuC;CAC3CJ,MAAQ;CACRC,OAAS;CACTC,KAAO;CACPC,QAAU;CACV,YAAY;CACZ,YAAY;AACd,GACME,IAAyC;CAC7CL,MAAQ,kBAACM,GAAD,CAAgB,CAAA;CACxBL,OAAS,kBAACM,GAAD,CAAiB,CAAA;CAC1BL,KAAO,kBAACM,GAAD,CAAe,CAAA;CACtBL,QAAU,kBAACM,GAAD,CAAkB,CAAA;CAC5B,YAAY,kBAACC,GAAD,CAAmB,CAAA;CAC/B,YAAY,kBAACC,GAAD,CAAmB,CAAA;AACjC;AAeA,SAASC,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAMC,EAAU,IAAI,GACpBC,IAAQC,EAAeC,GAAOC,CAAe,GAC7CC,IAAQN,EAAI,KAAK,MAAOE,EAAM,MAAMK,CAAE,CAAC,GACvCC,IAASF,EAAM,KAAK,MAAMG,EAA0BC,GAAGC,CAAI,CAAC,GAC5DC,IAASC,EACbL,GACAM,GAAQ,IACRC,EAAuBD,GAAQE,GAASZ,GAAOF,GAAOS,CAAI,CAC5D;CACA,AAAIC,MAAW,QACfR,EAAM,MAAM,eAAe;EACzB,KAAK,IAAIa,IAAI,GAAGA,IAAIjB,EAAI,QAAQ,KAAK;GACnC,IAAM,EAAE,OAAI,UAAOkB,EAAcV,EAAOS,IAAIL,GAAQO,CAAI;GACxD,IAAIC,MAAO,KAAKC,MAAO,GAAG;GAC1B,IAAMC,IAAKC,EAA2BjB,EAAMW,IAAIG,GAAIC,GAAIV,CAAI;GAC5D,EAAM,QAAQX,EAAIiB,IAAIf,EAAM,MAAMF,EAAIiB,IAAIK,CAAE,CAAC;EAC/C;CACF,CAAC;AACH;AAMA,SAASE,EAAgB,GAAyB;CAChD,OAAO;EACL,IAAItC,EAAOiC;EACX,OAAO5B,EAAU4B;EACjB,MAAM3B,EAAS2B;EACf,OAAO;EACP,UAAU,EAAE,YAAY,uBAAuB;EAC/C,UAAU;GAAC;GAAa;GAAS;GAAkB;GAAmB;EAAS;EAG/E,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMlB,IAAYwB,EAAK,WACjBrB,IAAQqB,EAAK;IACnB,AAAKxB,KAAcG,KACnBL,EACEE,GAAWG,GAAOe,GAAMO,EAAiBD,EAAK,cAAc,GAAGA,EAAK,iBACpEX,GAAQW,EAAK,OACf;GACF;EACF;EAKA,UAAU,QACUA,GAAM,UAAA,EACC,IAAI,CAAC,CAAC,UAAU,MACzB,KAAWE,EAAqB;CAEpD;AACF;AAGA,IAAaC,IAAqBJ,EAAgB,MAAM,GAE3CK,IAAqBL,EAAgB,OAAO,GAE5CM,IAAqBN,EAAgB,KAAK,GAE1CO,IAAqBP,EAAgB,QAAQ,GAE7CQ,IAAqBR,EAAgB,UAAU,GAE/CS,IAAqBT,EAAgB,UAAU"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { applyBooleanOp as e } from "../booleans/booleans.js";
|
|
2
|
-
import { CropIcon as t, DivideIcon as n, ExcludeIcon as r, IntersectIcon as i, SubtractIcon as a, UnionIcon as o } from "./icons/booleanIcons.js";
|
|
3
|
-
import { ActionDisabledReason as s } from "@weasel-js/routing";
|
|
4
|
-
import { jsx as c } from "react/jsx-runtime";
|
|
5
|
-
//#region src/interactions/actions/defaults/booleans.tsx
|
|
6
|
-
var l = {
|
|
7
|
-
union: "pathfinder.union",
|
|
8
|
-
intersect: "pathfinder.intersect",
|
|
9
|
-
subtract: "pathfinder.subtract",
|
|
10
|
-
exclude: "pathfinder.exclude",
|
|
11
|
-
divide: "pathfinder.divide",
|
|
12
|
-
crop: "pathfinder.crop"
|
|
13
|
-
}, u = {
|
|
14
|
-
union: "Unite",
|
|
15
|
-
intersect: "Intersect",
|
|
16
|
-
subtract: "Minus Front",
|
|
17
|
-
exclude: "Exclude",
|
|
18
|
-
divide: "Divide",
|
|
19
|
-
crop: "Crop"
|
|
20
|
-
}, d = {
|
|
21
|
-
union: /* @__PURE__ */ c(o, {}),
|
|
22
|
-
intersect: /* @__PURE__ */ c(i, {}),
|
|
23
|
-
subtract: /* @__PURE__ */ c(a, {}),
|
|
24
|
-
exclude: /* @__PURE__ */ c(r, {}),
|
|
25
|
-
divide: /* @__PURE__ */ c(n, {}),
|
|
26
|
-
crop: /* @__PURE__ */ c(t, {})
|
|
27
|
-
};
|
|
28
|
-
function f(t) {
|
|
29
|
-
return {
|
|
30
|
-
id: l[t],
|
|
31
|
-
label: u[t],
|
|
32
|
-
icon: d[t],
|
|
33
|
-
group: "pathfinder",
|
|
34
|
-
eligible: { capability: "creates-shapes" },
|
|
35
|
-
requires: ["selection", "booleansAdapter"],
|
|
36
|
-
invoker: {
|
|
37
|
-
timing: "immediate",
|
|
38
|
-
run: (n) => {
|
|
39
|
-
let r = n.booleansAdapter;
|
|
40
|
-
if (!r) return;
|
|
41
|
-
let i = e(r, t);
|
|
42
|
-
i.kind === "failed" && console.warn(`[pathfinder] ${i.error.message}`);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
enabled: (e) => ((e?.selection)?.get().length ?? 0) >= 2 || s.SelectionRequired
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
var p = f("union"), m = f("subtract"), h = f("intersect"), g = f("exclude"), _ = f("divide"), v = f("crop");
|
|
49
|
-
//#endregion
|
|
50
|
-
export { v as pathfinderCropAction, _ as pathfinderDivideAction, g as pathfinderExcludeAction, h as pathfinderIntersectAction, m as pathfinderSubtractAction, p as pathfinderUnionAction };
|
|
51
|
-
|
|
52
|
-
//# sourceMappingURL=booleans.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"booleans.js","names":["ID_FOR","LABEL_FOR","ICON_FOR","UnionIcon","IntersectIcon","SubtractIcon","ExcludeIcon","DivideIcon","CropIcon","makePathfinderAction","op","adapter","deps","result","applyBooleanOp","ActionDisabledReason","pathfinderUnionAction","pathfinderSubtractAction","pathfinderIntersectAction","pathfinderExcludeAction","pathfinderDivideAction","pathfinderCropAction"],"sources":["../../../../src/interactions/actions/defaults/booleans.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { applyBooleanOp, type BooleanOp } from '../booleans/booleans';\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\nimport {\n UnionIcon,\n IntersectIcon,\n SubtractIcon,\n ExcludeIcon,\n DivideIcon,\n CropIcon,\n} from './icons/booleanIcons';\n\nconst ID_FOR: Record<BooleanOp, string> = {\n union: 'pathfinder.union',\n intersect: 'pathfinder.intersect',\n subtract: 'pathfinder.subtract',\n exclude: 'pathfinder.exclude',\n divide: 'pathfinder.divide',\n crop: 'pathfinder.crop',\n};\n\nconst LABEL_FOR: Record<BooleanOp, string> = {\n union: 'Unite',\n intersect: 'Intersect',\n subtract: 'Minus Front',\n exclude: 'Exclude',\n divide: 'Divide',\n crop: 'Crop',\n};\n\nconst ICON_FOR: Record<BooleanOp, ReactNode> = {\n union: <UnionIcon />,\n intersect: <IntersectIcon />,\n subtract: <SubtractIcon />,\n exclude: <ExcludeIcon />,\n divide: <DivideIcon />,\n crop: <CropIcon />,\n};\n\n// ---------------------------------------------------------------------------\n// Static descriptors\n// ---------------------------------------------------------------------------\n\nfunction makePathfinderAction(op: BooleanOp): Action {\n return {\n id: ID_FOR[op],\n label: LABEL_FOR[op],\n icon: ICON_FOR[op],\n group: 'pathfinder',\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'booleansAdapter'],\n // No default keybindings — there's no industry-standard chord set for\n // boolean ops. Wire bindings explicitly via the actions registry override map.\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const adapter = deps.booleansAdapter;\n if (!adapter) return;\n const result = applyBooleanOp(adapter, op);\n if (result.kind === 'failed') console.warn(`[pathfinder] ${result.error.message}`);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => {\n const selection = deps?.selection;\n const count = selection?.get().length ?? 0;\n return count >= 2 ? true : ActionDisabledReason.SelectionRequired;\n },\n };\n}\n\n/** @experimental Static descriptor for pathfinder-union. */\nexport const pathfinderUnionAction = makePathfinderAction('union');\n/** @experimental Static descriptor for pathfinder-subtract. */\nexport const pathfinderSubtractAction = makePathfinderAction('subtract');\n/** @experimental Static descriptor for pathfinder-intersect. */\nexport const pathfinderIntersectAction = makePathfinderAction('intersect');\n/** @experimental Static descriptor for pathfinder-exclude. */\nexport const pathfinderExcludeAction = makePathfinderAction('exclude');\n/** @experimental Static descriptor for pathfinder-divide. */\nexport const pathfinderDivideAction = makePathfinderAction('divide');\n/** @experimental Static descriptor for pathfinder-crop. */\nexport const pathfinderCropAction = makePathfinderAction('crop');\n\n"],"mappings":";;;;;AAcA,IAAMA,IAAoC;CACxC,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,QAAQ;CACR,MAAM;AACR,GAEMC,IAAuC;CAC3C,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,QAAQ;CACR,MAAM;AACR,GAEMC,IAAyC;CAC7C,OAAO,kBAACC,GAAD,CAAY,CAAA;CACnB,WAAW,kBAACC,GAAD,CAAgB,CAAA;CAC3B,UAAU,kBAACC,GAAD,CAAe,CAAA;CACzB,SAAS,kBAACC,GAAD,CAAc,CAAA;CACvB,QAAQ,kBAACC,GAAD,CAAa,CAAA;CACrB,MAAM,kBAACC,GAAD,CAAW,CAAA;AACnB;AAMA,SAASC,EAAqB,GAAuB;CACnD,OAAO;EACL,IAAIT,EAAOU;EACX,OAAOT,EAAUS;EACjB,MAAMR,EAASQ;EACf,OAAO;EACP,UAAU,EAAE,YAAY,iBAAiB;EACzC,UAAU,CAAC,aAAa,iBAAiB;EAGzC,SAAS;GACP,QAAQ;GACR,MAAM,MAAS;IACb,IAAMC,IAAUC,EAAK;IACrB,IAAI,CAACD,GAAS;IACd,IAAME,IAASC,EAAeH,GAASD,CAAE;IACzC,AAAIG,EAAO,SAAS,YAAU,QAAQ,KAAK,gBAAgBA,EAAO,MAAM,SAAS;GACnF;EACF;EACA,UAAU,QACUD,GAAM,UAAA,EACC,IAAI,CAAC,CAAC,UAAU,MACzB,KAAWG,EAAqB;CAEpD;AACF;AAGA,IAAaC,IAA4BP,EAAqB,OAAO,GAExDQ,IAA4BR,EAAqB,UAAU,GAE3DS,IAA4BT,EAAqB,WAAW,GAE5DU,IAA4BV,EAAqB,SAAS,GAE1DW,IAA4BX,EAAqB,QAAQ,GAEzDY,IAA4BZ,EAAqB,MAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clipboard.js","names":["clipboardCopyAction","createElement","CopyIcon","requiresSelection","clipboardCutAction","CutIcon","clipboard","deps","selection","scene","applyOps","ids","ops","buildDeleteOps","defaultCommitAdapter","clipboardPasteAction","PasteIcon","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clipboard.ts"],"sourcesContent":["import { createElement } from 'react';\nimport { CopyIcon, CutIcon, PasteIcon } from './icons/editIcons';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { ActionDisabledReason, type Action } from '@weasel-js/routing';\nimport { buildDeleteOps } from './delete';\nimport { requiresSelection } from './requiresSelection';\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.copy` Action (Cmd/Ctrl+C).\n */\nexport const clipboardCopyAction: Action & { requires: string[] } = {\n id: 'clipboard.copy',\n label: 'Copy',\n icon: createElement(CopyIcon),\n group: 'clipboard',\n defaultBinding: { kind: 'key', key: 'c', mods: { mod: true } },\n // Same gate as `duplicate`: a mode that can neither edit the page nor own a\n // selection has nothing to copy. Notably excludes `text-edit`, where Cmd+C\n // must stay the browser's own copy of the caret range.\n eligible: { capability: ['edits-page', 'creates-selection'] },\n // `selection` is read by the `enabled` gate, not the invoker — the\n // dispatcher builds deps for both, and an undeclared read is undefined.\n requires: ['clipboard', 'selection'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n deps.clipboard?.copy();\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.cut` Action (Cmd/Ctrl+X) — copy, then\n * the same batched delete `deleteAction` performs, as one undo entry.\n */\nexport const clipboardCutAction: Action & { requires: string[] } = {\n id: 'clipboard.cut',\n label: 'Cut',\n icon: createElement(CutIcon),\n group: 'clipboard',\n defaultBinding: { kind: 'key', key: 'x', mods: { mod: true } },\n eligible: { capability: 'edits-page' },\n requires: ['clipboard', 'scene', 'selection', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const clipboard = deps.clipboard;\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!clipboard || !selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n // Snapshot before removal — `snapshotSelection` reads live nodes.\n clipboard.copy();\n\n const ops = buildDeleteOps(scene, ids, 'Cut');\n if (ops.length > 0) {\n if (applyOps) applyOps(ops, 'Cut');\n else scene.applyBatch(ops, 'Cut', defaultCommitAdapter(scene, selection.adapterMethods));\n }\n selection.set([]);\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.paste` Action — what a Paste button or\n * menu item triggers. It has no key binding: Cmd/Ctrl+V already arrives as a\n * DOM `paste` event, which the dispatcher routes to `ingest`, and a binding\n * here would fire alongside it and paste twice.\n */\nexport const clipboardPasteAction: Action & { requires: string[] } = {\n id: 'clipboard.paste',\n label: 'Paste',\n icon: createElement(PasteIcon),\n group: 'clipboard',\n eligible: { capability: 'edits-page' },\n requires: ['clipboard'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n deps.clipboard?.paste();\n },\n },\n enabled: (deps) => {\n const clipboard = deps?.clipboard;\n return clipboard && !clipboard.isEmpty() ? true : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":";;;;;;;AAWA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAQ;CAC5B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAI7D,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAG5D,UAAU,CAAC,aAAa,WAAW;CACnC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAK,WAAW,KAAK;EACvB;CACF;CACA,SAASC;AACX,GAOaC,IAAsD;CACjE,IAAI;CACJ,OAAO;CACP,MAAMH,EAAcI,CAAO;CAC3B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAC7D,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU;EAAC;EAAa;EAAS;EAAa;CAAU;CACxD,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBC,IAAYD,EAAK,WACjBE,IAAQF,EAAK,OACbG,IAAWH,EAAK;GACtB,IAAI,CAACD,KAAa,CAACE,KAAa,CAACC,GAAO;GACxC,IAAME,IAAMH,EAAU,IAAI;GAC1B,IAAIG,EAAI,WAAW,GAAG;GAGtB,EAAU,KAAK;GAEf,IAAMC,IAAMC,EAAeJ,GAAOE,GAAK,KAAK;GAK5C,AAJIC,EAAI,SAAS,MACXF,IAAUA,EAASE,GAAK,KAAK,IAC5BH,EAAM,WAAWG,GAAK,OAAOE,EAAqBL,GAAOD,EAAU,cAAc,CAAC,IAEzFA,EAAU,IAAI,CAAC,CAAC;EAClB;CACF;CACA,SAASL;AACX,GASaY,IAAwD;CACnE,IAAI;CACJ,OAAO;CACP,MAAMd,EAAce,CAAS;CAC7B,OAAO;CACP,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU,CAAC,WAAW;CACtB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAK,WAAW,MAAM;EACxB;CACF;CACA,UAAU,MAAS;EACjB,IAAMV,IAAYC,GAAM;EACxB,OAAOD,KAAa,CAACA,EAAU,QAAQ,IAAI,KAAOW,EAAqB;CACzE;AACF"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
|
|
2
|
-
import { poseDescriptorOf as t } from "../poseDescriptorDep.js";
|
|
3
|
-
import { carryPose as n, inPlane as r, invertPlane as i, planeOf as a, selectionLayer as o } from "../planeInput.js";
|
|
4
|
-
import { defaultCommitAdapter as s } from "../defaultCommitAdapter.js";
|
|
5
|
-
import { scenePoseFrame as c } from "../poseFrame.js";
|
|
6
|
-
import { createInsertOp as l } from "../../../core/ops/create.js";
|
|
7
|
-
import { freshNodeId as u } from "./freshNodeId.js";
|
|
8
|
-
//#region src/interactions/actions/defaults/clone.ts
|
|
9
|
-
var d = r({
|
|
10
|
-
id: "clone",
|
|
11
|
-
label: "Clone",
|
|
12
|
-
cursor: "copy",
|
|
13
|
-
activeCursor: "copy",
|
|
14
|
-
eligible: { capability: ["edits-page", "creates-selection"] },
|
|
15
|
-
requires: [
|
|
16
|
-
"selection",
|
|
17
|
-
"scene",
|
|
18
|
-
"applyOps",
|
|
19
|
-
"poseDescriptor",
|
|
20
|
-
"poseComposition"
|
|
21
|
-
],
|
|
22
|
-
invoker: {
|
|
23
|
-
timing: "ongoing",
|
|
24
|
-
start(r, o) {
|
|
25
|
-
let d = r.deps.selection, f = r.deps.scene, p = r.deps.applyOps;
|
|
26
|
-
if (!d || !f) return {};
|
|
27
|
-
let m = d.get();
|
|
28
|
-
if (m.length === 0) return {};
|
|
29
|
-
let h = c(f, r.deps.poseComposition), g = /* @__PURE__ */ new Map(), _ = t(r.deps.poseDescriptor);
|
|
30
|
-
for (let e of m) {
|
|
31
|
-
let t = f.get(e);
|
|
32
|
-
if (t === void 0) continue;
|
|
33
|
-
let o = i(a(r.deps.view, t.layer));
|
|
34
|
-
g.set(e, n(_, h.world(e), o));
|
|
35
|
-
}
|
|
36
|
-
if (g.size === 0) return {};
|
|
37
|
-
let v = {
|
|
38
|
-
ids: m,
|
|
39
|
-
scene: f,
|
|
40
|
-
descriptor: _,
|
|
41
|
-
frame: h,
|
|
42
|
-
originPoses: g,
|
|
43
|
-
view: r.deps.view,
|
|
44
|
-
currentDelta: {
|
|
45
|
-
dx: 0,
|
|
46
|
-
dy: 0
|
|
47
|
-
},
|
|
48
|
-
previews: /* @__PURE__ */ new Map(),
|
|
49
|
-
applyOps: p
|
|
50
|
-
}, y = (t, r, i) => {
|
|
51
|
-
let o = v.originPoses.get(t), s = v.scene.get(t);
|
|
52
|
-
if (o === void 0 || !s) return;
|
|
53
|
-
let c = e(o, r, i, v.descriptor);
|
|
54
|
-
return v.frame.local(t, n(v.descriptor, c, a(v.view, s.layer)));
|
|
55
|
-
};
|
|
56
|
-
return {
|
|
57
|
-
kind: "clone",
|
|
58
|
-
previewHidesSource: !1,
|
|
59
|
-
onMove(e) {
|
|
60
|
-
if (!e.drag) return;
|
|
61
|
-
v.currentDelta = {
|
|
62
|
-
dx: e.drag.delta.x,
|
|
63
|
-
dy: e.drag.delta.y
|
|
64
|
-
}, v.previews.clear();
|
|
65
|
-
let { dx: t, dy: n } = v.currentDelta;
|
|
66
|
-
if (t !== 0 || n !== 0) for (let e of v.originPoses.keys()) v.previews.set(e, y(e, t, n));
|
|
67
|
-
},
|
|
68
|
-
onEnd(e, t) {
|
|
69
|
-
if (t === "cancel") {
|
|
70
|
-
v.previews.clear();
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
let { dx: n, dy: r } = v.currentDelta;
|
|
74
|
-
if (n === 0 && r === 0) {
|
|
75
|
-
v.previews.clear();
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
let i = [];
|
|
79
|
-
for (let e of v.ids) {
|
|
80
|
-
let t = v.scene.get(e), a = y(e, n, r);
|
|
81
|
-
if (a === void 0 || !t) continue;
|
|
82
|
-
let o = {
|
|
83
|
-
id: u(),
|
|
84
|
-
kind: t.kind,
|
|
85
|
-
layer: t.layer,
|
|
86
|
-
pose: a,
|
|
87
|
-
data: t.data,
|
|
88
|
-
parent: t.parent ?? null
|
|
89
|
-
};
|
|
90
|
-
i.push(l({
|
|
91
|
-
node: o,
|
|
92
|
-
label: "Clone"
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
i.length > 0 && (v.applyOps ? v.applyOps(i, "Clone") : v.scene.applyBatch(i, "Clone", s(v.scene, d.adapterMethods))), v.previews.clear();
|
|
96
|
-
},
|
|
97
|
-
previewIds: () => v.previews.keys(),
|
|
98
|
-
previewPose: (e) => v.previews.get(e) ?? null
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
enabled: () => !0
|
|
103
|
-
}, o);
|
|
104
|
-
//#endregion
|
|
105
|
-
export { d as cloneAction };
|
|
106
|
-
|
|
107
|
-
//# sourceMappingURL=clone.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"clone.js","names":["cloneAction","inPlane","selection","ctx","scene","applyOps","ids","frame","scenePoseFrame","originPoses","descriptor","poseDescriptorOf","id","node","toEdited","invertPlane","planeOf","carryPose","scratch","landed","origin","moved","translatePoseViaDescriptor","dx","dy","moveCtx","reason","ops","originNode","newPose","freshNodeId","createInsertOp","defaultCommitAdapter","selectionLayer"],"sources":["../../../../src/interactions/actions/defaults/clone.ts"],"sourcesContent":["/**\n * `cloneAction` — ongoing Action descriptor for alt-drag clone.\n *\n * ## Status: REAL (scene-direct, no overlay)\n *\n * Implements the core clone-by-drag logic via insert ops committed through\n * `scene.applyBatch`:\n * - `start`: validates selection + scene; captures origin poses for all\n * selected nodes. The alt-modifier check that activates cloning in\n * `useClone` (via `CloneBehavior.activates`) is intentionally NOT applied\n * here — the descriptor fires when the dispatcher routes to it; modifier\n * discrimination is a dispatcher concern (Phase 12 TODO for alt-gating).\n * - `onMove`: tracks current drag delta in scratch (no scene writes).\n * - `onEnd('commit')`: emits one insert op per selected node (translated\n * pose) and commits them as a single batch — via the consumer `applyOps`\n * hook when present, else `scene.applyBatch(ops, 'Clone', ...)`. One\n * undo entry for the whole batch.\n * - `onEnd('cancel')`: no-op (scene never mutated during drag).\n *\n * ## What this does NOT wire (vs `useClone`)\n *\n * - Modifier gate: `useClone` only activates when `CloneBehavior.activates(mods)`\n * returns true (typically alt-held). The descriptor lacks that gate — it runs\n * whenever the dispatcher routes `clone`. Proper alt-gating requires a modifier-\n * discriminant in the dispatcher (Phase 12 TODO).\n * - Overlay: `useClone` renders a ghost via `setOverlay / clearOverlay`. The\n * descriptor has no overlay surface (deferred to Phase 7 overlay system).\n * - `expandIds`: group expansion is omitted; only leaf poses are cloned.\n * - Custom `CloneBehavior.onEnd` ops (e.g. `cloneByAltDrag`): the descriptor\n * uses a simpler `scene.add` path that does not delegate to behavior `onEnd`.\n * Behavior-pipeline cloning waits for a later phase.\n *\n * ## Pose generics\n *\n * Poses are translated through the `poseDescriptor` dep, as `moveAction` does.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { Node, Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { freshNodeId } from './freshNodeId';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport { carryPose, invertPlane, inPlane, planeOf, selectionLayer } from '../planeInput';\n\n// ---------------------------------------------------------------------------\n// Internal scratch\n// ---------------------------------------------------------------------------\n\ninterface CloneScratch {\n ids: NodeId[];\n scene: Scene<unknown, string, unknown>;\n descriptor: PoseDescriptor<unknown>;\n /** World reads and local writes over the scene's composition strategy. */\n frame: PoseFrame<unknown>;\n /** Origin poses captured at drag start, in world — the frame the drag\n * delta is expressed in, and the plane the edit is measured in. The copy\n * keeps its source's parent and layer, so each translated result is\n * carried back to that layer's plane and stored in that same frame. */\n originPoses: Map<NodeId, unknown>;\n /** The view the invocation started with, read for `planeOf`. */\n view: unknown;\n /** Running drag delta — updated each onMove, applied once at commit. */\n currentDelta: { dx: number; dy: number };\n /** Preview poses keyed by ORIGINAL node id (the clone targets don't have\n * scene ids yet; the preview-ghost layer paints the originals' silhouette\n * at the translated pose — original stays visible at its committed home,\n * ghost appears at the drag target). */\n previews: Map<NodeId, unknown>;\n /** Optional consumer commit hook captured at gesture start. When present,\n * the insert ops route through it (consumer history) instead of\n * `scene.applyBatch`. Undefined → fall back to `scene.applyBatch`. */\n applyOps?: (ops: Op[], label: string) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Static descriptor for the `clone` Action.\n *\n * Requires dep-schema entries: `selection`, `scene`.\n *\n * Clones selected nodes into new scene nodes translated by the drag delta.\n * Commits insert ops via `scene.applyBatch(ops, 'Clone', ...)` (or the\n * consumer `applyOps` hook) for a single undo entry.\n *\n * @see useClone — the React hook this descriptor partially mirrors.\n */\nexport const cloneAction: Action & { requires: string[] } = inPlane({\n id: 'clone',\n label: 'Clone',\n // No default binding: a bare `{ kind: 'drag' }` would clone a non-empty\n // selection on any drag no tool claimed. Alt-drag on a body binds it\n // (`selectionMoveBindings`, the `move` preset).\n // The platform's duplicate cursor, and the whole reason this field is\n // modifier-aware: the select tool binds clone behind `mods: { alt: true }`,\n // so the pump predicts it — and shows this — only while Alt is down.\n cursor: 'copy',\n activeCursor: 'copy',\n eligible: { capability: ['edits-page', 'creates-selection'] },\n requires: ['selection', 'scene', 'applyOps', 'poseDescriptor', 'poseComposition'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\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 // Capture origin poses once at drag start.\n const frame = scenePoseFrame(scene, ctx.deps.poseComposition);\n const originPoses = new Map<NodeId, unknown>();\n const descriptor = poseDescriptorOf(ctx.deps.poseDescriptor);\n for (const id of ids) {\n const node = scene.get(id);\n if (node === undefined) continue;\n const toEdited = invertPlane(planeOf(ctx.deps.view, node.layer));\n originPoses.set(id, carryPose(descriptor, frame.world(id), toEdited));\n }\n\n if (originPoses.size === 0) return {};\n\n const scratch: CloneScratch = {\n ids,\n scene,\n descriptor,\n frame,\n originPoses,\n view: ctx.deps.view,\n currentDelta: { dx: 0, dy: 0 },\n previews: new Map<NodeId, unknown>(),\n applyOps,\n };\n\n /** Where the copy of `id` lands for a drag of `(dx, dy)`, as stored. */\n const landed = (id: NodeId, dx: number, dy: number): unknown => {\n const origin = scratch.originPoses.get(id);\n const node = scratch.scene.get(id);\n if (origin === undefined || !node) return undefined;\n const moved = translatePoseViaDescriptor(origin, dx, dy, scratch.descriptor);\n return scratch.frame.local(id, carryPose(scratch.descriptor, moved, planeOf(scratch.view, node.layer)));\n };\n\n return {\n kind: 'clone',\n // Clone: source stays visible at its committed pose; the ghost\n // (rendered via previewIds/previewPose below) appears at the\n // drag target. Opt out of the default \"hide source\" behavior\n // move/resize/rotate use.\n previewHidesSource: false,\n onMove(moveCtx: InvocationCtx): void {\n if (!moveCtx.drag) return;\n scratch.currentDelta = {\n dx: moveCtx.drag.delta.x,\n dy: moveCtx.drag.delta.y,\n };\n // Preview: paint each original's silhouette at the translated pose.\n // The original stays at its committed location (we don't hide it);\n // the ghost overlay shows where the new copy will land on commit.\n scratch.previews.clear();\n const { dx, dy } = scratch.currentDelta;\n if (dx === 0 && dy === 0) return;\n for (const id of scratch.originPoses.keys()) scratch.previews.set(id, landed(id, dx, dy)!);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') {\n scratch.previews.clear();\n return;\n }\n const { dx, dy } = scratch.currentDelta;\n // Zero-delta drag — no clone.\n if (dx === 0 && dy === 0) {\n scratch.previews.clear();\n return;\n }\n\n // Build one insert op per clone target — same nodes/values the old\n // direct `scene.add` loop produced (kind/layer/data/parent preserved,\n // pose translated by the drag delta), then route the batch through the\n // consumer `applyOps` hook when present (so an app with its own history\n // captures the clone as a single undo entry); otherwise commit straight\n // to the scene's own history. One applyOps / applyBatch call =\n // one undo entry, matching the prior single `scene.batch('Clone', …)`.\n const ops: Op[] = [];\n for (const id of scratch.ids) {\n const originNode = scratch.scene.get(id);\n const newPose = landed(id, dx, dy);\n if (newPose === undefined || !originNode) continue;\n // The old `scene.add` (no explicit id) minted a random id; we\n // pre-generate one so the insert op carries a full node. Id value\n // was never observable, so behavior is preserved.\n const node = {\n id: freshNodeId(),\n kind: originNode.kind,\n layer: originNode.layer,\n pose: newPose,\n data: originNode.data,\n parent: originNode.parent ?? null,\n } as Node<unknown, string, unknown>;\n ops.push(createInsertOp<Node<unknown, string, unknown>>({ node, label: 'Clone' }));\n }\n if (ops.length > 0) {\n if (scratch.applyOps) scratch.applyOps(ops, 'Clone');\n else scratch.scene.applyBatch(ops, 'Clone', defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n }\n scratch.previews.clear();\n },\n previewIds: () => scratch.previews.keys(),\n previewPose: (id: string) => scratch.previews.get(id as NodeId) ?? null,\n };\n },\n },\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":";;;;;;;;AA+FA,IAAaA,IAA+CC,EAAQ;CAClE,IAAI;CACJ,OAAO;CAOP,QAAQ;CACR,cAAc;CACd,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAC5D,UAAU;EAAC;EAAa;EAAS;EAAY;EAAkB;CAAiB;CAChF,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAWF,EAAI,KAAK;GAE1B,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO,CAAC;GAElC,IAAME,IAAMJ,EAAU,IAAI;GAC1B,IAAII,EAAI,WAAW,GAAG,OAAO,CAAC;GAG9B,IAAMC,IAAQC,EAAeJ,GAAOD,EAAI,KAAK,eAAe,GACtDM,oBAAc,IAAI,IAAqB,GACvCC,IAAaC,EAAiBR,EAAI,KAAK,cAAc;GAC3D,KAAK,IAAMS,KAAMN,GAAK;IACpB,IAAMO,IAAOT,EAAM,IAAIQ,CAAE;IACzB,IAAIC,MAAS,KAAA,GAAW;IACxB,IAAMC,IAAWC,EAAYC,EAAQb,EAAI,KAAK,MAAMU,EAAK,KAAK,CAAC;IAC/D,EAAY,IAAID,GAAIK,EAAUP,GAAYH,EAAM,MAAMK,CAAE,GAAGE,CAAQ,CAAC;GACtE;GAEA,IAAIL,EAAY,SAAS,GAAG,OAAO,CAAC;GAEpC,IAAMS,IAAwB;IAC5B;IACA;IACA;IACA;IACA;IACA,MAAMf,EAAI,KAAK;IACf,cAAc;KAAE,IAAI;KAAG,IAAI;IAAE;IAC7B,0BAAU,IAAI,IAAqB;IACnC;GACF,GAGMgB,KAAU,GAAY,GAAY,MAAwB;IAC9D,IAAMC,IAASF,EAAQ,YAAY,IAAIN,CAAE,GACnCC,IAAOK,EAAQ,MAAM,IAAIN,CAAE;IACjC,IAAIQ,MAAW,KAAA,KAAa,CAACP,GAAM;IACnC,IAAMQ,IAAQC,EAA2BF,GAAQG,GAAIC,GAAIN,EAAQ,UAAU;IAC3E,OAAOA,EAAQ,MAAM,MAAMN,GAAIK,EAAUC,EAAQ,YAAYG,GAAOL,EAAQE,EAAQ,MAAML,EAAK,KAAK,CAAC,CAAC;GACxG;GAEA,OAAO;IACL,MAAM;IAKN,oBAAoB;IACpB,OAAO,GAA8B;KACnC,IAAI,CAACY,EAAQ,MAAM;KAQnB,AAPA,EAAQ,eAAe;MACrB,IAAIA,EAAQ,KAAK,MAAM;MACvB,IAAIA,EAAQ,KAAK,MAAM;KACzB,GAIAP,EAAQ,SAAS,MAAM;KACvB,IAAM,EAAE,OAAI,UAAOA,EAAQ;KAC3B,IAAIK,MAAO,KAAKC,MAAO,GACvB,KAAK,IAAMZ,KAAMM,EAAQ,YAAY,KAAK,GAAG,EAAQ,SAAS,IAAIN,GAAIO,EAAOP,GAAIW,GAAIC,CAAE,CAAE;IAC3F;IACA,MAAM,GAAwB,GAAmC;KAC/D,IAAIE,MAAW,UAAU;MACvB,EAAQ,SAAS,MAAM;MACvB;KACF;KACA,IAAM,EAAE,OAAI,UAAOR,EAAQ;KAE3B,IAAIK,MAAO,KAAKC,MAAO,GAAG;MACxB,EAAQ,SAAS,MAAM;MACvB;KACF;KASA,IAAMG,IAAY,CAAC;KACnB,KAAK,IAAMf,KAAMM,EAAQ,KAAK;MAC5B,IAAMU,IAAaV,EAAQ,MAAM,IAAIN,CAAE,GACjCiB,IAAUV,EAAOP,GAAIW,GAAIC,CAAE;MACjC,IAAIK,MAAY,KAAA,KAAa,CAACD,GAAY;MAI1C,IAAMf,IAAO;OACX,IAAIiB,EAAY;OAChB,MAAMF,EAAW;OACjB,OAAOA,EAAW;OAClB,MAAMC;OACN,MAAMD,EAAW;OACjB,QAAQA,EAAW,UAAU;MAC/B;MACA,EAAI,KAAKG,EAA+C;OAAE;OAAM,OAAO;MAAQ,CAAC,CAAC;KACnF;KAKA,AAJIJ,EAAI,SAAS,MACXT,EAAQ,WAAUA,EAAQ,SAASS,GAAK,OAAO,IAC9CT,EAAQ,MAAM,WAAWS,GAAK,SAASK,EAAqBd,EAAQ,OAAOhB,EAAU,cAAc,CAAC,IAE3GgB,EAAQ,SAAS,MAAM;IACzB;IACA,kBAAkBA,EAAQ,SAAS,KAAK;IACxC,cAAc,MAAeA,EAAQ,SAAS,IAAIN,CAAY,KAAK;GACrE;EACF;CACF;CACA,eAAe;AACjB,GAAGqB,CAAc"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { loadTextOutlines as e } from "../../../features/text/textToPath.js";
|
|
2
|
-
import { applyCreateOutlines as t } from "../outlines/createOutlines.js";
|
|
3
|
-
import { CreateOutlinesIcon as n } from "./icons/outlineIcons.js";
|
|
4
|
-
import { ActionDisabledReason as r } from "@weasel-js/routing";
|
|
5
|
-
import { jsx as i } from "react/jsx-runtime";
|
|
6
|
-
//#region src/interactions/actions/defaults/createOutlines.tsx
|
|
7
|
-
async function a(n) {
|
|
8
|
-
let r = t(n);
|
|
9
|
-
if (r.kind === "failed" && r.error.reason === "outlines-loading") {
|
|
10
|
-
let i = [...n.getSelection()].map((e) => n.getTextSource(e)).filter((e) => e !== void 0);
|
|
11
|
-
await Promise.all(i.map((t) => e(t.data))), r = t(n);
|
|
12
|
-
}
|
|
13
|
-
return r.kind === "failed" && console.warn(`[createOutlines] ${r.error.message}`), r;
|
|
14
|
-
}
|
|
15
|
-
var o = {
|
|
16
|
-
id: "createOutlines",
|
|
17
|
-
label: "Create Outlines",
|
|
18
|
-
icon: /* @__PURE__ */ i(n, {}),
|
|
19
|
-
group: "text",
|
|
20
|
-
defaultBinding: {
|
|
21
|
-
kind: "key",
|
|
22
|
-
key: "o",
|
|
23
|
-
mods: {
|
|
24
|
-
mod: !0,
|
|
25
|
-
shift: !0
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
eligible: { capability: "creates-shapes" },
|
|
29
|
-
requires: ["selection", "createOutlinesAdapter"],
|
|
30
|
-
invoker: {
|
|
31
|
-
timing: "immediate",
|
|
32
|
-
run: (e) => {
|
|
33
|
-
let t = e.createOutlinesAdapter;
|
|
34
|
-
t && a(t);
|
|
35
|
-
}
|
|
36
|
-
},
|
|
37
|
-
enabled: (e) => {
|
|
38
|
-
let t = e?.selection?.get() ?? [];
|
|
39
|
-
if (t.length === 0) return r.SelectionRequired;
|
|
40
|
-
let n = e?.createOutlinesAdapter;
|
|
41
|
-
return n && t.some((e) => n.getTextSource(e) !== void 0) ? !0 : r.NotApplicable;
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
//#endregion
|
|
45
|
-
export { o as createOutlinesAction, a as runCreateOutlines };
|
|
46
|
-
|
|
47
|
-
//# sourceMappingURL=createOutlines.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"createOutlines.js","names":["runCreateOutlines","result","applyCreateOutlines","adapter","texts","id","t","loadTextOutlines","createOutlinesAction","CreateOutlinesIcon","deps","ids","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createOutlines.tsx"],"sourcesContent":["import type { Action, ImmediateInvoker } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport { loadTextOutlines, type TextNodeSource } from 'features/text/textToPath';\nimport {\n applyCreateOutlines, type CreateOutlinesAdapter, type CreateOutlinesResult,\n} from '../outlines/createOutlines';\nimport { CreateOutlinesIcon } from './icons/outlineIcons';\n\n/**\n * {@link applyCreateOutlines}, waiting first for any face whose outlines are\n * registered but not yet loaded — a face is parsed on first use, so the first\n * conversion in a session would otherwise fail. Warns with the reason when\n * the selection still cannot be converted.\n */\nexport async function runCreateOutlines(adapter: CreateOutlinesAdapter): Promise<CreateOutlinesResult> {\n let result = applyCreateOutlines(adapter);\n if (result.kind === 'failed' && result.error.reason === 'outlines-loading') {\n const texts = [...adapter.getSelection()]\n .map((id) => adapter.getTextSource(id as NodeId))\n .filter((t): t is TextNodeSource => t !== undefined);\n await Promise.all(texts.map((t) => loadTextOutlines(t.data)));\n result = applyCreateOutlines(adapter);\n }\n if (result.kind === 'failed') console.warn(`[createOutlines] ${result.error.message}`);\n return result;\n}\n\n/**\n * @experimental Static descriptor for Create Outlines: replace the selected\n * text nodes with path nodes carrying their glyph outlines. Reads the\n * `createOutlinesAdapter` dep, published with `useCreateOutlinesAdapter`.\n */\nexport const createOutlinesAction: Action = {\n id: 'createOutlines',\n label: 'Create Outlines',\n icon: <CreateOutlinesIcon />,\n group: 'text',\n defaultBinding: { kind: 'key', key: 'o', mods: { mod: true, shift: true } },\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'createOutlinesAdapter'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const adapter = deps.createOutlinesAdapter;\n if (adapter) void runCreateOutlines(adapter);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => {\n const ids = deps?.selection?.get() ?? [];\n if (ids.length === 0) return ActionDisabledReason.SelectionRequired;\n const adapter = deps?.createOutlinesAdapter;\n return adapter && ids.some((id) => adapter.getTextSource(id) !== undefined)\n ? true\n : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":";;;;;;AAeA,eAAsBA,EAAkB,GAA+D;CACrG,IAAIC,IAASC,EAAoBC,CAAO;CACxC,IAAIF,EAAO,SAAS,YAAYA,EAAO,MAAM,WAAW,oBAAoB;EAC1E,IAAMG,IAAQ,CAAC,GAAGD,EAAQ,aAAa,CAAC,CAAC,CACtC,KAAK,MAAOA,EAAQ,cAAcE,CAAY,CAAC,CAAC,CAChD,QAAQ,MAA2BC,MAAM,KAAA,CAAS;EAErD,AADA,MAAM,QAAQ,IAAIF,EAAM,KAAK,MAAMG,EAAiB,EAAE,IAAI,CAAC,CAAC,GAC5D,IAASL,EAAoBC,CAAO;CACtC;CAEA,OADIF,EAAO,SAAS,YAAU,QAAQ,KAAK,oBAAoBA,EAAO,MAAM,SAAS,GAC9EA;AACT;AAOA,IAAaO,IAA+B;CAC1C,IAAI;CACJ,OAAO;CACP,MAAM,kBAACC,GAAD,CAAqB,CAAA;CAC3B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM;GAAE,KAAK;GAAM,OAAO;EAAK;CAAE;CAC1E,UAAU,EAAE,YAAY,iBAAiB;CACzC,UAAU,CAAC,aAAa,uBAAuB;CAC/C,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMN,IAAUO,EAAK;GACrB,AAAIP,KAASH,EAAuBG,CAAO;EAC7C;CACF;CACA,UAAU,MAAS;EACjB,IAAMQ,IAAMD,GAAM,WAAW,IAAI,KAAK,CAAC;EACvC,IAAIC,EAAI,WAAW,GAAG,OAAOC,EAAqB;EAClD,IAAMT,IAAUO,GAAM;EACtB,OAAOP,KAAWQ,EAAI,MAAM,MAAOR,EAAQ,cAAcE,CAAE,MAAM,KAAA,CAAS,IACtE,KACAO,EAAqB;CAC3B;AACF"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { translatePoseViaDescriptor as e, visualBoundsViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
|
|
2
|
-
import { poseDescriptorOf as n } from "../poseDescriptorDep.js";
|
|
3
|
-
import { scenePoseFrame as r } from "../poseFrame.js";
|
|
4
|
-
import { planDistribute as i } from "../distribute/plan.js";
|
|
5
|
-
import { DistributeHorizontalIcon as a, DistributeVerticalIcon as o } from "./icons/distributeIcons.js";
|
|
6
|
-
import { ActionDisabledReason as s } from "@weasel-js/routing";
|
|
7
|
-
import { jsx as c } from "react/jsx-runtime";
|
|
8
|
-
//#region src/interactions/actions/defaults/distribute.tsx
|
|
9
|
-
var l = {
|
|
10
|
-
x: "distribute.horizontal",
|
|
11
|
-
y: "distribute.vertical"
|
|
12
|
-
}, u = {
|
|
13
|
-
x: "Distribute Horizontally",
|
|
14
|
-
y: "Distribute Vertically"
|
|
15
|
-
}, d = {
|
|
16
|
-
x: /* @__PURE__ */ c(a, {}),
|
|
17
|
-
y: /* @__PURE__ */ c(o, {})
|
|
18
|
-
};
|
|
19
|
-
function f(n, a, o, s, c, l) {
|
|
20
|
-
let u = n.get();
|
|
21
|
-
if (u.length < 3) return;
|
|
22
|
-
let d = r(a, l), f = u.map((e) => {
|
|
23
|
-
let n = d.world(e);
|
|
24
|
-
return {
|
|
25
|
-
id: e,
|
|
26
|
-
pose: n,
|
|
27
|
-
b: t(n, c)
|
|
28
|
-
};
|
|
29
|
-
}), p = i(f.map((e) => e.b), o, s);
|
|
30
|
-
a.batch("Distribute", () => {
|
|
31
|
-
for (let t = 0; t < f.length; t++) {
|
|
32
|
-
let n = f[t], r = p[t] - (o === "x" ? n.b.x : n.b.y);
|
|
33
|
-
if (r === 0) continue;
|
|
34
|
-
let i = o === "x" ? r : 0, s = o === "y" ? r : 0, l = e(n.pose, i, s, c);
|
|
35
|
-
a.setPose(n.id, d.local(n.id, l));
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
function p(e) {
|
|
40
|
-
return {
|
|
41
|
-
id: l[e],
|
|
42
|
-
label: u[e],
|
|
43
|
-
icon: d[e],
|
|
44
|
-
group: "distribute",
|
|
45
|
-
eligible: { capability: "transforms-selection" },
|
|
46
|
-
requires: [
|
|
47
|
-
"selection",
|
|
48
|
-
"scene",
|
|
49
|
-
"poseDescriptor",
|
|
50
|
-
"poseComposition"
|
|
51
|
-
],
|
|
52
|
-
invoker: {
|
|
53
|
-
timing: "immediate",
|
|
54
|
-
run: (t, r) => {
|
|
55
|
-
let i = t.selection, a = t.scene;
|
|
56
|
-
i && a && f(i, a, e, r?.mode ?? "centers", n(t.poseDescriptor), t.poseComposition);
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
enabled: (e) => ((e?.selection)?.get().length ?? 0) >= 3 || s.SelectionRequired
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
var m = p("x"), h = p("y");
|
|
63
|
-
//#endregion
|
|
64
|
-
export { m as distributeHorizontalAction, h as distributeVerticalAction };
|
|
65
|
-
|
|
66
|
-
//# sourceMappingURL=distribute.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"distribute.js","names":["ID_FOR","LABEL_FOR","ICON_FOR","DistributeHorizontalIcon","DistributeVerticalIcon","distributeSelection","ids","selection","frame","scenePoseFrame","scene","poseComposition","items","pose","id","visualBoundsViaDescriptor","geom","targets","planDistribute","it","axis","mode","i","delta","dx","dy","to","translatePoseViaDescriptor","makeDistributeAction","deps","params","poseDescriptorOf","ActionDisabledReason","distributeHorizontalAction","distributeVerticalAction"],"sources":["../../../../src/interactions/actions/defaults/distribute.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { Scene } from 'core/scene/types';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, visualBoundsViaDescriptor } from '../align/align';\nimport type { DistributeAxis, DistributeMode } from '../distribute/distribute';\nimport { planDistribute } from '../distribute/plan';\nimport { scenePoseFrame } from '../poseFrame';\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\nimport { DistributeHorizontalIcon, DistributeVerticalIcon } from './icons/distributeIcons';\n\nconst ID_FOR: Record<DistributeAxis, string> = { x: 'distribute.horizontal', y: 'distribute.vertical' };\nconst LABEL_FOR: Record<DistributeAxis, string> = { x: 'Distribute Horizontally', y: 'Distribute Vertically' };\nconst ICON_FOR: Record<DistributeAxis, ReactNode> = {\n x: <DistributeHorizontalIcon />,\n y: <DistributeVerticalIcon />,\n};\n\n// ---------------------------------------------------------------------------\n// Shared helper for descriptor invokers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply a distribute operation to the current selection via the Scene API.\n * Reads poses through the `poseDescriptor` dep; `mode` comes from the\n * binding's `params.mode`.\n *\n * The span being divided is a world span, so the bounds are read and\n * translated in world and each result is stored back in its own parent's\n * frame.\n */\nfunction distributeSelection(\n selection: SelectionApi,\n scene: Scene<unknown, string, unknown>,\n axis: DistributeAxis,\n mode: DistributeMode,\n geom: PoseDescriptor<unknown>,\n poseComposition: unknown,\n): void {\n const ids = selection.get();\n if (ids.length < 3) return;\n const frame = scenePoseFrame(scene, poseComposition);\n\n const items = ids.map((id) => {\n const pose = frame.world(id);\n return { id, pose, b: visualBoundsViaDescriptor(pose, geom) };\n });\n const targets = planDistribute(items.map((it) => it.b), axis, mode);\n\n scene.batch('Distribute', () => {\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const delta = targets[i] - (axis === 'x' ? it.b.x : it.b.y);\n if (delta === 0) continue;\n const dx = axis === 'x' ? delta : 0;\n const dy = axis === 'y' ? delta : 0;\n const to = translatePoseViaDescriptor(it.pose, dx, dy, geom);\n scene.setPose(it.id, frame.local(it.id, to));\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Static descriptors\n// ---------------------------------------------------------------------------\n\nfunction makeDistributeAction(axis: DistributeAxis): Action {\n return {\n id: ID_FOR[axis],\n label: LABEL_FOR[axis],\n icon: ICON_FOR[axis],\n group: 'distribute',\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'poseDescriptor', 'poseComposition'],\n // No default keybindings. Wire bindings explicitly via the actions registry.\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const selection = deps.selection;\n const scene = deps.scene;\n if (!selection || !scene) return;\n const mode = (params?.mode as DistributeMode | undefined) ?? 'centers';\n distributeSelection(selection, scene, axis, mode, poseDescriptorOf(deps.poseDescriptor), deps.poseComposition);\n },\n } satisfies ImmediateInvoker,\n // Deps-aware, matching `distributeSelection`'s own `ids.length < 3` guard:\n // a constant disabled reason greys the entry out forever (see\n // `requiresSelection`).\n enabled: (deps) => {\n const selection = deps?.selection;\n const count = selection?.get().length ?? 0;\n return count >= 3 ? true : ActionDisabledReason.SelectionRequired;\n },\n };\n}\n\n/** @experimental Static descriptor for distribute-horizontal. */\nexport const distributeHorizontalAction = makeDistributeAction('x');\n/** @experimental Static descriptor for distribute-vertical. */\nexport const distributeVerticalAction = makeDistributeAction('y');\n\n"],"mappings":";;;;;;;;AAcA,IAAMA,IAAyC;CAAE,GAAG;CAAyB,GAAG;AAAsB,GAChGC,IAA4C;CAAE,GAAG;CAA2B,GAAG;AAAwB,GACvGC,IAA8C;CAClD,GAAG,kBAACC,GAAD,CAA2B,CAAA;CAC9B,GAAG,kBAACC,GAAD,CAAyB,CAAA;AAC9B;AAeA,SAASC,EACP,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAMC,EAAU,IAAI;CAC1B,IAAID,EAAI,SAAS,GAAG;CACpB,IAAME,IAAQC,EAAeC,GAAOC,CAAe,GAE7CC,IAAQN,EAAI,KAAK,MAAO;EAC5B,IAAMO,IAAOL,EAAM,MAAMM,CAAE;EAC3B,OAAO;GAAE;GAAI;GAAM,GAAGC,EAA0BF,GAAMG,CAAI;EAAE;CAC9D,CAAC,GACKC,IAAUC,EAAeN,EAAM,KAAK,MAAOO,EAAG,CAAC,GAAGC,GAAMC,CAAI;CAElE,EAAM,MAAM,oBAAoB;EAC9B,KAAK,IAAIC,IAAI,GAAGA,IAAIV,EAAM,QAAQ,KAAK;GACrC,IAAMO,IAAKP,EAAMU,IACXC,IAAQN,EAAQK,MAAMF,MAAS,MAAMD,EAAG,EAAE,IAAIA,EAAG,EAAE;GACzD,IAAII,MAAU,GAAG;GACjB,IAAMC,IAAKJ,MAAS,MAAMG,IAAQ,GAC5BE,IAAKL,MAAS,MAAMG,IAAQ,GAC5BG,IAAKC,EAA2BR,EAAG,MAAMK,GAAIC,GAAIT,CAAI;GAC3D,EAAM,QAAQG,EAAG,IAAIX,EAAM,MAAMW,EAAG,IAAIO,CAAE,CAAC;EAC7C;CACF,CAAC;AACH;AAMA,SAASE,EAAqB,GAA8B;CAC1D,OAAO;EACL,IAAI5B,EAAOoB;EACX,OAAOnB,EAAUmB;EACjB,MAAMlB,EAASkB;EACf,OAAO;EACP,UAAU,EAAE,YAAY,uBAAuB;EAC/C,UAAU;GAAC;GAAa;GAAS;GAAkB;EAAiB;EAEpE,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMb,IAAYsB,EAAK,WACjBnB,IAAQmB,EAAK;IACnB,AAAKtB,KAAcG,KAEnBL,EAAoBE,GAAWG,GAAOU,GADxBU,GAAQ,QAAuC,WACXC,EAAiBF,EAAK,cAAc,GAAGA,EAAK,eAAe;GAC/G;EACF;EAIA,UAAU,QACUA,GAAM,UAAA,EACC,IAAI,CAAC,CAAC,UAAU,MACzB,KAAWG,EAAqB;CAEpD;AACF;AAGA,IAAaC,IAA6BL,EAAqB,GAAG,GAErDM,IAA6BN,EAAqB,GAAG"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"editAnchors.js","names":["parseAnchorAffordance","m","kind","selectionAfterAnchorPress","additive","next","current","anchorIndex","editAnchorsAction","inPlane","isAnchorOrControl","dep","ctx","affordance","anchorInfo","worldPath","editingId","storageKind","decoded","pathToAnchors","origin","anchorAt","dragging","nodeShape","originRectPose","originData","scratch","active","dx","moveCtx","dy","editAnchorSet","flat","set","side","moveHandleTo","reason","id","worldEditToStorage","editingLayer"],"sources":["../../../../src/interactions/actions/defaults/editAnchors.ts"],"sourcesContent":["/**\n * `editAnchorsAction` — ongoing Action descriptor for editing polygon anchors.\n *\n * Owns the whole press-on-an-anchor gesture, because pressing and dragging\n * an anchor are two outcomes of one interaction rather than two\n * interactions:\n *\n * - **Press** selects. Bare press replaces the anchor selection; Shift\n * toggles the pressed anchor in or out of it. Pressing an anchor that\n * is already part of a multi-anchor selection leaves the selection\n * alone, so you can grab a set and move it.\n * - **Drag** then moves whatever the press left selected — one anchor,\n * or every selected anchor together.\n * - **Dragging a control handle** moves just that handle, mirroring the\n * opposite one while the anchor is smooth. Alt breaks the mirror.\n *\n * Selection lives on the `editAnchors` dep (flat anchor indices) rather\n * than in this handle's scratch, because the keyboard actions\n * (`nudgeAnchors`, `deleteAnchors`) and the overlay all need to read it\n * between gestures.\n *\n * ## Wiring\n *\n * The descriptor is operational when the consumer wires:\n * 1. `buildAffordanceAt` with a `getAnchorState` thunk so the dispatcher\n * classifies anchor/control-handle hits as `anchor:N`, `controlIn:N`,\n * or `controlOut:N` affordances on pointerdown.\n * 2. The `editAnchors` dep in the DepSchema.\n *\n * When `ctx.drag.affordance` is absent or is not an anchor/control kind,\n * `start` returns `{}` (no-op) so other bindings can handle the drag.\n *\n * @see buildAffordanceAt — the classifier that produces anchor affordances.\n * @see anchorEdits — the pure geometry these handlers drive.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport { isAnchorOrControl } from '@weasel-js/routing';\nimport {\n anchorAt,\n editAnchorSet,\n moveHandleTo,\n translateAnchorBy,\n type AnchorSet,\n} from 'features/paths/anchorEdits';\nimport { pathToAnchors } from 'features/paths/anchors';\nimport { worldEditToStorage } from 'features/paths/pathInWorld';\n// Commit goes through dep.applyEdit (routes setPose or setPose+update\n// based on the node's path-storage shape); no direct op or dispatch\n// helpers needed here.\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { inPlane, editingLayer } from '../planeInput';\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Parse an anchor affordance kind string into the anchor it names.\n * Returns `null` when the affordance is not an anchor kind.\n *\n * Format: `'anchor:N'` | `'controlIn:N'` | `'controlOut:N'`, where N is the\n * flat anchor index — the same numbering `enumerateAnchors` produces and\n * `anchorEdits` addresses by.\n */\nfunction parseAnchorAffordance(\n kind: string,\n): { anchorIndex: number; part: 'anchor' | 'controlIn' | 'controlOut' } | null {\n const m = kind.match(/^(anchor|controlIn|controlOut):(\\d+)$/);\n if (!m) return null;\n return {\n anchorIndex: parseInt(m[2], 10),\n part: m[1] as 'anchor' | 'controlIn' | 'controlOut',\n };\n}\n\n/**\n * Resolve what a press on `anchorIndex` should leave selected.\n *\n * Shift toggles. A bare press on an anchor that's already part of the\n * selection keeps the selection intact (so the drag moves the whole set);\n * a bare press anywhere else collapses to just that anchor.\n */\nexport function selectionAfterAnchorPress(\n current: ReadonlySet<number>,\n anchorIndex: number,\n additive: boolean,\n): Set<number> {\n if (additive) {\n const next = new Set(current);\n if (next.has(anchorIndex)) next.delete(anchorIndex);\n else next.add(anchorIndex);\n return next;\n }\n if (current.has(anchorIndex) && current.size > 1) return new Set(current);\n return new Set([anchorIndex]);\n}\n\n// ---------------------------------------------------------------------------\n// Internal scratch\n// ---------------------------------------------------------------------------\n\ninterface EditAnchorsScratch {\n dep: EditAnchorsDep;\n id: string;\n anchorIndex: number;\n /** `'anchor'` drags on-curve points (and their handles) by a delta.\n * `'controlIn'` / `'controlOut'` drag one control point to an absolute\n * world coord. */\n part: 'anchor' | 'controlIn' | 'controlOut';\n /** Anchors this drag moves — the pressed one, or the whole anchor\n * selection when the press landed inside it. Flat indices. */\n dragging: readonly number[];\n /** World position of the pressed anchor at drag start; the drag delta is\n * measured from here rather than accumulated per move, so the geometry\n * is always derived from `originPose` in one step. */\n anchorOrigin: { x: number; y: number };\n originPose: PolygonPath;\n currentPose: PolygonPath;\n /** Where the polygon lives on the node — drives which preview-ghost\n * axes the handle populates (`previewPose` only for pose-as-polygon,\n * `previewPose` + `previewData` for data.path). */\n storageKind: 'pose' | 'data';\n}\n\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * Static descriptor for the `editAnchors` Action.\n *\n * Requires dep-schema entries: `selection`, `editAnchors`.\n */\nexport const editAnchorsAction: Action & { requires: string[] } = inPlane({\n id: 'editAnchors',\n label: 'Edit Anchors',\n defaultBinding: {\n kind: 'drag',\n // Only matches drags whose pointerdown hit an anchor or control handle.\n // Ties moveAction's `selected-body` on specificity and registers after\n // it, so move declines these presses in `start`.\n target: { kindOf: isAnchorOrControl },\n },\n eligible: { capability: 'edits-anchors' },\n requires: ['selection', 'editAnchors'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const dep = ctx.deps.editAnchors;\n if (!dep) return {};\n\n const affordance = ctx.drag?.affordance;\n if (!affordance) {\n // No affordance hit → this drag doesn't target an anchor handle.\n // Let other bindings handle it (the handle returns {}, dispatcher moves on).\n return {};\n }\n\n const anchorInfo = parseAnchorAffordance(affordance.kind);\n if (!anchorInfo) {\n // Affordance is a non-anchor kind (e.g. resize handle, rotate handle).\n return {};\n }\n\n const { editingId } = dep;\n // World-coord polygon. For pose-as-polygon nodes this equals\n // node.pose; for data.path nodes it's pathInWorld-projected (translate +\n // rotation) so the anchor world coords match what the user clicked.\n const worldPath = dep.getEditablePath(editingId) as PolygonPath | undefined;\n if (!worldPath || worldPath.kind !== 'polygon') return {};\n const storageKind = dep.getStorageKind(editingId);\n if (storageKind !== 'pose' && storageKind !== 'data') return {};\n\n // Decode once to validate the affordance index against the actual\n // geometry and to read the press origin. A stale affordance (the\n // path changed between pointerdown and now) fails here rather than\n // silently editing whichever anchor now holds that index.\n const decoded = pathToAnchors(worldPath) as AnchorSet;\n const origin = anchorAt(decoded, anchorInfo.anchorIndex);\n if (!origin) return {};\n if (anchorInfo.part === 'controlIn' && !origin.inHandle) return {};\n if (anchorInfo.part === 'controlOut' && !origin.outHandle) return {};\n\n // --- Press semantics: selection updates immediately, before any move.\n let dragging: readonly number[] = [anchorInfo.anchorIndex];\n if (anchorInfo.part === 'anchor') {\n const next = selectionAfterAnchorPress(\n dep.selectedAnchors,\n anchorInfo.anchorIndex,\n ctx.modifiers.shift,\n );\n dep.setSelectedAnchors(next);\n // Shift-pressing an anchor OUT of the selection must not then drag\n // it; drag whatever the press left selected, intersected with the\n // pressed anchor's membership.\n dragging = next.has(anchorInfo.anchorIndex)\n ? [...next]\n : [];\n }\n\n // For data.path nodes, we also need the original rect pose + data\n // so previewPose / previewData can be derived from currentPose.\n // Captured at start so onMove doesn't re-read the scene.\n const nodeShape = storageKind === 'data' ? dep.getNodeShape(editingId) : null;\n const originRectPose =\n nodeShape ? (nodeShape.pose as { x: number; y: number; width: number; height: number }) : undefined;\n const originData = nodeShape ? (nodeShape.data as object) : undefined;\n\n const scratch: EditAnchorsScratch = {\n dep,\n id: editingId,\n anchorIndex: anchorInfo.anchorIndex,\n part: anchorInfo.part,\n dragging,\n anchorOrigin: { x: origin.x, y: origin.y },\n originPose: worldPath,\n currentPose: worldPath,\n storageKind,\n };\n\n let active = false;\n\n return {\n kind: 'edit-anchors',\n onMove(moveCtx: InvocationCtx): void {\n if (scratch.part === 'anchor') {\n if (scratch.dragging.length === 0) return;\n const dx = moveCtx.world.x - scratch.anchorOrigin.x;\n const dy = moveCtx.world.y - scratch.anchorOrigin.y;\n const next = editAnchorSet(scratch.originPose, (set) => {\n for (const flat of scratch.dragging) translateAnchorBy(set, flat, dx, dy);\n });\n if (next) scratch.currentPose = next;\n } else {\n const side = scratch.part === 'controlIn' ? 'in' : 'out';\n const next = editAnchorSet(scratch.originPose, (set) =>\n moveHandleTo(\n set,\n scratch.anchorIndex,\n side,\n moveCtx.world.x,\n moveCtx.world.y,\n // Alt breaks the smooth mirror for this drag — read live so\n // the user can press or release Alt mid-drag.\n moveCtx.modifiers.alt,\n ),\n );\n if (next) scratch.currentPose = next;\n }\n active = true;\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n active = false;\n if (reason === 'cancel') return;\n if (scratch.originPose === scratch.currentPose) return;\n scratch.dep.applyEdit(scratch.id, scratch.currentPose, 'Edit anchors');\n },\n previewIds: () => (active ? [scratch.id] : null),\n previewPose: (id: string): unknown | null => {\n if (!active || id !== scratch.id) return null;\n if (scratch.storageKind === 'pose') {\n // Pose IS the polygon — preview pose is the polygon itself.\n return scratch.currentPose;\n }\n // data.path: invert the world edit the same way the commit does, so\n // the preview ghost (which re-applies pose.rotation via the render\n // wrap) matches the committed result — no double-rotation.\n if (!originRectPose) return null;\n return worldEditToStorage(originRectPose, scratch.currentPose).pose;\n },\n previewData: (id: string): unknown | null => {\n if (!active || id !== scratch.id) return null;\n if (scratch.storageKind !== 'data') return null;\n if (!originData) return null;\n // Stored path is the unrotated, origin-aligned contour; the render\n // invariant `pathInWorld(stored, pose) === world` holds.\n const { path } = worldEditToStorage(originRectPose!, scratch.currentPose);\n return { ...originData, path };\n },\n };\n },\n },\n enabled: () => true,\n}, editingLayer);\n"],"mappings":";;;;;;AAmEA,SAASA,EACP,GAC6E;CAC7E,IAAMC,IAAIC,EAAK,MAAM,uCAAuC;CAE5D,OADKD,IACE;EACL,aAAa,SAASA,EAAE,IAAI,EAAE;EAC9B,MAAMA,EAAE;CACV,IAJe;AAKjB;AASA,SAAgBE,EACd,GACA,GACA,GACa;CACb,IAAIC,GAAU;EACZ,IAAMC,IAAO,IAAI,IAAIC,CAAO;EAG5B,OAFID,EAAK,IAAIE,CAAW,IAAGF,EAAK,OAAOE,CAAW,IAC7CF,EAAK,IAAIE,CAAW,GAClBF;CACT;CAEA,OADIC,EAAQ,IAAIC,CAAW,KAAKD,EAAQ,OAAO,IAAU,IAAI,IAAIA,CAAO,oBACjE,IAAI,IAAI,CAACC,CAAW,CAAC;AAC9B;AAsCA,IAAaC,IAAqDC,EAAQ;CACxE,IAAI;CACJ,OAAO;CACP,gBAAgB;EACd,MAAM;EAIN,QAAQ,EAAE,QAAQC,EAAkB;CACtC;CACA,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,aAAa,aAAa;CACrC,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAMC,EAAI,KAAK;GACrB,IAAI,CAACD,GAAK,OAAO,CAAC;GAElB,IAAME,IAAaD,EAAI,MAAM;GAC7B,IAAI,CAACC,GAGH,OAAO,CAAC;GAGV,IAAMC,IAAad,EAAsBa,EAAW,IAAI;GACxD,IAAI,CAACC,GAEH,OAAO,CAAC;GAGV,IAAM,EAAE,iBAAcH,GAIhBI,IAAYJ,EAAI,gBAAgBK,CAAS;GAC/C,IAAI,CAACD,KAAaA,EAAU,SAAS,WAAW,OAAO,CAAC;GACxD,IAAME,IAAcN,EAAI,eAAeK,CAAS;GAChD,IAAIC,MAAgB,UAAUA,MAAgB,QAAQ,OAAO,CAAC;GAM9D,IAAMC,IAAUC,EAAcJ,CAAS,GACjCK,IAASC,EAASH,GAASJ,EAAW,WAAW;GAGvD,IAFI,CAACM,KACDN,EAAW,SAAS,eAAe,CAACM,EAAO,YAC3CN,EAAW,SAAS,gBAAgB,CAACM,EAAO,WAAW,OAAO,CAAC;GAGnE,IAAIE,IAA8B,CAACR,EAAW,WAAW;GACzD,IAAIA,EAAW,SAAS,UAAU;IAChC,IAAMT,IAAOF,EACXQ,EAAI,iBACJG,EAAW,aACXF,EAAI,UAAU,KAChB;IAKA,AAJAD,EAAI,mBAAmBN,CAAI,GAI3B,IAAWA,EAAK,IAAIS,EAAW,WAAW,IACtC,CAAC,GAAGT,CAAI,IACR,CAAC;GACP;GAKA,IAAMkB,IAAYN,MAAgB,SAASN,EAAI,aAAaK,CAAS,IAAI,MACnEQ,IACJD,IAAaA,EAAU,OAAmE,KAAA,GACtFE,IAAaF,IAAaA,EAAU,OAAkB,KAAA,GAEtDG,IAA8B;IAClC;IACA,IAAIV;IACJ,aAAaF,EAAW;IACxB,MAAMA,EAAW;IACjB;IACA,cAAc;KAAE,GAAGM,EAAO;KAAG,GAAGA,EAAO;IAAE;IACzC,YAAYL;IACZ,aAAaA;IACb;GACF,GAEIY,IAAS;GAEb,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KACnC,IAAID,EAAQ,SAAS,UAAU;MAC7B,IAAIA,EAAQ,SAAS,WAAW,GAAG;MACnC,IAAME,IAAKC,EAAQ,MAAM,IAAIH,EAAQ,aAAa,GAC5CI,IAAKD,EAAQ,MAAM,IAAIH,EAAQ,aAAa,GAC5CrB,IAAO0B,EAAcL,EAAQ,aAAa,MAAQ;OACtD,KAAK,IAAMM,KAAQN,EAAQ,UAAU,EAAkBO,GAAKD,GAAMJ,GAAIE,CAAE;MAC1E,CAAC;MACD,AAAIzB,MAAM,EAAQ,cAAcA;KAClC,OAAO;MACL,IAAM6B,IAAOR,EAAQ,SAAS,cAAc,OAAO,OAC7CrB,IAAO0B,EAAcL,EAAQ,aAAa,MAC9CS,EACEF,GACAP,EAAQ,aACRQ,GACAL,EAAQ,MAAM,GACdA,EAAQ,MAAM,GAGdA,EAAQ,UAAU,GACpB,CACF;MACA,AAAIxB,MAAM,EAAQ,cAAcA;KAClC;KACA,IAAS;IACX;IACA,MAAM,GAAwB,GAAmC;KAE/D,AADA,IAAS,IACL+B,MAAW,YACXV,EAAQ,eAAeA,EAAQ,eACnCA,EAAQ,IAAI,UAAUA,EAAQ,IAAIA,EAAQ,aAAa,cAAc;IACvE;IACA,kBAAmBC,IAAS,CAACD,EAAQ,EAAE,IAAI;IAC3C,cAAc,MACR,CAACC,KAAUU,MAAOX,EAAQ,KAAW,OACrCA,EAAQ,gBAAgB,SAEnBA,EAAQ,cAKZF,IACEc,EAAmBd,GAAgBE,EAAQ,WAAW,CAAC,CAAC,OADnC;IAG9B,cAAc,MAA+B;KAG3C,IAFI,CAACC,KAAUU,MAAOX,EAAQ,MAC1BA,EAAQ,gBAAgB,UACxB,CAACD,GAAY,OAAO;KAGxB,IAAM,EAAE,YAASa,EAAmBd,GAAiBE,EAAQ,WAAW;KACxE,OAAO;MAAE,GAAGD;MAAY;KAAK;IAC/B;GACF;EACF;CACF;CACA,eAAe;AACjB,GAAGc,CAAY"}
|