@weasel-js/core 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1006 -0
- package/README.md +28 -9
- package/dist/WeaselProvider.js +15 -0
- package/dist/WeaselProvider.js.map +1 -0
- package/dist/affordances/composeAffordanceLayer.js +224 -0
- package/dist/affordances/composeAffordanceLayer.js.map +1 -0
- package/dist/affordances/cornerResize.js +69 -0
- package/dist/affordances/cornerResize.js.map +1 -0
- package/dist/affordances/hitAffordanceRegions.js +138 -0
- package/dist/affordances/hitAffordanceRegions.js.map +1 -0
- package/dist/affordances/pathAnchors.js +66 -0
- package/dist/affordances/pathAnchors.js.map +1 -0
- package/dist/affordances/rotationHandle.js +103 -0
- package/dist/affordances/rotationHandle.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +118 -0
- package/dist/animation/behaviors/momentum.js.map +1 -0
- package/dist/animation/colorHelpers.js +135 -0
- package/dist/animation/colorHelpers.js.map +1 -0
- package/dist/animation/colorRegistry.js +37 -0
- package/dist/animation/colorRegistry.js.map +1 -0
- package/dist/animation/index.js +20 -0
- package/dist/animation/loop.js +62 -0
- package/dist/animation/loop.js.map +1 -0
- package/dist/animation/observe.js +23 -0
- package/dist/animation/observe.js.map +1 -0
- package/dist/animation/poseHelpers.js +50 -0
- package/dist/animation/poseHelpers.js.map +1 -0
- package/dist/animation/reflow.js +121 -0
- package/dist/animation/reflow.js.map +1 -0
- package/dist/animation/rig/bindRig.js +74 -0
- package/dist/animation/rig/bindRig.js.map +1 -0
- package/dist/animation/rig/blendPoses.js +43 -0
- package/dist/animation/rig/blendPoses.js.map +1 -0
- package/dist/animation/rig/mirrorPose.js +19 -0
- package/dist/animation/rig/mirrorPose.js.map +1 -0
- package/dist/animation/rig/resolveSkeleton.js +33 -0
- package/dist/animation/rig/resolveSkeleton.js.map +1 -0
- package/dist/animation/rig/solveIk.js +103 -0
- package/dist/animation/rig/solveIk.js.map +1 -0
- package/dist/animation/rig/types.js +12 -0
- package/dist/animation/rig/types.js.map +1 -0
- package/dist/animation/rig/useRig.js +23 -0
- package/dist/animation/rig/useRig.js.map +1 -0
- package/dist/animation/slew.js +27 -0
- package/dist/animation/slew.js.map +1 -0
- package/dist/animation/stagger.js +138 -0
- package/dist/animation/stagger.js.map +1 -0
- package/dist/animation/timeline/booking.js +106 -0
- package/dist/animation/timeline/booking.js.map +1 -0
- package/dist/animation/timeline/createTimeline.js +116 -0
- package/dist/animation/timeline/createTimeline.js.map +1 -0
- package/dist/animation/timeline/sampleTrack.js +29 -0
- package/dist/animation/timeline/sampleTrack.js.map +1 -0
- package/dist/animation/useAnimator.js +329 -0
- package/dist/animation/useAnimator.js.map +1 -0
- package/dist/animation/wrappers/animateLifecycle.js +40 -0
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
- package/dist/animation/wrappers/animateOnSetPose.js +44 -0
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
- package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
- package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
- package/dist/canvas/Canvas.js +608 -0
- package/dist/canvas/Canvas.js.map +1 -0
- package/dist/canvas/CanvasView.js +255 -0
- package/dist/canvas/CanvasView.js.map +1 -0
- package/dist/canvas/CursorCoordsHud.js +75 -0
- package/dist/canvas/CursorCoordsHud.js.map +1 -0
- package/dist/canvas/DrawCanvas.js +67 -0
- package/dist/canvas/DrawCanvas.js.map +1 -0
- package/dist/canvas/MinimapCanvas.js +139 -0
- package/dist/canvas/MinimapCanvas.js.map +1 -0
- package/dist/canvas/ModalityHud.js +66 -0
- package/dist/canvas/ModalityHud.js.map +1 -0
- package/dist/canvas/NodeShape.js +391 -0
- package/dist/canvas/NodeShape.js.map +1 -0
- package/dist/canvas/PickHud.js +93 -0
- package/dist/canvas/PickHud.js.map +1 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
- package/dist/canvas/SceneCanvas/features.js +97 -0
- package/dist/canvas/SceneCanvas/features.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +992 -0
- package/dist/canvas/SceneCanvas.js.map +1 -0
- package/dist/canvas/SceneViewCanvas.js +54 -0
- package/dist/canvas/SceneViewCanvas.js.map +1 -0
- package/dist/canvas/accentColor.js +9 -0
- package/dist/canvas/accentColor.js.map +1 -0
- package/dist/canvas/affordanceAt.js +63 -0
- package/dist/canvas/affordanceAt.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +65 -0
- package/dist/canvas/buildSceneTree.js.map +1 -0
- package/dist/canvas/canvasRenderer.js +89 -0
- package/dist/canvas/canvasRenderer.js.map +1 -0
- package/dist/canvas/colorOverrides.js +16 -0
- package/dist/canvas/colorOverrides.js.map +1 -0
- package/dist/canvas/defaultDrawOne.js +43 -0
- package/dist/canvas/defaultDrawOne.js.map +1 -0
- package/dist/canvas/deps/areaSelect.js +19 -0
- package/dist/canvas/deps/areaSelect.js.map +1 -0
- package/dist/canvas/deps/debug.js +9 -0
- package/dist/canvas/deps/debug.js.map +1 -0
- package/dist/canvas/deps/dispatcher.js +11 -0
- package/dist/canvas/deps/dispatcher.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +101 -0
- package/dist/canvas/deps/editAnchors.js.map +1 -0
- package/dist/canvas/deps/geometryProjection.js +11 -0
- package/dist/canvas/deps/geometryProjection.js.map +1 -0
- package/dist/canvas/deps/hitTestArea.js +51 -0
- package/dist/canvas/deps/hitTestArea.js.map +1 -0
- package/dist/canvas/deps/ingestion.js +31 -0
- package/dist/canvas/deps/ingestion.js.map +1 -0
- package/dist/canvas/deps/insert.js +116 -0
- package/dist/canvas/deps/insert.js.map +1 -0
- package/dist/canvas/deps/lassoSelect.js +20 -0
- package/dist/canvas/deps/lassoSelect.js.map +1 -0
- package/dist/canvas/deps/layout.js +34 -0
- package/dist/canvas/deps/layout.js.map +1 -0
- package/dist/canvas/deps/nodeAtPoint.js +19 -0
- package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
- package/dist/canvas/deps/poseComposition.js +11 -0
- package/dist/canvas/deps/poseComposition.js.map +1 -0
- package/dist/canvas/deps/poseDescriptor.js +12 -0
- package/dist/canvas/deps/poseDescriptor.js.map +1 -0
- package/dist/canvas/deps/resizePolicy.js +35 -0
- package/dist/canvas/deps/resizePolicy.js.map +1 -0
- package/dist/canvas/deps/slice.js +99 -0
- package/dist/canvas/deps/slice.js.map +1 -0
- package/dist/canvas/deps/snap.js +11 -0
- package/dist/canvas/deps/snap.js.map +1 -0
- package/dist/canvas/deps/textEdit.js +21 -0
- package/dist/canvas/deps/textEdit.js.map +1 -0
- package/dist/canvas/deps/view.js +43 -0
- package/dist/canvas/deps/view.js.map +1 -0
- package/dist/canvas/derivedPath.js +47 -0
- package/dist/canvas/derivedPath.js.map +1 -0
- package/dist/canvas/drawEnvelope.js +22 -0
- package/dist/canvas/drawEnvelope.js.map +1 -0
- package/dist/canvas/getNodeAtPoint.js +18 -0
- package/dist/canvas/getNodeAtPoint.js.map +1 -0
- package/dist/canvas/hostAnchor.js +29 -0
- package/dist/canvas/hostAnchor.js.map +1 -0
- package/dist/canvas/hud.module.js +18 -0
- package/dist/canvas/hud.module.js.map +1 -0
- package/dist/canvas/insertPreviewExtent.js +103 -0
- package/dist/canvas/insertPreviewExtent.js.map +1 -0
- package/dist/canvas/kitRequirements.js +177 -0
- package/dist/canvas/kitRequirements.js.map +1 -0
- package/dist/canvas/layerOrder.js +66 -0
- package/dist/canvas/layerOrder.js.map +1 -0
- package/dist/canvas/layerSlots.js +14 -0
- package/dist/canvas/layerSlots.js.map +1 -0
- package/dist/canvas/minimapMath.js +80 -0
- package/dist/canvas/minimapMath.js.map +1 -0
- package/dist/canvas/mountedCanvases.js +20 -0
- package/dist/canvas/mountedCanvases.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js +17 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -0
- package/dist/canvas/paintCull.js +20 -0
- package/dist/canvas/paintCull.js.map +1 -0
- package/dist/canvas/pickWalk.js +158 -0
- package/dist/canvas/pickWalk.js.map +1 -0
- package/dist/canvas/planeClips.js +30 -0
- package/dist/canvas/planeClips.js.map +1 -0
- package/dist/canvas/poseRotation.js +35 -0
- package/dist/canvas/poseRotation.js.map +1 -0
- package/dist/canvas/rasterToPng.js +21 -0
- package/dist/canvas/rasterToPng.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +32 -0
- package/dist/canvas/renderDebugSnapshot.js.map +1 -0
- package/dist/canvas/renderNeeds.js +25 -0
- package/dist/canvas/renderNeeds.js.map +1 -0
- package/dist/canvas/renderSceneToPixels.js +143 -0
- package/dist/canvas/renderSceneToPixels.js.map +1 -0
- package/dist/canvas/sceneAdapter.js +270 -0
- package/dist/canvas/sceneAdapter.js.map +1 -0
- package/dist/canvas/sceneLayerPaint.js +37 -0
- package/dist/canvas/sceneLayerPaint.js.map +1 -0
- package/dist/canvas/sceneSlotWiring.js +20 -0
- package/dist/canvas/sceneSlotWiring.js.map +1 -0
- package/dist/canvas/sceneViewRender.js +72 -0
- package/dist/canvas/sceneViewRender.js.map +1 -0
- package/dist/canvas/slopsDebugLayer.js +61 -0
- package/dist/canvas/slopsDebugLayer.js.map +1 -0
- package/dist/canvas/surfaceContribution.js +15 -0
- package/dist/canvas/surfaceContribution.js.map +1 -0
- package/dist/canvas/toolPreview.js +39 -0
- package/dist/canvas/toolPreview.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +11 -0
- package/dist/canvas/useCanvasRenderer.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +60 -0
- package/dist/canvas/useFrameLoop.js.map +1 -0
- package/dist/canvas/useHostAnchor.js +71 -0
- package/dist/canvas/useHostAnchor.js.map +1 -0
- package/dist/canvas/useLateContentRedraw.js +21 -0
- package/dist/canvas/useLateContentRedraw.js.map +1 -0
- package/dist/canvas/useRedrawOn.js +21 -0
- package/dist/canvas/useRedrawOn.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +120 -0
- package/dist/canvas/useViewHelpers.js.map +1 -0
- package/dist/canvas/viewInputs.js +17 -0
- package/dist/canvas/viewInputs.js.map +1 -0
- package/dist/canvas/viewRegistry.js +61 -0
- package/dist/canvas/viewRegistry.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js +14 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -0
- package/dist/clipboard.d.ts +10 -5
- package/dist/clipboard.js +3 -5
- package/dist/clone.d.ts +3 -3
- package/dist/clone.js +2 -5
- package/dist/core/adapters/arrayAdapter.js +85 -0
- package/dist/core/adapters/arrayAdapter.js.map +1 -0
- package/dist/core/adapters/useArrayAdapter.js +13 -0
- package/dist/core/adapters/useArrayAdapter.js.map +1 -0
- package/dist/core/applyOps.js +12 -0
- package/dist/core/applyOps.js.map +1 -0
- package/dist/core/device/index.js +4 -0
- package/dist/core/device/targets.js +17 -0
- package/dist/core/device/targets.js.map +1 -0
- package/dist/core/device/useDeviceProfile.js +75 -0
- package/dist/core/device/useDeviceProfile.js.map +1 -0
- package/dist/core/fillInPoseFrame.js +102 -0
- package/dist/core/fillInPoseFrame.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +98 -0
- package/dist/core/geometry/poseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseRotation.js +58 -0
- package/dist/core/geometry/poseRotation.js.map +1 -0
- package/dist/core/geometry/regionHit.js +102 -0
- package/dist/core/geometry/regionHit.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +60 -0
- package/dist/core/geometry/unionBounds.js.map +1 -0
- package/dist/core/gradient.js +136 -0
- package/dist/core/gradient.js.map +1 -0
- package/dist/core/isPlainObject.js +11 -0
- package/dist/core/isPlainObject.js.map +1 -0
- package/dist/core/layers/render.js +150 -0
- package/dist/core/layers/render.js.map +1 -0
- package/dist/core/markerInset.js +24 -0
- package/dist/core/markerInset.js.map +1 -0
- package/dist/core/mixed.js +6 -0
- package/dist/core/mixed.js.map +1 -0
- package/dist/core/ops/arrange.js +31 -0
- package/dist/core/ops/arrange.js.map +1 -0
- package/dist/core/ops/create.js +32 -0
- package/dist/core/ops/create.js.map +1 -0
- package/dist/core/ops/createHistory.js +20 -0
- package/dist/core/ops/createHistory.js.map +1 -0
- package/dist/core/ops/delete.js +89 -0
- package/dist/core/ops/delete.js.map +1 -0
- package/dist/core/ops/registry.js +17 -0
- package/dist/core/ops/registry.js.map +1 -0
- package/dist/core/ops/reorder/algorithms.js +55 -0
- package/dist/core/ops/reorder/algorithms.js.map +1 -0
- package/dist/core/ops/reorder/index.js +140 -0
- package/dist/core/ops/reorder/index.js.map +1 -0
- package/dist/core/ops/reparent.js +52 -0
- package/dist/core/ops/reparent.js.map +1 -0
- package/dist/core/ops/select.js +34 -0
- package/dist/core/ops/select.js.map +1 -0
- package/dist/core/ops/setData.js +34 -0
- package/dist/core/ops/setData.js.map +1 -0
- package/dist/core/ops/setLayer.js +34 -0
- package/dist/core/ops/setLayer.js.map +1 -0
- package/dist/core/ops/setLayout.js +31 -0
- package/dist/core/ops/setLayout.js.map +1 -0
- package/dist/core/ops/setPath.js +57 -0
- package/dist/core/ops/setPath.js.map +1 -0
- package/dist/core/ops/setText.js +34 -0
- package/dist/core/ops/setText.js.map +1 -0
- package/dist/core/ops/slot.js +37 -0
- package/dist/core/ops/slot.js.map +1 -0
- package/dist/core/ops/transform.js +42 -0
- package/dist/core/ops/transform.js.map +1 -0
- package/dist/core/paintKinds.js +156 -0
- package/dist/core/paintKinds.js.map +1 -0
- package/dist/core/scene/NodeProperties.js +20 -0
- package/dist/core/scene/NodeProperties.js.map +1 -0
- package/dist/core/scene/NodeRouting.js +24 -0
- package/dist/core/scene/NodeRouting.js.map +1 -0
- package/dist/core/scene/arrivals.js +12 -0
- package/dist/core/scene/arrivals.js.map +1 -0
- package/dist/core/scene/composeFrame.js +29 -0
- package/dist/core/scene/composeFrame.js.map +1 -0
- package/dist/core/scene/depMemo.js +18 -0
- package/dist/core/scene/depMemo.js.map +1 -0
- package/dist/core/scene/dependents.js +66 -0
- package/dist/core/scene/dependents.js.map +1 -0
- package/dist/core/scene/derivedPath.js +31 -0
- package/dist/core/scene/derivedPath.js.map +1 -0
- package/dist/core/scene/effectivePose.js +78 -0
- package/dist/core/scene/effectivePose.js.map +1 -0
- package/dist/core/scene/kitRegistry.js +33 -0
- package/dist/core/scene/kitRegistry.js.map +1 -0
- package/dist/core/scene/layoutPass.js +96 -0
- package/dist/core/scene/layoutPass.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +83 -0
- package/dist/core/scene/nodeFnFields.js.map +1 -0
- package/dist/core/scene/nodeMemo.js +28 -0
- package/dist/core/scene/nodeMemo.js.map +1 -0
- package/dist/core/scene/poseFeed.js +87 -0
- package/dist/core/scene/poseFeed.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +52 -0
- package/dist/core/scene/poseOverrides.js.map +1 -0
- package/dist/core/scene/poseSnapshot.js +54 -0
- package/dist/core/scene/poseSnapshot.js.map +1 -0
- package/dist/core/scene/scene.js +1271 -0
- package/dist/core/scene/scene.js.map +1 -0
- package/dist/core/scene/types.js +6 -0
- package/dist/core/scene/types.js.map +1 -0
- package/dist/core/scene/useScene.js +32 -0
- package/dist/core/scene/useScene.js.map +1 -0
- package/dist/core/selection/chromeState.js +31 -0
- package/dist/core/selection/chromeState.js.map +1 -0
- package/dist/core/selection/selectionTarget.js +6 -0
- package/dist/core/selection/selectionTarget.js.map +1 -0
- package/dist/core/selection/useSelection.js +71 -0
- package/dist/core/selection/useSelection.js.map +1 -0
- package/dist/core/shapeKinds.js +54 -0
- package/dist/core/shapeKinds.js.map +1 -0
- package/dist/core/strokeMarkerShapes.js +139 -0
- package/dist/core/strokeMarkerShapes.js.map +1 -0
- package/dist/core/strokeMarkers.js +28 -0
- package/dist/core/strokeMarkers.js.map +1 -0
- package/dist/core/stylus/stylus.js +39 -0
- package/dist/core/stylus/stylus.js.map +1 -0
- package/dist/core/stylus/usePointerStylus.js +51 -0
- package/dist/core/stylus/usePointerStylus.js.map +1 -0
- package/dist/core/usePaintKinds.js +17 -0
- package/dist/core/usePaintKinds.js.map +1 -0
- package/dist/core/viewport/clampView.js +24 -0
- package/dist/core/viewport/clampView.js.map +1 -0
- package/dist/core/viewport/clientToWorld.js +8 -0
- package/dist/core/viewport/clientToWorld.js.map +1 -0
- package/dist/core/viewport/createVelocityTracker.js +39 -0
- package/dist/core/viewport/createVelocityTracker.js.map +1 -0
- package/dist/core/viewport/fitToBounds.js +18 -0
- package/dist/core/viewport/fitToBounds.js.map +1 -0
- package/dist/core/viewport/fitViewToBounds.js +36 -0
- package/dist/core/viewport/fitViewToBounds.js.map +1 -0
- package/dist/core/viewport/interpolateView.js +34 -0
- package/dist/core/viewport/interpolateView.js.map +1 -0
- package/dist/core/viewport/meanScale.js +8 -0
- package/dist/core/viewport/meanScale.js.map +1 -0
- package/dist/core/viewport/parallax.js +111 -0
- package/dist/core/viewport/parallax.js.map +1 -0
- package/dist/core/viewport/pxExtent.js +42 -0
- package/dist/core/viewport/pxExtent.js.map +1 -0
- package/dist/core/viewport/sceneNodeClientRect.js +18 -0
- package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
- package/dist/core/viewport/screenSlop.js +27 -0
- package/dist/core/viewport/screenSlop.js.map +1 -0
- package/dist/core/viewport/useAutoCenter.js +32 -0
- package/dist/core/viewport/useAutoCenter.js.map +1 -0
- package/dist/core/viewport/useCanvasSize.js +29 -0
- package/dist/core/viewport/useCanvasSize.js.map +1 -0
- package/dist/core/viewport/useDecayLoop.js +63 -0
- package/dist/core/viewport/useDecayLoop.js.map +1 -0
- package/dist/core/viewport/useVelocityTracker.js +10 -0
- package/dist/core/viewport/useVelocityTracker.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +63 -0
- package/dist/core/viewport/useViewAnimation.js.map +1 -0
- package/dist/core/viewport/view.js +37 -0
- package/dist/core/viewport/view.js.map +1 -0
- package/dist/core/viewport/viewTransform.js +11 -0
- package/dist/core/viewport/viewTransform.js.map +1 -0
- package/dist/core/viewport/viewportWorldRect.js +13 -0
- package/dist/core/viewport/viewportWorldRect.js.map +1 -0
- package/dist/core/viewport/wheelHandler.js +30 -0
- package/dist/core/viewport/wheelHandler.js.map +1 -0
- package/dist/core/viewport/zoomAt.js +22 -0
- package/dist/core/viewport/zoomAt.js.map +1 -0
- package/dist/core/viewport/zoomBounds.js +20 -0
- package/dist/core/viewport/zoomBounds.js.map +1 -0
- package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
- package/dist/debug/createDebugOverlayLayer.js +358 -0
- package/dist/debug/createDebugOverlayLayer.js.map +1 -0
- package/dist/debug/createDebugSink.js +83 -0
- package/dist/debug/createDebugSink.js.map +1 -0
- package/dist/debug/defaultTheme.js +31 -0
- package/dist/debug/defaultTheme.js.map +1 -0
- package/dist/debug/flag.js +41 -0
- package/dist/debug/flag.js.map +1 -0
- package/dist/debug/frameStats.js +16 -0
- package/dist/debug/frameStats.js.map +1 -0
- package/dist/debug/parseDebugFlags.js +32 -0
- package/dist/debug/parseDebugFlags.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
- package/dist/features/chrome-caps/conditions.js +36 -0
- package/dist/features/chrome-caps/conditions.js.map +1 -0
- package/dist/features/chrome-caps/defaults.js +26 -0
- package/dist/features/chrome-caps/defaults.js.map +1 -0
- package/dist/features/chrome-caps/index.js +7 -0
- package/dist/features/chrome-caps/resolve.js +23 -0
- package/dist/features/chrome-caps/resolve.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js +27 -0
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
- package/dist/features/cursor/paintedCursorLayer.js +60 -0
- package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
- package/dist/features/focus/gateLayer.js +14 -0
- package/dist/features/focus/gateLayer.js.map +1 -0
- package/dist/features/focus/useCanvasFocus.js +29 -0
- package/dist/features/focus/useCanvasFocus.js.map +1 -0
- package/dist/features/groups/children.js +23 -0
- package/dist/features/groups/children.js.map +1 -0
- package/dist/features/groups/composePose.js +67 -0
- package/dist/features/groups/composePose.js.map +1 -0
- package/dist/features/groups/nestedHit.js +40 -0
- package/dist/features/groups/nestedHit.js.map +1 -0
- package/dist/features/groups/unionOfChildren.js +15 -0
- package/dist/features/groups/unionOfChildren.js.map +1 -0
- package/dist/features/images/imageCache.js +94 -0
- package/dist/features/images/imageCache.js.map +1 -0
- package/dist/features/ingestion/contentHandlers.js +37 -0
- package/dist/features/ingestion/contentHandlers.js.map +1 -0
- package/dist/features/ingestion/imageHandler.js +45 -0
- package/dist/features/ingestion/imageHandler.js.map +1 -0
- package/dist/features/ingestion/index.js +8 -0
- package/dist/features/ingestion/openFilePicker.js +15 -0
- package/dist/features/ingestion/openFilePicker.js.map +1 -0
- package/dist/features/ingestion/registerKitHandlers.js +26 -0
- package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
- package/dist/features/ingestion/svgHandler.js +58 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +39 -0
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
- package/dist/features/longPress/longPressFeedback.js +96 -0
- package/dist/features/longPress/longPressFeedback.js.map +1 -0
- package/dist/features/meshPaint/bake.js +79 -0
- package/dist/features/meshPaint/bake.js.map +1 -0
- package/dist/features/meshPaint/bakeCache.js +59 -0
- package/dist/features/meshPaint/bakeCache.js.map +1 -0
- package/dist/features/meshPaint/handles.js +86 -0
- package/dist/features/meshPaint/handles.js.map +1 -0
- package/dist/features/meshPaint/lazyKind.js +1298 -0
- package/dist/features/meshPaint/lazyKind.js.map +1 -0
- package/dist/features/meshPaint/meshPaint.js +236 -0
- package/dist/features/meshPaint/meshPaint.js.map +1 -0
- package/dist/features/meshPaint/meshShader.js +6 -0
- package/dist/features/meshPaint/meshShader.js.map +1 -0
- package/dist/features/meshPaint/register.js +7 -0
- package/dist/features/meshPaint/register.js.map +1 -0
- package/dist/features/meshPaint/surface.js +110 -0
- package/dist/features/meshPaint/surface.js.map +1 -0
- package/dist/features/minimap/actions.js +53 -0
- package/dist/features/minimap/actions.js.map +1 -0
- package/dist/features/minimap/createMinimapContribution.js +96 -0
- package/dist/features/minimap/createMinimapContribution.js.map +1 -0
- package/dist/features/minimap/layers.js +103 -0
- package/dist/features/minimap/layers.js.map +1 -0
- package/dist/features/modes/modeLayers.js +113 -0
- package/dist/features/modes/modeLayers.js.map +1 -0
- package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
- package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
- package/dist/features/parallax/createParallaxLayer.js +26 -0
- package/dist/features/parallax/createParallaxLayer.js.map +1 -0
- package/dist/features/parallax/createParallaxPlane.js +26 -0
- package/dist/features/parallax/createParallaxPlane.js.map +1 -0
- package/dist/features/paths/anchorEdits.js +156 -0
- package/dist/features/paths/anchorEdits.js.map +1 -0
- package/dist/features/paths/anchors.js +154 -0
- package/dist/features/paths/anchors.js.map +1 -0
- package/dist/features/paths/booleans.js +2 -0
- package/dist/features/paths/index.js +15 -0
- package/dist/features/paths/markerCommands.js +116 -0
- package/dist/features/paths/markerCommands.js.map +1 -0
- package/dist/features/paths/markerSites.js +59 -0
- package/dist/features/paths/markerSites.js.map +1 -0
- package/dist/features/paths/markers.js +95 -0
- package/dist/features/paths/markers.js.map +1 -0
- package/dist/features/paths/nearestAnchor.js +36 -0
- package/dist/features/paths/nearestAnchor.js.map +1 -0
- package/dist/features/paths/originProjection.js +16 -0
- package/dist/features/paths/originProjection.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
- package/dist/features/paths/pathInWorld.js +41 -0
- package/dist/features/paths/pathInWorld.js.map +1 -0
- package/dist/features/paths/pathLayer.js +44 -0
- package/dist/features/paths/pathLayer.js.map +1 -0
- package/dist/features/paths/penPreviewLayer.js +220 -0
- package/dist/features/paths/penPreviewLayer.js.map +1 -0
- package/dist/features/paths/poseDescriptor.js +44 -0
- package/dist/features/paths/poseDescriptor.js.map +1 -0
- package/dist/features/paths/tessellate/stroke.js +230 -0
- package/dist/features/paths/tessellate/stroke.js.map +1 -0
- package/dist/features/patterns/index.js +23 -0
- package/dist/features/patterns/index.js.map +1 -0
- package/dist/features/patterns/patterns-builtin.js +38 -0
- package/dist/features/patterns/patterns-builtin.js.map +1 -0
- package/dist/features/patterns/resolveSpec.js +57 -0
- package/dist/features/patterns/resolveSpec.js.map +1 -0
- package/dist/features/patterns/tileGeometry.js +158 -0
- package/dist/features/patterns/tileGeometry.js.map +1 -0
- package/dist/features/pointer/PointerContext.js +45 -0
- package/dist/features/pointer/PointerContext.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +70 -0
- package/dist/features/poseRun/usePoseRun.js.map +1 -0
- package/dist/features/selection/SelectionContext.js +46 -0
- package/dist/features/selection/SelectionContext.js.map +1 -0
- package/dist/features/selection/overlay.js +442 -0
- package/dist/features/selection/overlay.js.map +1 -0
- package/dist/features/simulation/createSimulation.js +61 -0
- package/dist/features/simulation/createSimulation.js.map +1 -0
- package/dist/features/simulation/types.js +6 -0
- package/dist/features/simulation/types.js.map +1 -0
- package/dist/features/simulation/useSimulation.js +74 -0
- package/dist/features/simulation/useSimulation.js.map +1 -0
- package/dist/features/text/domRuns.js +258 -0
- package/dist/features/text/domRuns.js.map +1 -0
- package/dist/features/text/fitTextPose.js +38 -0
- package/dist/features/text/fitTextPose.js.map +1 -0
- package/dist/features/text/hitTest.js +45 -0
- package/dist/features/text/hitTest.js.map +1 -0
- package/dist/features/text/renderLabel.js +14 -0
- package/dist/features/text/renderLabel.js.map +1 -0
- package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
- package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
- package/dist/features/text/runs/flagRange.js +53 -0
- package/dist/features/text/runs/flagRange.js.map +1 -0
- package/dist/features/text/runs/rangeStyle.js +135 -0
- package/dist/features/text/runs/rangeStyle.js.map +1 -0
- package/dist/features/text/textCommand.js +59 -0
- package/dist/features/text/textCommand.js.map +1 -0
- package/dist/features/text/textLayer.js +35 -0
- package/dist/features/text/textLayer.js.map +1 -0
- package/dist/features/text/textToPath.js +181 -0
- package/dist/features/text/textToPath.js.map +1 -0
- package/dist/features/text/useSceneTextEdit.js +138 -0
- package/dist/features/text/useSceneTextEdit.js.map +1 -0
- package/dist/features/text/useTextEdit.js +465 -0
- package/dist/features/text/useTextEdit.js.map +1 -0
- package/dist/features/tiling/createTiledLayer.js +63 -0
- package/dist/features/tiling/createTiledLayer.js.map +1 -0
- package/dist/features/tiling/tiledProject.js +14 -0
- package/dist/features/tiling/tiledProject.js.map +1 -0
- package/dist/features/viewports/viewResolver.js +59 -0
- package/dist/features/viewports/viewResolver.js.map +1 -0
- package/dist/features/viewports/viewportLayer.js +58 -0
- package/dist/features/viewports/viewportLayer.js.map +1 -0
- package/dist/icons/ArrowIcon.js +23 -0
- package/dist/icons/ArrowIcon.js.map +1 -0
- package/dist/icons/EllipseIcon.js +21 -0
- package/dist/icons/EllipseIcon.js.map +1 -0
- package/dist/icons/EyedropperIcon.js +49 -0
- package/dist/icons/EyedropperIcon.js.map +1 -0
- package/dist/icons/HandIcon.js +59 -0
- package/dist/icons/HandIcon.js.map +1 -0
- package/dist/icons/ImageIcon.js +34 -0
- package/dist/icons/ImageIcon.js.map +1 -0
- package/dist/icons/LassoIcon.js +22 -0
- package/dist/icons/LassoIcon.js.map +1 -0
- package/dist/icons/LineIcon.js +22 -0
- package/dist/icons/LineIcon.js.map +1 -0
- package/dist/icons/PenIcon.js +36 -0
- package/dist/icons/PenIcon.js.map +1 -0
- package/dist/icons/PencilIcon.js +25 -0
- package/dist/icons/PencilIcon.js.map +1 -0
- package/dist/icons/PolygonIcon.js +19 -0
- package/dist/icons/PolygonIcon.js.map +1 -0
- package/dist/icons/RectIcon.js +37 -0
- package/dist/icons/RectIcon.js.map +1 -0
- package/dist/icons/SelectIcon.js +20 -0
- package/dist/icons/SelectIcon.js.map +1 -0
- package/dist/icons/StarIcon.js +19 -0
- package/dist/icons/StarIcon.js.map +1 -0
- package/dist/icons/TextIcon.js +19 -0
- package/dist/icons/TextIcon.js.map +1 -0
- package/dist/icons/UnknownIcon.js +33 -0
- package/dist/icons/UnknownIcon.js.map +1 -0
- package/dist/icons/_base.js +12 -0
- package/dist/icons/_base.js.map +1 -0
- package/dist/index.css +2 -86
- package/dist/index.d.ts +2349 -2609
- package/dist/index.js +312 -13
- package/dist/input/keyState.js +76 -0
- package/dist/input/keyState.js.map +1 -0
- package/dist/input/useKeyState.js +22 -0
- package/dist/input/useKeyState.js.map +1 -0
- package/dist/interactions/actions/actionShortcuts.js +32 -0
- package/dist/interactions/actions/actionShortcuts.js.map +1 -0
- package/dist/interactions/actions/align/align.js +81 -0
- package/dist/interactions/actions/align/align.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +120 -0
- package/dist/interactions/actions/booleans/booleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +20 -0
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
- package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
- package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
- package/dist/interactions/actions/defaults/align.js +71 -0
- package/dist/interactions/actions/defaults/align.js.map +1 -0
- package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
- package/dist/interactions/actions/defaults/areaSelect.js +75 -0
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/booleans.js +52 -0
- package/dist/interactions/actions/defaults/booleans.js.map +1 -0
- package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
- package/dist/interactions/actions/defaults/clearSelection.js +19 -0
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/clipboard.js +78 -0
- package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
- package/dist/interactions/actions/defaults/clone.js +96 -0
- package/dist/interactions/actions/defaults/clone.js.map +1 -0
- package/dist/interactions/actions/defaults/createOutlines.js +47 -0
- package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
- package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
- package/dist/interactions/actions/defaults/delete.js +61 -0
- package/dist/interactions/actions/defaults/delete.js.map +1 -0
- package/dist/interactions/actions/defaults/distribute.js +66 -0
- package/dist/interactions/actions/defaults/distribute.js.map +1 -0
- package/dist/interactions/actions/defaults/duplicate.js +83 -0
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
- package/dist/interactions/actions/defaults/editAnchors.js +100 -0
- package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/escape.js +26 -0
- package/dist/interactions/actions/defaults/escape.js.map +1 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/flip.js +119 -0
- package/dist/interactions/actions/defaults/flip.js.map +1 -0
- package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
- package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
- package/dist/interactions/actions/defaults/group.js +131 -0
- package/dist/interactions/actions/defaults/group.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/ingest.js +58 -0
- package/dist/interactions/actions/defaults/ingest.js.map +1 -0
- package/dist/interactions/actions/defaults/insert.js +288 -0
- package/dist/interactions/actions/defaults/insert.js.map +1 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
- package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
- package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/move.js +656 -0
- package/dist/interactions/actions/defaults/move.js.map +1 -0
- package/dist/interactions/actions/defaults/nudge.js +110 -0
- package/dist/interactions/actions/defaults/nudge.js.map +1 -0
- package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
- package/dist/interactions/actions/defaults/reorder.js +143 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -0
- package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/resize.js +332 -0
- package/dist/interactions/actions/defaults/resize.js.map +1 -0
- package/dist/interactions/actions/defaults/rotate.js +181 -0
- package/dist/interactions/actions/defaults/rotate.js.map +1 -0
- package/dist/interactions/actions/defaults/selectAll.js +27 -0
- package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
- package/dist/interactions/actions/defaults/setFill.js +27 -0
- package/dist/interactions/actions/defaults/setFill.js.map +1 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/setStroke.js +36 -0
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/slice.js +39 -0
- package/dist/interactions/actions/defaults/slice.js.map +1 -0
- package/dist/interactions/actions/defaults/sliceOps.js +60 -0
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
- package/dist/interactions/actions/defaults/toolActivate.js +35 -0
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
- package/dist/interactions/actions/defaults/undoRedo.js +51 -0
- package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +42 -0
- package/dist/interactions/actions/distribute/distribute.js.map +1 -0
- package/dist/interactions/actions/distribute/plan.js +29 -0
- package/dist/interactions/actions/distribute/plan.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/handles.js +43 -0
- package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +35 -0
- package/dist/interactions/actions/flip/helpers.js.map +1 -0
- package/dist/interactions/actions/geometryProjection.js +18 -0
- package/dist/interactions/actions/geometryProjection.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +44 -0
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +37 -0
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +84 -0
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
- package/dist/interactions/actions/planeInput.js +168 -0
- package/dist/interactions/actions/planeInput.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +9 -0
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
- package/dist/interactions/actions/poseFrame.js +38 -0
- package/dist/interactions/actions/poseFrame.js.map +1 -0
- package/dist/interactions/actions/previewOverrides.js +25 -0
- package/dist/interactions/actions/previewOverrides.js.map +1 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/index.js +8 -0
- package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
- package/dist/interactions/actions/resize/cornerHandles.js +72 -0
- package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js +60 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -0
- package/dist/interactions/actions/resolvePreviews.js +61 -0
- package/dist/interactions/actions/resolvePreviews.js.map +1 -0
- package/dist/interactions/actions/rotate/geometry.js +46 -0
- package/dist/interactions/actions/rotate/geometry.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +27 -0
- package/dist/interactions/actions/rotate/handle.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js +42 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +142 -0
- package/dist/interactions/actions/useStandardActions.js.map +1 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
- package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
- package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
- package/dist/interactions/gestures/shared/originProjection.js +42 -0
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
- package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
- package/dist/interactions/gestures/shared/snap.js +24 -0
- package/dist/interactions/gestures/shared/snap.js.map +1 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
- package/dist/layout/arrivals.js +36 -0
- package/dist/layout/arrivals.js.map +1 -0
- package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
- package/dist/math.d.ts +4 -5
- package/dist/math.js +6 -4
- package/dist/mesh.d.ts +268 -0
- package/dist/mesh.js +7 -0
- package/dist/move.d.ts +7 -48
- package/dist/move.js +3 -142
- package/dist/originProjection-BSn4xiEy.d.ts +57 -0
- package/dist/patterns-builtin.js +3 -3
- package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
- package/dist/registerProgram-ateHDGjw.d.ts +193 -0
- package/dist/renderer/DrawCommand.js +6 -0
- package/dist/renderer/DrawCommand.js.map +1 -0
- package/dist/renderer/WeaselRenderer.js +328 -0
- package/dist/renderer/WeaselRenderer.js.map +1 -0
- package/dist/renderer/cache/GLImageCache.js +64 -0
- package/dist/renderer/cache/GLImageCache.js.map +1 -0
- package/dist/renderer/cache/GLMeshCache.js +102 -0
- package/dist/renderer/cache/GLMeshCache.js.map +1 -0
- package/dist/renderer/cache/GLTextureCache.js +51 -0
- package/dist/renderer/cache/GLTextureCache.js.map +1 -0
- package/dist/renderer/cache/GradientRampAtlas.js +82 -0
- package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
- package/dist/renderer/cache/cache.js +13 -0
- package/dist/renderer/cache/cache.js.map +1 -0
- package/dist/renderer/cache/markerCommandCache.js +59 -0
- package/dist/renderer/cache/markerCommandCache.js.map +1 -0
- package/dist/renderer/cache/outlineMeshCache.js +15 -0
- package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
- package/dist/renderer/cache/strokeMeshCache.js +44 -0
- package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
- package/dist/renderer/cullDrawCommands.js +89 -0
- package/dist/renderer/cullDrawCommands.js.map +1 -0
- package/dist/renderer/draw.js +1109 -0
- package/dist/renderer/draw.js.map +1 -0
- package/dist/renderer/drawBatch.js +168 -0
- package/dist/renderer/drawBatch.js.map +1 -0
- package/dist/renderer/effects/EffectTargets.js +45 -0
- package/dist/renderer/effects/EffectTargets.js.map +1 -0
- package/dist/renderer/effects/builtins.js +31 -0
- package/dist/renderer/effects/builtins.js.map +1 -0
- package/dist/renderer/effects/composite.js +9 -0
- package/dist/renderer/effects/composite.js.map +1 -0
- package/dist/renderer/effects/effectPrelude.js +10 -0
- package/dist/renderer/effects/effectPrelude.js.map +1 -0
- package/dist/renderer/effects/types.js +10 -0
- package/dist/renderer/effects/types.js.map +1 -0
- package/dist/renderer/index.js +19 -0
- package/dist/renderer/math/color.js +341 -0
- package/dist/renderer/math/color.js.map +1 -0
- package/dist/renderer/math/mat3.js +71 -0
- package/dist/renderer/math/mat3.js.map +1 -0
- package/dist/renderer/math/patternSpace.js +22 -0
- package/dist/renderer/math/patternSpace.js.map +1 -0
- package/dist/renderer/math/viewToMat3.js +19 -0
- package/dist/renderer/math/viewToMat3.js.map +1 -0
- package/dist/renderer/paintResources.js +18 -0
- package/dist/renderer/paintResources.js.map +1 -0
- package/dist/renderer/paintScratch.js +37 -0
- package/dist/renderer/paintScratch.js.map +1 -0
- package/dist/renderer/shaders/ShaderProgram.js +74 -0
- package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
- package/dist/renderer/shaders/batchFill.js +118 -0
- package/dist/renderer/shaders/batchFill.js.map +1 -0
- package/dist/renderer/shaders/customPrelude.js +34 -0
- package/dist/renderer/shaders/customPrelude.js.map +1 -0
- package/dist/renderer/shaders/extractUniformNames.js +184 -0
- package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
- package/dist/renderer/shaders/glyphPaint.js +61 -0
- package/dist/renderer/shaders/glyphPaint.js.map +1 -0
- package/dist/renderer/shaders/gradFill.js +30 -0
- package/dist/renderer/shaders/gradFill.js.map +1 -0
- package/dist/renderer/shaders/imageFill.js +14 -0
- package/dist/renderer/shaders/imageFill.js.map +1 -0
- package/dist/renderer/shaders/pathFill.js +13 -0
- package/dist/renderer/shaders/pathFill.js.map +1 -0
- package/dist/renderer/shaders/patternFill.js +24 -0
- package/dist/renderer/shaders/patternFill.js.map +1 -0
- package/dist/renderer/shaders/registerProgram.js +18 -0
- package/dist/renderer/shaders/registerProgram.js.map +1 -0
- package/dist/renderer/spriteSheet.js +14 -0
- package/dist/renderer/spriteSheet.js.map +1 -0
- package/dist/renderer/state/GroupState.js +77 -0
- package/dist/renderer/state/GroupState.js.map +1 -0
- package/dist/renderer/syntheticItalic.js +6 -0
- package/dist/renderer/syntheticItalic.js.map +1 -0
- package/dist/renderer/textures/registerTexture.js +14 -0
- package/dist/renderer/textures/registerTexture.js.map +1 -0
- package/dist/renderer.d.ts +18 -20
- package/dist/renderer.js +18 -13
- package/dist/resize.d.ts +10 -46
- package/dist/resize.js +7 -5
- package/dist/routing.d.ts +1 -1
- package/dist/routing.js +2 -3
- package/dist/scheduling/useVisibleRaf.js +69 -0
- package/dist/scheduling/useVisibleRaf.js.map +1 -0
- package/dist/test-hook/createTestHook.js +39 -0
- package/dist/test-hook/createTestHook.js.map +1 -0
- package/dist/test-hook/install.js +12 -0
- package/dist/test-hook/install.js.map +1 -0
- package/dist/test-seams-fYf6m5pu.d.ts +356 -0
- package/dist/test-seams.d.ts +6 -0
- package/dist/test-seams.js +3 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
- package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
- package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
- package/dist/tools/builtin/hand/useHandTool.js +31 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
- package/dist/tools/builtin/image/useImageTool.js +41 -0
- package/dist/tools/builtin/image/useImageTool.js.map +1 -0
- package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
- package/dist/tools/builtin/line/useLineTool.js +33 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -0
- package/dist/tools/builtin/pen/usePenTool.js +414 -0
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
- package/dist/tools/builtin/pickTopMostHit.js +45 -0
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
- package/dist/tools/builtin/rect/useRectTool.js +32 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +109 -0
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
- package/dist/tools/builtin/select/useSelectTool.js +162 -0
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
- package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
- package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +263 -0
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
- package/dist/tools/builtin/star/useStarTool.js +82 -0
- package/dist/tools/builtin/star/useStarTool.js.map +1 -0
- package/dist/tools/builtin/text/useTextTool.js +177 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -0
- package/dist/tools/overlayBinding.js +8 -0
- package/dist/tools/overlayBinding.js.map +1 -0
- package/dist/tools/prefs.js +47 -0
- package/dist/tools/prefs.js.map +1 -0
- package/dist/tools/useKeybindings.js +66 -0
- package/dist/tools/useKeybindings.js.map +1 -0
- package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
- package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
- package/dist/util/color.js +26 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/constrainTo45.js +17 -0
- package/dist/util/constrainTo45.js.map +1 -0
- package/dist/util/paint.js +72 -0
- package/dist/util/paint.js.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +31 -18
- package/dist/chunk-44EWMJV2.js +0 -128
- package/dist/chunk-44EWMJV2.js.map +0 -1
- package/dist/chunk-4RJP2N2L.js +0 -143
- package/dist/chunk-4RJP2N2L.js.map +0 -1
- package/dist/chunk-BJN5ZRIJ.js +0 -167
- package/dist/chunk-BJN5ZRIJ.js.map +0 -1
- package/dist/chunk-D4AAWR64.js +0 -28
- package/dist/chunk-D4AAWR64.js.map +0 -1
- package/dist/chunk-DOBSZOPR.js +0 -29
- package/dist/chunk-DOBSZOPR.js.map +0 -1
- package/dist/chunk-H6N2JSZ3.js +0 -248
- package/dist/chunk-H6N2JSZ3.js.map +0 -1
- package/dist/chunk-HPFJUUTF.js +0 -167
- package/dist/chunk-HPFJUUTF.js.map +0 -1
- package/dist/chunk-L5YNZYEG.js +0 -648
- package/dist/chunk-L5YNZYEG.js.map +0 -1
- package/dist/chunk-MZAIDI6D.js +0 -32492
- package/dist/chunk-MZAIDI6D.js.map +0 -1
- package/dist/chunk-PNNZSYRD.js +0 -318
- package/dist/chunk-PNNZSYRD.js.map +0 -1
- package/dist/chunk-RMR4QMM6.js +0 -250
- package/dist/chunk-RMR4QMM6.js.map +0 -1
- package/dist/clipboard.js.map +0 -1
- package/dist/clone.js.map +0 -1
- package/dist/grid-BXdz8GF2.d.ts +0 -158
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/insert.d.ts +0 -37
- package/dist/insert.js +0 -81
- package/dist/insert.js.map +0 -1
- package/dist/math.js.map +0 -1
- package/dist/move.js.map +0 -1
- package/dist/options-CzjxFoYZ.d.ts +0 -67
- package/dist/path-JEV2c5If.d.ts +0 -48
- package/dist/patterns-builtin.js.map +0 -1
- package/dist/renderer.css +0 -86
- package/dist/renderer.css.map +0 -1
- package/dist/renderer.js.map +0 -1
- package/dist/resize.js.map +0 -1
- package/dist/routing.js.map +0 -1
- package/dist/types-D2tTKEU0.d.ts +0 -18
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { DEFAULT_MAX_ZOOM as e, DEFAULT_MIN_ZOOM as t } from "../../../core/viewport/zoomBounds.js";
|
|
2
|
+
import { viewToTransform as n } from "../../../core/viewport/view.js";
|
|
3
|
+
import { screenToWorld as r } from "../../../core/viewport/viewTransform.js";
|
|
4
|
+
import { zoomAt as i } from "../../../core/viewport/zoomAt.js";
|
|
5
|
+
import { wheelZoomFactor as a } from "../../../core/viewport/wheelHandler.js";
|
|
6
|
+
//#region src/interactions/actions/defaults/viewportZoom.ts
|
|
7
|
+
var o = 1.25;
|
|
8
|
+
function s(e) {
|
|
9
|
+
let t = e.hostSize?.();
|
|
10
|
+
return t ? {
|
|
11
|
+
x: t.width / 2,
|
|
12
|
+
y: t.height / 2
|
|
13
|
+
} : {
|
|
14
|
+
x: 0,
|
|
15
|
+
y: 0
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function c(c = {}) {
|
|
19
|
+
let l = {
|
|
20
|
+
min: c.min ?? t,
|
|
21
|
+
max: c.max ?? e
|
|
22
|
+
}, u = c.wheel === "plain" ? { kind: "wheel" } : {
|
|
23
|
+
kind: "wheel",
|
|
24
|
+
mods: { mod: !0 }
|
|
25
|
+
}, d = c.animate === !0 ? {} : c.animate || null, { resetMs: f, ...p } = d ?? {}, m = d ? p : null;
|
|
26
|
+
return {
|
|
27
|
+
id: "viewport.zoom",
|
|
28
|
+
label: "Zoom",
|
|
29
|
+
group: "viewport",
|
|
30
|
+
defaultBinding: [
|
|
31
|
+
{
|
|
32
|
+
spec: u,
|
|
33
|
+
opts: { params: { kind: "wheel" } }
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
spec: {
|
|
37
|
+
kind: "wheel",
|
|
38
|
+
mods: { ctrl: !0 }
|
|
39
|
+
},
|
|
40
|
+
opts: { params: { kind: "wheel" } }
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
spec: { kind: "pinch" },
|
|
44
|
+
opts: { params: { kind: "pinch" } }
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
spec: {
|
|
48
|
+
kind: "key",
|
|
49
|
+
key: "=",
|
|
50
|
+
mods: {
|
|
51
|
+
mod: !0,
|
|
52
|
+
shift: "optional"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
opts: { params: { kind: "in" } }
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
spec: {
|
|
59
|
+
kind: "key",
|
|
60
|
+
key: "-",
|
|
61
|
+
mods: { mod: !0 }
|
|
62
|
+
},
|
|
63
|
+
opts: { params: { kind: "out" } }
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
spec: {
|
|
67
|
+
kind: "key",
|
|
68
|
+
key: "0",
|
|
69
|
+
mods: { mod: !0 }
|
|
70
|
+
},
|
|
71
|
+
opts: { params: { kind: "reset" } }
|
|
72
|
+
}
|
|
73
|
+
],
|
|
74
|
+
requires: ["view", "debug"],
|
|
75
|
+
invoker: {
|
|
76
|
+
timing: "immediate",
|
|
77
|
+
run(e, t) {
|
|
78
|
+
let c = e.view;
|
|
79
|
+
if (!c) return;
|
|
80
|
+
let u = e.debug, d = c.get(), p = (e, t, i) => {
|
|
81
|
+
if (!u) return;
|
|
82
|
+
let [a, o] = r(i.x, i.y, n(e));
|
|
83
|
+
u.recordViewport("zoom", e, t, {
|
|
84
|
+
x: a,
|
|
85
|
+
y: o
|
|
86
|
+
});
|
|
87
|
+
}, h = t?.kind, g = m !== null && typeof c.animate == "function", _ = (e, t) => {
|
|
88
|
+
if (!g) {
|
|
89
|
+
c.set(e);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
c.animate(e, {
|
|
93
|
+
...m,
|
|
94
|
+
ms: t ?? m.ms
|
|
95
|
+
});
|
|
96
|
+
}, v = () => g && c.animationTarget?.() || d, y = () => ({
|
|
97
|
+
x: t?.clientX ?? 0,
|
|
98
|
+
y: t?.clientY ?? 0
|
|
99
|
+
}), b = (e) => {
|
|
100
|
+
if (!(e > 0) || !Number.isFinite(e)) return;
|
|
101
|
+
let t = i(d, y(), e, l);
|
|
102
|
+
c.set(t), p(d, t, y());
|
|
103
|
+
};
|
|
104
|
+
switch (h) {
|
|
105
|
+
case "wheel":
|
|
106
|
+
b(a(t?.deltaY ?? 0));
|
|
107
|
+
break;
|
|
108
|
+
case "pinch":
|
|
109
|
+
b(t?.scale ?? NaN);
|
|
110
|
+
break;
|
|
111
|
+
case "in":
|
|
112
|
+
case "out": {
|
|
113
|
+
let e = v(), t = i(e, s(c), h === "in" ? o : 1 / o, l);
|
|
114
|
+
_(t), p(e, t, s(c));
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "reset": {
|
|
118
|
+
let e = c.recenter ? c.recenter() : {
|
|
119
|
+
x: 0,
|
|
120
|
+
y: 0,
|
|
121
|
+
scale: {
|
|
122
|
+
x: 1,
|
|
123
|
+
y: 1
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
e && _(e, f);
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
default: t === void 0 && c.set(i(d, {
|
|
130
|
+
x: 0,
|
|
131
|
+
y: 0
|
|
132
|
+
}, o, l));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
enabled: () => !0
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
var l = c();
|
|
140
|
+
//#endregion
|
|
141
|
+
export { c as makeViewportZoomAction, l as viewportZoomAction };
|
|
142
|
+
|
|
143
|
+
//# sourceMappingURL=viewportZoom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewportZoom.js","names":["KEY_STEP","keyAnchor","size","view","makeViewportZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","wheelSpec","rawAnimate","animateRest","tweenOpts","deps","debug","current","record","wx","wy","screenToWorld","anchor","viewToTransform","from","to","kind","params","canAnimate","stepTo","target","ms","stepFrom","focal","scaleBy","factor","next","zoomAt","wheelZoomFactor","resetMs","viewportZoomAction"],"sources":["../../../../src/interactions/actions/defaults/viewportZoom.ts"],"sourcesContent":["/**\n * `viewportZoomAction` — immediate Action descriptor for viewport zoom.\n *\n * ## Bindings (parametric — each passes `params.kind`)\n * - `{ kind: 'wheel', mods: { mod: true } }` → Cmd+wheel, params: `{ kind: 'wheel' }`\n * - `{ kind: 'wheel', mods: { ctrl: true } }` → trackpad pinch, params: `{ kind: 'wheel' }`.\n * Browsers synthesize a trackpad pinch as ctrl+wheel. On a Mac that is a\n * *different* event from the `mod` binding above (`mod` is metaKey there), so\n * pinch needs its own binding or nothing claims it and the page zooms instead.\n * - `{ kind: 'pinch' }` → Safari trackpad pinch (WebKit `gesturechange`),\n * params: `{ kind: 'pinch' }`. Safari may send the same pinch as ctrl+wheel\n * as well; the dispatcher swallows that copy while a claimed gesture is live,\n * so only one of the two bindings fires per pinch.\n * - `{ kind: 'key', key: '=' }` → zoom in, params: `{ kind: 'in' }`\n * - `{ kind: 'key', key: '-' }` → zoom out, params: `{ kind: 'out' }`\n * - `{ kind: 'key', key: '0' }` → reset zoom, params: `{ kind: 'reset' }`\n *\n * ## Design notes\n * The invoker switches on `params.kind`:\n * - `'wheel'` and `'pinch'`: both reduce to a scale factor about a focal\n * point and share one `zoomAt` call. A wheel sample's factor is\n * `wheelZoomFactor(deltaY)`, the kit's one statement of the wheel\n * convention; a pinch sample carries its factor as `scale`. The dispatcher\n * merges event data into params and converts client coords to canvas-local\n * (subtracting the canvas's bounding rect) before merging — `zoomAt`\n * expects canvas-local.\n * - `'in'`/`'out'`: step zoom by ×1.25 / ×0.8, anchored at the host center\n * when the `view` dep wires `hostSize()` (SceneCanvas does), falling back\n * to the canvas top-left origin for consumers that don't.\n * - `'reset'`: resets scale to 1, translation to 0, or calls the `view` dep's\n * `recenter()`.\n *\n * The three discrete branches glide instead of jumping when the `animate`\n * option is configured and the `view` dep implements `animate` — they hand the\n * action a target and nothing in between, which is the whole condition for\n * tweening. `'wheel'` and `'pinch'` always jump per sample.\n *\n * ## Key binding modifier notes\n * The key bindings (`=`, `-`, `0`) require `mod: true` (Cmd on Mac, Ctrl elsewhere).\n * This matches the behaviour of the dissolved `useKeyboardZoomTool`.\n */\n\nimport type { Action, DebugSink } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { zoomAt } from 'core/viewport/zoomAt';\nimport { wheelZoomFactor } from 'core/viewport/wheelHandler';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\nimport { viewToTransform, type View } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport type { ViewAnimationOptions } from 'core/viewport/useViewAnimation';\n\n// Multiplicative step for keyboard zoom (matches useKeyboardZoomTool default).\nconst KEY_STEP = 1.25;\n\n/** Keyboard-zoom anchor: the host center when the view dep can measure it,\n * else the canvas top-left origin (see design notes). */\nfunction keyAnchor(view: ViewApi): { x: number; y: number } {\n const size = view.hostSize?.();\n return size ? { x: size.width / 2, y: size.height / 2 } : { x: 0, y: 0 };\n}\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Tuning for the animated form of the discrete zoom steps.\n */\nexport interface ViewportZoomAnimateOptions extends ViewAnimationOptions {\n /** Duration for the Cmd+0 reset branch. Defaults to `ms`. */\n resetMs?: number;\n}\n\n/**\n * @experimental\n * Tuning for {@link makeViewportZoomAction}.\n */\nexport interface ViewportZoomOptions {\n /**\n * Which wheel gesture triggers zoom.\n * - `'mod'` (default): Cmd/Ctrl+wheel — coexists with plain-wheel pan\n * (`viewport.wheelPan`). A Mac trackpad pinch arrives as ctrl+wheel, which\n * `mod: true` forbids on Mac; nothing here handles it.\n * - `'plain'`: bare wheel, no modifier. Pair with `viewport.pan: false`,\n * since plain wheel otherwise drives pan and the two would compete.\n */\n wheel?: 'plain' | 'mod';\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n /**\n * Glide the discrete steps (Cmd+=, Cmd+-, Cmd+0) instead of jumping.\n * `true` uses the kit defaults; an object tunes them. Wheel and pinch never\n * animate — their input already samples every frame. Requires a `view` dep\n * that implements `animate`; without one this is ignored.\n */\n animate?: boolean | ViewportZoomAnimateOptions;\n}\n\n/**\n * @experimental\n * Build a `viewport.zoom` Action descriptor with a configurable wheel trigger\n * and scale clamp. The keyboard bindings (Cmd+=/-/0) are fixed; only the wheel\n * binding and the `zoomAt` clamp vary.\n *\n * Requires dep-schema entry: `view`.\n */\nexport function makeViewportZoomAction(\n opts: ViewportZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n // 'plain': bare wheel (omitting `mods` forbids any modifier — see the\n // matcher's strict modifier check). 'mod': Cmd/Ctrl+wheel.\n const wheelSpec =\n opts.wheel === 'plain'\n ? { kind: 'wheel' as const }\n : { kind: 'wheel' as const, mods: { mod: true } };\n\n const rawAnimate: ViewportZoomAnimateOptions | null =\n opts.animate === true ? {} : (opts.animate || null);\n const { resetMs, ...animateRest } = rawAnimate ?? {};\n const tweenOpts: ViewAnimationOptions | null = rawAnimate ? animateRest : null;\n\n return {\n id: 'viewport.zoom',\n label: 'Zoom',\n group: 'viewport',\n defaultBinding: [\n // wheel → wheel zoom (mod-gated by default; plain when configured)\n {\n spec: wheelSpec,\n opts: { params: { kind: 'wheel' } },\n },\n // Trackpad pinch, which the browser delivers as ctrl+wheel. Distinct from\n // the `mod` binding on mac; a duplicate of it elsewhere, where `matchBest`\n // picks a single winner. `viewport.wheelPan` forbids ctrl, so no contest.\n {\n spec: { kind: 'wheel' as const, mods: { ctrl: true } },\n opts: { params: { kind: 'wheel' } },\n },\n // Safari's trackpad pinch, reported as a scale rather than a wheel.\n {\n spec: { kind: 'pinch' as const },\n opts: { params: { kind: 'pinch' } },\n },\n // Cmd+= → zoom in (also accepts Cmd+Shift+= which is Cmd++ on many keyboards)\n {\n spec: { kind: 'key', key: '=', mods: { mod: true, shift: 'optional' } },\n opts: { params: { kind: 'in' } },\n },\n // Cmd+- → zoom out\n {\n spec: { kind: 'key', key: '-', mods: { mod: true } },\n opts: { params: { kind: 'out' } },\n },\n // Cmd+0 → reset zoom\n {\n spec: { kind: 'key', key: '0', mods: { mod: true } },\n opts: { params: { kind: 'reset' } },\n },\n ],\n requires: ['view', 'debug'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const view = deps.view as ViewApi | undefined;\n if (!view) return;\n const debug = deps.debug as DebugSink | undefined;\n const current = view.get();\n // Report a zoom about `anchor` (canvas-local px) from `from` to `to`.\n const record = (from: View, to: View, anchor: { x: number; y: number }) => {\n if (!debug) return;\n const [wx, wy] = screenToWorld(anchor.x, anchor.y, viewToTransform(from));\n debug.recordViewport('zoom', from, to, { x: wx, y: wy });\n };\n const kind = params?.kind as string | undefined;\n\n const canAnimate = tweenOpts !== null && typeof view.animate === 'function';\n const stepTo = (target: View, ms?: number) => {\n if (!canAnimate) { view.set(target); return; }\n view.animate!(target, { ...tweenOpts!, ms: ms ?? tweenOpts!.ms });\n };\n // Successive presses compound off where the camera is heading, not off\n // whichever frame the tween happens to be on.\n const stepFrom = (): View => (canAnimate && view.animationTarget?.()) || current;\n\n const focal = () => ({\n x: (params?.clientX as number | undefined) ?? 0,\n y: (params?.clientY as number | undefined) ?? 0,\n });\n const scaleBy = (factor: number) => {\n if (!(factor > 0) || !Number.isFinite(factor)) return;\n const next = zoomAt(current, focal(), factor, clamp);\n view.set(next);\n record(current, next, focal());\n };\n\n switch (kind) {\n case 'wheel':\n scaleBy(wheelZoomFactor((params?.deltaY as number | undefined) ?? 0));\n break;\n case 'pinch':\n scaleBy((params?.scale as number | undefined) ?? Number.NaN);\n break;\n case 'in':\n case 'out': {\n const from = stepFrom();\n const target = zoomAt(from, keyAnchor(view), kind === 'in' ? KEY_STEP : 1 / KEY_STEP, clamp);\n stepTo(target);\n record(from, target, keyAnchor(view));\n break;\n }\n case 'reset': {\n // Prefer the consumer-supplied recenter when available — typically\n // re-fits the document page into the workspace. A recenter that\n // returns its target can be animated; one that returns nothing\n // dispatched the view itself and is already done.\n const target = view.recenter\n ? view.recenter()\n : { x: 0, y: 0, scale: { x: 1, y: 1 } };\n if (target) stepTo(target, resetMs);\n break;\n }\n default:\n // Unknown kind — no-op. Legacy bridge calls with params=undefined;\n // default to zoom-in as a sensible fallback.\n if (params === undefined) {\n view.set(zoomAt(current, { x: 0, y: 0 }, KEY_STEP, clamp));\n }\n break;\n }\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.zoom` descriptor: Cmd/Ctrl+wheel zoom with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makeViewportZoomAction()`.\n *\n * Requires dep-schema entry: `view`.\n */\nexport const viewportZoomAction: Action & { requires: string[] } = makeViewportZoomAction();\n"],"mappings":";;;;;;AAoDA,IAAMA,IAAW;AAIjB,SAASC,EAAU,GAAyC;CAC1D,IAAMC,IAAOC,EAAK,WAAW;CAC7B,OAAOD,IAAO;EAAE,GAAGA,EAAK,QAAQ;EAAG,GAAGA,EAAK,SAAS;CAAE,IAAI;EAAE,GAAG;EAAG,GAAG;CAAE;AACzE;AAiDA,SAAgBE,EACd,IAA4B,CAAC,GACI;CACjC,IAAMC,IAAQ;EAAE,KAAKC,EAAK,OAAOC;EAAkB,KAAKD,EAAK,OAAOE;CAAiB,GAG/EC,IACJH,EAAK,UAAU,UACX,EAAE,MAAM,QAAiB,IACzB;EAAE,MAAM;EAAkB,MAAM,EAAE,KAAK,GAAK;CAAE,GAE9CI,IACJJ,EAAK,YAAY,KAAO,CAAC,IAAKA,EAAK,WAAW,MAC1C,EAAE,YAAS,GAAGK,MAAgBD,KAAc,CAAC,GAC7CE,IAAyCF,IAAaC,IAAc;CAE1E,OAAO;EACL,IAAI;EACJ,OAAO;EACP,OAAO;EACP,gBAAgB;GAEd;IACE,MAAMF;IACN,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,EAAE;GACpC;GAIA;IACE,MAAM;KAAE,MAAM;KAAkB,MAAM,EAAE,MAAM,GAAK;IAAE;IACrD,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,EAAE;GACpC;GAEA;IACE,MAAM,EAAE,MAAM,QAAiB;IAC/B,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,EAAE;GACpC;GAEA;IACE,MAAM;KAAE,MAAM;KAAO,KAAK;KAAK,MAAM;MAAE,KAAK;MAAM,OAAO;KAAW;IAAE;IACtE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,EAAE;GACjC;GAEA;IACE,MAAM;KAAE,MAAM;KAAO,KAAK;KAAK,MAAM,EAAE,KAAK,GAAK;IAAE;IACnD,MAAM,EAAE,QAAQ,EAAE,MAAM,MAAM,EAAE;GAClC;GAEA;IACE,MAAM;KAAE,MAAM;KAAO,KAAK;KAAK,MAAM,EAAE,KAAK,GAAK;IAAE;IACnD,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,EAAE;GACpC;EACF;EACA,UAAU,CAAC,QAAQ,OAAO;EAC1B,SAAS;GACP,QAAQ;GACR,IAAI,GAAM,GAAQ;IAChB,IAAMN,IAAOU,EAAK;IAClB,IAAI,CAACV,GAAM;IACX,IAAMW,IAAQD,EAAK,OACbE,IAAUZ,EAAK,IAAI,GAEnBa,KAAU,GAAY,GAAU,MAAqC;KACzE,IAAI,CAACF,GAAO;KACZ,IAAM,CAACG,GAAIC,KAAMC,EAAcC,EAAO,GAAGA,EAAO,GAAGC,EAAgBC,CAAI,CAAC;KACxE,EAAM,eAAe,QAAQA,GAAMC,GAAI;MAAE,GAAGN;MAAI,GAAGC;KAAG,CAAC;IACzD,GACMM,IAAOC,GAAQ,MAEfC,IAAad,MAAc,QAAQ,OAAOT,EAAK,WAAY,YAC3DwB,KAAU,GAAc,MAAgB;KAC5C,IAAI,CAACD,GAAY;MAAE,EAAK,IAAIE,CAAM;MAAG;KAAQ;KAC7C,EAAK,QAASA,GAAQ;MAAE,GAAGhB;MAAY,IAAIiB,KAAMjB,EAAW;KAAG,CAAC;IAClE,GAGMkB,UAAwBJ,KAAcvB,EAAK,kBAAkB,KAAMY,GAEnEgB,WAAe;KACnB,GAAIN,GAAQ,WAAkC;KAC9C,GAAIA,GAAQ,WAAkC;IAChD,IACMO,KAAW,MAAmB;KAClC,IAAI,EAAEC,IAAS,MAAM,CAAC,OAAO,SAASA,CAAM,GAAG;KAC/C,IAAMC,IAAOC,EAAOpB,GAASgB,EAAM,GAAGE,GAAQ5B,CAAK;KAEnD,AADAF,EAAK,IAAI+B,CAAI,GACblB,EAAOD,GAASmB,GAAMH,EAAM,CAAC;IAC/B;IAEA,QAAQP,GAAR;KACE,KAAK;MACH,EAAQY,EAAiBX,GAAQ,UAAiC,CAAC,CAAC;MACpE;KACF,KAAK;MACH,EAASA,GAAQ,SAAgC,GAAU;MAC3D;KACF,KAAK;KACL,KAAK,OAAO;MACV,IAAMH,IAAOQ,EAAS,GAChBF,IAASO,EAAOb,GAAMrB,EAAUE,CAAI,GAAGqB,MAAS,OAAOxB,IAAW,IAAIA,GAAUK,CAAK;MAE3F,AADAsB,EAAOC,CAAM,GACbZ,EAAOM,GAAMM,GAAQ3B,EAAUE,CAAI,CAAC;MACpC;KACF;KACA,KAAK,SAAS;MAKZ,IAAMyB,IAASzB,EAAK,WAChBA,EAAK,SAAS,IACd;OAAE,GAAG;OAAG,GAAG;OAAG,OAAO;QAAE,GAAG;QAAG,GAAG;OAAE;MAAE;MACxC,AAAIyB,KAAQD,EAAOC,GAAQS,CAAO;MAClC;KACF;KACA,SAGE,AAAIZ,MAAW,KAAA,KACbtB,EAAK,IAAIgC,EAAOpB,GAAS;MAAE,GAAG;MAAG,GAAG;KAAE,GAAGf,GAAUK,CAAK,CAAC;IAG/D;GACF;EACF;EACA,eAAe;CACjB;AACF;AASA,IAAaiC,IAAsDlC,EAAuB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { IDENTITY_POSE_COMPOSITION as e } from "../../../core/scene/composeFrame.js";
|
|
2
|
+
import { createTransformOp as t } from "../../../core/ops/transform.js";
|
|
3
|
+
import { RECT_POSE_DESCRIPTOR as n, translatePoseViaDescriptor as r, visualBoundsViaDescriptor as i } from "../../../core/geometry/poseDescriptor.js";
|
|
4
|
+
import { poseFrame as a } from "../poseFrame.js";
|
|
5
|
+
import { dispatchApplyBatch as o } from "../../../core/applyOps.js";
|
|
6
|
+
import { planDistribute as s } from "./plan.js";
|
|
7
|
+
import { useCallback as c } from "react";
|
|
8
|
+
import { useLatest as l } from "@weasel-js/react";
|
|
9
|
+
//#region src/interactions/actions/distribute/distribute.ts
|
|
10
|
+
function u(u, d = {}) {
|
|
11
|
+
let f = l(u), p = l(d);
|
|
12
|
+
return { distribute: c((c, l) => {
|
|
13
|
+
let u = f.current, d = p.current, m = u.getSelection();
|
|
14
|
+
if (m.length < 3) return;
|
|
15
|
+
let h = d.geometry ?? n, g = l ?? d.defaultMode ?? "centers", _ = a({
|
|
16
|
+
getPose: (e) => u.getPose(e),
|
|
17
|
+
getParent: (e) => u.getParent?.(e) ?? null
|
|
18
|
+
}, d.composition ?? e), v = m.map((e) => {
|
|
19
|
+
let t = _.world(e);
|
|
20
|
+
return {
|
|
21
|
+
id: e,
|
|
22
|
+
pose: t,
|
|
23
|
+
b: i(t, h)
|
|
24
|
+
};
|
|
25
|
+
}), y = s(v.map((e) => e.b), c, g), b = [];
|
|
26
|
+
for (let e = 0; e < v.length; e++) {
|
|
27
|
+
let n = v[e], i = y[e] - (c === "x" ? n.b.x : n.b.y);
|
|
28
|
+
if (i === 0) continue;
|
|
29
|
+
let a = c === "x" ? i : 0, o = c === "y" ? i : 0, s = r(n.pose, a, o, h);
|
|
30
|
+
b.push(t({
|
|
31
|
+
id: n.id,
|
|
32
|
+
from: u.getPose(n.id),
|
|
33
|
+
to: _.local(n.id, s)
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
b.length !== 0 && o(u, b, d.label ?? "Distribute");
|
|
37
|
+
}, [f, p]) };
|
|
38
|
+
}
|
|
39
|
+
//#endregion
|
|
40
|
+
export { u as useDistribute };
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=distribute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribute.js","names":["useDistribute","adapterRef","useLatest","adapter","optsRef","options","useCallback","a","o","sel","geom","RECT_POSE_DESCRIPTOR","m","mode","frame","poseFrame","id","IDENTITY_POSE_COMPOSITION","items","pose","visualBoundsViaDescriptor","targets","planDistribute","it","axis","ops","i","delta","dx","dy","to","translatePoseViaDescriptor","createTransformOp","dispatchApplyBatch"],"sources":["../../../../src/interactions/actions/distribute/distribute.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport type { NodeId } from 'core/scene/types';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../resize/geometry';\nimport { translatePoseViaDescriptor, visualBoundsViaDescriptor } from '../align/align';\nimport { planDistribute } from './plan';\nimport { poseFrame } from '../poseFrame';\nimport { IDENTITY_POSE_COMPOSITION, type PoseComposition } from 'features/groups/composePose';\n\n/** Axis along which selection is distributed. `'x'` spreads horizontally. */\nexport type DistributeAxis = 'x' | 'y';\n\n/** `'centers'` spaces centers equally; `'gaps'` makes the gap between\n * consecutive items equal. Both measure a rotated item by its ink extent.\n * Endpoints stay put in both modes. */\nexport type DistributeMode = 'centers' | 'gaps';\n\n/** Adapter for `useDistribute`. */\nexport interface DistributeAdapter<TPose> {\n getSelection(): NodeId[];\n /** The pose as stored — local to the node's parent. */\n getPose(id: NodeId): TPose;\n /** The parent chain, for a scene whose container poses define a frame.\n * Omit it (or leave `composition` unset) for an absolute-pose scene. */\n getParent?(id: NodeId): NodeId | null;\n applyOps?(ops: Op[], label?: string): void;\n}\n\n/** Options for `useDistribute`. */\nexport interface UseDistributeOptions<TPose> {\n /** Projection between `TPose` and bounds. Defaults to `RECT_POSE_DESCRIPTOR`\n * for `{x,y,width,height}` poses. */\n geometry?: PoseDescriptor<TPose>;\n /** Default mode when `distribute(axis)` is called without one. Default 'centers'. */\n defaultMode?: DistributeMode;\n /** Label passed to applyOps. Default 'Distribute'. */\n label?: string;\n /** How local poses fold up to world. Default IDENTITY, where the two are\n * the same value and the spread runs entirely in stored coordinates. */\n composition?: PoseComposition<TPose>;\n}\n\n/** Return shape of `useDistribute`. */\nexport interface UseDistributeReturn {\n /** Imperative trigger. No-op when fewer than 3 items selected. */\n distribute(axis: DistributeAxis, mode?: DistributeMode): void;\n}\n\n/** Distribute the current multi-selection along `axis`. Requires ≥3 items;\n * no-op otherwise. Endpoints (min and max along the axis) stay put; the\n * remaining items are repositioned. Single batch — one undo step.\n *\n * The span being divided is a world span: bounds are measured and translated\n * in world, and each result is stored back in its own parent's frame. */\nexport function useDistribute<TPose>(\n adapter: DistributeAdapter<TPose>,\n options: UseDistributeOptions<TPose> = {},\n): UseDistributeReturn {\n const adapterRef = useLatest(adapter);\n const optsRef = useLatest(options);\n\n const distribute = useCallback((axis: DistributeAxis, mode?: DistributeMode): void => {\n const a = adapterRef.current;\n const o = optsRef.current;\n const sel = a.getSelection();\n if (sel.length < 3) return;\n const geom =\n o.geometry ??\n (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>);\n const m = mode ?? o.defaultMode ?? 'centers';\n\n const frame = poseFrame<TPose>(\n {\n getPose: (id) => a.getPose(id as NodeId),\n getParent: (id) => (a.getParent?.(id as NodeId) ?? null) as string | null,\n },\n o.composition ?? (IDENTITY_POSE_COMPOSITION as PoseComposition<TPose>),\n );\n const items = sel.map((id) => {\n const pose = frame.world(id);\n return { id, pose, b: visualBoundsViaDescriptor(pose, geom) };\n });\n const targets = planDistribute(items.map((it) => it.b), axis, m);\n\n const ops: Op[] = [];\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const delta = targets[i] - (axis === 'x' ? it.b.x : it.b.y);\n if (delta === 0) continue;\n const dx = axis === 'x' ? delta : 0;\n const dy = axis === 'y' ? delta : 0;\n const to = translatePoseViaDescriptor(it.pose, dx, dy, geom);\n ops.push(createTransformOp<TPose>({\n id: it.id,\n from: a.getPose(it.id),\n to: frame.local(it.id, to),\n }));\n }\n if (ops.length === 0) return;\n dispatchApplyBatch(a, ops, o.label ?? 'Distribute');\n }, [adapterRef, optsRef]);\n\n return { distribute };\n}\n"],"mappings":";;;;;;;;;AAyDA,SAAgBA,EACd,GACA,IAAuC,CAAC,GACnB;CACrB,IAAMC,IAAaC,EAAUC,CAAO,GAC9BC,IAAUF,EAAUG,CAAO;CA2CjC,OAAO,EAAE,YAzCUC,GAAa,GAAsB,MAAgC;EACpF,IAAMC,IAAIN,EAAW,SACfO,IAAIJ,EAAQ,SACZK,IAAMF,EAAE,aAAa;EAC3B,IAAIE,EAAI,SAAS,GAAG;EACpB,IAAMC,IACJF,EAAE,YACDG,GACGC,IAAIC,KAAQL,EAAE,eAAe,WAE7BM,IAAQC,EACZ;GACE,UAAU,MAAOR,EAAE,QAAQS,CAAY;GACvC,YAAY,MAAQT,EAAE,YAAYS,CAAY,KAAK;EACrD,GACAR,EAAE,eAAgBS,CACpB,GACMC,IAAQT,EAAI,KAAK,MAAO;GAC5B,IAAMU,IAAOL,EAAM,MAAME,CAAE;GAC3B,OAAO;IAAE;IAAI;IAAM,GAAGI,EAA0BD,GAAMT,CAAI;GAAE;EAC9D,CAAC,GACKW,IAAUC,EAAeJ,EAAM,KAAK,MAAOK,EAAG,CAAC,GAAGC,GAAMZ,CAAC,GAEzDa,IAAY,CAAC;EACnB,KAAK,IAAIC,IAAI,GAAGA,IAAIR,EAAM,QAAQ,KAAK;GACrC,IAAMK,IAAKL,EAAMQ,IACXC,IAAQN,EAAQK,MAAMF,MAAS,MAAMD,EAAG,EAAE,IAAIA,EAAG,EAAE;GACzD,IAAII,MAAU,GAAG;GACjB,IAAMC,IAAKJ,MAAS,MAAMG,IAAQ,GAC5BE,IAAKL,MAAS,MAAMG,IAAQ,GAC5BG,IAAKC,EAA2BR,EAAG,MAAMK,GAAIC,GAAInB,CAAI;GAC3D,EAAI,KAAKsB,EAAyB;IAChC,IAAIT,EAAG;IACP,MAAMhB,EAAE,QAAQgB,EAAG,EAAE;IACrB,IAAIT,EAAM,MAAMS,EAAG,IAAIO,CAAE;GAC3B,CAAC,CAAC;EACJ;EACA,AAAIL,EAAI,WAAW,KACnBQ,EAAmB1B,GAAGkB,GAAKjB,EAAE,SAAS,YAAY;CACpD,GAAG,CAACP,GAAYG,CAAO,CAEd,EAAW;AACtB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/interactions/actions/distribute/plan.ts
|
|
2
|
+
function e(e, t, n) {
|
|
3
|
+
let r = (e) => t === "x" ? e.x : e.y, i = (e) => t === "x" ? e.width : e.height, a = (e) => r(e) + i(e) / 2, o = e.map((e, t) => ({
|
|
4
|
+
b: e,
|
|
5
|
+
i: t
|
|
6
|
+
})).sort((e, t) => r(e.b) - r(t.b)), s = o.length, c = Array(s);
|
|
7
|
+
if (s === 0) return c;
|
|
8
|
+
let l = o[0].b, u = o[s - 1].b;
|
|
9
|
+
if (n === "centers") {
|
|
10
|
+
let e = a(l), t = (a(u) - e) / (s - 1);
|
|
11
|
+
for (let n = 0; n < s; n++) {
|
|
12
|
+
let { b: r, i: a } = o[n];
|
|
13
|
+
c[a] = e + t * n - i(r) / 2;
|
|
14
|
+
}
|
|
15
|
+
return c;
|
|
16
|
+
}
|
|
17
|
+
let d = r(u) + i(u) - r(l), f = 0;
|
|
18
|
+
for (let { b: e } of o) f += i(e);
|
|
19
|
+
let p = (d - f) / (s - 1), m = r(l);
|
|
20
|
+
for (let e = 0; e < s; e++) {
|
|
21
|
+
let { b: t, i: n } = o[e];
|
|
22
|
+
c[n] = m, m += i(t) + p;
|
|
23
|
+
}
|
|
24
|
+
return c;
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { e as planDistribute };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","names":["planDistribute","min","axis","b","size","center","order","bounds","p","q","n","targets","first","last","mode","c0","stride","i","orig","span","sumSizes","gap","cursor"],"sources":["../../../../src/interactions/actions/distribute/plan.ts"],"sourcesContent":["import type { DistributeAxis, DistributeMode } from './distribute';\n\n/** Axis-aligned box a distribute plan is computed from. Pass the *visual*\n * bounds (`visualBoundsViaDescriptor`) — a rotated shape's ink is wider than\n * the box it was posed in, and both the stride and the gap divide by size. */\nexport interface DistributeBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * Where each box's min edge along `axis` should land. Result is parallel to\n * `bounds`. The two extreme boxes stay put in both modes; `'centers'` spaces\n * centers evenly between them, `'gaps'` spaces the empty runs evenly.\n *\n * Callers translate by `target - currentMin`, so the plan is expressed in the\n * same frame as the bounds it was given.\n */\nexport function planDistribute(\n bounds: readonly DistributeBounds[],\n axis: DistributeAxis,\n mode: DistributeMode,\n): number[] {\n const min = (b: DistributeBounds): number => (axis === 'x' ? b.x : b.y);\n const size = (b: DistributeBounds): number => (axis === 'x' ? b.width : b.height);\n const center = (b: DistributeBounds): number => min(b) + size(b) / 2;\n\n const order = bounds.map((b, i) => ({ b, i })).sort((p, q) => min(p.b) - min(q.b));\n const n = order.length;\n const targets = new Array<number>(n);\n if (n === 0) return targets;\n const first = order[0].b;\n const last = order[n - 1].b;\n\n if (mode === 'centers') {\n const c0 = center(first);\n const stride = (center(last) - c0) / (n - 1);\n for (let i = 0; i < n; i++) {\n const { b, i: orig } = order[i];\n targets[orig] = c0 + stride * i - size(b) / 2;\n }\n return targets;\n }\n\n const span = (min(last) + size(last)) - min(first);\n let sumSizes = 0;\n for (const { b } of order) sumSizes += size(b);\n const gap = (span - sumSizes) / (n - 1);\n let cursor = min(first);\n for (let i = 0; i < n; i++) {\n const { b, i: orig } = order[i];\n targets[orig] = cursor;\n cursor += size(b) + gap;\n }\n return targets;\n}\n"],"mappings":";AAoBA,SAAgBA,EACd,GACA,GACA,GACU;CACV,IAAMC,KAAO,MAAiCC,MAAS,MAAMC,EAAE,IAAIA,EAAE,GAC/DC,KAAQ,MAAiCF,MAAS,MAAMC,EAAE,QAAQA,EAAE,QACpEE,KAAU,MAAgCJ,EAAIE,CAAC,IAAIC,EAAKD,CAAC,IAAI,GAE7DG,IAAQC,EAAO,KAAK,GAAG,OAAO;EAAE;EAAG;CAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAMN,EAAIO,EAAE,CAAC,IAAIP,EAAIQ,EAAE,CAAC,CAAC,GAC3EC,IAAIJ,EAAM,QACVK,IAAc,MAAcD,CAAC;CACnC,IAAIA,MAAM,GAAG,OAAOC;CACpB,IAAMC,IAAQN,EAAM,EAAE,CAAC,GACjBO,IAAOP,EAAMI,IAAI,EAAE,CAAC;CAE1B,IAAII,MAAS,WAAW;EACtB,IAAMC,IAAKV,EAAOO,CAAK,GACjBI,KAAUX,EAAOQ,CAAI,IAAIE,MAAOL,IAAI;EAC1C,KAAK,IAAIO,IAAI,GAAGA,IAAIP,GAAG,KAAK;GAC1B,IAAM,EAAE,MAAG,GAAGQ,MAASZ,EAAMW;GAC7B,EAAQC,KAAQH,IAAKC,IAASC,IAAIb,EAAKD,CAAC,IAAI;EAC9C;EACA,OAAOQ;CACT;CAEA,IAAMQ,IAAQlB,EAAIY,CAAI,IAAIT,EAAKS,CAAI,IAAKZ,EAAIW,CAAK,GAC7CQ,IAAW;CACf,KAAK,IAAM,EAAE,UAAOd,GAAO,KAAYF,EAAKD,CAAC;CAC7C,IAAMkB,KAAOF,IAAOC,MAAaV,IAAI,IACjCY,IAASrB,EAAIW,CAAK;CACtB,KAAK,IAAIK,IAAI,GAAGA,IAAIP,GAAG,KAAK;EAC1B,IAAM,EAAE,MAAG,GAAGQ,MAASZ,EAAMW;EAE7B,AADA,EAAQC,KAAQI,GAChB,KAAUlB,EAAKD,CAAC,IAAIkB;CACtB;CACA,OAAOV;AACT"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PATH_C as e, PATH_L as t, PATH_M as n, PATH_Q as r, PATH_Z as i, forEachSegment as a } from "@weasel-js/geom";
|
|
2
|
+
//#region src/interactions/actions/edit-anchors/geometry.ts
|
|
3
|
+
function o(o) {
|
|
4
|
+
let { commands: s, coords: c } = o, l = [], u = null, d = (e, t) => {
|
|
5
|
+
let n = {
|
|
6
|
+
anchorIndex: l.length,
|
|
7
|
+
x: c[e],
|
|
8
|
+
y: c[e + 1],
|
|
9
|
+
coordIndex: e,
|
|
10
|
+
...t ? { controlIn: t } : {}
|
|
11
|
+
};
|
|
12
|
+
l.push(n), u = n;
|
|
13
|
+
};
|
|
14
|
+
return a(s, c, (a, o) => {
|
|
15
|
+
switch (a) {
|
|
16
|
+
case n:
|
|
17
|
+
case t:
|
|
18
|
+
d(o);
|
|
19
|
+
break;
|
|
20
|
+
case e:
|
|
21
|
+
u && (u.controlOut = {
|
|
22
|
+
x: c[o],
|
|
23
|
+
y: c[o + 1],
|
|
24
|
+
coordIndex: o
|
|
25
|
+
}), d(o + 4, {
|
|
26
|
+
x: c[o + 2],
|
|
27
|
+
y: c[o + 3],
|
|
28
|
+
coordIndex: o + 2
|
|
29
|
+
});
|
|
30
|
+
break;
|
|
31
|
+
case r:
|
|
32
|
+
u && (u.controlOut = {
|
|
33
|
+
x: c[o],
|
|
34
|
+
y: c[o + 1],
|
|
35
|
+
coordIndex: o
|
|
36
|
+
}), d(o + 2, {
|
|
37
|
+
x: c[o],
|
|
38
|
+
y: c[o + 1],
|
|
39
|
+
coordIndex: o
|
|
40
|
+
});
|
|
41
|
+
break;
|
|
42
|
+
case i:
|
|
43
|
+
u = null;
|
|
44
|
+
break;
|
|
45
|
+
default: throw Error(`enumerateAnchors: unknown command ${a}`);
|
|
46
|
+
}
|
|
47
|
+
}), l;
|
|
48
|
+
}
|
|
49
|
+
function s(e, t, n, r) {
|
|
50
|
+
let i = new Float32Array(e.coords);
|
|
51
|
+
return i[t] = n, i[t + 1] = r, {
|
|
52
|
+
kind: "polygon",
|
|
53
|
+
commands: e.commands,
|
|
54
|
+
coords: i,
|
|
55
|
+
fillRule: e.fillRule
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { o as enumerateAnchors, s as withCoord };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometry.js","names":["enumerateAnchors","path","anchors","lastAnchor","push","a","coords","coordIndex","controlIn","forEachSegment","commands","cmd","PATH_M","PATH_L","ci","PATH_C","PATH_Q","PATH_Z","withCoord","next","x","y"],"sources":["../../../../src/interactions/actions/edit-anchors/geometry.ts"],"sourcesContent":["import { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, type PolygonPath } from '@weasel-js/geom';\n\n/** A single anchor on a `PolygonPath`, with its incoming/outgoing bezier\n * control points (when present). `coordIndex` points at the anchor's own\n * on-curve x in the `coords` array. `inCoordIndex` / `outCoordIndex` point\n * at the corresponding control x. */\nexport interface PathAnchor {\n /** Sequential anchor index in walk order (0-based). */\n anchorIndex: number;\n /** On-curve point. */\n x: number;\n y: number;\n /** Incoming control (from the previous segment, when it was C/Q). */\n controlIn?: { x: number; y: number; coordIndex: number };\n /** Outgoing control (from the next segment, when it is C/Q). */\n controlOut?: { x: number; y: number; coordIndex: number };\n /** Index of the anchor's on-curve x in `coords`. */\n coordIndex: number;\n}\n\n/** Walk a PolygonPath's command stream and yield one `PathAnchor` per\n * on-curve point. Adjacent C/Q control points are attached as\n * `controlIn`/`controlOut`. Subpath boundaries (M after a previous M or Z)\n * start fresh — the new M's anchor has no `controlIn` from a Z. */\nexport function enumerateAnchors(path: PolygonPath): PathAnchor[] {\n const { commands, coords } = path;\n const anchors: PathAnchor[] = [];\n let lastAnchor: PathAnchor | null = null;\n\n const push = (coordIndex: number, controlIn?: PathAnchor['controlIn']): void => {\n const a: PathAnchor = {\n anchorIndex: anchors.length,\n x: coords[coordIndex],\n y: coords[coordIndex + 1],\n coordIndex,\n ...(controlIn ? { controlIn } : {}),\n };\n anchors.push(a);\n lastAnchor = a;\n };\n\n forEachSegment(commands, coords, (cmd, ci) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L:\n push(ci);\n break;\n case PATH_C:\n if (lastAnchor) {\n lastAnchor.controlOut = { x: coords[ci], y: coords[ci + 1], coordIndex: ci };\n }\n push(ci + 4, { x: coords[ci + 2], y: coords[ci + 3], coordIndex: ci + 2 });\n break;\n case PATH_Q:\n if (lastAnchor) {\n lastAnchor.controlOut = { x: coords[ci], y: coords[ci + 1], coordIndex: ci };\n }\n push(ci + 2, { x: coords[ci], y: coords[ci + 1], coordIndex: ci });\n break;\n case PATH_Z:\n lastAnchor = null;\n break;\n default:\n throw new Error(`enumerateAnchors: unknown command ${cmd}`);\n }\n });\n return anchors;\n}\n\n/** Mutate `coords` in-place: write `(x, y)` at `coordIndex`, return a new\n * PolygonPath sharing the same commands but with a fresh coords buffer. */\nexport function withCoord(path: PolygonPath, coordIndex: number, x: number, y: number): PolygonPath {\n const next = new Float32Array(path.coords);\n next[coordIndex] = x;\n next[coordIndex + 1] = y;\n return { kind: 'polygon', commands: path.commands, coords: next, fillRule: path.fillRule };\n}\n\n/** Translate anchor `anchorIndex` AND its attached control handles\n * (`controlIn` / `controlOut`) by `(dx, dy)`. Used by `editAnchorsAction`\n * when the dragged affordance is the anchor itself — moving the anchor\n * without its handles would shear the surrounding bezier segments. */\nexport function translateAnchor(\n path: PolygonPath,\n anchorIndex: number,\n dx: number,\n dy: number,\n): PolygonPath {\n const anchors = enumerateAnchors(path);\n const a = anchors[anchorIndex];\n if (!a) return path;\n const next = new Float32Array(path.coords);\n // Anchor itself.\n next[a.coordIndex] += dx;\n next[a.coordIndex + 1] += dy;\n // In-handle of THIS anchor — the trailing pair of the incoming C/Q.\n if (a.controlIn) {\n next[a.controlIn.coordIndex] += dx;\n next[a.controlIn.coordIndex + 1] += dy;\n }\n // Out-handle: the leading pair of the OUTGOING C/Q. Owned by this\n // anchor's segment.\n if (a.controlOut) {\n next[a.controlOut.coordIndex] += dx;\n next[a.controlOut.coordIndex + 1] += dy;\n }\n return { kind: 'polygon', commands: path.commands, coords: next, fillRule: path.fillRule };\n}\n"],"mappings":";;AAwBA,SAAgBA,EAAiB,GAAiC;CAChE,IAAM,EAAE,aAAU,cAAWC,GACvBC,IAAwB,CAAC,GAC3BC,IAAgC,MAE9BC,KAAQ,GAAoB,MAA8C;EAC9E,IAAMC,IAAgB;GACpB,aAAaH,EAAQ;GACrB,GAAGI,EAAOC;GACV,GAAGD,EAAOC,IAAa;GACvB;GACA,GAAIC,IAAY,EAAE,aAAU,IAAI,CAAC;EACnC;EAEA,AADAN,EAAQ,KAAKG,CAAC,GACd,IAAaA;CACf;CA2BA,OAzBAI,EAAeC,GAAUJ,IAAS,GAAK,MAAO;EAC5C,QAAQK,GAAR;GACE,KAAKC;GACL,KAAKC;IACH,EAAKC,CAAE;IACP;GACF,KAAKC;IAIH,AAHIZ,MACF,EAAW,aAAa;KAAE,GAAGG,EAAOQ;KAAK,GAAGR,EAAOQ,IAAK;KAAI,YAAYA;IAAG,IAE7EV,EAAKU,IAAK,GAAG;KAAE,GAAGR,EAAOQ,IAAK;KAAI,GAAGR,EAAOQ,IAAK;KAAI,YAAYA,IAAK;IAAE,CAAC;IACzE;GACF,KAAKE;IAIH,AAHIb,MACF,EAAW,aAAa;KAAE,GAAGG,EAAOQ;KAAK,GAAGR,EAAOQ,IAAK;KAAI,YAAYA;IAAG,IAE7EV,EAAKU,IAAK,GAAG;KAAE,GAAGR,EAAOQ;KAAK,GAAGR,EAAOQ,IAAK;KAAI,YAAYA;IAAG,CAAC;IACjE;GACF,KAAKG;IACH,IAAa;IACb;GACF,SACE,MAAU,MAAM,qCAAqCN,GAAK;EAC9D;CACF,CAAC,GACMT;AACT;AAIA,SAAgBgB,EAAU,GAAmB,GAAoB,GAAW,GAAwB;CAClG,IAAMC,IAAO,IAAI,aAAalB,EAAK,MAAM;CAGzC,OAFA,EAAKM,KAAca,GACnB,EAAKb,IAAa,KAAKc,GAChB;EAAE,MAAM;EAAW,UAAUpB,EAAK;EAAU,QAAQkB;EAAM,UAAUlB,EAAK;CAAS;AAC3F"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { enumerateAnchors as e } from "./geometry.js";
|
|
2
|
+
//#region src/interactions/actions/edit-anchors/handles.ts
|
|
3
|
+
function t(t, n, r, i) {
|
|
4
|
+
let a = e(t), o = null, s = null, c = i * i;
|
|
5
|
+
for (let e of a) {
|
|
6
|
+
if (e.controlIn) {
|
|
7
|
+
let t = e.controlIn.x - n, i = e.controlIn.y - r, a = t * t + i * i;
|
|
8
|
+
a <= c && (!o || a < o.d2) && (o = {
|
|
9
|
+
d2: a,
|
|
10
|
+
hit: {
|
|
11
|
+
anchorIndex: e.anchorIndex,
|
|
12
|
+
kind: "controlIn",
|
|
13
|
+
coordIndex: e.controlIn.coordIndex
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
if (e.controlOut) {
|
|
18
|
+
let t = e.controlOut.x - n, i = e.controlOut.y - r, a = t * t + i * i;
|
|
19
|
+
a <= c && (!o || a < o.d2) && (o = {
|
|
20
|
+
d2: a,
|
|
21
|
+
hit: {
|
|
22
|
+
anchorIndex: e.anchorIndex,
|
|
23
|
+
kind: "controlOut",
|
|
24
|
+
coordIndex: e.controlOut.coordIndex
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
let t = e.x - n, i = e.y - r, a = t * t + i * i;
|
|
29
|
+
a <= c && (!s || a < s.d2) && (s = {
|
|
30
|
+
d2: a,
|
|
31
|
+
hit: {
|
|
32
|
+
anchorIndex: e.anchorIndex,
|
|
33
|
+
kind: "anchor",
|
|
34
|
+
coordIndex: e.coordIndex
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return o ? o.hit : s ? s.hit : null;
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { t as hitAnchor };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=handles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handles.js","names":["hitAnchor","anchors","enumerateAnchors","path","bestControl","bestAnchor","t2","threshold","a","dx","worldX","dy","worldY","d2"],"sources":["../../../../src/interactions/actions/edit-anchors/handles.ts"],"sourcesContent":["import type { PolygonPath } from '@weasel-js/geom';\nimport { enumerateAnchors, type PathAnchor } from './geometry';\n\n/** Result of a hit-test against a path's anchors / control handles. */\nexport interface AnchorHit {\n anchorIndex: number;\n kind: 'anchor' | 'controlIn' | 'controlOut';\n /** Index in `coords` of the hit point's x. */\n coordIndex: number;\n}\n\n/** Hit-test anchors and control handles. Controls win over anchors when both\n * are within `threshold` (controls are smaller and rendered on top). */\nexport function hitAnchor(\n path: PolygonPath,\n worldX: number,\n worldY: number,\n threshold: number,\n): AnchorHit | null {\n const anchors = enumerateAnchors(path);\n let bestControl: { d2: number; hit: AnchorHit } | null = null;\n let bestAnchor: { d2: number; hit: AnchorHit } | null = null;\n const t2 = threshold * threshold;\n\n for (const a of anchors) {\n if (a.controlIn) {\n const dx = a.controlIn.x - worldX;\n const dy = a.controlIn.y - worldY;\n const d2 = dx * dx + dy * dy;\n if (d2 <= t2 && (!bestControl || d2 < bestControl.d2)) {\n bestControl = {\n d2,\n hit: { anchorIndex: a.anchorIndex, kind: 'controlIn', coordIndex: a.controlIn.coordIndex },\n };\n }\n }\n if (a.controlOut) {\n const dx = a.controlOut.x - worldX;\n const dy = a.controlOut.y - worldY;\n const d2 = dx * dx + dy * dy;\n if (d2 <= t2 && (!bestControl || d2 < bestControl.d2)) {\n bestControl = {\n d2,\n hit: { anchorIndex: a.anchorIndex, kind: 'controlOut', coordIndex: a.controlOut.coordIndex },\n };\n }\n }\n const dx = a.x - worldX;\n const dy = a.y - worldY;\n const d2 = dx * dx + dy * dy;\n if (d2 <= t2 && (!bestAnchor || d2 < bestAnchor.d2)) {\n bestAnchor = {\n d2,\n hit: { anchorIndex: a.anchorIndex, kind: 'anchor', coordIndex: a.coordIndex },\n };\n }\n }\n if (bestControl) return bestControl.hit;\n if (bestAnchor) return bestAnchor.hit;\n return null;\n}\n\nexport type { PathAnchor };\n"],"mappings":";;AAaA,SAAgBA,EACd,GACA,GACA,GACA,GACkB;CAClB,IAAMC,IAAUC,EAAiBC,CAAI,GACjCC,IAAqD,MACrDC,IAAoD,MAClDC,IAAKC,IAAYA;CAEvB,KAAK,IAAMC,KAAKP,GAAS;EACvB,IAAIO,EAAE,WAAW;GACf,IAAMC,IAAKD,EAAE,UAAU,IAAIE,GACrBC,IAAKH,EAAE,UAAU,IAAII,GACrBC,IAAKJ,IAAKA,IAAKE,IAAKA;GAC1B,AAAIE,KAAMP,MAAO,CAACF,KAAeS,IAAKT,EAAY,QAChD,IAAc;IACZ;IACA,KAAK;KAAE,aAAaI,EAAE;KAAa,MAAM;KAAa,YAAYA,EAAE,UAAU;IAAW;GAC3F;EAEJ;EACA,IAAIA,EAAE,YAAY;GAChB,IAAMC,IAAKD,EAAE,WAAW,IAAIE,GACtBC,IAAKH,EAAE,WAAW,IAAII,GACtBC,IAAKJ,IAAKA,IAAKE,IAAKA;GAC1B,AAAIE,KAAMP,MAAO,CAACF,KAAeS,IAAKT,EAAY,QAChD,IAAc;IACZ;IACA,KAAK;KAAE,aAAaI,EAAE;KAAa,MAAM;KAAc,YAAYA,EAAE,WAAW;IAAW;GAC7F;EAEJ;EACA,IAAMC,IAAKD,EAAE,IAAIE,GACXC,IAAKH,EAAE,IAAII,GACXC,IAAKJ,IAAKA,IAAKE,IAAKA;EAC1B,AAAIE,KAAMP,MAAO,CAACD,KAAcQ,IAAKR,EAAW,QAC9C,IAAa;GACX;GACA,KAAK;IAAE,aAAaG,EAAE;IAAa,MAAM;IAAU,YAAYA,EAAE;GAAW;EAC9E;CAEJ;CAGA,OAFIJ,IAAoBA,EAAY,MAChCC,IAAmBA,EAAW,MAC3B;AACT"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/interactions/actions/flip/helpers.ts
|
|
2
|
+
function e(e, t, i, a) {
|
|
3
|
+
let o = i.getBounds(e), s = a.x + a.width / 2, c = a.y + a.height / 2, l = t === "x" ? {
|
|
4
|
+
x: 2 * s - o.x,
|
|
5
|
+
y: o.y,
|
|
6
|
+
width: -o.width,
|
|
7
|
+
height: o.height
|
|
8
|
+
} : {
|
|
9
|
+
x: o.x,
|
|
10
|
+
y: 2 * c - o.y,
|
|
11
|
+
width: o.width,
|
|
12
|
+
height: -o.height
|
|
13
|
+
}, u = i.remapBounds(e, o, l), d = i.getRotation?.(e) ?? o.rotation ?? 0;
|
|
14
|
+
return n(r(u), d, i);
|
|
15
|
+
}
|
|
16
|
+
function t(t, n, r) {
|
|
17
|
+
return e(t, n, r, r.getBounds(t));
|
|
18
|
+
}
|
|
19
|
+
function n(e, t, n) {
|
|
20
|
+
return t === 0 ? e : n.withRotation ? n.withRotation(e, -t) : e;
|
|
21
|
+
}
|
|
22
|
+
function r(e) {
|
|
23
|
+
let t = e, n = !1, r = t.x, i = t.y, a = t.width, o = t.height;
|
|
24
|
+
return typeof a == "number" && a < 0 && typeof r == "number" && (r += a, a = -a, n = !0), typeof o == "number" && o < 0 && typeof i == "number" && (i += o, o = -o, n = !0), n ? {
|
|
25
|
+
...e,
|
|
26
|
+
x: r,
|
|
27
|
+
y: i,
|
|
28
|
+
width: a,
|
|
29
|
+
height: o
|
|
30
|
+
} : e;
|
|
31
|
+
}
|
|
32
|
+
//#endregion
|
|
33
|
+
export { e as flipPoseAboutBounds, t as flipPoseViaDescriptor };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["flipPoseAboutBounds","src","geometry","pose","cxPivot","pivotBounds","cyPivot","dst","axis","next","rotation","negateRotation","normalizeNegativeExtent","flipPoseViaDescriptor","p","mutated","nx","ny","nw","nh"],"sources":["../../../../src/interactions/actions/flip/helpers.ts"],"sourcesContent":["/**\n * Pose-flip helpers used by `flipAction` (via `defaults/flip.ts`).\n *\n * These were extracted from the legacy `useFlip` hook when it was removed —\n * they remain because the descriptor-style `flipAction` still needs to reflect\n * arbitrary `TPose` values through a `PoseDescriptor`.\n */\nimport type { PoseDescriptor } from '../resize/geometry';\nimport type { SpatialReference } from '../spatialReference';\n\n/** Axis for flip. `'x'` mirrors horizontally (left↔right); `'y'` mirrors vertically (top↔bottom). */\nexport type FlipAxis = 'x' | 'y';\n\n/** How a multi-selection flip chooses its pivot.\n *\n * - `'each'` — every pose mirrors about its own AABB; spatial layout of the\n * selection is unchanged, individual items are reflected in place.\n * - `'union'` — every pose mirrors about the selection's union AABB; items\n * swap sides as well as reflect, matching Illustrator/Figma defaults.\n * - a {@link SpatialReference} — every pose mirrors about the center of the\n * bounds it names: the pointer, a world point or rect, or a key node. */\nexport type FlipPivot = 'each' | 'union' | SpatialReference;\n\n/** Reflect `pose` across the centerline of `pivotBounds` along `axis`, using\n * `geometry` to read bounds and remap. The pose's own AABB is read once to\n * compute the reflected destination rect; coords inside the pose are then\n * remapped through the affine that takes its own bounds → reflected dst.\n * A rotation the pose carries is negated: a mirror reverses the sense of the\n * turn, and `remapBounds` carries the original angle through untouched. */\nexport function flipPoseAboutBounds<TPose>(\n pose: TPose,\n axis: FlipAxis,\n geometry: PoseDescriptor<TPose>,\n pivotBounds: { x: number; y: number; width: number; height: number },\n): TPose {\n const src = geometry.getBounds(pose);\n const cxPivot = pivotBounds.x + pivotBounds.width / 2;\n const cyPivot = pivotBounds.y + pivotBounds.height / 2;\n const dst = axis === 'x'\n ? { x: 2 * cxPivot - src.x, y: src.y, width: -src.width, height: src.height }\n : { x: src.x, y: 2 * cyPivot - src.y, width: src.width, height: -src.height };\n const next = geometry.remapBounds(pose, src, dst);\n const rotation = geometry.getRotation?.(pose) ?? (src as { rotation?: number }).rotation ?? 0;\n return negateRotation(normalizeNegativeExtent(next), rotation, geometry);\n}\n\n/** Reflect `pose` across the centerline of its own AABB along `axis`. */\nexport function flipPoseViaDescriptor<TPose>(\n pose: TPose,\n axis: FlipAxis,\n geometry: PoseDescriptor<TPose>,\n): TPose {\n return flipPoseAboutBounds(pose, axis, geometry, geometry.getBounds(pose));\n}\n\nfunction negateRotation<TPose>(pose: TPose, rotation: number, geometry: PoseDescriptor<TPose>): TPose {\n if (rotation === 0) return pose;\n return geometry.withRotation ? geometry.withRotation(pose, -rotation) : pose;\n}\n\nfunction normalizeNegativeExtent<TPose>(pose: TPose): TPose {\n const p = pose as unknown as { x?: number; y?: number; width?: number; height?: number };\n let mutated = false;\n let nx = p.x;\n let ny = p.y;\n let nw = p.width;\n let nh = p.height;\n if (typeof nw === 'number' && nw < 0 && typeof nx === 'number') {\n nx = nx + nw;\n nw = -nw;\n mutated = true;\n }\n if (typeof nh === 'number' && nh < 0 && typeof ny === 'number') {\n ny = ny + nh;\n nh = -nh;\n mutated = true;\n }\n if (!mutated) return pose;\n return { ...(pose as object), x: nx, y: ny, width: nw, height: nh } as TPose;\n}\n"],"mappings":";AA6BA,SAAgBA,EACd,GACA,GACA,GACA,GACO;CACP,IAAMC,IAAMC,EAAS,UAAUC,CAAI,GAC7BC,IAAUC,EAAY,IAAIA,EAAY,QAAQ,GAC9CC,IAAUD,EAAY,IAAIA,EAAY,SAAS,GAC/CE,IAAMC,MAAS,MACjB;EAAE,GAAG,IAAIJ,IAAUH,EAAI;EAAG,GAAGA,EAAI;EAAG,OAAO,CAACA,EAAI;EAAO,QAAQA,EAAI;CAAO,IAC1E;EAAE,GAAGA,EAAI;EAAG,GAAG,IAAIK,IAAUL,EAAI;EAAG,OAAOA,EAAI;EAAO,QAAQ,CAACA,EAAI;CAAO,GACxEQ,IAAOP,EAAS,YAAYC,GAAMF,GAAKM,CAAG,GAC1CG,IAAWR,EAAS,cAAcC,CAAI,KAAMF,EAA8B,YAAY;CAC5F,OAAOU,EAAeC,EAAwBH,CAAI,GAAGC,GAAUR,CAAQ;AACzE;AAGA,SAAgBW,EACd,GACA,GACA,GACO;CACP,OAAOb,EAAoBG,GAAMK,GAAMN,GAAUA,EAAS,UAAUC,CAAI,CAAC;AAC3E;AAEA,SAASQ,EAAsB,GAAa,GAAkB,GAAwC;CAEpG,OADID,MAAa,IAAUP,IACpBD,EAAS,eAAeA,EAAS,aAAaC,GAAM,CAACO,CAAQ,IAAIP;AAC1E;AAEA,SAASS,EAA+B,GAAoB;CAC1D,IAAME,IAAIX,GACNY,IAAU,IACVC,IAAKF,EAAE,GACPG,IAAKH,EAAE,GACPI,IAAKJ,EAAE,OACPK,IAAKL,EAAE;CAYX,OAXI,OAAOI,KAAO,YAAYA,IAAK,KAAK,OAAOF,KAAO,aACpD,KAAUE,GACV,IAAK,CAACA,GACN,IAAU,KAER,OAAOC,KAAO,YAAYA,IAAK,KAAK,OAAOF,KAAO,aACpD,KAAUE,GACV,IAAK,CAACA,GACN,IAAU,KAEPJ,IACE;EAAE,GAAIZ;EAAiB,GAAGa;EAAI,GAAGC;EAAI,OAAOC;EAAI,QAAQC;CAAG,IAD7ChB;AAEvB"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createSetDataOp as e } from "../../core/ops/setData.js";
|
|
2
|
+
import "@weasel-js/geom";
|
|
3
|
+
//#region src/interactions/actions/geometryProjection.ts
|
|
4
|
+
function t(t, n, r, i) {
|
|
5
|
+
if (!t || !n) return;
|
|
6
|
+
let a = t.transform(n, r);
|
|
7
|
+
if (a != null) return e({
|
|
8
|
+
id: n.id,
|
|
9
|
+
from: n.data,
|
|
10
|
+
to: a,
|
|
11
|
+
label: i,
|
|
12
|
+
coalesceKey: `setData:${n.id}`
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { t as geometryDataOp };
|
|
17
|
+
|
|
18
|
+
//# sourceMappingURL=geometryProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geometryProjection.js","names":["geometryDataOp","projection","node","next","m","createSetDataOp"],"sources":["../../../src/interactions/actions/geometryProjection.ts"],"sourcesContent":["import { type Mat3 } from '@weasel-js/geom';\nimport { createSetDataOp } from 'core/ops/setData';\nimport type { Op } from 'core/ops/types';\n\n/** Optional consumer seam: given a node and the affine `m` that a pose-transform\n * action applied to the node's POSE, return updated `data` with the node's\n * data-held geometry transformed by `m`, or `null` if this node has no\n * data-held geometry (the kit leaves `data` alone). */\nexport interface GeometryProjection {\n transform(node: { id?: string; data: unknown; pose: unknown }, m: Mat3): unknown | null;\n}\n\n/** Build the `setData` op for a node when a geometryProjection is wired and\n * returns non-null. Returns `undefined` (no op) otherwise — keeping the data\n * op strictly opt-in so adapters without `setData` are never invoked. */\nexport function geometryDataOp(\n projection: GeometryProjection | undefined,\n node: { id: string; data: unknown; pose: unknown } | undefined,\n m: Mat3,\n label: string,\n): Op | undefined {\n if (!projection || !node) return undefined;\n const next = projection.transform(node, m);\n if (next == null) return undefined;\n return createSetDataOp({ id: node.id, from: node.data, to: next, label, coalesceKey: `setData:${node.id}` });\n}\n"],"mappings":";;;AAeA,SAAgBA,EACd,GACA,GACA,GACA,GACgB;CAChB,IAAI,CAACC,KAAc,CAACC,GAAM;CAC1B,IAAMC,IAAOF,EAAW,UAAUC,GAAME,CAAC;CACzC,IAAID,KAAQ,MACZ,OAAOE,EAAgB;EAAE,IAAIH,EAAK;EAAI,MAAMA,EAAK;EAAM,IAAIC;EAAM;EAAO,aAAa,WAAWD,EAAK;CAAK,CAAC;AAC7G"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
//#region src/interactions/actions/gestureLifecycle.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
let t = {};
|
|
4
|
+
return e.label !== void 0 && (t.label = e.label), e.transient !== void 0 && (t.transient = e.transient), e.onGestureStart && (t.onGestureStart = e.onGestureStart), e.onGestureEnd && (t.onGestureEnd = e.onGestureEnd), t;
|
|
5
|
+
}
|
|
6
|
+
function t(e, t, n = []) {
|
|
7
|
+
let r = e ?? {}, i = !1, a = !1;
|
|
8
|
+
return {
|
|
9
|
+
label: r.label ?? t,
|
|
10
|
+
labelFor: (e) => r.label ?? e[0]?.label ?? t,
|
|
11
|
+
transient: r.transient ?? n.some((e) => e.defaultTransient === !0),
|
|
12
|
+
start(e) {
|
|
13
|
+
i || (i = !0, r.onGestureStart?.([...e]));
|
|
14
|
+
},
|
|
15
|
+
end(e) {
|
|
16
|
+
i && !a && (a = !0, r.onGestureEnd?.(e));
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function n(e, t, n) {
|
|
21
|
+
if (t.transient) {
|
|
22
|
+
e.scene.untracked(() => {
|
|
23
|
+
for (let t of n) t.apply(e.adapter);
|
|
24
|
+
});
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let r = t.labelFor(n);
|
|
28
|
+
e.applyOps ? e.applyOps(n, r) : e.scene.applyBatch(n, r, e.adapter);
|
|
29
|
+
}
|
|
30
|
+
function r(e, t) {
|
|
31
|
+
let n;
|
|
32
|
+
for (let r of e) {
|
|
33
|
+
let e = r.onEnd?.(t, { answered: n !== void 0 });
|
|
34
|
+
n === void 0 && e !== void 0 && (n = e);
|
|
35
|
+
}
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
function i(e, t) {
|
|
39
|
+
for (let n of e) n.onCancel?.(t);
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { n as commitGestureOps, e as gestureLifecycleParams, t as readGestureLifecycle, r as reduceBehaviorEnd, i as runBehaviorCancel };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=gestureLifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gestureLifecycle.js","names":["gestureLifecycleParams","out","o","readGestureLifecycle","source","started","ended","defaultLabel","ops","behaviors","b","ids","committed","commitGestureOps","lifecycle","op","target","label","reduceBehaviorEnd","answer","r","ctx","runBehaviorCancel"],"sources":["../../../src/interactions/actions/gestureLifecycle.ts"],"sourcesContent":["/**\n * The lifecycle the ongoing transform actions (`move`, `resize`, `rotate`)\n * share: what their committed batch is called in history, whether it is\n * recorded at all, and the callbacks fired as the gesture opens and closes.\n *\n * Move and rotate read it from their binding's params; resize reads it from\n * the `resizePolicy` dep, where the rest of its options already live.\n */\nimport type { Op } from 'core/ops/types';\nimport type { Scene } from 'core/scene/types';\nimport type { BehaviorEnd } from 'interactions/gestures/types';\n\n/** The lifecycle options, as a binding's params or the resize policy carry\n * them. */\nexport interface GestureLifecycleOptions {\n /** History label for the committed batch. Unset, the batch takes its first\n * op's label (a layout drop or a behavior names its own), else the\n * action's. */\n label?: string;\n /** Commit through `scene.untracked`: the edit lands, but no undo entry\n * records it and the consumer `applyOps` hook is bypassed. Unset, any\n * behavior's `defaultTransient: true` turns it on. */\n transient?: boolean;\n /** Fired once the gesture starts changing poses, with the ids it moves. */\n onGestureStart?(ids: string[]): void;\n /** Fired once per `onGestureStart`: `true` when the gesture wrote to the\n * document, `false` on cancel, abort, or a release with nothing to write. */\n onGestureEnd?(committed: boolean): void;\n}\n\n/** The params entries for {@link GestureLifecycleOptions}, with the unset\n * keys left out. */\nexport function gestureLifecycleParams(o: GestureLifecycleOptions): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (o.label !== undefined) out.label = o.label;\n if (o.transient !== undefined) out.transient = o.transient;\n if (o.onGestureStart) out.onGestureStart = o.onGestureStart;\n if (o.onGestureEnd) out.onGestureEnd = o.onGestureEnd;\n return out;\n}\n\n/** A gesture's resolved lifecycle. `start` and `end` fire their callbacks at\n * most once each, and `end` only after `start`. */\nexport interface GestureLifecycle {\n /** The label ops built by the action itself carry. */\n readonly label: string;\n /** The history label for committing `ops`. */\n labelFor(ops: readonly Op[]): string;\n readonly transient: boolean;\n start(ids: readonly string[]): void;\n end(committed: boolean): void;\n}\n\nexport function readGestureLifecycle(\n source: GestureLifecycleOptions | Record<string, unknown> | undefined,\n defaultLabel: string,\n behaviors: readonly { defaultTransient?: boolean }[] = [],\n): GestureLifecycle {\n const o = (source ?? {}) as GestureLifecycleOptions;\n let started = false;\n let ended = false;\n return {\n label: o.label ?? defaultLabel,\n labelFor: (ops) => o.label ?? ops[0]?.label ?? defaultLabel,\n transient: o.transient ?? behaviors.some((b) => b.defaultTransient === true),\n start(ids) {\n if (started) return;\n started = true;\n o.onGestureStart?.([...ids]);\n },\n end(committed) {\n if (!started || ended) return;\n ended = true;\n o.onGestureEnd?.(committed);\n },\n };\n}\n\n/** Commit a gesture's ops: untracked when transient, else through the\n * consumer `applyOps` hook when one is wired, else into the scene's history. */\nexport function commitGestureOps(\n target: {\n scene: Scene<unknown, string, unknown>;\n applyOps?: (ops: Op[], label: string) => void;\n adapter: unknown;\n },\n lifecycle: GestureLifecycle,\n ops: Op[],\n): void {\n if (lifecycle.transient) {\n target.scene.untracked(() => {\n for (const op of ops) op.apply(target.adapter);\n });\n return;\n }\n const label = lifecycle.labelFor(ops);\n if (target.applyOps) target.applyOps(ops, label);\n else target.scene.applyBatch(ops, label, target.adapter);\n}\n\n/** Runs every behavior's `onEnd` in order; the first that answers decides the\n * commit and later answers are ignored. `null` aborts, `Op[]` claims it (an\n * empty array included), and `undefined` means every behavior deferred to the\n * action's own commit. */\nexport function reduceBehaviorEnd<TCtx>(\n behaviors: readonly { onEnd?(ctx: TCtx, end: BehaviorEnd): Op[] | null | void }[],\n ctx: TCtx,\n): Op[] | null | undefined {\n let answer: Op[] | null | undefined;\n for (const b of behaviors) {\n const r = b.onEnd?.(ctx, { answered: answer !== undefined });\n if (answer === undefined && r !== undefined) answer = r;\n }\n return answer;\n}\n\n/** Runs every behavior's `onCancel`, for a gesture closing without a commit. */\nexport function runBehaviorCancel<TCtx>(\n behaviors: readonly { onCancel?(ctx: TCtx): void }[],\n ctx: TCtx,\n): void {\n for (const b of behaviors) b.onCancel?.(ctx);\n}\n"],"mappings":";AAgCA,SAAgBA,EAAuB,GAAqD;CAC1F,IAAMC,IAA+B,CAAC;CAKtC,OAJIC,EAAE,UAAU,KAAA,MAAW,EAAI,QAAQA,EAAE,QACrCA,EAAE,cAAc,KAAA,MAAW,EAAI,YAAYA,EAAE,YAC7CA,EAAE,mBAAgB,EAAI,iBAAiBA,EAAE,iBACzCA,EAAE,iBAAc,EAAI,eAAeA,EAAE,eAClCD;AACT;AAcA,SAAgBE,EACd,GACA,GACA,IAAuD,CAAC,GACtC;CAClB,IAAMD,IAAKE,KAAU,CAAC,GAClBC,IAAU,IACVC,IAAQ;CACZ,OAAO;EACL,OAAOJ,EAAE,SAASK;EAClB,WAAW,MAAQL,EAAE,SAASM,EAAI,EAAE,EAAE,SAASD;EAC/C,WAAWL,EAAE,aAAaO,EAAU,MAAM,MAAMC,EAAE,qBAAqB,EAAI;EAC3E,MAAM,GAAK;GACT,AAAIL,MACJ,IAAU,IACVH,EAAE,iBAAiB,CAAC,GAAGS,CAAG,CAAC;EAC7B;EACA,IAAI,GAAW;GACb,AAAKN,KAAW,OAChB,IAAQ,IACRH,EAAE,eAAeU,CAAS;EAC5B;CACF;AACF;AAIA,SAAgBC,EACd,GAKA,GACA,GACM;CACN,IAAIC,EAAU,WAAW;EACvB,EAAO,MAAM,gBAAgB;GAC3B,KAAK,IAAMC,KAAMP,GAAK,EAAG,MAAMQ,EAAO,OAAO;EAC/C,CAAC;EACD;CACF;CACA,IAAMC,IAAQH,EAAU,SAASN,CAAG;CACpC,AAAIQ,EAAO,WAAUA,EAAO,SAASR,GAAKS,CAAK,IAC1CD,EAAO,MAAM,WAAWR,GAAKS,GAAOD,EAAO,OAAO;AACzD;AAMA,SAAgBE,EACd,GACA,GACyB;CACzB,IAAIC;CACJ,KAAK,IAAMT,KAAKD,GAAW;EACzB,IAAMW,IAAIV,EAAE,QAAQW,GAAK,EAAE,UAAUF,MAAW,KAAA,EAAU,CAAC;EAC3D,AAAIA,MAAW,KAAA,KAAaC,MAAM,KAAA,MAAW,IAASA;CACxD;CACA,OAAOD;AACT;AAGA,SAAgBG,EACd,GACA,GACM;CACN,KAAK,IAAMZ,KAAKD,GAAW,EAAE,WAAWY,CAAG;AAC7C"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createSetSelectionOp as e } from "../../../../core/ops/select.js";
|
|
2
|
+
import { getScratch as t, scratchKey as n } from "@weasel-js/routing";
|
|
3
|
+
//#region src/interactions/actions/lasso-select/behaviors/selectFromLasso.ts
|
|
4
|
+
var r = n("lassoSelect.vertices"), i = 4;
|
|
5
|
+
function a(n) {
|
|
6
|
+
let a = n?.mode ?? "intersect";
|
|
7
|
+
return {
|
|
8
|
+
defaultTransient: !0,
|
|
9
|
+
onEnd(n) {
|
|
10
|
+
let c = n.adapter;
|
|
11
|
+
if (!c.getSelection || !c.hitTestLasso) return null;
|
|
12
|
+
let l = t(n.scratch, r) ?? [], u = n.origin.get("gesture"), d = u ? u.shiftHeld === !0 : !1, f = c.getSelection();
|
|
13
|
+
if (l.length < 3 || o(l) < i) return [e({
|
|
14
|
+
from: f,
|
|
15
|
+
to: d ? f : []
|
|
16
|
+
})];
|
|
17
|
+
let p = c.hitTestLasso(l, a), m = d ? s(f, p) : p;
|
|
18
|
+
return [e({
|
|
19
|
+
from: f,
|
|
20
|
+
to: m
|
|
21
|
+
})];
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function o(e) {
|
|
26
|
+
if (e.length === 0) return 0;
|
|
27
|
+
let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity;
|
|
28
|
+
for (let a of e) a.x < t && (t = a.x), a.y < n && (n = a.y), a.x > r && (r = a.x), a.y > i && (i = a.y);
|
|
29
|
+
return (r - t) * (i - n);
|
|
30
|
+
}
|
|
31
|
+
function s(e, t) {
|
|
32
|
+
let n = [...e];
|
|
33
|
+
for (let e of t) n.includes(e) || n.push(e);
|
|
34
|
+
return n;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { r as LASSO_VERTICES, a as selectFromLasso };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=selectFromLasso.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectFromLasso.js","names":["LASSO_VERTICES","scratchKey","MIN_AREA","selectFromLasso","mode","opts","adapter","ctx","vertices","getScratch","startPose","shiftHeld","from","polygonAabbArea","createSetSelectionOp","hits","to","mergeUnique","minX","minY","maxX","maxY","v","out","a","id","b"],"sources":["../../../../../src/interactions/actions/lasso-select/behaviors/selectFromLasso.ts"],"sourcesContent":["import { createSetSelectionOp } from 'core/ops/select';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId } from 'core/scene/types';\nimport type {\n LassoHitMode,\n LassoSelectAdapter,\n} from 'core/adapters/types';\nimport type { LassoSelectBehavior } from '../../../gestures/types';\nimport { scratchKey, getScratch } from '@weasel-js/routing';\n\n/** Typed scratch slot the lasso tool's gesture writes into for this behavior\n * to consume. Shared identity: tools producing the polygon for a lasso\n * selection write under this same key. */\nexport const LASSO_VERTICES = scratchKey<ReadonlyArray<{ x: number; y: number }>>('lassoSelect.vertices');\n\nconst MIN_AREA = 4;\n\n/** Options for `selectFromLasso`. */\nexport interface SelectFromLassoOptions {\n /** Hit mode for `hitTestLasso`. Default 'intersect'. */\n mode?: LassoHitMode;\n}\n\n/** A lasso behavior (`useLassoTool({ behaviors })`): replace selection with\n * polygon hits in its own `mode`, or extend the existing selection when shift\n * is held at gesture start. Tiny / degenerate lassos behave like a click —\n * clear (or preserve, with shift). Hits come from the gesture adapter's\n * `hitTestLasso`, which under `lassoSelectAction` is the `lassoSelect` dep. */\nexport function selectFromLasso(opts?: SelectFromLassoOptions): LassoSelectBehavior {\n const mode: LassoHitMode = opts?.mode ?? 'intersect';\n return {\n defaultTransient: true,\n onEnd(ctx) {\n const adapter = ctx.adapter as unknown as LassoSelectAdapter;\n if (!adapter.getSelection || !adapter.hitTestLasso) return null;\n\n const vertices = getScratch(ctx.scratch, LASSO_VERTICES) ?? [];\n const startPose = ctx.origin.get('gesture');\n const shiftHeld = startPose ? (startPose as { shiftHeld?: boolean }).shiftHeld === true : false;\n const from = adapter.getSelection();\n\n // Tiny / degenerate lassos behave like a click: clear (or preserve on shift).\n const tiny = vertices.length < 3 || polygonAabbArea(vertices) < MIN_AREA;\n if (tiny) {\n const to = shiftHeld ? from : [];\n const op: Op = createSetSelectionOp({ from: from as NodeId[], to: to as NodeId[] });\n return [op];\n }\n\n const hits = adapter.hitTestLasso(vertices, mode);\n const to = shiftHeld\n ? mergeUnique(from, hits)\n : hits;\n const op: Op = createSetSelectionOp({ from: from as NodeId[], to: to as NodeId[] });\n return [op];\n },\n };\n}\n\nfunction polygonAabbArea(vertices: ReadonlyArray<{ x: number; y: number }>): number {\n if (vertices.length === 0) return 0;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const v of vertices) {\n if (v.x < minX) minX = v.x;\n if (v.y < minY) minY = v.y;\n if (v.x > maxX) maxX = v.x;\n if (v.y > maxY) maxY = v.y;\n }\n return (maxX - minX) * (maxY - minY);\n}\n\nfunction mergeUnique(a: ReadonlyArray<string>, b: ReadonlyArray<string>): string[] {\n const out = [...a];\n for (const id of b) if (!out.includes(id)) out.push(id);\n return out;\n}\n"],"mappings":";;;AAaA,IAAaA,IAAiBC,EAAoD,sBAAsB,GAElGC,IAAW;AAajB,SAAgBC,EAAgB,GAAoD;CAClF,IAAMC,IAAqBC,GAAM,QAAQ;CACzC,OAAO;EACL,kBAAkB;EAClB,MAAM,GAAK;GACT,IAAMC,IAAUC,EAAI;GACpB,IAAI,CAACD,EAAQ,gBAAgB,CAACA,EAAQ,cAAc,OAAO;GAE3D,IAAME,IAAWC,EAAWF,EAAI,SAASP,CAAc,KAAK,CAAC,GACvDU,IAAYH,EAAI,OAAO,IAAI,SAAS,GACpCI,IAAYD,IAAaA,EAAsC,cAAc,KAAO,IACpFE,IAAON,EAAQ,aAAa;GAIlC,IADaE,EAAS,SAAS,KAAKK,EAAgBL,CAAQ,IAAIN,GAI9D,OAAO,CADQY,EAAqB;IAAQ;IAAsB,IADvDH,IAAYC,IAAO,CAAC;GACkD,CACzE,CAAE;GAGZ,IAAMG,IAAOT,EAAQ,aAAaE,GAAUJ,CAAI,GAC1CY,IAAKL,IACPM,EAAYL,GAAMG,CAAI,IACtBA;GAEJ,OAAO,CADQD,EAAqB;IAAQ;IAAsB;GAAe,CACzE,CAAE;EACZ;CACF;AACF;AAEA,SAASD,EAAgB,GAA2D;CAClF,IAAIL,EAAS,WAAW,GAAG,OAAO;CAClC,IAAIU,IAAO,UAAUC,IAAO,UAAUC,IAAO,WAAWC,IAAO;CAC/D,KAAK,IAAMC,KAAKd,GAId,AAHIc,EAAE,IAAIJ,MAAM,IAAOI,EAAE,IACrBA,EAAE,IAAIH,MAAM,IAAOG,EAAE,IACrBA,EAAE,IAAIF,MAAM,IAAOE,EAAE,IACrBA,EAAE,IAAID,MAAM,IAAOC,EAAE;CAE3B,QAAQF,IAAOF,MAASG,IAAOF;AACjC;AAEA,SAASF,EAAY,GAA0B,GAAoC;CACjF,IAAMM,IAAM,CAAC,GAAGC,CAAC;CACjB,KAAK,IAAMC,KAAMC,GAAG,AAAKH,EAAI,SAASE,CAAE,KAAGF,EAAI,KAAKE,CAAE;CACtD,OAAOF;AACT"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createDeleteOp as e } from "../../../../core/ops/delete.js";
|
|
2
|
+
import { AUTO_ORIGIN_PROJECTION as t } from "../../../gestures/shared/originProjection.js";
|
|
3
|
+
import { getScratch as n, scratchKey as r, setScratch as i } from "@weasel-js/routing";
|
|
4
|
+
//#region src/interactions/actions/move/behaviors/snapBackOrDelete.ts
|
|
5
|
+
var a = r("snapBackOrDelete.snapshots"), o = r("snapBackOrDelete.indexes");
|
|
6
|
+
function s(r) {
|
|
7
|
+
let { radius: s, onFreeRelease: c, deleteLabel: l = "Delete" } = r, u = r.origin ?? t, d = s * s;
|
|
8
|
+
return {
|
|
9
|
+
onStart(e) {
|
|
10
|
+
let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = e.adapter.getNodes();
|
|
11
|
+
for (let i of e.draggedIds) {
|
|
12
|
+
let a = e.adapter.getNode(i) ?? { id: i };
|
|
13
|
+
t.set(i, a), n.set(i, r.findIndex((e) => e.id === i));
|
|
14
|
+
}
|
|
15
|
+
i(e.scratch, a, t), i(e.scratch, o, n);
|
|
16
|
+
},
|
|
17
|
+
onEnd(t) {
|
|
18
|
+
if (t.snap) return;
|
|
19
|
+
let r = t.draggedIds[0], i = u.getOrigin(t.origin.get(r)), s = u.getOrigin(t.current.get(r)), f = s.x - i.x, p = s.y - i.y;
|
|
20
|
+
if (f * f + p * p <= d) return null;
|
|
21
|
+
if (c === "delete") {
|
|
22
|
+
let i = n(t.scratch, a), s = n(t.scratch, o), c = i?.get(r) ?? { id: r }, u = s?.get(r) ?? -1;
|
|
23
|
+
return [e({
|
|
24
|
+
node: c,
|
|
25
|
+
label: l,
|
|
26
|
+
index: u
|
|
27
|
+
})];
|
|
28
|
+
}
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { s as snapBackOrDelete };
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=snapBackOrDelete.js.map
|