@weasel-js/core 1.9.4 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +750 -0
- package/README.md +5 -3
- package/dist/WeaselProvider.js +5 -7
- package/dist/WeaselProvider.js.map +1 -1
- package/dist/affordances/composeAffordanceLayer.js +91 -83
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/cornerResize.js +3 -2
- package/dist/affordances/cornerResize.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +54 -100
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotationHandle.js +5 -4
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/behaviors/coast.js +21 -0
- package/dist/animation/behaviors/coast.js.map +1 -0
- package/dist/animation/behaviors/coastByWrite.js +107 -0
- package/dist/animation/behaviors/coastByWrite.js.map +1 -0
- package/dist/animation/behaviors/coastOnTargets.js +94 -0
- package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +48 -136
- package/dist/animation/behaviors/momentum.js.map +1 -1
- package/dist/animation/clipTargets.js +12 -0
- package/dist/animation/clipTargets.js.map +1 -0
- package/dist/animation/index.js +15 -20
- package/dist/animation/poseHelpers.js +112 -33
- package/dist/animation/poseHelpers.js.map +1 -1
- package/dist/animation/poseTarget.js +115 -0
- package/dist/animation/poseTarget.js.map +1 -0
- package/dist/animation/reflow.js +113 -83
- package/dist/animation/reflow.js.map +1 -1
- package/dist/animation/rewind.js +66 -0
- package/dist/animation/rewind.js.map +1 -0
- package/dist/animation/rig/bindRig.js +85 -53
- package/dist/animation/rig/bindRig.js.map +1 -1
- package/dist/animation/rig/rigNode.js +93 -0
- package/dist/animation/rig/rigNode.js.map +1 -0
- package/dist/animation/rig/rigSeat.js +26 -0
- package/dist/animation/rig/rigSeat.js.map +1 -0
- package/dist/animation/rig/skinBinding.js +56 -0
- package/dist/animation/rig/skinBinding.js.map +1 -0
- package/dist/animation/rig/useRig.js +31 -16
- package/dist/animation/rig/useRig.js.map +1 -1
- package/dist/animation/wrappers/animateLifecycle.js +8 -7
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
- package/dist/animation/wrappers/animateOnSetPose.js +31 -31
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
- package/dist/animation/wrappers/instantPose.js.map +1 -1
- package/dist/animation/writtenPoseTarget.js +33 -0
- package/dist/animation/writtenPoseTarget.js.map +1 -0
- package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
- package/dist/barrel/canvas.js +31 -0
- package/dist/barrel/chrome.js +10 -10
- package/dist/barrel/input.js +16 -17
- package/dist/barrel/interactions.js +35 -39
- package/dist/barrel/paint.js +11 -18
- package/dist/barrel/paths.js +12 -19
- package/dist/barrel/renderer.js +14 -20
- package/dist/barrel/routing.js +42 -36
- package/dist/barrel/scene.js +37 -0
- package/dist/barrel/text.js +9 -18
- package/dist/barrel/viewport.js +41 -51
- package/dist/canvas/Canvas.js +281 -475
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +169 -188
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +22 -23
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +39 -56
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/ModalityHud.js.map +1 -1
- package/dist/canvas/NodeShape.js +28 -29
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
- package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +51 -54
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
- package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +40 -29
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +73 -43
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
- package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/props.js +15 -14
- package/dist/canvas/SceneCanvas/props.js.map +1 -1
- package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
- package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
- package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +39 -37
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +76 -80
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +303 -707
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +41 -47
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/adapterDerivedPath.js +26 -0
- package/dist/canvas/adapterDerivedPath.js.map +1 -0
- package/dist/canvas/affordanceAt.js +11 -1
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +81 -61
- package/dist/canvas/buildSceneLayer.js.map +1 -1
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +40 -44
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/colorOverrides.js.map +1 -1
- package/dist/canvas/defaultDrawOne.js +12 -12
- package/dist/canvas/defaultDrawOne.js.map +1 -1
- package/dist/canvas/deps/areaSelect.js +4 -4
- package/dist/canvas/deps/areaSelect.js.map +1 -1
- package/dist/canvas/deps/debug.js.map +1 -1
- package/dist/canvas/deps/editAnchors.js +49 -68
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/geometryProjection.js.map +1 -1
- package/dist/canvas/deps/hitTestArea.js +31 -26
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/insert.js +65 -54
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/lassoSelect.js +5 -5
- package/dist/canvas/deps/lassoSelect.js.map +1 -1
- package/dist/canvas/deps/poseDescriptor.js +1 -1
- package/dist/canvas/deps/poseDescriptor.js.map +1 -1
- package/dist/canvas/deps/resizePolicy.js.map +1 -1
- package/dist/canvas/deps/slice.js +44 -45
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +8 -8
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/deps/view.js.map +1 -1
- package/dist/canvas/derivedPath.js +43 -41
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/drawEnvelope.js +8 -4
- package/dist/canvas/drawEnvelope.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +2 -6
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/hud.module.js.map +1 -1
- package/dist/canvas/insertPreviewExtent.js.map +1 -1
- package/dist/canvas/layerOrder.js.map +1 -1
- package/dist/canvas/layerSlots.js +6 -1
- package/dist/canvas/layerSlots.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/imagePainter.js +10 -10
- package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
- package/dist/canvas/nodeShapes/memo.js.map +1 -1
- package/dist/canvas/nodeShapes/nodePaint.js +34 -23
- package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
- package/dist/canvas/nodeShapes/pathPainter.js +23 -22
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/poseBox.js +6 -6
- package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
- package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/shapePainter.js +16 -16
- package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
- package/dist/canvas/nodeShapes/textPainter.js +1 -1
- package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/paintCull.js +6 -8
- package/dist/canvas/paintCull.js.map +1 -1
- package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
- package/dist/canvas/paintedCursorLayer.js.map +1 -0
- package/dist/canvas/pickWalk.js +52 -50
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/planeClips.js +18 -19
- package/dist/canvas/planeClips.js.map +1 -1
- package/dist/canvas/poseCascade.js +41 -0
- package/dist/canvas/poseCascade.js.map +1 -0
- package/dist/canvas/poseRotation.js +1 -3
- package/dist/canvas/poseRotation.js.map +1 -1
- package/dist/canvas/rasterReadback.js +22 -0
- package/dist/canvas/rasterReadback.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +12 -12
- package/dist/canvas/renderDebugSnapshot.js.map +1 -1
- package/dist/canvas/renderNeeds.js +3 -3
- package/dist/canvas/renderNeeds.js.map +1 -1
- package/dist/canvas/renderSceneToPixels.js +64 -83
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +68 -132
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +1 -1
- package/dist/canvas/sceneClipboard.js.map +1 -1
- package/dist/canvas/sceneLayerPaint.js +4 -4
- package/dist/canvas/sceneLayerPaint.js.map +1 -1
- package/dist/canvas/sceneSlotWiring.js +4 -4
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +36 -35
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/slopsDebugLayer.js +4 -4
- package/dist/canvas/slopsDebugLayer.js.map +1 -1
- package/dist/canvas/surface.module.js +6 -0
- package/dist/canvas/surface.module.js.map +1 -0
- package/dist/canvas/surfaceBox.js +16 -0
- package/dist/canvas/surfaceBox.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +23 -11
- package/dist/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/canvas/useCanvasSurface.js +31 -0
- package/dist/canvas/useCanvasSurface.js.map +1 -0
- package/dist/canvas/useCanvasView.js +46 -37
- package/dist/canvas/useCanvasView.js.map +1 -1
- package/dist/canvas/useFrameLoop.js +11 -12
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useHostAnchor.js +35 -33
- package/dist/canvas/useHostAnchor.js.map +1 -1
- package/dist/canvas/useLateContentRedraw.js +8 -8
- package/dist/canvas/useLateContentRedraw.js.map +1 -1
- package/dist/canvas/useSceneLayerList.js +4 -14
- package/dist/canvas/useSceneLayerList.js.map +1 -1
- package/dist/canvas/useSurfaceInput.js +42 -0
- package/dist/canvas/useSurfaceInput.js.map +1 -0
- package/dist/canvas/useToolCursor.js +29 -0
- package/dist/canvas/useToolCursor.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +46 -85
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/canvas/viewInputs.js.map +1 -1
- package/dist/canvas/viewRegistry.js +25 -27
- package/dist/canvas/viewRegistry.js.map +1 -1
- package/dist/canvas/watchElementMove.js +43 -0
- package/dist/canvas/watchElementMove.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -1
- package/dist/clipboard.d.ts +7 -14
- package/dist/{types-B4iJRHC3.d.ts → clone-2a5hVbBd.d.ts} +122 -77
- package/dist/clone.d.ts +4 -8
- package/dist/clone.js +0 -2
- package/dist/core/device/targets.js.map +1 -1
- package/dist/core/device/useDeviceProfile.js +13 -13
- package/dist/core/device/useDeviceProfile.js.map +1 -1
- package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
- package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/pathPoseDescriptor.js +88 -0
- package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +61 -14
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/regionHit.js +35 -37
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/targetFrame.js +94 -0
- package/dist/core/geometry/targetFrame.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +4 -5
- package/dist/core/geometry/unionBounds.js.map +1 -1
- package/dist/core/layers/backgroundFill.js +31 -0
- package/dist/core/layers/backgroundFill.js.map +1 -0
- package/dist/{features/groups → core/layers}/children.js +1 -1
- package/dist/core/layers/children.js.map +1 -0
- package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
- package/dist/core/layers/gateLayer.js.map +1 -0
- package/dist/core/layers/layerGroup.js +40 -0
- package/dist/core/layers/layerGroup.js.map +1 -0
- package/dist/core/layers/render.js +50 -76
- package/dist/core/layers/render.js.map +1 -1
- package/dist/core/ops/createHistory.js +9 -9
- package/dist/core/ops/createHistory.js.map +1 -1
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/paint/meshKind.js +16 -0
- package/dist/core/paint/meshKind.js.map +1 -0
- package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +103 -92
- package/dist/core/paint/meshKindLazy.js.map +1 -0
- package/dist/core/paint/paintKindEntry.js +8 -0
- package/dist/core/paint/paintKindEntry.js.map +1 -0
- package/dist/core/paint/paintKinds.js +144 -0
- package/dist/core/paint/paintKinds.js.map +1 -0
- package/dist/core/paint/registerMesh.js +7 -0
- package/dist/core/paint/registerMesh.js.map +1 -0
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/NodeRouting.js.map +1 -1
- package/dist/core/scene/arrivalWindow.js +65 -64
- package/dist/core/scene/arrivalWindow.js.map +1 -1
- package/dist/core/scene/boundOps.js +40 -0
- package/dist/core/scene/boundOps.js.map +1 -0
- package/dist/core/scene/composeFrame.js +9 -6
- package/dist/core/scene/composeFrame.js.map +1 -1
- package/dist/{features/groups → core/scene}/composePose.js +18 -18
- package/dist/core/scene/composePose.js.map +1 -0
- package/dist/core/scene/depMemo.js +31 -6
- package/dist/core/scene/depMemo.js.map +1 -1
- package/dist/core/scene/derivedPath.js +19 -20
- package/dist/core/scene/derivedPath.js.map +1 -1
- package/dist/core/scene/editMode.js +26 -0
- package/dist/core/scene/editMode.js.map +1 -0
- package/dist/core/scene/effectivePose.js +38 -39
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/fieldEdits.js +98 -0
- package/dist/core/scene/fieldEdits.js.map +1 -0
- package/dist/core/scene/historyFacade.js +116 -70
- package/dist/core/scene/historyFacade.js.map +1 -1
- package/dist/core/scene/historyForm.js +6 -0
- package/dist/core/scene/historyForm.js.map +1 -0
- package/dist/core/scene/kitOps.js +83 -71
- package/dist/core/scene/kitOps.js.map +1 -1
- package/dist/core/scene/kitRegistry.js.map +1 -1
- package/dist/core/scene/layerStack.js +105 -12
- package/dist/core/scene/layerStack.js.map +1 -1
- package/dist/core/scene/layoutPass.js +58 -59
- package/dist/core/scene/layoutPass.js.map +1 -1
- package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
- package/dist/core/scene/nestedHit.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +9 -9
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/nodeMemo.js.map +1 -1
- package/dist/core/scene/nodeStore.js +72 -71
- package/dist/core/scene/nodeStore.js.map +1 -1
- package/dist/core/scene/notifier.js +37 -0
- package/dist/core/scene/notifier.js.map +1 -0
- package/dist/core/scene/opTable.js +50 -0
- package/dist/core/scene/opTable.js.map +1 -0
- package/dist/core/scene/outerOps.js +66 -0
- package/dist/core/scene/outerOps.js.map +1 -0
- package/dist/core/scene/poseHold.js +39 -0
- package/dist/core/scene/poseHold.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +44 -36
- package/dist/core/scene/poseOverrides.js.map +1 -1
- package/dist/core/scene/poseSnapshot.js.map +1 -1
- package/dist/core/scene/reconcileSpecs.js +3 -2
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/recorder.js +86 -0
- package/dist/core/scene/recorder.js.map +1 -0
- package/dist/core/scene/renderOrder.js.map +1 -1
- package/dist/core/scene/scene.js +81 -690
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneEdits.js +58 -0
- package/dist/core/scene/sceneEdits.js.map +1 -0
- package/dist/core/scene/sceneMutators.js +49 -0
- package/dist/core/scene/sceneMutators.js.map +1 -0
- package/dist/core/scene/scenePoseAdapter.js +16 -0
- package/dist/core/scene/scenePoseAdapter.js.map +1 -0
- package/dist/core/scene/sceneRecording.js +90 -0
- package/dist/core/scene/sceneRecording.js.map +1 -0
- package/dist/core/scene/sceneSelection.js +28 -0
- package/dist/core/scene/sceneSelection.js.map +1 -0
- package/dist/core/scene/sceneState.js +49 -0
- package/dist/core/scene/sceneState.js.map +1 -0
- package/dist/core/scene/serialization.js +8 -5
- package/dist/core/scene/serialization.js.map +1 -1
- package/dist/core/scene/staleReplay.js +51 -0
- package/dist/core/scene/staleReplay.js.map +1 -0
- package/dist/core/scene/statedFields.js +9 -0
- package/dist/core/scene/statedFields.js.map +1 -0
- package/dist/core/scene/treeEdits.js +127 -0
- package/dist/core/scene/treeEdits.js.map +1 -0
- package/dist/core/scene/treeReads.js +26 -0
- package/dist/core/scene/treeReads.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
- package/dist/core/scene/unionOfChildren.js.map +1 -0
- package/dist/core/scene/unitScopes.js +13 -0
- package/dist/core/scene/unitScopes.js.map +1 -0
- package/dist/core/scene/useScene.js.map +1 -1
- package/dist/core/selection/readOnlySelection.js +32 -0
- package/dist/core/selection/readOnlySelection.js.map +1 -0
- package/dist/core/selection/usePublishSceneSelection.js +26 -0
- package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
- package/dist/core/selection/useSelection.js +34 -25
- package/dist/core/selection/useSelection.js.map +1 -1
- package/dist/core/shapeKinds.js.map +1 -1
- package/dist/core/stylus/stylus.js.map +1 -1
- package/dist/core/stylus/usePointerStylus.js.map +1 -1
- package/dist/core/usePaintKinds.js +1 -1
- package/dist/core/usePaintKinds.js.map +1 -1
- package/dist/core/viewport/clientToWorld.js.map +1 -1
- package/dist/core/viewport/fitViewToBounds.js.map +1 -1
- package/dist/core/viewport/parallax.js.map +1 -1
- package/dist/core/viewport/screenSlop.js +11 -11
- package/dist/core/viewport/screenSlop.js.map +1 -1
- package/dist/core/viewport/useCanvasSize.js.map +1 -1
- package/dist/core/viewport/useDecayLoop.js +8 -8
- package/dist/core/viewport/useDecayLoop.js.map +1 -1
- package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
- package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +102 -43
- package/dist/core/viewport/useViewAnimation.js.map +1 -1
- package/dist/core/viewport/view.js +7 -7
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/wheelHandler.js.map +1 -1
- package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
- package/dist/debug/createDebugOverlayLayer.js +100 -100
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/createDebugSink.js.map +1 -1
- package/dist/debug/frameStats.js.map +1 -1
- package/dist/debug/useDebugSink.js +52 -0
- package/dist/debug/useDebugSink.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
- package/dist/features/chrome-caps/conditions.js.map +1 -1
- package/dist/features/chrome-caps/defaults.js.map +1 -1
- package/dist/features/chrome-caps/resolve.js.map +1 -1
- package/dist/features/chrome-caps/useChromeCaps.js +54 -0
- package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +25 -19
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/ingestion/imageHandler.js +21 -24
- package/dist/features/ingestion/imageHandler.js.map +1 -1
- package/dist/features/ingestion/openFilePicker.js.map +1 -1
- package/dist/features/ingestion/placement.js +16 -0
- package/dist/features/ingestion/placement.js.map +1 -0
- package/dist/features/ingestion/svgHandler.js +5 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -1
- package/dist/features/ingestion/textHandler.js +28 -0
- package/dist/features/ingestion/textHandler.js.map +1 -0
- package/dist/features/ingestion/useCanvasIngestion.js +48 -0
- package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +5 -0
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
- package/dist/features/longPress/longPressFeedback.js.map +1 -1
- package/dist/features/modes/modeLayers.js +7 -7
- package/dist/features/modes/modeLayers.js.map +1 -1
- package/dist/features/paths/editablePath.js +47 -0
- package/dist/features/paths/editablePath.js.map +1 -0
- package/dist/features/paths/index.js +9 -16
- package/dist/features/paths/pathEditState.js +41 -0
- package/dist/features/paths/pathEditState.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
- package/dist/features/paths/pathLayer.js +3 -2
- package/dist/features/paths/pathLayer.js.map +1 -1
- package/dist/features/paths/penPreviewLayer.js +86 -88
- package/dist/features/paths/penPreviewLayer.js.map +1 -1
- package/dist/features/paths/usePathEdit.js +34 -0
- package/dist/features/paths/usePathEdit.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +42 -55
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/selection/overlay.js +170 -178
- package/dist/features/selection/overlay.js.map +1 -1
- package/dist/features/text/index.js +6 -0
- package/dist/features/text/textLayer.js +1 -1
- package/dist/features/text/textLayer.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +95 -82
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/viewports/viewportLayer.js +25 -36
- package/dist/features/viewports/viewportLayer.js.map +1 -1
- package/dist/index.d.ts +4507 -8459
- package/dist/index.js +275 -320
- package/dist/input/keyState.js +14 -14
- package/dist/interactions/actions/actionShortcuts.js.map +1 -1
- package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
- package/dist/interactions/actions/align/action.js.map +1 -0
- package/dist/interactions/actions/align/align.js +23 -23
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/action.js +65 -0
- package/dist/interactions/actions/booleans/action.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +69 -78
- package/dist/interactions/actions/booleans/booleans.js.map +1 -1
- package/dist/interactions/actions/booleans/operands.js +40 -0
- package/dist/interactions/actions/booleans/operands.js.map +1 -0
- package/dist/interactions/actions/booleans/pieces.js +45 -0
- package/dist/interactions/actions/booleans/pieces.js.map +1 -0
- package/dist/interactions/actions/booleans/placement.js +24 -0
- package/dist/interactions/actions/booleans/placement.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +11 -9
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
- package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
- package/dist/interactions/actions/clipboard/action.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
- package/dist/interactions/actions/clone/action.js +98 -0
- package/dist/interactions/actions/clone/action.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors.js +52 -0
- package/dist/interactions/actions/clone/behaviors.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +41 -43
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
- package/dist/interactions/actions/defaults/delete.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +19 -19
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +35 -40
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +19 -15
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +14 -15
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +30 -31
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/setFill.js +9 -3
- package/dist/interactions/actions/defaults/setFill.js.map +1 -1
- package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
- package/dist/interactions/actions/defaults/sliceOps.js +20 -22
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
- package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
- package/dist/interactions/actions/distribute/action.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +11 -11
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +19 -21
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/flip/action.js +124 -0
- package/dist/interactions/actions/flip/action.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +1 -1
- package/dist/interactions/actions/flip/helpers.js.map +1 -1
- package/dist/interactions/actions/gestureFrames.js +18 -0
- package/dist/interactions/actions/gestureFrames.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +47 -20
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +72 -0
- package/dist/interactions/actions/insert/action.js.map +1 -0
- package/dist/interactions/actions/insert/commit.js +28 -0
- package/dist/interactions/actions/insert/commit.js.map +1 -0
- package/dist/interactions/actions/insert/extras.js +65 -0
- package/dist/interactions/actions/insert/extras.js.map +1 -0
- package/dist/interactions/actions/insert/frame.js +48 -0
- package/dist/interactions/actions/insert/frame.js.map +1 -0
- package/dist/interactions/actions/insert/geometry.js +35 -0
- package/dist/interactions/actions/insert/geometry.js.map +1 -0
- package/dist/interactions/actions/insert/rotateAction.js +21 -0
- package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
- package/dist/interactions/actions/insert/session.js +59 -0
- package/dist/interactions/actions/insert/session.js.map +1 -0
- package/dist/interactions/actions/insert/shape.js +34 -0
- package/dist/interactions/actions/insert/shape.js.map +1 -0
- package/dist/interactions/actions/lasso-select/action.js +143 -0
- package/dist/interactions/actions/lasso-select/action.js.map +1 -0
- package/dist/interactions/actions/move/action.js +87 -0
- package/dist/interactions/actions/move/action.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +24 -23
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +99 -0
- package/dist/interactions/actions/move/capture.js.map +1 -0
- package/dist/interactions/actions/move/commit/index.js +41 -0
- package/dist/interactions/actions/move/commit/index.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
- package/dist/interactions/actions/move/commit/rebase.js +18 -0
- package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
- package/dist/interactions/actions/move/commit/reparent.js +65 -0
- package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
- package/dist/interactions/actions/move/delta.js +51 -0
- package/dist/interactions/actions/move/delta.js.map +1 -0
- package/dist/interactions/actions/move/frame.js +59 -0
- package/dist/interactions/actions/move/frame.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +15 -40
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +8 -8
- package/dist/interactions/actions/move/layout/container.js +94 -0
- package/dist/interactions/actions/move/layout/container.js.map +1 -0
- package/dist/interactions/actions/move/layout/dragged.js +58 -0
- package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
- package/dist/interactions/actions/move/layout/dropPass.js +122 -0
- package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
- package/dist/interactions/actions/move/layout/exits.js +38 -0
- package/dist/interactions/actions/move/layout/exits.js.map +1 -0
- package/dist/interactions/actions/move/layout/glide.js +48 -0
- package/dist/interactions/actions/move/layout/glide.js.map +1 -0
- package/dist/interactions/actions/move/session.js +63 -0
- package/dist/interactions/actions/move/session.js.map +1 -0
- package/dist/interactions/actions/move/translate.js +61 -0
- package/dist/interactions/actions/move/translate.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +17 -64
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
- package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
- package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
- package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
- package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
- package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
- package/dist/interactions/actions/planeInput.js.map +1 -1
- package/dist/interactions/actions/pointerState.js +12 -0
- package/dist/interactions/actions/pointerState.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +1 -1
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +26 -26
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/resize/action.js +55 -0
- package/dist/interactions/actions/resize/action.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
- package/dist/interactions/actions/resize/boxFrame.js +16 -0
- package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
- package/dist/interactions/actions/resize/capture.js +85 -0
- package/dist/interactions/actions/resize/capture.js.map +1 -0
- package/dist/interactions/actions/resize/commit.js +69 -0
- package/dist/interactions/actions/resize/commit.js.map +1 -0
- package/dist/interactions/actions/resize/frame.js +74 -0
- package/dist/interactions/actions/resize/frame.js.map +1 -0
- package/dist/interactions/actions/resize/pointSnap.js +111 -0
- package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
- package/dist/interactions/actions/resize/ruleBounds.js +9 -0
- package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
- package/dist/interactions/actions/resize/session.js +49 -0
- package/dist/interactions/actions/resize/session.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -1
- package/dist/interactions/actions/resolvePreviews.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +56 -0
- package/dist/interactions/actions/rotate/action.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
- package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
- package/dist/interactions/actions/rotate/commit.js +40 -0
- package/dist/interactions/actions/rotate/commit.js.map +1 -0
- package/dist/interactions/actions/rotate/frame.js +65 -0
- package/dist/interactions/actions/rotate/frame.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +12 -12
- package/dist/interactions/actions/rotate/handle.js.map +1 -1
- package/dist/interactions/actions/rotate/session.js +92 -0
- package/dist/interactions/actions/rotate/session.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -1
- package/dist/interactions/actions/useStandardActions.js +77 -72
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
- package/dist/interactions/gestures/shared/originProjection.js +1 -1
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
- package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
- package/dist/interactions/gestures/shared/snap.js.map +1 -1
- package/dist/layout/arrivals.js +20 -23
- package/dist/layout/arrivals.js.map +1 -1
- package/dist/math-CYUjoyyU.d.ts +33 -0
- package/dist/math.d.ts +5 -2
- package/dist/math.js +6 -6
- package/dist/mesh.d.ts +4 -268
- package/dist/mesh.js +3 -7
- package/dist/move.d.ts +6 -4
- package/dist/{originProjection-gHnOup4e.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
- package/dist/patterns-builtin.d.ts +1 -118
- package/dist/patterns-builtin.js +2 -3
- package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
- package/dist/renderer.d.ts +1 -92
- package/dist/renderer.js +2 -19
- package/dist/resize.d.ts +11 -22
- package/dist/resize.js +1 -1
- package/dist/style.css +1 -1
- package/dist/test-hook/install.js.map +1 -1
- package/dist/test-hook/useTestHook.js +22 -0
- package/dist/test-hook/useTestHook.js.map +1 -0
- package/dist/test-seams-D0pyV3pR.d.ts +149 -0
- package/dist/test-seams.d.ts +4 -4
- package/dist/test-seams.js +2 -2
- package/dist/tools/builtin/bone/boneActions.js +130 -0
- package/dist/tools/builtin/bone/boneActions.js.map +1 -0
- package/dist/tools/builtin/bone/boneOverlay.js +58 -0
- package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
- package/dist/tools/builtin/bone/placedRig.js +24 -0
- package/dist/tools/builtin/bone/placedRig.js.map +1 -0
- package/dist/tools/builtin/bone/rigEditState.js +21 -0
- package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
- package/dist/tools/builtin/bone/useBoneTool.js +98 -0
- package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
- package/dist/tools/builtin/image/useImageTool.js.map +1 -1
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +161 -163
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
- package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +4 -4
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +43 -71
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
- package/dist/tools/builtin/slice/useSliceTool.js +67 -72
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +8 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/tools/builtin/weight/useWeightTool.js +77 -0
- package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
- package/dist/tools/builtin/weight/weightActions.js +112 -0
- package/dist/tools/builtin/weight/weightActions.js.map +1 -0
- package/dist/tools/builtin/weight/weightOverlay.js +61 -0
- package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
- package/dist/tools/overlayBinding.js.map +1 -1
- package/dist/tools/useKeybindings.js +20 -14
- package/dist/tools/useKeybindings.js.map +1 -1
- package/dist/{types-k-5Oqh-U.d.ts → types-CIKDwlsP.d.ts} +84 -164
- package/dist/util/paint.js +1 -1
- package/dist/util/paint.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +26 -21
- package/dist/animation/colorHelpers.js +0 -135
- package/dist/animation/colorHelpers.js.map +0 -1
- package/dist/animation/colorRegistry.js +0 -37
- package/dist/animation/colorRegistry.js.map +0 -1
- package/dist/animation/engine/axes.js +0 -36
- package/dist/animation/engine/axes.js.map +0 -1
- package/dist/animation/engine/codec.js +0 -170
- package/dist/animation/engine/codec.js.map +0 -1
- package/dist/animation/engine/integrator.js +0 -12
- package/dist/animation/engine/integrator.js.map +0 -1
- package/dist/animation/loop.js +0 -60
- package/dist/animation/loop.js.map +0 -1
- package/dist/animation/observe.js +0 -23
- package/dist/animation/observe.js.map +0 -1
- package/dist/animation/rig/blendPoses.js +0 -43
- package/dist/animation/rig/blendPoses.js.map +0 -1
- package/dist/animation/rig/mirrorPose.js +0 -19
- package/dist/animation/rig/mirrorPose.js.map +0 -1
- package/dist/animation/rig/resolveSkeleton.js +0 -33
- package/dist/animation/rig/resolveSkeleton.js.map +0 -1
- package/dist/animation/rig/solveIk.js +0 -103
- package/dist/animation/rig/solveIk.js.map +0 -1
- package/dist/animation/rig/types.js +0 -12
- package/dist/animation/rig/types.js.map +0 -1
- package/dist/animation/slew.js +0 -27
- package/dist/animation/slew.js.map +0 -1
- package/dist/animation/stagger.js +0 -146
- package/dist/animation/stagger.js.map +0 -1
- package/dist/animation/timeline/booking.js +0 -114
- package/dist/animation/timeline/booking.js.map +0 -1
- package/dist/animation/timeline/createTimeline.js +0 -125
- package/dist/animation/timeline/createTimeline.js.map +0 -1
- package/dist/animation/timeline/sampleTrack.js +0 -79
- package/dist/animation/timeline/sampleTrack.js.map +0 -1
- package/dist/animation/useAnimator.js +0 -388
- package/dist/animation/useAnimator.js.map +0 -1
- package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
- package/dist/builtins-DPcdghtB.d.ts +0 -1223
- package/dist/canvas/MinimapCanvas.js +0 -140
- package/dist/canvas/MinimapCanvas.js.map +0 -1
- package/dist/canvas/deps/poseComposition.js +0 -11
- package/dist/canvas/deps/poseComposition.js.map +0 -1
- package/dist/canvas/minimapMath.js +0 -82
- package/dist/canvas/minimapMath.js.map +0 -1
- package/dist/canvas/toolPreview.js +0 -39
- package/dist/canvas/toolPreview.js.map +0 -1
- package/dist/core/adapters/arrayAdapter.js +0 -94
- package/dist/core/adapters/arrayAdapter.js.map +0 -1
- package/dist/core/adapters/useArrayAdapter.js +0 -13
- package/dist/core/adapters/useArrayAdapter.js.map +0 -1
- package/dist/core/fillInPoseFrame.js +0 -102
- package/dist/core/fillInPoseFrame.js.map +0 -1
- package/dist/core/geometry/poseFrame.js +0 -44
- package/dist/core/geometry/poseFrame.js.map +0 -1
- package/dist/core/geometry/poseRotation.js +0 -58
- package/dist/core/geometry/poseRotation.js.map +0 -1
- package/dist/core/gradient.js +0 -136
- package/dist/core/gradient.js.map +0 -1
- package/dist/core/markerInset.js +0 -24
- package/dist/core/markerInset.js.map +0 -1
- package/dist/core/mixed.js +0 -6
- package/dist/core/mixed.js.map +0 -1
- package/dist/core/paintKinds.js +0 -156
- package/dist/core/paintKinds.js.map +0 -1
- package/dist/core/scene/pickability.js +0 -6
- package/dist/core/scene/pickability.js.map +0 -1
- package/dist/core/strokeMarkerShapes.js +0 -139
- package/dist/core/strokeMarkerShapes.js.map +0 -1
- package/dist/core/strokeMarkers.js +0 -28
- package/dist/core/strokeMarkers.js.map +0 -1
- package/dist/core/viewport/meanScale.js +0 -8
- package/dist/core/viewport/meanScale.js.map +0 -1
- package/dist/core/viewport/pxExtent.js +0 -42
- package/dist/core/viewport/pxExtent.js.map +0 -1
- package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
- package/dist/features/focus/gateLayer.js.map +0 -1
- package/dist/features/focus/useCanvasFocus.js +0 -29
- package/dist/features/focus/useCanvasFocus.js.map +0 -1
- package/dist/features/groups/children.js.map +0 -1
- package/dist/features/groups/composePose.js.map +0 -1
- package/dist/features/groups/nestedHit.js.map +0 -1
- package/dist/features/groups/unionOfChildren.js.map +0 -1
- package/dist/features/images/imageCache.js +0 -104
- package/dist/features/images/imageCache.js.map +0 -1
- package/dist/features/ingestion/index.js +0 -8
- package/dist/features/meshPaint/bake.js +0 -79
- package/dist/features/meshPaint/bake.js.map +0 -1
- package/dist/features/meshPaint/bakeCache.js +0 -59
- package/dist/features/meshPaint/bakeCache.js.map +0 -1
- package/dist/features/meshPaint/handles.js +0 -86
- package/dist/features/meshPaint/handles.js.map +0 -1
- package/dist/features/meshPaint/lazyKind.js.map +0 -1
- package/dist/features/meshPaint/meshPaint.js +0 -239
- package/dist/features/meshPaint/meshPaint.js.map +0 -1
- package/dist/features/meshPaint/meshShader.js +0 -6
- package/dist/features/meshPaint/meshShader.js.map +0 -1
- package/dist/features/meshPaint/register.js +0 -7
- package/dist/features/meshPaint/register.js.map +0 -1
- package/dist/features/meshPaint/surface.js +0 -110
- package/dist/features/meshPaint/surface.js.map +0 -1
- package/dist/features/minimap/actions.js +0 -53
- package/dist/features/minimap/actions.js.map +0 -1
- package/dist/features/minimap/createMinimapContribution.js +0 -96
- package/dist/features/minimap/createMinimapContribution.js.map +0 -1
- package/dist/features/minimap/layers.js +0 -85
- package/dist/features/minimap/layers.js.map +0 -1
- package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
- package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
- package/dist/features/parallax/createParallaxLayer.js +0 -26
- package/dist/features/parallax/createParallaxLayer.js.map +0 -1
- package/dist/features/parallax/createParallaxPlane.js +0 -22
- package/dist/features/parallax/createParallaxPlane.js.map +0 -1
- package/dist/features/paths/anchorEdits.js +0 -167
- package/dist/features/paths/anchorEdits.js.map +0 -1
- package/dist/features/paths/anchors.js +0 -159
- package/dist/features/paths/anchors.js.map +0 -1
- package/dist/features/paths/booleans.js +0 -2
- package/dist/features/paths/markerCommands.js +0 -149
- package/dist/features/paths/markerCommands.js.map +0 -1
- package/dist/features/paths/markerSites.js +0 -59
- package/dist/features/paths/markerSites.js.map +0 -1
- package/dist/features/paths/markers.js +0 -95
- package/dist/features/paths/markers.js.map +0 -1
- package/dist/features/paths/nearestAnchor.js +0 -36
- package/dist/features/paths/nearestAnchor.js.map +0 -1
- package/dist/features/paths/pathInWorld.js +0 -41
- package/dist/features/paths/pathInWorld.js.map +0 -1
- package/dist/features/paths/poseDescriptor.js +0 -39
- package/dist/features/paths/poseDescriptor.js.map +0 -1
- package/dist/features/paths/strokeToPath.js +0 -40
- package/dist/features/paths/strokeToPath.js.map +0 -1
- package/dist/features/paths/tessellate/dash.js +0 -52
- package/dist/features/paths/tessellate/dash.js.map +0 -1
- package/dist/features/paths/tessellate/insets.js +0 -32
- package/dist/features/paths/tessellate/insets.js.map +0 -1
- package/dist/features/paths/tessellate/metric.js +0 -72
- package/dist/features/paths/tessellate/metric.js.map +0 -1
- package/dist/features/paths/tessellate/stroke.js +0 -170
- package/dist/features/paths/tessellate/stroke.js.map +0 -1
- package/dist/features/paths/tessellate/vertexWidths.js +0 -32
- package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
- package/dist/features/patterns/commandPaint.js +0 -18
- package/dist/features/patterns/commandPaint.js.map +0 -1
- package/dist/features/patterns/index.js +0 -11
- package/dist/features/patterns/index.js.map +0 -1
- package/dist/features/patterns/patterns-builtin.js +0 -38
- package/dist/features/patterns/patterns-builtin.js.map +0 -1
- package/dist/features/patterns/rasterizeTile.js +0 -17
- package/dist/features/patterns/rasterizeTile.js.map +0 -1
- package/dist/features/patterns/resolveSpec.js +0 -65
- package/dist/features/patterns/resolveSpec.js.map +0 -1
- package/dist/features/patterns/tileGeometry.js +0 -158
- package/dist/features/patterns/tileGeometry.js.map +0 -1
- package/dist/features/pointer/PointerContext.js +0 -45
- package/dist/features/pointer/PointerContext.js.map +0 -1
- package/dist/features/selection/SelectionContext.js +0 -51
- package/dist/features/selection/SelectionContext.js.map +0 -1
- package/dist/features/simulation/createSimulation.js +0 -61
- package/dist/features/simulation/createSimulation.js.map +0 -1
- package/dist/features/simulation/types.js +0 -6
- package/dist/features/simulation/types.js.map +0 -1
- package/dist/features/simulation/useSimulation.js +0 -74
- package/dist/features/simulation/useSimulation.js.map +0 -1
- package/dist/features/text/domOffsets.js +0 -82
- package/dist/features/text/domOffsets.js.map +0 -1
- package/dist/features/text/domRuns.js +0 -230
- package/dist/features/text/domRuns.js.map +0 -1
- package/dist/features/text/fitTextPose.js +0 -38
- package/dist/features/text/fitTextPose.js.map +0 -1
- package/dist/features/text/hitTest.js +0 -48
- package/dist/features/text/hitTest.js.map +0 -1
- package/dist/features/text/isTextData.js +0 -8
- package/dist/features/text/isTextData.js.map +0 -1
- package/dist/features/text/overlayDirection.js +0 -15
- package/dist/features/text/overlayDirection.js.map +0 -1
- package/dist/features/text/renderLabel.js +0 -14
- package/dist/features/text/renderLabel.js.map +0 -1
- package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
- package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
- package/dist/features/text/runs/flagRange.js +0 -53
- package/dist/features/text/runs/flagRange.js.map +0 -1
- package/dist/features/text/runs/rangeStyle.js +0 -133
- package/dist/features/text/runs/rangeStyle.js.map +0 -1
- package/dist/features/text/textCommand.js +0 -60
- package/dist/features/text/textCommand.js.map +0 -1
- package/dist/features/text/textToPath.js +0 -181
- package/dist/features/text/textToPath.js.map +0 -1
- package/dist/features/text/useTextEdit.js +0 -491
- package/dist/features/text/useTextEdit.js.map +0 -1
- package/dist/features/tiling/createTiledLayer.js +0 -65
- package/dist/features/tiling/createTiledLayer.js.map +0 -1
- package/dist/features/tiling/tiledProject.js +0 -14
- package/dist/features/tiling/tiledProject.js.map +0 -1
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
- package/dist/interactions/actions/defaults/align.js.map +0 -1
- package/dist/interactions/actions/defaults/booleans.js +0 -52
- package/dist/interactions/actions/defaults/booleans.js.map +0 -1
- package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
- package/dist/interactions/actions/defaults/clone.js +0 -91
- package/dist/interactions/actions/defaults/clone.js.map +0 -1
- package/dist/interactions/actions/defaults/createOutlines.js +0 -47
- package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
- package/dist/interactions/actions/defaults/distribute.js.map +0 -1
- package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
- package/dist/interactions/actions/defaults/flip.js +0 -125
- package/dist/interactions/actions/defaults/flip.js.map +0 -1
- package/dist/interactions/actions/defaults/insert.js +0 -287
- package/dist/interactions/actions/defaults/insert.js.map +0 -1
- package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
- package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
- package/dist/interactions/actions/defaults/move.js +0 -778
- package/dist/interactions/actions/defaults/move.js.map +0 -1
- package/dist/interactions/actions/defaults/resize.js +0 -341
- package/dist/interactions/actions/defaults/resize.js.map +0 -1
- package/dist/interactions/actions/defaults/rotate.js +0 -185
- package/dist/interactions/actions/defaults/rotate.js.map +0 -1
- package/dist/interactions/actions/previewOverrides.js +0 -25
- package/dist/interactions/actions/previewOverrides.js.map +0 -1
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
- package/dist/math-J-ACHyEg.d.ts +0 -159
- package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
- package/dist/renderer/DrawCommand.js +0 -6
- package/dist/renderer/DrawCommand.js.map +0 -1
- package/dist/renderer/WeaselRenderer.js +0 -333
- package/dist/renderer/WeaselRenderer.js.map +0 -1
- package/dist/renderer/batchClip.js +0 -46
- package/dist/renderer/batchClip.js.map +0 -1
- package/dist/renderer/cache/GLImageCache.js +0 -74
- package/dist/renderer/cache/GLImageCache.js.map +0 -1
- package/dist/renderer/cache/GLMeshCache.js +0 -102
- package/dist/renderer/cache/GLMeshCache.js.map +0 -1
- package/dist/renderer/cache/GLTextureCache.js +0 -68
- package/dist/renderer/cache/GLTextureCache.js.map +0 -1
- package/dist/renderer/cache/GradientRampAtlas.js +0 -82
- package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
- package/dist/renderer/cache/cache.js +0 -13
- package/dist/renderer/cache/cache.js.map +0 -1
- package/dist/renderer/cache/markerCommandCache.js +0 -63
- package/dist/renderer/cache/markerCommandCache.js.map +0 -1
- package/dist/renderer/cache/outlineMeshCache.js +0 -15
- package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
- package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
- package/dist/renderer/cache/strokeMeshCache.js +0 -55
- package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
- package/dist/renderer/cullDrawCommands.js +0 -90
- package/dist/renderer/cullDrawCommands.js.map +0 -1
- package/dist/renderer/draw/batch.js +0 -133
- package/dist/renderer/draw/batch.js.map +0 -1
- package/dist/renderer/draw/clip.js +0 -89
- package/dist/renderer/draw/clip.js.map +0 -1
- package/dist/renderer/draw/customShader.js +0 -230
- package/dist/renderer/draw/customShader.js.map +0 -1
- package/dist/renderer/draw/drawTriangles.js +0 -8
- package/dist/renderer/draw/drawTriangles.js.map +0 -1
- package/dist/renderer/draw/effects.js +0 -28
- package/dist/renderer/draw/effects.js.map +0 -1
- package/dist/renderer/draw/flushBatch.js +0 -35
- package/dist/renderer/draw/flushBatch.js.map +0 -1
- package/dist/renderer/draw/gradient.js +0 -90
- package/dist/renderer/draw/gradient.js.map +0 -1
- package/dist/renderer/draw/image.js +0 -38
- package/dist/renderer/draw/image.js.map +0 -1
- package/dist/renderer/draw/mesh.js +0 -16
- package/dist/renderer/draw/mesh.js.map +0 -1
- package/dist/renderer/draw/paintBind.js +0 -70
- package/dist/renderer/draw/paintBind.js.map +0 -1
- package/dist/renderer/draw/pathPaint.js +0 -142
- package/dist/renderer/draw/pathPaint.js.map +0 -1
- package/dist/renderer/draw/scratchPass.js +0 -83
- package/dist/renderer/draw/scratchPass.js.map +0 -1
- package/dist/renderer/draw/stencil.js +0 -28
- package/dist/renderer/draw/stencil.js.map +0 -1
- package/dist/renderer/draw/text.js +0 -167
- package/dist/renderer/draw/text.js.map +0 -1
- package/dist/renderer/draw/uniforms.js +0 -77
- package/dist/renderer/draw/uniforms.js.map +0 -1
- package/dist/renderer/draw.js +0 -79
- package/dist/renderer/draw.js.map +0 -1
- package/dist/renderer/drawBatch.js +0 -198
- package/dist/renderer/drawBatch.js.map +0 -1
- package/dist/renderer/effects/EffectTargets.js +0 -48
- package/dist/renderer/effects/EffectTargets.js.map +0 -1
- package/dist/renderer/effects/builtins.js +0 -31
- package/dist/renderer/effects/builtins.js.map +0 -1
- package/dist/renderer/effects/composite.js +0 -11
- package/dist/renderer/effects/composite.js.map +0 -1
- package/dist/renderer/effects/effectPrelude.js +0 -10
- package/dist/renderer/effects/effectPrelude.js.map +0 -1
- package/dist/renderer/effects/types.js +0 -10
- package/dist/renderer/effects/types.js.map +0 -1
- package/dist/renderer/glyphOutlineMesh.js +0 -67
- package/dist/renderer/glyphOutlineMesh.js.map +0 -1
- package/dist/renderer/index.js +0 -20
- package/dist/renderer/math/color.js +0 -321
- package/dist/renderer/math/color.js.map +0 -1
- package/dist/renderer/math/mat3.js +0 -80
- package/dist/renderer/math/mat3.js.map +0 -1
- package/dist/renderer/math/patternSpace.js +0 -22
- package/dist/renderer/math/patternSpace.js.map +0 -1
- package/dist/renderer/math/viewToMat3.js +0 -19
- package/dist/renderer/math/viewToMat3.js.map +0 -1
- package/dist/renderer/paintResources.js +0 -18
- package/dist/renderer/paintResources.js.map +0 -1
- package/dist/renderer/paintScratch.js +0 -37
- package/dist/renderer/paintScratch.js.map +0 -1
- package/dist/renderer/shaders/ShaderProgram.js +0 -74
- package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
- package/dist/renderer/shaders/batchFill.js +0 -119
- package/dist/renderer/shaders/batchFill.js.map +0 -1
- package/dist/renderer/shaders/customPrelude.js +0 -34
- package/dist/renderer/shaders/customPrelude.js.map +0 -1
- package/dist/renderer/shaders/extractUniformNames.js +0 -184
- package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
- package/dist/renderer/shaders/glyphPaint.js +0 -61
- package/dist/renderer/shaders/glyphPaint.js.map +0 -1
- package/dist/renderer/shaders/gradFill.js +0 -31
- package/dist/renderer/shaders/gradFill.js.map +0 -1
- package/dist/renderer/shaders/pathFill.js +0 -14
- package/dist/renderer/shaders/pathFill.js.map +0 -1
- package/dist/renderer/shaders/patternFill.js +0 -25
- package/dist/renderer/shaders/patternFill.js.map +0 -1
- package/dist/renderer/shaders/registerProgram.js +0 -18
- package/dist/renderer/shaders/registerProgram.js.map +0 -1
- package/dist/renderer/spriteSheet.js +0 -14
- package/dist/renderer/spriteSheet.js.map +0 -1
- package/dist/renderer/state/GroupState.js +0 -77
- package/dist/renderer/state/GroupState.js.map +0 -1
- package/dist/renderer/strokeLengths.js +0 -50
- package/dist/renderer/strokeLengths.js.map +0 -1
- package/dist/renderer/syntheticItalic.js +0 -6
- package/dist/renderer/syntheticItalic.js.map +0 -1
- package/dist/renderer/textures/registerTexture.js +0 -34
- package/dist/renderer/textures/registerTexture.js.map +0 -1
- package/dist/scheduling/useVisibleRaf.js +0 -69
- package/dist/scheduling/useVisibleRaf.js.map +0 -1
- package/dist/test-seams-DM2B87-g.d.ts +0 -356
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSliceTool.js","names":["VERTEX_RADIUS_PX","useSliceTool","scratchRef","useRef","optsRef","useLatest","options","live","useMemo","listeners","notify","fn","createPointerFollower","actions","points","pending","ActionDisabledReason","reset","commit","cut","deps","place","pts","first","scale","withinPxRadius","x","y","eligible","sliceAction","\"slice\"","p","params","reason","at","endCtx","overlay","t","viewToTransform","view","toScreen","worldToScreen","run","stroke","OVERLAY_ROLE_STROKES","\"cut\"","out","polylineFromPoints","ellipsePath","defineTool","keybinding"],"sources":["../../../../src/tools/builtin/slice/useSliceTool.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport type { RenderLayer } from 'core/layers/render';\nimport type { DrawCommand } from '../../../renderer';\nimport type { Action, ActionDeps, InvocationCtx, ToolKeybinding } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport { createPointerFollower } from '../shared/pointerFollower';\nimport { sliceAction } from 'interactions/actions/defaults/slice';\nimport { withinPxRadius } from 'core/viewport/pxExtent';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { viewToTransform } from 'core/viewport/view';\nimport { ellipsePath, polylineFromPoints } from '@weasel-js/geom';\nimport { OVERLAY_ROLE_STROKES } from 'canvas/overlayRoleStrokes';\n\n/** Options for `useSliceTool`. */\nexport interface UseSliceToolOptions {\n /** Override the default keybinding (`{ key: 'K' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** Screen-px radius around the first point within which a click closes the\n * cut into a loop and commits it. Default `8`. */\n closeHitRadius?: number;\n}\n\n/** The click-by-click cut in progress, in world coords. */\nexport interface SliceScratch {\n points: { x: number; y: number }[];\n}\n\nconst VERTEX_RADIUS_PX = 3;\n\n/**\n * Knife tool. A drag cuts along a straight line, and an Alt-drag along its\n * freehand trail, through `sliceAction`. Clicks place a cut one point at a\n * time: Enter or a double-click commits it, Escape discards it, Backspace\n * takes back the last point, and a click on the first point closes it into a\n * loop and commits. While points are placed, a drag places one more where it\n * is released instead of cutting on its own.\n *\n * Every cut goes to the `slice` dep, which decides what it does to the scene.\n * `<SceneCanvas>` publishes one that cuts every path the cut crosses. The pending cut paints through\n * `Tool.overlay`, trailing to the pointer when the host publishes one.\n */\nexport function useSliceTool(options: UseSliceToolOptions = {}): Tool<null> {\n const scratchRef = useRef<SliceScratch>({ points: [] });\n const optsRef = useLatest({ closeHitRadius: options.closeHitRadius ?? 8 });\n\n // What the overlay layer's `subscribe` hears: a change to the points, and,\n // while any are placed, every move of the pointer the rubber band follows.\n const live = useMemo(() => {\n const listeners = new Set<() => void>();\n const notify = (): void => { for (const fn of [...listeners]) fn(); };\n return {\n notify,\n listen(fn: () => void): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n ...createPointerFollower(notify),\n };\n }, []);\n\n const actions = useMemo<Action[]>(() => {\n const points = () => scratchRef.current.points;\n const pending = () => (points().length > 0 ? true : ActionDisabledReason.NotApplicable);\n\n const reset = (): void => {\n scratchRef.current.points = [];\n live.unfollow();\n live.notify();\n };\n const commit = (deps: ActionDeps): void => {\n const cut = points().slice();\n reset();\n if (cut.length >= 2) deps.slice?.commit(cut);\n };\n const place = (deps: ActionDeps, x: number, y: number): void => {\n const pts = points();\n const first = pts[0];\n const scale = deps.view?.get().scale ?? { x: 1, y: 1 };\n if (pts.length >= 3 && withinPxRadius(x - first.x, y - first.y, optsRef.current.closeHitRadius, scale)) {\n pts.push({ x: first.x, y: first.y });\n commit(deps);\n return;\n }\n pts.push({ x, y });\n live.follow(deps.pointer);\n live.notify();\n };\n\n const eligible = { capability: 'edits-page' } as const;\n return [\n sliceAction,\n {\n id: 'slice.addPoint',\n label: 'Slice — place point',\n eligible,\n requires: ['slice', 'view', 'pointer'],\n enabled: (deps) => (deps?.['slice'] ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number } | undefined;\n if (p?.pressX === undefined || p.pressY === undefined) return;\n place(deps, p.pressX, p.pressY);\n },\n },\n },\n {\n id: 'slice.dragPoint',\n label: 'Slice — drag out a point',\n eligible,\n requires: ['slice', 'view', 'pointer'],\n enabled: pending,\n invoker: {\n timing: 'ongoing',\n // The dispatcher hands `onEnd` a context with empty deps.\n start: ({ deps }: InvocationCtx) => ({\n onMove: () => {},\n onEnd: (endCtx: InvocationCtx, reason: 'commit' | 'cancel') => {\n if (reason === 'cancel' || points().length === 0) return;\n const at = endCtx.drag?.current ?? endCtx.world;\n place(deps, at.x, at.y);\n },\n }),\n },\n },\n {\n id: 'slice.finish',\n label: 'Slice — cut along the points',\n eligible,\n requires: ['slice'],\n enabled: pending,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n // A double click arrives after both of its clicks, so the second\n // has already placed a point on top of the first.\n if ((params as { viaDoubleClick?: boolean } | undefined)?.viaDoubleClick) points().pop();\n commit(deps);\n },\n },\n },\n {\n id: 'slice.dropPoint',\n label: 'Slice — take back the last point',\n eligible,\n enabled: pending,\n invoker: {\n timing: 'immediate',\n run: () => {\n points().pop();\n if (points().length === 0) reset();\n else live.notify();\n },\n },\n },\n {\n id: 'slice.cancel',\n label: 'Slice — discard the points',\n eligible,\n // Declining with nothing placed leaves Escape to the ambient `escape`.\n enabled: pending,\n invoker: { timing: 'immediate', run: () => reset() },\n },\n ];\n }, [live, optsRef]);\n\n const overlay = useMemo<RenderLayer<unknown>>(() => ({\n id: 'slice-pending-cut',\n label: 'Slice — pending cut',\n space: 'screen',\n subscribe: live.listen,\n draw: (_data, view) => {\n const pts = scratchRef.current.points;\n if (pts.length === 0) return [];\n const t = viewToTransform(view);\n const toScreen = (p: { x: number; y: number }) => {\n const [x, y] = worldToScreen(p.x, p.y, t);\n return { x, y };\n };\n const run = pts.map(toScreen);\n const at = live.pointer()?.get();\n if (at) run.push(toScreen({ x: at.worldX, y: at.worldY }));\n const stroke = OVERLAY_ROLE_STROKES['cut'];\n const out: DrawCommand[] = [];\n if (run.length >= 2) out.push({ kind: 'path', path: polylineFromPoints(run), stroke });\n for (const p of pts.map(toScreen)) {\n out.push({\n kind: 'path',\n path: ellipsePath({\n x: p.x - VERTEX_RADIUS_PX,\n y: p.y - VERTEX_RADIUS_PX,\n width: VERTEX_RADIUS_PX * 2,\n height: VERTEX_RADIUS_PX * 2,\n }),\n fill: stroke.paint,\n });\n }\n return out;\n },\n }), [live]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool<null>({\n id: 'slice',\n capabilities: ['edits-page'],\n hookName: 'useSliceTool',\n cursor: 'crosshair',\n presentation: { label: 'Slice', group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'K' } }),\n actions,\n overlay,\n onDeactivate: () => {\n scratchRef.current.points = [];\n live.unfollow();\n live.notify();\n },\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'slice.addPoint' },\n {\n spec: { kind: 'doubleClick', mods: { shift: 'optional', alt: 'optional' } },\n actionId: 'slice.finish',\n opts: { params: { viaDoubleClick: true } },\n },\n // Ahead of the cutting drags: it declines unless points are placed.\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'slice.dragPoint' },\n { spec: { kind: 'drag' }, actionId: 'slice' },\n { spec: { kind: 'drag', mods: { alt: true } }, actionId: 'slice', opts: { params: { cut: 'freehand' } } },\n { spec: { kind: 'key', key: 'Enter' }, actionId: 'slice.finish' },\n { spec: { kind: 'key', key: 'Escape' }, actionId: 'slice.cancel' },\n { spec: { kind: 'key', key: 'Backspace' }, actionId: 'slice.dropPoint' },\n ],\n }), [actions, overlay, keybinding, live]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSliceTool.js","names":["VERTEX_RADIUS_PX","useSliceTool","scratchRef","useRef","optsRef","useLatest","options","live","useMemo","changed","createEmitter","createPointerFollower","actions","points","pending","ActionDisabledReason","reset","commit","cut","deps","place","pts","first","scale","withinPxRadius","x","y","eligible","sliceAction","\"slice\"","p","params","reason","at","endCtx","overlay","t","viewToTransform","view","toScreen","worldToScreen","run","stroke","OVERLAY_ROLE_STROKES","\"cut\"","out","polylineFromPoints","ellipsePath","defineTool","keybinding"],"sources":["../../../../src/tools/builtin/slice/useSliceTool.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport type { RenderLayer } from 'core/layers/render';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { Action, ActionDeps, InvocationCtx, ToolKeybinding } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport { createPointerFollower } from '../shared/pointerFollower';\nimport { sliceAction } from 'interactions/actions/defaults/slice';\nimport { withinPxRadius } from '@weasel-js/geom';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { viewToTransform } from 'core/viewport/view';\nimport { ellipsePath, polylineFromPoints } from '@weasel-js/geom';\nimport { OVERLAY_ROLE_STROKES } from 'canvas/overlayRoleStrokes';\nimport { createEmitter } from '@weasel-js/registry';\n\n/** Options for `useSliceTool`. */\nexport interface UseSliceToolOptions {\n /** Override the default keybinding (`{ key: 'K' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** Screen-px radius around the first point within which a click closes the\n * cut into a loop and commits it. Default `8`. */\n closeHitRadius?: number;\n}\n\n/** The click-by-click cut in progress, in world coords. */\nexport interface SliceScratch {\n points: { x: number; y: number }[];\n}\n\nconst VERTEX_RADIUS_PX = 3;\n\n/**\n * Knife tool. A drag cuts along a straight line, and an Alt-drag along its\n * freehand trail, through `sliceAction`. Clicks place a cut one point at a\n * time: Enter or a double-click commits it, Escape discards it, Backspace\n * takes back the last point, and a click on the first point closes it into a\n * loop and commits. While points are placed, a drag places one more where it\n * is released instead of cutting on its own.\n *\n * Every cut goes to the `slice` dep, which decides what it does to the scene.\n * `<SceneCanvas>` publishes one that cuts every path the cut crosses.\n */\nexport function useSliceTool(options: UseSliceToolOptions = {}): Tool {\n const scratchRef = useRef<SliceScratch>({ points: [] });\n const optsRef = useLatest({ closeHitRadius: options.closeHitRadius ?? 8 });\n\n // What the overlay layer's `subscribe` hears: a change to the points, and,\n // while any are placed, every move of the pointer the rubber band follows.\n const live = useMemo(() => {\n const changed = createEmitter();\n return {\n notify: changed.emit,\n listen: changed.subscribe,\n ...createPointerFollower(changed.emit),\n };\n }, []);\n\n const actions = useMemo<Action[]>(() => {\n const points = () => scratchRef.current.points;\n const pending = () => (points().length > 0 ? true : ActionDisabledReason.NotApplicable);\n\n const reset = (): void => {\n scratchRef.current.points = [];\n live.unfollow();\n live.notify();\n };\n const commit = (deps: ActionDeps): void => {\n const cut = points().slice();\n reset();\n if (cut.length >= 2) deps.slice?.commit(cut);\n };\n const place = (deps: ActionDeps, x: number, y: number): void => {\n const pts = points();\n const first = pts[0];\n const scale = deps.view?.get().scale ?? { x: 1, y: 1 };\n if (pts.length >= 3 && withinPxRadius(x - first.x, y - first.y, optsRef.current.closeHitRadius, scale)) {\n pts.push({ x: first.x, y: first.y });\n commit(deps);\n return;\n }\n pts.push({ x, y });\n live.follow(deps.pointer);\n live.notify();\n };\n\n const eligible = { capability: 'edits-page' } as const;\n return [\n sliceAction,\n {\n id: 'slice.addPoint',\n label: 'Slice — place point',\n eligible,\n requires: ['slice', 'view', 'pointer'],\n enabled: (deps) => (deps?.['slice'] ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number } | undefined;\n if (p?.pressX === undefined || p.pressY === undefined) return;\n place(deps, p.pressX, p.pressY);\n },\n },\n },\n {\n id: 'slice.dragPoint',\n label: 'Slice — drag out a point',\n eligible,\n requires: ['slice', 'view', 'pointer'],\n enabled: pending,\n invoker: {\n timing: 'ongoing',\n // The dispatcher hands `onEnd` a context with empty deps.\n start: ({ deps }: InvocationCtx) => ({\n onMove: () => {},\n onEnd: (endCtx: InvocationCtx, reason: 'commit' | 'cancel') => {\n if (reason === 'cancel' || points().length === 0) return;\n const at = endCtx.drag?.current ?? endCtx.world;\n place(deps, at.x, at.y);\n },\n }),\n },\n },\n {\n id: 'slice.finish',\n label: 'Slice — cut along the points',\n eligible,\n requires: ['slice'],\n enabled: pending,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n // A double click arrives after both of its clicks, so the second\n // has already placed a point on top of the first.\n if ((params as { viaDoubleClick?: boolean } | undefined)?.viaDoubleClick) points().pop();\n commit(deps);\n },\n },\n },\n {\n id: 'slice.dropPoint',\n label: 'Slice — take back the last point',\n eligible,\n enabled: pending,\n invoker: {\n timing: 'immediate',\n run: () => {\n points().pop();\n if (points().length === 0) reset();\n else live.notify();\n },\n },\n },\n {\n id: 'slice.cancel',\n label: 'Slice — discard the points',\n eligible,\n // Declining with nothing placed leaves Escape to the ambient `escape`.\n enabled: pending,\n invoker: { timing: 'immediate', run: () => reset() },\n },\n ];\n }, [live, optsRef]);\n\n const overlay = useMemo<RenderLayer<unknown>>(() => ({\n id: 'slice-pending-cut',\n label: 'Slice — pending cut',\n space: 'screen',\n subscribe: live.listen,\n draw: (_data, view) => {\n const pts = scratchRef.current.points;\n if (pts.length === 0) return [];\n const t = viewToTransform(view);\n const toScreen = (p: { x: number; y: number }) => {\n const [x, y] = worldToScreen(p.x, p.y, t);\n return { x, y };\n };\n const run = pts.map(toScreen);\n const at = live.pointer()?.get();\n if (at) run.push(toScreen({ x: at.worldX, y: at.worldY }));\n const stroke = OVERLAY_ROLE_STROKES['cut'];\n const out: DrawCommand[] = [];\n if (run.length >= 2) out.push({ kind: 'path', path: polylineFromPoints(run), stroke });\n for (const p of pts.map(toScreen)) {\n out.push({\n kind: 'path',\n path: ellipsePath({\n x: p.x - VERTEX_RADIUS_PX,\n y: p.y - VERTEX_RADIUS_PX,\n width: VERTEX_RADIUS_PX * 2,\n height: VERTEX_RADIUS_PX * 2,\n }),\n fill: { paint: stroke.paint },\n });\n }\n return out;\n },\n }), [live]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool({\n id: 'slice',\n capabilities: ['edits-page'],\n hookName: 'useSliceTool',\n cursor: 'crosshair',\n presentation: { label: 'Slice', group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'K' } }),\n actions,\n overlay,\n onDeactivate: () => {\n scratchRef.current.points = [];\n live.unfollow();\n live.notify();\n },\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'slice.addPoint' },\n {\n spec: { kind: 'doubleClick', mods: { shift: 'optional', alt: 'optional' } },\n actionId: 'slice.finish',\n opts: { params: { viaDoubleClick: true } },\n },\n // Ahead of the cutting drags: it declines unless points are placed.\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'slice.dragPoint', opts: { yields: true } },\n { spec: { kind: 'drag' }, actionId: 'slice' },\n { spec: { kind: 'drag', mods: { alt: true } }, actionId: 'slice', opts: { params: { cut: 'freehand' } } },\n { spec: { kind: 'key', key: 'Enter' }, actionId: 'slice.finish' },\n { spec: { kind: 'key', key: 'Escape' }, actionId: 'slice.cancel' },\n { spec: { kind: 'key', key: 'Backspace' }, actionId: 'slice.dropPoint' },\n ],\n }), [actions, overlay, keybinding, live]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStarTool.js","names":["StarIcon","MIN_POINTS","MAX_POINTS","useStarTool","initialPoints","options","pointsRef","useRef","innerRatioRef","useLatest","innerRatio","setPointsTick","useState","bumpPoints","useCallback","n","adjustPointsAction","useMemo","p","params","step","defineTool","cursorFor","insertBindingBehaviors","behaviors","label"],"sources":["../../../../src/tools/builtin/star/useStarTool.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { StarIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport type { Action } from '@weasel-js/routing';\nimport { useLatest } from '@weasel-js/react';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** A point in world coordinates. */\nexport interface StarPoint { x: number; y: number }\n\n/** Options for `useStarTool`. */\nexport interface UseStarToolOptions extends InsertToolOptions {\n label?: string;\n /** Initial point count. Persists across gestures (Illustrator\n * convention), adjustable mid-drag via ArrowUp/Down or wheel\n * (range 3–32). */\n points?: number;\n /** Inner-radius / outer-radius ratio. Default 0.5. Consumers wanting\n * per-instance ratios should override the `insert` dep. */\n innerRatio?: number;\n}\n\nconst MIN_POINTS = 3;\nconst MAX_POINTS = 32;\n\n/**\n * Drag-from-center star tool. Pointerdown sets center; drag determines\n * outer radius + rotation; release commits via `insertAction`. Inner\n * radius = outer × `innerRatio` (default 0.5). Point count defaults to\n * 5, adjustable mid-gesture via ArrowUp/Down or wheel.\n *\n * Live preview painted by the dispatcher overlay layer reading\n * `insertAction.overlay()`. Consumers wanting custom star geometry\n * override the `insert` dep.\n */\nexport function useStarTool<TNode extends { id: string } = { id: string }>(\n options: UseStarToolOptions = {},\n): Tool
|
|
1
|
+
{"version":3,"file":"useStarTool.js","names":["StarIcon","MIN_POINTS","MAX_POINTS","useStarTool","initialPoints","options","pointsRef","useRef","innerRatioRef","useLatest","innerRatio","setPointsTick","useState","bumpPoints","useCallback","n","adjustPointsAction","useMemo","p","params","step","defineTool","cursorFor","insertBindingBehaviors","behaviors","label"],"sources":["../../../../src/tools/builtin/star/useStarTool.tsx"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { StarIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport type { Action } from '@weasel-js/routing';\nimport { useLatest } from '@weasel-js/react';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** A point in world coordinates. */\nexport interface StarPoint { x: number; y: number }\n\n/** Options for `useStarTool`. */\nexport interface UseStarToolOptions extends InsertToolOptions {\n label?: string;\n /** Initial point count. Persists across gestures (Illustrator\n * convention), adjustable mid-drag via ArrowUp/Down or wheel\n * (range 3–32). */\n points?: number;\n /** Inner-radius / outer-radius ratio. Default 0.5. Consumers wanting\n * per-instance ratios should override the `insert` dep. */\n innerRatio?: number;\n}\n\nconst MIN_POINTS = 3;\nconst MAX_POINTS = 32;\n\n/**\n * Drag-from-center star tool. Pointerdown sets center; drag determines\n * outer radius + rotation; release commits via `insertAction`. Inner\n * radius = outer × `innerRatio` (default 0.5). Point count defaults to\n * 5, adjustable mid-gesture via ArrowUp/Down or wheel.\n *\n * Live preview painted by the dispatcher overlay layer reading\n * `insertAction.overlay()`. Consumers wanting custom star geometry\n * override the `insert` dep.\n */\nexport function useStarTool<TNode extends { id: string } = { id: string }>(\n options: UseStarToolOptions = {},\n): Tool {\n const {\n points: initialPoints = 5,\n innerRatio = 0.5,\n label = 'Star',\n behaviors,\n } = options;\n const pointsRef = useRef(initialPoints);\n const innerRatioRef = useLatest(innerRatio);\n const [, setPointsTick] = useState(0);\n const bumpPoints = useCallback(() => setPointsTick((n) => n + 1), []);\n\n // Wheel-to-adjust-points action. Phase-gated to `[engaged]` so it\n // fires only mid-drag.\n const adjustPointsAction = useMemo<Action>(\n () => ({\n id: 'star.adjustPoints',\n label: 'Star — adjust points',\n invoker: {\n timing: 'immediate' as const,\n run: (_deps, params) => {\n const p = params as { deltaY?: number; delta?: number } | undefined;\n // `delta` comes from the ArrowUp/ArrowDown key bindings; `deltaY`\n // from the wheel. Wheel up (deltaY > 0 under natural scrolling)\n // adds a point.\n const step = p?.delta ?? (p?.deltaY !== undefined && p.deltaY !== 0\n ? (p.deltaY > 0 ? 1 : -1)\n : 0);\n if (step === 0) return;\n pointsRef.current = step > 0\n ? Math.min(MAX_POINTS, pointsRef.current + 1)\n : Math.max(MIN_POINTS, pointsRef.current - 1);\n bumpPoints();\n },\n },\n }),\n [bumpPoints],\n );\n\n void ({} as TNode);\n\n return useMemo(\n () =>\n defineTool({\n id: 'star',\n capabilities: ['creates-shapes'],\n hookName: 'useStarTool',\n cursor: cursorFor('crosshairStar', { fallback: 'crosshair' }),\n // Registered by <ToolActionsMounter>, inside the ActionsProvider —\n // see `ToolDef.actions` for why the hook can't register it itself.\n actions: [adjustPointsAction],\n presentation: {\n label,\n group: 'shape',\n icon: <StarIcon />,\n },\n bindings: [\n // Default = drag from corner; anchor dot in the overlay sells\n // the click point. Alt flips to center mode (live toggle).\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: {\n params: () => ({\n kind: 'star',\n points: pointsRef.current,\n innerRadiusRatio: innerRatioRef.current,\n }),\n ...insertBindingBehaviors(behaviors),\n },\n },\n {\n spec: { kind: 'wheel', phase: 'engaged' },\n actionId: 'star.adjustPoints',\n },\n {\n spec: { kind: 'wheel', phase: 'engaged', mods: { shift: true } },\n actionId: 'insert.adjustRotation',\n },\n // ArrowUp/Down → adjust point count. Ported off the phase table for\n // the same reason as polygon's: as an `initial.keyDown` route the\n // key was claimed on the tool pipeline while `nudge.*` matched the\n // same press on the interactions dispatcher, so both fired.\n {\n spec: { kind: 'key', key: 'ArrowUp' },\n actionId: 'star.adjustPoints',\n opts: { params: { delta: 1 } },\n },\n {\n spec: { kind: 'key', key: 'ArrowDown' },\n actionId: 'star.adjustPoints',\n opts: { params: { delta: -1 } },\n },\n ],\n }),\n [adjustPointsAction, behaviors, label, innerRatioRef],\n );\n}\n"],"mappings":";;;;;;;;AAwBA,IAAMC,IAAa,GACbC,IAAa;AAYnB,SAAgBC,EACd,IAA8B,CAAC,GACzB;CACN,IAAM,EACJ,QAAQC,IAAgB,GACxB,gBAAa,IACb,WAAQ,QACR,iBACEC,GACEC,IAAYC,EAAOH,CAAa,GAChCI,IAAgBC,EAAUC,CAAU,GACpC,GAAGC,KAAiBC,EAAS,CAAC,GAC9BC,IAAaC,QAAkBH,GAAe,MAAMI,IAAI,CAAC,GAAG,CAAC,CAAC,GAI9DC,IAAqBC,SAClB;EACL,IAAI;EACJ,OAAO;EACP,SAAS;GACP,QAAQ;GACR,MAAM,GAAO,MAAW;IACtB,IAAMC,IAAIC,GAIJC,IAAOF,GAAG,UAAUA,GAAG,WAAW,KAAA,KAAaA,EAAE,WAAW,IAC7DA,EAAE,SAAS,IAAI,IAAI,KACpB;IACJ,AAAIE,MAAS,MACb,EAAU,UAAUA,IAAO,IACvB,KAAK,IAAIlB,GAAYI,EAAU,UAAU,CAAC,IAC1C,KAAK,IAAIL,GAAYK,EAAU,UAAU,CAAC,GAC9CO,EAAW;GACb;EACF;CACF,IACA,CAACA,CAAU,CACb;CAIA,OAAOI,QAEHI,EAAW;EACT,IAAI;EACJ,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQC,EAAU,iBAAiB,EAAE,UAAU,YAAY,CAAC;EAG5D,SAAS,CAACN,CAAkB;EAC5B,cAAc;GACZ;GACA,OAAO;GACP,MAAM,kBAAChB,GAAD,CAAW,CAAA;EACnB;EACA,UAAU;GAGR;IACE,MAAM,EAAE,MAAM,OAAO;IACrB,UAAU;IACV,MAAM;KACJ,eAAe;MACb,MAAM;MACN,QAAQM,EAAU;MAClB,kBAAkBE,EAAc;KAClC;KACA,GAAGe,EAAuBC,CAAS;IACrC;GACF;GACA;IACE,MAAM;KAAE,MAAM;KAAS,OAAO;IAAU;IACxC,UAAU;GACZ;GACA;IACE,MAAM;KAAE,MAAM;KAAS,OAAO;KAAW,MAAM,EAAE,OAAO,GAAK;IAAE;IAC/D,UAAU;GACZ;GAKA;IACE,MAAM;KAAE,MAAM;KAAO,KAAK;IAAU;IACpC,UAAU;IACV,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;GAC/B;GACA;IACE,MAAM;KAAE,MAAM;KAAO,KAAK;IAAY;IACtC,UAAU;IACV,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,EAAE;GAChC;EACF;CACF,CAAC,GACH;EAACR;EAAoBQ;EAAWC;EAAOjB;CAAa,CACtD;AACF"}
|
|
@@ -179,6 +179,14 @@ o.options = {
|
|
|
179
179
|
description: "Ink for the range.",
|
|
180
180
|
alpha: !0,
|
|
181
181
|
default: "#000000"
|
|
182
|
+
},
|
|
183
|
+
noFill: {
|
|
184
|
+
kind: "boolean",
|
|
185
|
+
name: "No fill",
|
|
186
|
+
description: "Draw the range with no fill.",
|
|
187
|
+
icon: "paintNone",
|
|
188
|
+
control: "toggle",
|
|
189
|
+
default: !1
|
|
182
190
|
}
|
|
183
191
|
}
|
|
184
192
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTextTool.js","names":["TextIcon","PRESENTATION","createElement","useTextTool","options","useMemo","defineTool","insertBindingBehaviors","behaviors","PERCENT","v","flag","name"],"sources":["../../../../src/tools/builtin/text/useTextTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport type { PrefGroup } from '@weasel-js/prefs';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { TextIcon } from '../../../icons';\n\nconst PRESENTATION = {\n label: 'Text',\n icon: createElement(TextIcon),\n group: 'type',\n};\n\n/** Text tool. Drag-rect insertion is owned end-to-end by the dispatcher's\n * `insertAction` (kind: `'text'`); click-on-selected-text-node enters edit\n * mode via the `enterTextEdit` action.\n *\n * Consumers must register both the `insert` dep (e.g. through\n * `SceneCanvas`'s `useInsertDepSource`) and the `textEdit` dep\n * (`enterTextEditAction`'s contract — see\n * `src/interactions/actions/defaults/enterTextEdit.ts`). Custom node\n * factories and hit gating belong on those deps, not on the tool. */\nexport function useTextTool(options: InsertToolOptions = {}): Tool
|
|
1
|
+
{"version":3,"file":"useTextTool.js","names":["TextIcon","PRESENTATION","createElement","useTextTool","options","useMemo","defineTool","insertBindingBehaviors","behaviors","PERCENT","v","flag","name"],"sources":["../../../../src/tools/builtin/text/useTextTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport type { PrefGroup } from '@weasel-js/prefs';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { TextIcon } from '../../../icons';\n\nconst PRESENTATION = {\n label: 'Text',\n icon: createElement(TextIcon),\n group: 'type',\n};\n\n/** Text tool. Drag-rect insertion is owned end-to-end by the dispatcher's\n * `insertAction` (kind: `'text'`); click-on-selected-text-node enters edit\n * mode via the `enterTextEdit` action.\n *\n * Consumers must register both the `insert` dep (e.g. through\n * `SceneCanvas`'s `useInsertDepSource`) and the `textEdit` dep\n * (`enterTextEditAction`'s contract — see\n * `src/interactions/actions/defaults/enterTextEdit.ts`). Custom node\n * factories and hit gating belong on those deps, not on the tool. */\nexport function useTextTool(options: InsertToolOptions = {}): Tool {\n const { behaviors } = options;\n return useMemo<Tool>(\n () =>\n defineTool({\n id: 'text',\n keybinding: { key: 'T' },\n capabilities: ['creates-text'],\n hookName: 'useTextTool',\n cursor: 'text',\n presentation: PRESENTATION,\n bindings: [\n { spec: { kind: 'drag' }, actionId: 'insert', opts: { params: { kind: 'text' }, ...insertBindingBehaviors(behaviors) } },\n { spec: { kind: 'click', target: 'selected-body' }, actionId: 'enterTextEdit' },\n ],\n }),\n [behaviors],\n );\n}\n\n/** Both script primitives are fractions of the inherited size, so both read\n * as percentages. The step is a tenth of a point because the field snaps the\n * *displayed* value to it, and a coarser one would render a superscript's\n * 58.3% as 60% and commit that on the next edit. */\nconst PERCENT = {\n toDisplay: (v: number) => Math.round(v * 1000) / 10,\n // Rounded rather than divided: 33.3 / 100 is 0.33299999999999996, and that\n // dust would be written into the document and shown back on the next read.\n fromDisplay: (v: number) => Math.round(v * 1000) / 100_000,\n suffix: '%',\n};\n\n/** A run flag: on or off per character, drawn as one segment of a bar. */\nconst flag = (name: string, icon: string) =>\n ({\n kind: 'boolean',\n name,\n description: `${name} for the characters in the range.`,\n icon,\n control: 'toggle',\n default: false,\n }) as const;\n\n/**\n * What the tool offers while a caret range is active — the character half of\n * text styling, against the node-level Character group a selection shows.\n *\n * Keyed by {@link StyledRun} field, so a host reads values out of a\n * `RangeStyle` and writes a `RunStylePatch` back with no name mapping of its\n * own. `script` is a preset over `baselineShift` and `fontScale`, so all three\n * are here and naming either primitive overrides that half. `noFill` is the one\n * key that is not a field: on, it is `fill: null`.\n */\nuseTextTool.options = {\n name: 'Text',\n description: 'Character styling for the selected range.',\n children: {\n bold: {\n ...flag('Bold', 'bold'),\n pair: { with: ['italic', 'underline', 'strikethrough', 'overline'], label: 'Character style' },\n },\n italic: flag('Italic', 'italic'),\n underline: flag('Underline', 'underline'),\n strikethrough: flag('Strikethrough', 'strikethrough'),\n overline: flag('Overline', 'overline'),\n // Clearable: the two values are exclusive *and* absent is a third state,\n // so clicking the lit segment turns the script off.\n script: {\n kind: 'enum',\n name: 'Script',\n description: 'Raise or lower the range off the baseline, at a smaller size.',\n control: 'toggle',\n clearable: true,\n default: undefined,\n options: [\n { value: 'super', label: 'Superscript', icon: 'superscript' },\n { value: 'sub', label: 'Subscript', icon: 'subscript' },\n ],\n },\n textTransform: {\n kind: 'enum',\n name: 'Case',\n description: 'Draw the range in capitals, lowercase or title case. The text itself is unchanged.',\n control: 'toggle',\n default: 'none',\n options: [{ value: 'none', label: 'None', short: ['–'] }, { value: 'uppercase', label: 'Uppercase', short: ['AA'] }, { value: 'lowercase', label: 'Lowercase', short: ['aa'] }, { value: 'capitalize', label: 'Capitalize', short: ['Aa'] }],\n },\n fontVariantCaps: {\n kind: 'enum',\n name: 'Small caps',\n description: 'Draw lowercase letters in the range as smaller capitals. The text itself is unchanged.',\n control: 'toggle',\n default: 'normal',\n options: [{ value: 'normal', label: 'Normal', short: ['–'] }, { value: 'small-caps', label: 'Small caps', short: ['Sc'] }],\n },\n fontFamily: {\n kind: 'font-family',\n name: 'Font',\n description: 'Typeface for the range.',\n default: undefined,\n },\n // Listed from the weights the range's family has registered. Bold is a\n // preset over it: toggling Bold clears it, picking one clears Bold.\n fontWeight: {\n kind: 'font-weight',\n name: 'Weight',\n description: 'Weight of the range, from the faces its family has.',\n default: undefined,\n },\n fontSize: { kind: 'number', name: 'Size', description: 'Type size.', min: 1, step: 1, default: 16 },\n letterSpacing: {\n kind: 'number',\n name: 'Tracking',\n // The typographic term, short enough for a strip; `name` stays the\n // accessible one.\n short: ['VA'],\n description: 'Space added between characters.',\n step: 0.1,\n default: 0,\n },\n baselineShift: {\n kind: 'number',\n name: 'Baseline shift',\n short: ['Shift'],\n description: 'Raise or lower the range, in ems of the inherited size.',\n step: 0.001,\n unit: PERCENT,\n default: 0,\n },\n fontScale: {\n kind: 'number',\n name: 'Scale',\n description: 'Size of the range against the inherited size.',\n min: 0.01,\n step: 0.001,\n unit: PERCENT,\n default: 1,\n },\n fill: {\n kind: 'color',\n name: 'Color',\n description: 'Ink for the range.',\n alpha: true,\n default: '#000000',\n },\n noFill: {\n kind: 'boolean',\n name: 'No fill',\n description: 'Draw the range with no fill.',\n icon: 'paintNone',\n control: 'toggle',\n default: false,\n },\n },\n} satisfies PrefGroup;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { defineTool as e } from "../../overlayBinding.js";
|
|
2
|
+
import { placedRig as t } from "../bone/placedRig.js";
|
|
3
|
+
import { createBoneOverlay as n } from "../bone/boneOverlay.js";
|
|
4
|
+
import { createRigEditState as r } from "../bone/rigEditState.js";
|
|
5
|
+
import { createWeightActions as i, weighedPaths as a } from "./weightActions.js";
|
|
6
|
+
import { createWeightOverlay as o } from "./weightOverlay.js";
|
|
7
|
+
import { useMemo as s } from "react";
|
|
8
|
+
import { useLatest as c } from "@weasel-js/react";
|
|
9
|
+
//#region src/tools/builtin/weight/useWeightTool.ts
|
|
10
|
+
function l(l) {
|
|
11
|
+
let u = s(() => r(), []), d = l.state ?? u, f = c({
|
|
12
|
+
scene: l.scene,
|
|
13
|
+
rig: l.rig,
|
|
14
|
+
radius: l.radius ?? 24,
|
|
15
|
+
reach: l.reach ?? 10
|
|
16
|
+
}), p = s(() => ({
|
|
17
|
+
state: d,
|
|
18
|
+
scene: () => f.current.scene,
|
|
19
|
+
placed: () => t(f.current.scene, f.current.rig()),
|
|
20
|
+
reachPx: () => f.current.reach,
|
|
21
|
+
radiusPx: () => f.current.radius,
|
|
22
|
+
painted: d.painted,
|
|
23
|
+
paint: d.paint
|
|
24
|
+
}), [f, d]), m = s(() => i(p), [p]), h = s(() => [o({
|
|
25
|
+
id: "weight-tool-points",
|
|
26
|
+
paths: () => a(p),
|
|
27
|
+
active: d.active,
|
|
28
|
+
subscribe: d.listen
|
|
29
|
+
}), n({
|
|
30
|
+
id: "weight-tool-skeleton",
|
|
31
|
+
skeleton: () => p.placed()?.skeleton ?? null,
|
|
32
|
+
active: d.active,
|
|
33
|
+
subscribe: d.listen
|
|
34
|
+
})], [p, d]), { keybinding: g } = l;
|
|
35
|
+
return s(() => e({
|
|
36
|
+
id: "weight",
|
|
37
|
+
capabilities: ["edits-page"],
|
|
38
|
+
hookName: "useWeightTool",
|
|
39
|
+
cursor: "crosshair",
|
|
40
|
+
presentation: {
|
|
41
|
+
label: "Weight",
|
|
42
|
+
group: "shape"
|
|
43
|
+
},
|
|
44
|
+
...g === null ? {} : { keybinding: g ?? { key: "W" } },
|
|
45
|
+
actions: m,
|
|
46
|
+
overlay: h,
|
|
47
|
+
onDeactivate: () => p.paint(null),
|
|
48
|
+
bindings: [{
|
|
49
|
+
spec: {
|
|
50
|
+
kind: "click",
|
|
51
|
+
mods: {
|
|
52
|
+
shift: "optional",
|
|
53
|
+
alt: "optional"
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
actionId: "weight.click"
|
|
57
|
+
}, {
|
|
58
|
+
spec: {
|
|
59
|
+
kind: "drag",
|
|
60
|
+
mods: {
|
|
61
|
+
shift: "optional",
|
|
62
|
+
alt: "optional"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
actionId: "weight.paint"
|
|
66
|
+
}]
|
|
67
|
+
}), [
|
|
68
|
+
m,
|
|
69
|
+
h,
|
|
70
|
+
g,
|
|
71
|
+
p
|
|
72
|
+
]);
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { l as useWeightTool };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=useWeightTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWeightTool.js","names":["useWeightTool","ownState","useMemo","createRigEditState","state","options","opts","useLatest","env","placedRig","actions","createWeightActions","overlay","createWeightOverlay","weighedPaths","createBoneOverlay","defineTool","keybinding"],"sources":["../../../../src/tools/builtin/weight/useWeightTool.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { createBoneOverlay } from '../bone/boneOverlay';\nimport { placedRig } from '../bone/placedRig';\nimport { createRigEditState, type RigEditState } from '../bone/rigEditState';\nimport { createWeightActions, weighedPaths, type WeightEnv } from './weightActions';\nimport { createWeightOverlay } from './weightOverlay';\n\n/** Options for `useWeightTool`. */\nexport interface UseWeightToolOptions {\n scene: Scene<unknown, string, unknown>;\n /** The node whose data holds the skeleton; the tool paints the paths under it. */\n rig: () => NodeId | null;\n /** Shared with `useBoneTool`, so both act on one joint. Default: the tool's own. */\n state?: RigEditState;\n /** Override the default keybinding (`{ key: 'W' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** The brush's radius in screen px. Default 24. */\n radius?: number;\n /** Screen px around a joint within which a click picks it. Default 10. */\n reach?: number;\n}\n\n/**\n * Paints how much the active joint weighs each point of the paths under a rig node, into\n * their `data.skin`. A click on a joint makes it the active one. A drag is a round brush:\n * points under it follow the active joint more, the nearer the brush's center, and their\n * other joints give way; with Alt held they follow it less. A click away from any joint is\n * one dab. Every point shows as a dot colored by the active joint's share of it. A stroke is\n * one undo entry, and until it ends its weights are in `state.painted()`, which `useRigNode`\n * binds when given the same `state` as `painting`.\n */\nexport function useWeightTool(options: UseWeightToolOptions): Tool {\n const ownState = useMemo(() => createRigEditState(), []);\n const state = options.state ?? ownState;\n const opts = useLatest({\n scene: options.scene, rig: options.rig, radius: options.radius ?? 24, reach: options.reach ?? 10,\n });\n const env = useMemo((): WeightEnv => ({\n state,\n scene: () => opts.current.scene,\n placed: () => placedRig(opts.current.scene, opts.current.rig()),\n reachPx: () => opts.current.reach,\n radiusPx: () => opts.current.radius,\n painted: state.painted,\n paint: state.paint,\n }), [opts, state]);\n\n const actions = useMemo(() => createWeightActions(env), [env]);\n const overlay = useMemo(() => [\n createWeightOverlay({\n id: 'weight-tool-points',\n paths: () => weighedPaths(env),\n active: state.active,\n subscribe: state.listen,\n }),\n createBoneOverlay({\n id: 'weight-tool-skeleton',\n skeleton: () => env.placed()?.skeleton ?? null,\n active: state.active,\n subscribe: state.listen,\n }),\n ], [env, state]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool({\n id: 'weight',\n capabilities: ['edits-page'],\n hookName: 'useWeightTool',\n cursor: 'crosshair',\n presentation: { label: 'Weight', group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'W' } }),\n actions,\n overlay,\n onDeactivate: () => env.paint(null),\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'weight.click' },\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'weight.paint' },\n ],\n }), [actions, overlay, keybinding, env]);\n}\n"],"mappings":";;;;;;;;;AAoCA,SAAgBA,EAAc,GAAqC;CACjE,IAAMC,IAAWC,QAAcC,EAAmB,GAAG,CAAC,CAAC,GACjDC,IAAQC,EAAQ,SAASJ,GACzBK,IAAOC,EAAU;EACrB,OAAOF,EAAQ;EAAO,KAAKA,EAAQ;EAAK,QAAQA,EAAQ,UAAU;EAAI,OAAOA,EAAQ,SAAS;CAChG,CAAC,GACKG,IAAMN,SAA0B;EACpC;EACA,aAAaI,EAAK,QAAQ;EAC1B,cAAcG,EAAUH,EAAK,QAAQ,OAAOA,EAAK,QAAQ,IAAI,CAAC;EAC9D,eAAeA,EAAK,QAAQ;EAC5B,gBAAgBA,EAAK,QAAQ;EAC7B,SAASF,EAAM;EACf,OAAOA,EAAM;CACf,IAAI,CAACE,GAAMF,CAAK,CAAC,GAEXM,IAAUR,QAAcS,EAAoBH,CAAG,GAAG,CAACA,CAAG,CAAC,GACvDI,IAAUV,QAAc,CAC5BW,EAAoB;EAClB,IAAI;EACJ,aAAaC,EAAaN,CAAG;EAC7B,QAAQJ,EAAM;EACd,WAAWA,EAAM;CACnB,CAAC,GACDW,EAAkB;EAChB,IAAI;EACJ,gBAAgBP,EAAI,OAAO,CAAC,EAAE,YAAY;EAC1C,QAAQJ,EAAM;EACd,WAAWA,EAAM;CACnB,CAAC,CACH,GAAG,CAACI,GAAKJ,CAAK,CAAC,GAET,EAAE,kBAAeC;CACvB,OAAOH,QAAcc,EAAW;EAC9B,IAAI;EACJ,cAAc,CAAC,YAAY;EAC3B,UAAU;EACV,QAAQ;EACR,cAAc;GAAE,OAAO;GAAU,OAAO;EAAQ;EAChD,GAAIC,MAAe,OAAO,CAAC,IAAI,EAAE,YAAYA,KAAc,EAAE,KAAK,IAAI,EAAE;EACxE;EACA;EACA,oBAAoBT,EAAI,MAAM,IAAI;EAClC,UAAU,CACR;GAAE,MAAM;IAAE,MAAM;IAAS,MAAM;KAAE,OAAO;KAAY,KAAK;IAAW;GAAE;GAAG,UAAU;EAAe,GAClG;GAAE,MAAM;IAAE,MAAM;IAAQ,MAAM;KAAE,OAAO;KAAY,KAAK;IAAW;GAAE;GAAG,UAAU;EAAe,CACnG;CACF,CAAC,GAAG;EAACE;EAASE;EAASK;EAAYT;CAAG,CAAC;AACzC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { createSetDataOp as e } from "../../../core/ops/setData.js";
|
|
2
|
+
import { defaultCommitAdapter as t } from "../../../interactions/actions/defaultCommitAdapter.js";
|
|
3
|
+
import { dataRestPath as n } from "../../../animation/rig/skinBinding.js";
|
|
4
|
+
import { sceneReach as r } from "../bone/placedRig.js";
|
|
5
|
+
import { ActionDisabledReason as i } from "@weasel-js/routing";
|
|
6
|
+
import { brushWeights as a, jointAt as o, setWeights as s, skinnable as c } from "@weasel-js/animator";
|
|
7
|
+
//#region src/tools/builtin/weight/weightActions.ts
|
|
8
|
+
function l(e) {
|
|
9
|
+
let t = e.placed();
|
|
10
|
+
if (!t) return [];
|
|
11
|
+
let r = e.scene(), i = e.painted(), a = [], o = (e) => {
|
|
12
|
+
for (let t of r.childrenOf(e)) {
|
|
13
|
+
let e = r.get(t), s = e && n(e);
|
|
14
|
+
if (e && s) {
|
|
15
|
+
let n = i.get(t) ?? e.data?.skin ?? {};
|
|
16
|
+
a.push({
|
|
17
|
+
id: t,
|
|
18
|
+
path: c(s),
|
|
19
|
+
skin: n
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
o(t);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return o(t.id), a;
|
|
26
|
+
}
|
|
27
|
+
var u = { capability: "edits-page" }, d = (e) => {
|
|
28
|
+
let t = e.state.active();
|
|
29
|
+
return t !== null && e.placed()?.skeleton.joints.some((e) => e.name === t) ? t : null;
|
|
30
|
+
};
|
|
31
|
+
function f(e, t, n, i, o, c) {
|
|
32
|
+
let u = r(t, e.radiusPx()), d = null;
|
|
33
|
+
for (let { id: t, path: r, skin: f } of l(e)) {
|
|
34
|
+
let l = a(r.coords, i, o, u, f[n], c);
|
|
35
|
+
l.size !== 0 && (d ??= new Map(e.painted()), d.set(t, s(f, r.coords.length >> 1, n, l)));
|
|
36
|
+
}
|
|
37
|
+
return d;
|
|
38
|
+
}
|
|
39
|
+
function p(n, r) {
|
|
40
|
+
let i = n.scene(), a = [];
|
|
41
|
+
for (let [t, r] of n.painted()) {
|
|
42
|
+
let n = i.get(t)?.data;
|
|
43
|
+
n !== void 0 && a.push(e({
|
|
44
|
+
id: t,
|
|
45
|
+
from: n,
|
|
46
|
+
to: {
|
|
47
|
+
...n,
|
|
48
|
+
skin: r
|
|
49
|
+
},
|
|
50
|
+
label: "Paint weights"
|
|
51
|
+
}));
|
|
52
|
+
}
|
|
53
|
+
a.length > 0 && (r.applyOps ? r.applyOps(a, "Paint weights") : i.applyBatch(a, "Paint weights", t(i, r.selection?.adapterMethods))), n.paint(null);
|
|
54
|
+
}
|
|
55
|
+
function m(e) {
|
|
56
|
+
return [{
|
|
57
|
+
id: "weight.paint",
|
|
58
|
+
label: "Weight — paint the active joint's weights",
|
|
59
|
+
eligible: u,
|
|
60
|
+
requires: [
|
|
61
|
+
"view",
|
|
62
|
+
"selection",
|
|
63
|
+
"applyOps"
|
|
64
|
+
],
|
|
65
|
+
enabled: () => d(e) !== null || i.NotApplicable,
|
|
66
|
+
invoker: {
|
|
67
|
+
timing: "ongoing",
|
|
68
|
+
start: ({ deps: t, drag: n, world: r, modifiers: i }) => {
|
|
69
|
+
let a = d(e);
|
|
70
|
+
if (a === null) return {};
|
|
71
|
+
let o = (n, r, i) => {
|
|
72
|
+
let o = f(e, t, a, n, r, i ? "remove" : "add");
|
|
73
|
+
o && e.paint(o);
|
|
74
|
+
}, s = n?.start ?? r;
|
|
75
|
+
return o(s.x, s.y, i.alt), {
|
|
76
|
+
onMove: (e) => o(e.world.x, e.world.y, e.modifiers.alt),
|
|
77
|
+
onEnd: (n, r) => {
|
|
78
|
+
r === "cancel" ? e.paint(null) : p(e, t);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}, {
|
|
84
|
+
id: "weight.click",
|
|
85
|
+
label: "Weight — pick a joint, or dab its weight",
|
|
86
|
+
eligible: u,
|
|
87
|
+
requires: [
|
|
88
|
+
"view",
|
|
89
|
+
"selection",
|
|
90
|
+
"applyOps"
|
|
91
|
+
],
|
|
92
|
+
enabled: () => e.placed() ? !0 : i.NotApplicable,
|
|
93
|
+
invoker: {
|
|
94
|
+
timing: "immediate",
|
|
95
|
+
run: (t, n) => {
|
|
96
|
+
let i = n, a = e.placed();
|
|
97
|
+
if (!a || i?.pressX === void 0 || i.pressY === void 0) return;
|
|
98
|
+
let s = o(a.skeleton, i.pressX, i.pressY, r(t, e.reachPx()));
|
|
99
|
+
if (s !== null) {
|
|
100
|
+
e.state.setActive(s);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
let c = d(e), l = c === null ? null : f(e, t, c, i.pressX, i.pressY, i.mods?.alt ? "remove" : "add");
|
|
104
|
+
l && (e.paint(l), p(e, t));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}];
|
|
108
|
+
}
|
|
109
|
+
//#endregion
|
|
110
|
+
export { m as createWeightActions, l as weighedPaths };
|
|
111
|
+
|
|
112
|
+
//# sourceMappingURL=weightActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weightActions.js","names":["weighedPaths","rig","env","scene","painted","out","walk","id","parent","node","rest","dataRestPath","skin","skinnable","eligible","activeJoint","name","j","dab","radius","sceneReach","deps","next","hits","brushWeights","path","x","y","joint","mode","setWeights","commitPainted","ops","data","createSetDataOp","defaultCommitAdapter","createWeightActions","ActionDisabledReason","stroke","alt","press","drag","world","modifiers","move","reason","p","params","hit","jointAt"],"sources":["../../../../src/tools/builtin/weight/weightActions.ts"],"sourcesContent":["import type { Action, ActionDeps, InvocationCtx } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport type { Op } from '@weasel-js/history';\nimport { createSetDataOp } from 'core/ops/setData';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { defaultCommitAdapter } from 'interactions/actions/defaultCommitAdapter';\nimport type { RigNodeData } from '../../../animation/rig/rigNode';\nimport { jointAt } from '@weasel-js/animator';\nimport { skinnable, type Skin } from '@weasel-js/animator';\nimport { dataRestPath } from '../../../animation/rig/skinBinding';\nimport { brushWeights, setWeights } from '@weasel-js/animator';\nimport { sceneReach, type PlacedRig } from '../bone/placedRig';\nimport type { RigEditState } from '../bone/rigEditState';\n\n/** One path under the rig node, where it is drawn, with the weights now showing. */\nexport interface WeighedPath {\n id: NodeId;\n path: PolygonPath;\n skin: Skin;\n}\n\n/** What the weight tool's actions read and write, all of it the tool's own. */\nexport interface WeightEnv {\n scene(): Scene<unknown, string, unknown>;\n placed(): PlacedRig | null;\n state: RigEditState;\n /** Screen px around a joint within which a click picks it. */\n reachPx(): number;\n /** The brush's radius in screen px. */\n radiusPx(): number;\n /** Weights a stroke has painted and not yet committed, by node. */\n painted(): ReadonlyMap<NodeId, Skin>;\n paint(next: ReadonlyMap<NodeId, Skin> | null): void;\n}\n\n/** Every path under the rig node, with what `env.painted()` holds for it in place of its\n * `data.skin`. */\nexport function weighedPaths(env: Pick<WeightEnv, 'scene' | 'placed' | 'painted'>): WeighedPath[] {\n const rig = env.placed();\n if (!rig) return [];\n const scene = env.scene();\n const painted = env.painted();\n const out: WeighedPath[] = [];\n const walk = (parent: NodeId): void => {\n for (const id of scene.childrenOf(parent)) {\n const node = scene.get(id);\n const rest = node && dataRestPath(node);\n if (node && rest) {\n const skin = painted.get(id) ?? (node.data as RigNodeData | null | undefined)?.skin ?? {};\n out.push({ id, path: skinnable(rest), skin });\n }\n walk(id);\n }\n };\n walk(rig.id);\n return out;\n}\n\nconst eligible = { capability: 'edits-page' } as const;\n\nconst activeJoint = (env: WeightEnv): string | null => {\n const name = env.state.active();\n return name !== null && env.placed()?.skeleton.joints.some((j) => j.name === name) ? name : null;\n};\n\n/** One dab of the brush at `(x, y)`: what `env.painted()` becomes, or `null` if no point moved. */\nfunction dab(env: WeightEnv, deps: ActionDeps, joint: string, x: number, y: number, mode: 'add' | 'remove'): Map<NodeId, Skin> | null {\n const radius = sceneReach(deps, env.radiusPx());\n let next: Map<NodeId, Skin> | null = null;\n for (const { id, path, skin } of weighedPaths(env)) {\n const hits = brushWeights(path.coords, x, y, radius, skin[joint], mode);\n if (hits.size === 0) continue;\n next ??= new Map(env.painted());\n next.set(id, setWeights(skin, path.coords.length >> 1, joint, hits));\n }\n return next;\n}\n\n/** Write what a stroke painted into each node's `data.skin`, as one undo entry. */\nfunction commitPainted(env: WeightEnv, deps: ActionDeps): void {\n const scene = env.scene();\n const ops: Op[] = [];\n for (const [id, skin] of env.painted()) {\n const data = scene.get(id)?.data;\n if (data !== undefined) ops.push(createSetDataOp({ id, from: data, to: { ...(data as object), skin }, label: 'Paint weights' }));\n }\n if (ops.length > 0) {\n if (deps.applyOps) deps.applyOps(ops, 'Paint weights');\n else scene.applyBatch(ops, 'Paint weights', defaultCommitAdapter(scene, deps.selection?.adapterMethods));\n }\n env.paint(null);\n}\n\n/** The weight tool's actions: `weight.paint` and `weight.click`. */\nexport function createWeightActions(env: WeightEnv): Action[] {\n const editing = () => (env.placed() ? true : ActionDisabledReason.NotApplicable);\n return [\n {\n id: 'weight.paint',\n label: 'Weight — paint the active joint\\'s weights',\n eligible,\n requires: ['view', 'selection', 'applyOps'],\n enabled: () => (activeJoint(env) !== null ? true : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'ongoing',\n start: ({ deps, drag, world, modifiers }: InvocationCtx) => {\n const joint = activeJoint(env);\n if (joint === null) return {};\n const stroke = (x: number, y: number, alt: boolean): void => {\n const next = dab(env, deps, joint, x, y, alt ? 'remove' : 'add');\n if (next) env.paint(next);\n };\n const press = drag?.start ?? world;\n stroke(press.x, press.y, modifiers.alt);\n return {\n onMove: (move: InvocationCtx) => stroke(move.world.x, move.world.y, move.modifiers.alt),\n // The dispatcher hands `onEnd` a context with empty deps.\n onEnd: (_end: InvocationCtx, reason: 'commit' | 'cancel') => {\n if (reason === 'cancel') env.paint(null);\n else commitPainted(env, deps);\n },\n };\n },\n },\n },\n {\n id: 'weight.click',\n label: 'Weight — pick a joint, or dab its weight',\n eligible,\n requires: ['view', 'selection', 'applyOps'],\n enabled: editing,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number; mods?: { alt?: boolean } } | undefined;\n const rig = env.placed();\n if (!rig || p?.pressX === undefined || p.pressY === undefined) return;\n const hit = jointAt(rig.skeleton, p.pressX, p.pressY, sceneReach(deps, env.reachPx()));\n if (hit !== null) {\n env.state.setActive(hit);\n return;\n }\n const joint = activeJoint(env);\n const next = joint === null ? null : dab(env, deps, joint, p.pressX, p.pressY, p.mods?.alt ? 'remove' : 'add');\n if (!next) return;\n env.paint(next);\n commitPainted(env, deps);\n },\n },\n },\n ];\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { viewToTransform as e } from "../../../core/viewport/view.js";
|
|
2
|
+
import { worldToScreen as t } from "../../../core/viewport/viewTransform.js";
|
|
3
|
+
import { ellipsePath as n } from "@weasel-js/geom";
|
|
4
|
+
//#region src/tools/builtin/weight/weightOverlay.ts
|
|
5
|
+
var r = 3.5, i = "#10161d", a = [
|
|
6
|
+
31,
|
|
7
|
+
111,
|
|
8
|
+
139
|
|
9
|
+
], o = [
|
|
10
|
+
255,
|
|
11
|
+
138,
|
|
12
|
+
61
|
|
13
|
+
], s = "#8a94a3", c = (e) => {
|
|
14
|
+
let t = a.map((t, n) => Math.round(t + (o[n] - t) * e));
|
|
15
|
+
return `rgb(${t[0]}, ${t[1]}, ${t[2]})`;
|
|
16
|
+
};
|
|
17
|
+
function l(a) {
|
|
18
|
+
return {
|
|
19
|
+
id: a.id,
|
|
20
|
+
label: "Weights",
|
|
21
|
+
space: "screen",
|
|
22
|
+
subscribe: a.subscribe,
|
|
23
|
+
draw: (o, l) => {
|
|
24
|
+
let u = e(l), d = a.active(), f = [];
|
|
25
|
+
for (let { path: e, skin: o } of a.paths()) {
|
|
26
|
+
let a = d === null ? void 0 : o[d], l;
|
|
27
|
+
if (d !== null) {
|
|
28
|
+
l = Array(e.coords.length >> 1).fill(0);
|
|
29
|
+
for (let e in o) o[e].forEach((e, t) => {
|
|
30
|
+
t < l.length && (l[t] += e);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
for (let o = 0; 2 * o + 1 < e.coords.length; o++) {
|
|
34
|
+
let [p, m] = t(e.coords[2 * o], e.coords[2 * o + 1], u), h = l && l[o] > 0 ? (a?.[o] ?? 0) / l[o] : 0;
|
|
35
|
+
f.push({
|
|
36
|
+
kind: "path",
|
|
37
|
+
path: n({
|
|
38
|
+
x: p - r,
|
|
39
|
+
y: m - r,
|
|
40
|
+
width: 2 * r,
|
|
41
|
+
height: 2 * r
|
|
42
|
+
}),
|
|
43
|
+
fill: { paint: {
|
|
44
|
+
kind: "solid",
|
|
45
|
+
color: d === null ? s : c(h)
|
|
46
|
+
} },
|
|
47
|
+
stroke: {
|
|
48
|
+
paint: { color: i },
|
|
49
|
+
width: 1
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return f;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//#endregion
|
|
59
|
+
export { l as createWeightOverlay };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=weightOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weightOverlay.js","names":["POINT_RADIUS_PX","RIM","COLD","HOT","IDLE","mix","c","v","k","w","createWeightOverlay","source","t","viewToTransform","view","active","out","weights","skin","total","path","joint","i","x","y","worldToScreen","share","ellipsePath"],"sources":["../../../../src/tools/builtin/weight/weightOverlay.ts"],"sourcesContent":["import { ellipsePath } from '@weasel-js/geom';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport { viewToTransform } from 'core/viewport/view';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport type { WeighedPath } from './weightActions';\n\nconst POINT_RADIUS_PX = 3.5;\nconst RIM = '#10161d';\n/** No weight, and all of it. */\nconst COLD = [0x1f, 0x6f, 0x8b];\nconst HOT = [0xff, 0x8a, 0x3d];\nconst IDLE = '#8a94a3';\n\nconst mix = (w: number): string => {\n const c = COLD.map((v, k) => Math.round(v + (HOT[k] - v) * w));\n return `rgb(${c[0]}, ${c[1]}, ${c[2]})`;\n};\n\n/**\n * A screen-space layer drawing a dot on every point of every path under a rig, anchors and\n * curve handles alike, colored by how much the active joint weighs it. With no joint active\n * the dots are gray.\n */\nexport function createWeightOverlay(source: {\n id: string;\n paths(): readonly WeighedPath[];\n active(): string | null;\n subscribe(fn: () => void): () => void;\n}): RenderLayer<unknown> {\n return {\n id: source.id,\n label: 'Weights',\n space: 'screen',\n subscribe: source.subscribe,\n draw: (_data, view) => {\n const t = viewToTransform(view);\n const active = source.active();\n const out: DrawCommand[] = [];\n for (const { path, skin } of source.paths()) {\n const weights = active === null ? undefined : skin[active];\n let total: number[] | undefined;\n if (active !== null) {\n total = new Array<number>(path.coords.length >> 1).fill(0);\n for (const joint in skin) skin[joint].forEach((w, i) => { if (i < total!.length) total![i] += w; });\n }\n for (let i = 0; 2 * i + 1 < path.coords.length; i++) {\n const [x, y] = worldToScreen(path.coords[2 * i], path.coords[2 * i + 1], t);\n const share = total && total[i] > 0 ? (weights?.[i] ?? 0) / total[i] : 0;\n out.push({\n kind: 'path',\n path: ellipsePath({ x: x - POINT_RADIUS_PX, y: y - POINT_RADIUS_PX, width: 2 * POINT_RADIUS_PX, height: 2 * POINT_RADIUS_PX }),\n fill: { paint: { kind: 'solid', color: active === null ? IDLE : mix(share) } },\n stroke: { paint: { color: RIM }, width: 1 },\n });\n }\n }\n return out;\n },\n };\n}\n"],"mappings":";;;;AAOA,IAAMA,IAAkB,KAClBC,IAAM,WAENC,IAAO;CAAC;CAAM;CAAM;AAAI,GACxBC,IAAM;CAAC;CAAM;CAAM;AAAI,GACvBC,IAAO,WAEPC,KAAO,MAAsB;CACjC,IAAMC,IAAIJ,EAAK,KAAK,GAAG,MAAM,KAAK,MAAMK,KAAKJ,EAAIK,KAAKD,KAAKE,CAAC,CAAC;CAC7D,OAAO,OAAOH,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,GAAG;AACvC;AAOA,SAAgBI,EAAoB,GAKX;CACvB,OAAO;EACL,IAAIC,EAAO;EACX,OAAO;EACP,OAAO;EACP,WAAWA,EAAO;EAClB,OAAO,GAAO,MAAS;GACrB,IAAMC,IAAIC,EAAgBC,CAAI,GACxBC,IAASJ,EAAO,OAAO,GACvBK,IAAqB,CAAC;GAC5B,KAAK,IAAM,EAAE,SAAM,aAAUL,EAAO,MAAM,GAAG;IAC3C,IAAMM,IAAUF,MAAW,OAAO,KAAA,IAAYG,EAAKH,IAC/CI;IACJ,IAAIJ,MAAW,MAAM;KACnB,IAAY,MAAcK,EAAK,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;KACzD,KAAK,IAAMC,KAASH,GAAM,EAAKG,EAAM,CAAC,SAAS,GAAG,MAAM;MAAE,AAAIC,IAAIH,EAAO,WAAQ,EAAOG,MAAMb;KAAG,CAAC;IACpG;IACA,KAAK,IAAIa,IAAI,GAAG,IAAIA,IAAI,IAAIF,EAAK,OAAO,QAAQ,KAAK;KACnD,IAAM,CAACG,GAAGC,KAAKC,EAAcL,EAAK,OAAO,IAAIE,IAAIF,EAAK,OAAO,IAAIE,IAAI,IAAIV,CAAC,GACpEc,IAAQP,KAASA,EAAMG,KAAK,KAAKL,IAAUK,MAAM,KAAKH,EAAMG,KAAK;KACvE,EAAI,KAAK;MACP,MAAM;MACN,MAAMK,EAAY;OAAE,GAAGJ,IAAIvB;OAAiB,GAAGwB,IAAIxB;OAAiB,OAAO,IAAIA;OAAiB,QAAQ,IAAIA;MAAgB,CAAC;MAC7H,MAAM,EAAE,OAAO;OAAE,MAAM;OAAS,OAAOe,MAAW,OAAOX,IAAOC,EAAIqB,CAAK;MAAE,EAAE;MAC7E,QAAQ;OAAE,OAAO,EAAE,OAAOzB,EAAI;OAAG,OAAO;MAAE;KAC5C,CAAC;IACH;GACF;GACA,OAAOe;EACT;CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlayBinding.js","names":["useTools","routingUseTools","useTools$1","useTools","defineTool"],"sources":["../../src/tools/overlayBinding.ts"],"sourcesContent":["/**\n * The routing types that carry an overlay, bound to the kit's `RenderLayer`.\n *\n * `@weasel-js/routing` never reads an overlay — it collects the live ones and\n * hands them back in scope order — so it leaves the element type open. What a\n * weasel canvas draws is a `RenderLayer`, and every kit call site should see\n * that rather than `unknown`, so core binds the parameter once, here, and\n * re-exports these names under the ones they have always had.\n */\nimport type { RenderLayer } from 'core/layers/render';\nimport { useTools as routingUseTools, useContributions as routingUseContributions } from '@weasel-js/routing/react';\nimport type {\n Contribution as RoutingContribution,\n ContributionChrome as RoutingContributionChrome,\n Tool as RoutingTool,\n ToolDef as RoutingToolDef,\n
|
|
1
|
+
{"version":3,"file":"overlayBinding.js","names":["useTools","routingUseTools","useTools$1","useTools","defineTool"],"sources":["../../src/tools/overlayBinding.ts"],"sourcesContent":["/**\n * The routing types that carry an overlay, bound to the kit's `RenderLayer`.\n *\n * `@weasel-js/routing` never reads an overlay — it collects the live ones and\n * hands them back in scope order — so it leaves the element type open. What a\n * weasel canvas draws is a `RenderLayer`, and every kit call site should see\n * that rather than `unknown`, so core binds the parameter once, here, and\n * re-exports these names under the ones they have always had.\n */\nimport type { RenderLayer } from 'core/layers/render';\nimport { useTools as routingUseTools, useContributions as routingUseContributions } from '@weasel-js/routing/react';\nimport type {\n Contribution as RoutingContribution,\n ContributionChrome as RoutingContributionChrome,\n Tool as RoutingTool,\n ToolDef as RoutingToolDef,\n} from '@weasel-js/routing';\nimport type {\n ToolsApi as RoutingToolsApi,\n UseToolsOptions as RoutingUseToolsOptions,\n ContributionsApi as RoutingContributionsApi,\n UseContributionsOptions as RoutingUseContributionsOptions,\n} from '@weasel-js/routing/react';\n\n/** What a canvas overlay is, at this layer. */\nexport type Overlay = RenderLayer<unknown>;\n\ndeclare module '@weasel-js/routing' {\n interface OverlaySchema { overlay: RenderLayer<unknown> }\n}\n\n/** Routing's `Contribution`, with overlays typed as `RenderLayer`. */\nexport type Contribution = RoutingContribution<Overlay>;\n/** Routing's `ContributionChrome`, with overlays typed as `RenderLayer`. */\nexport type ContributionChrome = RoutingContributionChrome<Overlay>;\n/** Routing's `Tool`, with overlays typed as `RenderLayer`. */\nexport type Tool = RoutingTool<Overlay>;\n/** The same type as `Tool`, kept for code that imports it by this name. */\nexport type AnyTool = Tool;\n/** Routing's `ToolDef` (what `defineTool` takes), with overlays typed as `RenderLayer`. */\nexport type ToolDef = RoutingToolDef<Overlay>;\n/** Routing's `ToolsApi`, with overlays typed as `RenderLayer`. */\nexport type ToolsApi = RoutingToolsApi<Overlay>;\n/** Routing's `UseToolsOptions`, with overlays typed as `RenderLayer`. */\nexport type UseToolsOptions = RoutingUseToolsOptions<Overlay>;\nexport type ContributionsApi = RoutingContributionsApi<Overlay>;\nexport type UseContributionsOptions = RoutingUseContributionsOptions<Overlay>;\n\n// Routing's own authoring functions: the `OverlaySchema` merge above makes\n// their overlay default `Overlay`, so there is one `defineTool`, not a wrapper.\nexport { defineTool } from '@weasel-js/routing';\n/** Routing's `useTools`, typed for `RenderLayer` overlays. */\nexport const useTools: (opts: UseToolsOptions) => ToolsApi = routingUseTools;\nexport const useContributions: (opts: UseContributionsOptions) => ContributionsApi =\n routingUseContributions;\n"],"mappings":";;;AAoDA,IAAaA,IAAgDC"}
|
|
@@ -3,12 +3,13 @@ import { makeToolResetToDefaultAction as n } from "../interactions/actions/defau
|
|
|
3
3
|
import { useEffect as r, useRef as i } from "react";
|
|
4
4
|
import { useLatest as a } from "@weasel-js/react";
|
|
5
5
|
import { useActionsRegistry as o } from "@weasel-js/routing/react";
|
|
6
|
+
import { eligibleForMode as s } from "@weasel-js/modes";
|
|
6
7
|
//#region src/tools/useKeybindings.ts
|
|
7
|
-
function
|
|
8
|
-
let
|
|
8
|
+
function c(c, l = {}) {
|
|
9
|
+
let u = a(c), d = a(l), f = i(c.active), p = o(), { disable: m = !1 } = l;
|
|
9
10
|
r(() => {
|
|
10
|
-
if (
|
|
11
|
-
let r = [], i =
|
|
11
|
+
if (m || !p || Object.keys(u.current.registry).length === 0) return;
|
|
12
|
+
let r = [], i = u.current.registry;
|
|
12
13
|
for (let e in i) {
|
|
13
14
|
let t = i[e].keybinding;
|
|
14
15
|
if (!t) continue;
|
|
@@ -24,27 +25,32 @@ function s(s, c = {}) {
|
|
|
24
25
|
let a = [];
|
|
25
26
|
if (r.length > 0) {
|
|
26
27
|
let n = e(r);
|
|
27
|
-
a.push(
|
|
28
|
+
a.push(p.register(t(n, (e) => {
|
|
29
|
+
let t = d.current.modes;
|
|
30
|
+
if (!t) return !0;
|
|
31
|
+
let n = u.current.registry[e]?.eligibility.capabilities;
|
|
32
|
+
return s(t.current(), n ?? []);
|
|
33
|
+
})));
|
|
28
34
|
}
|
|
29
|
-
return a.push(
|
|
30
|
-
let e =
|
|
35
|
+
return a.push(p.register(n(() => {
|
|
36
|
+
let e = d.current.defaultTool;
|
|
31
37
|
if (e === null) return null;
|
|
32
|
-
let t = e ??
|
|
38
|
+
let t = e ?? f.current;
|
|
33
39
|
if (!t) return null;
|
|
34
|
-
let n =
|
|
40
|
+
let n = u.current;
|
|
35
41
|
return !n.has(t) || n.active === t ? null : t;
|
|
36
42
|
}))), () => {
|
|
37
43
|
for (let e of a) e();
|
|
38
44
|
};
|
|
39
45
|
}, [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
l,
|
|
46
|
+
p,
|
|
47
|
+
c,
|
|
43
48
|
u,
|
|
44
|
-
|
|
49
|
+
d,
|
|
50
|
+
m
|
|
45
51
|
]);
|
|
46
52
|
}
|
|
47
53
|
//#endregion
|
|
48
|
-
export {
|
|
54
|
+
export { c as useKeybindings };
|
|
49
55
|
|
|
50
56
|
//# sourceMappingURL=useKeybindings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useKeybindings.js","names":["useKeybindings","toolsRef","useLatest","tools","optionsRef","options","initialActiveRef","useRef","registry","useActionsRegistry","disable","specs","allTools","toolId","binding","keys","key","unregisters","bindings","buildToolActivateBindings","makeToolActivateAction","makeToolResetToDefaultAction","opt","target","api","u"],"sources":["../../src/tools/useKeybindings.ts"],"sourcesContent":["// src/tools/useKeybindings.ts\nimport { useEffect, useRef } from 'react';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport {\n makeToolActivateAction,\n buildToolActivateBindings,\n type ToolActivateBindingSpec,\n} from 'interactions/actions/defaults/toolActivate';\nimport { makeToolResetToDefaultAction } from 'interactions/actions/defaults/toolResetToDefault';\nimport type { ToolsApi } from './overlayBinding';\n\n/** Options for `useKeybindings`. */\nexport interface UseKeybindingsOptions {\n /** Skip all wiring. Useful for touch apps or test isolation. */\n disable?: boolean;\n /** Tool id Escape switches to. When omitted, defaults to whatever\n * `tools.active` was when the hook first ran (i.e. the initial active\n * tool). Pass `null` to disable Escape-returns-to-default behavior. */\n defaultTool?: string | null;\n /**\n *
|
|
1
|
+
{"version":3,"file":"useKeybindings.js","names":["useKeybindings","toolsRef","useLatest","tools","optionsRef","options","initialActiveRef","useRef","registry","useActionsRegistry","disable","specs","allTools","toolId","binding","keys","key","unregisters","bindings","buildToolActivateBindings","makeToolActivateAction","modes","tags","eligibleForMode","makeToolResetToDefaultAction","opt","target","api","u"],"sources":["../../src/tools/useKeybindings.ts"],"sourcesContent":["// src/tools/useKeybindings.ts\nimport { useEffect, useRef } from 'react';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport { eligibleForMode, type ModeRegistry } from '@weasel-js/modes';\nimport {\n makeToolActivateAction,\n buildToolActivateBindings,\n type ToolActivateBindingSpec,\n} from 'interactions/actions/defaults/toolActivate';\nimport { makeToolResetToDefaultAction } from 'interactions/actions/defaults/toolResetToDefault';\nimport type { ToolsApi } from './overlayBinding';\n\n/** Options for `useKeybindings`. */\nexport interface UseKeybindingsOptions {\n /** Skip all wiring. Useful for touch apps or test isolation. */\n disable?: boolean;\n /** Tool id Escape switches to. When omitted, defaults to whatever\n * `tools.active` was when the hook first ran (i.e. the initial active\n * tool). Pass `null` to disable Escape-returns-to-default behavior. */\n defaultTool?: string | null;\n /**\n * The modes that gate keyboard tool activation: a key is refused when the\n * active mode does not allow every tag in the tool's\n * `eligibility.capabilities` — the predicate `ToolPalette` greys a button\n * out by, so the grey-out is a guarantee rather than a hint. `<SceneCanvas>`\n * passes its `modes` prop, whoever built the `ToolsApi`.\n *\n * Omit for consumers with no mode registry: every tool stays activatable.\n */\n modes?: ModeRegistry;\n}\n\n/** Wire the single-key tool-activation shortcuts (V, P, T, …) and Escape to\n * return to the default tool. Activation is gated on what the active mode\n * allows, so a key cannot reach a tool the palette greys out. */\nexport function useKeybindings(\n tools: ToolsApi,\n options: UseKeybindingsOptions = {},\n): void {\n const toolsRef = useLatest(tools);\n const optionsRef = useLatest(options);\n // Snapshot the initial active tool — used as the Escape target when the\n // consumer doesn't pass an explicit `defaultTool`. Captured in a ref\n // (not state) so it survives re-renders without re-syncing.\n const initialActiveRef = useRef(tools.active);\n\n // Held-key engagement is not here: a tool declares `ToolDef.hotkey` and\n // assembly registers `tool.offhand` from the declaration.\n const registry = useActionsRegistry();\n\n // --- Tool-activate: register one parametric `tool.activate` action.\n // The single descriptor carries a `defaultBinding: BoundGesture[]` with one\n // entry per tool — each entry pairs a key spec with `opts.params.toolId`.\n // The invoker reads `params.toolId` and calls `setActive`. Imperative\n // callers (palette, toolbar) reach the same effect via\n // `registry.trigger('tool.activate', { toolId })`.\n //\n // Every key comes from a `ToolDef.keybinding` in the tools registry.\n const { disable = false } = options;\n useEffect(() => {\n if (disable) return;\n if (!registry) return;\n // No tools, no tool keys: nothing to activate and nothing to return to.\n if (Object.keys(toolsRef.current.registry).length === 0) return;\n\n const specs: ToolActivateBindingSpec[] = [];\n\n const allTools = toolsRef.current.registry;\n for (const toolId in allTools) {\n const binding = allTools[toolId].keybinding;\n if (!binding) continue;\n // `KeyBinding.key` may be an array of aliases: one binding per key.\n const keys = typeof binding.key === 'string' ? [binding.key] : binding.key;\n for (const key of keys) {\n if (!key) continue;\n specs.push({ toolId, keyOpts: { ...binding, key } });\n }\n }\n\n const unregisters: Array<() => void> = [];\n\n if (specs.length > 0) {\n const bindings = buildToolActivateBindings(specs);\n unregisters.push(registry.register(makeToolActivateAction(\n bindings,\n (toolId) => {\n const modes = optionsRef.current.modes;\n if (!modes) return true;\n const tags = toolsRef.current.registry[toolId]?.eligibility.capabilities;\n return eligibleForMode(modes.current(), tags ?? []);\n },\n )));\n }\n\n // Escape-returns-to-default. Registered here rather than in the deleted\n // document listener so it competes in the dispatcher's Escape ladder\n // instead of firing in parallel with it — see\n // `makeToolResetToDefaultAction` for the ordering and the behavior\n // change that implies.\n unregisters.push(registry.register(makeToolResetToDefaultAction(() => {\n const opt = optionsRef.current.defaultTool;\n if (opt === null) return null;\n const target = opt ?? initialActiveRef.current;\n if (!target) return null;\n const api = toolsRef.current;\n if (!api.has(target) || api.active === target) return null;\n return target;\n })));\n\n return () => { for (const u of unregisters) u(); };\n }, [registry, tools, toolsRef, optionsRef, disable]);\n}\n\n"],"mappings":";;;;;;;AAoCA,SAAgBA,EACd,GACA,IAAiC,CAAC,GAC5B;CACN,IAAMC,IAAWC,EAAUC,CAAK,GAC1BC,IAAaF,EAAUG,CAAO,GAI9BC,IAAmBC,EAAOJ,EAAM,MAAM,GAItCK,IAAWC,EAAmB,GAU9B,EAAE,aAAU,OAAUJ;CAC5B,QAAgB;EAId,IAHIK,KACA,CAACF,KAED,OAAO,KAAKP,EAAS,QAAQ,QAAQ,CAAC,CAAC,WAAW,GAAG;EAEzD,IAAMU,IAAmC,CAAC,GAEpCC,IAAWX,EAAS,QAAQ;EAClC,KAAK,IAAMY,KAAUD,GAAU;GAC7B,IAAME,IAAUF,EAASC,EAAO,CAAC;GACjC,IAAI,CAACC,GAAS;GAEd,IAAMC,IAAO,OAAOD,EAAQ,OAAQ,WAAW,CAACA,EAAQ,GAAG,IAAIA,EAAQ;GACvE,KAAK,IAAME,KAAOD,GAChB,AAAKC,KACLL,EAAM,KAAK;IAAE;IAAQ,SAAS;KAAE,GAAGG;KAAS;IAAI;GAAE,CAAC;EAEvD;EAEA,IAAMG,IAAiC,CAAC;EAExC,IAAIN,EAAM,SAAS,GAAG;GACpB,IAAMO,IAAWC,EAA0BR,CAAK;GAChD,EAAY,KAAKH,EAAS,SAASY,EACjCF,IACC,MAAW;IACV,IAAMG,IAAQjB,EAAW,QAAQ;IACjC,IAAI,CAACiB,GAAO,OAAO;IACnB,IAAMC,IAAOrB,EAAS,QAAQ,SAASY,EAAO,EAAE,YAAY;IAC5D,OAAOU,EAAgBF,EAAM,QAAQ,GAAGC,KAAQ,CAAC,CAAC;GACpD,CACF,CAAC,CAAC;EACJ;EAiBA,OAVAL,EAAY,KAAKT,EAAS,SAASgB,QAAmC;GACpE,IAAMC,IAAMrB,EAAW,QAAQ;GAC/B,IAAIqB,MAAQ,MAAM,OAAO;GACzB,IAAMC,IAASD,KAAOnB,EAAiB;GACvC,IAAI,CAACoB,GAAQ,OAAO;GACpB,IAAMC,IAAM1B,EAAS;GAErB,OADI,CAAC0B,EAAI,IAAID,CAAM,KAAKC,EAAI,WAAWD,IAAe,OAC/CA;EACT,CAAC,CAAC,CAAC,SAEU;GAAE,KAAK,IAAME,KAAKX,GAAa,EAAE;EAAG;CACnD,GAAG;EAACT;EAAUL;EAAOF;EAAUG;EAAYM;CAAO,CAAC;AACrD"}
|