@weasel-js/core 1.9.4 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +918 -0
- package/README.md +38 -3
- package/dist/WeaselProvider.js +5 -7
- package/dist/WeaselProvider.js.map +1 -1
- package/dist/affordances/composeAffordanceLayer.js +92 -84
- 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 +71 -101
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js +50 -28
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotateCursor.js +12 -0
- package/dist/affordances/rotateCursor.js.map +1 -0
- package/dist/affordances/rotationHandle.js +44 -46
- 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 +99 -0
- package/dist/animation/rig/rigNode.js.map +1 -0
- package/dist/animation/rig/rigSeat.js +59 -0
- package/dist/animation/rig/rigSeat.js.map +1 -0
- package/dist/animation/rig/skinBinding.js +64 -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 +32 -0
- package/dist/barrel/chrome.js +10 -10
- package/dist/barrel/input.js +16 -17
- package/dist/barrel/interactions.js +34 -37
- package/dist/barrel/paint.js +11 -18
- package/dist/barrel/paths.js +13 -19
- package/dist/barrel/renderer.js +14 -20
- package/dist/barrel/routing.js +54 -47
- package/dist/barrel/scene.js +37 -0
- package/dist/barrel/text.js +9 -18
- package/dist/barrel/viewport.js +44 -51
- package/dist/canvas/Canvas.js +270 -475
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +168 -190
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +24 -25
- 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 +33 -36
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +38 -50
- 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 +319 -270
- 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 +71 -62
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/insertPreviewCommands.js +97 -0
- package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -0
- package/dist/canvas/SceneCanvas/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/scenePointQuery.js +50 -0
- package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -0
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +52 -0
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionTunings.js +17 -0
- package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -0
- package/dist/canvas/SceneCanvas/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 +46 -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 +49 -113
- 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 +51 -41
- 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 +65 -101
- 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 +8 -0
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +301 -708
- 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/SurfaceCanvas.js +40 -0
- package/dist/canvas/SurfaceCanvas.js.map +1 -0
- package/dist/canvas/adapterDerivedPath.js +26 -0
- package/dist/canvas/adapterDerivedPath.js.map +1 -0
- package/dist/canvas/adapterPickSource.js +34 -0
- package/dist/canvas/adapterPickSource.js.map +1 -0
- package/dist/canvas/affordanceAt.js +12 -2
- 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 +56 -34
- 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/copiesAbove.js +27 -0
- package/dist/canvas/copiesAbove.js.map +1 -0
- package/dist/canvas/defaultDrawOne.js +25 -24
- 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 +47 -71
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/geometryProjection.js.map +1 -1
- package/dist/canvas/deps/hitTestArea.js +45 -25
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/insert.js +149 -104
- 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/layout.js +9 -15
- package/dist/canvas/deps/layout.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 +69 -43
- 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 +33 -31
- 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/overChildren.js +29 -0
- package/dist/canvas/overChildren.js.map +1 -0
- 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/pickReach.js +23 -0
- package/dist/canvas/pickReach.js.map +1 -0
- package/dist/canvas/pickWalk.js +43 -70
- 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 +59 -144
- 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 +10 -9
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +37 -42
- 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/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 +51 -44
- 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/useSceneAdapter.js +22 -0
- package/dist/canvas/useSceneAdapter.js.map +1 -0
- package/dist/canvas/useSceneLayerList.js +4 -14
- package/dist/canvas/useSceneLayerList.js.map +1 -1
- package/dist/canvas/useSurfaceInput.js +39 -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 +40 -34
- 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 +7 -2
- package/dist/canvas/wrapNodeOutput.js.map +1 -1
- package/dist/clipboard.d.ts +7 -14
- package/dist/{types-B4iJRHC3.d.ts → clone-C0eADtS0.d.ts} +129 -84
- 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 +102 -29
- 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 +2 -4
- 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/create.js +2 -2
- package/dist/core/ops/create.js.map +1 -1
- package/dist/core/ops/createHistory.js +9 -9
- package/dist/core/ops/createHistory.js.map +1 -1
- package/dist/core/ops/delete.js +19 -23
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/ops/reorder/index.js +3 -7
- package/dist/core/ops/reorder/index.js.map +1 -1
- package/dist/core/ops/reorder/setChildOrder.js +2 -4
- package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
- package/dist/core/ops/reparent.js +0 -1
- package/dist/core/ops/reparent.js.map +1 -1
- package/dist/core/ops/slot.js +3 -6
- package/dist/core/ops/slot.js.map +1 -1
- package/dist/core/pages/fitViewToPage.js +15 -0
- package/dist/core/pages/fitViewToPage.js.map +1 -0
- package/dist/core/pages/pages.js +65 -0
- package/dist/core/pages/pages.js.map +1 -0
- package/dist/core/pages/pagesLayer.js +27 -0
- package/dist/core/pages/pagesLayer.js.map +1 -0
- package/dist/core/paint/meshKind.js +16 -0
- package/dist/core/paint/meshKind.js.map +1 -0
- package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +104 -93
- 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/core/scene/composePose.js +105 -0
- 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 +42 -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 +122 -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 +16 -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 +67 -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 +4 -3
- 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 +91 -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 +31 -33
- 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 +113 -53
- package/dist/core/viewport/useViewAnimation.js.map +1 -1
- package/dist/core/viewport/view.js +14 -11
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/wheelHandler.js.map +1 -1
- package/dist/core/viewport/zoomAt.js +11 -2
- package/dist/core/viewport/zoomAt.js.map +1 -1
- package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BSKbyuvQ.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 +63 -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/shapeGenerator.js +89 -0
- package/dist/features/paths/shapeGenerator.js.map +1 -0
- package/dist/features/paths/usePathEdit.js +34 -0
- package/dist/features/paths/usePathEdit.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +44 -57
- 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 +119 -88
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/viewports/viewResolver.js +28 -24
- package/dist/features/viewports/viewResolver.js.map +1 -1
- package/dist/features/viewports/viewportLayer.js +25 -36
- package/dist/features/viewports/viewportLayer.js.map +1 -1
- package/dist/icons/SliceIcon.js +24 -0
- package/dist/icons/SliceIcon.js.map +1 -0
- package/dist/index.d.ts +5200 -8777
- package/dist/index.js +284 -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 +24 -24
- 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 +74 -83
- 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 +103 -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 +69 -74
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorHandles.js +42 -0
- package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -0
- package/dist/interactions/actions/defaults/anchorJoin.js +92 -0
- package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -0
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js +46 -0
- package/dist/interactions/actions/defaults/bendSegment.js.map +1 -0
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/copySubtree.js +1 -1
- package/dist/interactions/actions/defaults/copySubtree.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 +36 -21
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterPathEdit.js +19 -7
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/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/anchorIcons.js +75 -0
- package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +1 -0
- 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/editIcons.js +35 -8
- package/dist/interactions/actions/defaults/icons/editIcons.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 +18 -34
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +43 -39
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/pinchZoom.js +29 -29
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/segmentUnder.js +22 -0
- package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -0
- package/dist/interactions/actions/defaults/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 +82 -79
- 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 +15 -15
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/action.js +101 -0
- 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/edit-anchors/preview.js +26 -0
- package/dist/interactions/actions/edit-anchors/preview.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/symmetry.js +11 -0
- package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -0
- package/dist/interactions/actions/flip/action.js +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/geometryProjection.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 +79 -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 +55 -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/repositionAction.js +31 -0
- package/dist/interactions/actions/insert/repositionAction.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 +91 -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 +35 -28
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +108 -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 +47 -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/pathCommands/cutJoin.js +102 -0
- package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -0
- package/dist/interactions/actions/pathCommands/livePathEdit.js +64 -0
- package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -0
- package/dist/interactions/actions/pathCommands/pathNodes.js +99 -0
- package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -0
- package/dist/interactions/actions/pathCommands/simplifyOffset.js +42 -0
- package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -0
- package/dist/interactions/actions/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 +66 -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 +88 -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/replay.js +47 -0
- package/dist/interactions/actions/resize/replay.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 +63 -0
- package/dist/interactions/actions/resize/session.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js +2 -1
- 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 +71 -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/replay.js +22 -0
- package/dist/interactions/actions/rotate/replay.js.map +1 -0
- package/dist/interactions/actions/rotate/session.js +102 -0
- package/dist/interactions/actions/rotate/session.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -1
- package/dist/interactions/actions/transform-again/action.js +63 -0
- package/dist/interactions/actions/transform-again/action.js.map +1 -0
- package/dist/interactions/actions/transform-again/memory.js +35 -0
- package/dist/interactions/actions/transform-again/memory.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +84 -61
- 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/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-CoNVpITV.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 +16 -15
- 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 +16 -15
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +162 -164
- 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 +11 -14
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +17 -15
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js +15 -14
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/adapterPointQuery.js +40 -0
- package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +5 -5
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +44 -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 +69 -72
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +18 -16
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +10 -2
- 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-DBbbCy0i.d.ts} +103 -176
- 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 +0 -67
- 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 +0 -100
- 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/layout/arrivals.js +0 -36
- package/dist/layout/arrivals.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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasIngestion.js","names":["useCanvasIngestion","handlers","options","disposers","acquireKitContentHandlers","h","registerContentHandler","d","reviver","enabled","onOmitted","useLatest","clipboard","useMemo","adapter","omitted","registryOf","getRegistry","useCallback","items","input","entry","itemsFromFiles","registry","dwarn","params","point","ran"],"sources":["../../../src/features/ingestion/useCanvasIngestion.ts"],"sourcesContent":["import { useLatest } from '@weasel-js/react';\nimport { itemsFromFiles, type ActionsRegistry, type IngestItem } from '@weasel-js/routing';\nimport type { InsertAdapter } from 'core/adapters/types';\nimport type { ClipboardIngestCtx } from 'interactions/actions/depSchema';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport { dwarn } from '../../debug';\nimport { registerContentHandler, type ContentHandlerEntry } from './contentHandlers';\nimport { acquireKitContentHandlers } from './registerKitHandlers';\n\n/** What `useCanvasIngestion` reads of `<SceneCanvas ingestion>`. */\nexport interface CanvasIngestionOptions {\n handlers?: ContentHandlerEntry[];\n clipboard?: {\n reviver?: ClipboardIngestCtx['reviver'];\n enabled?: boolean;\n onOmitted?: ClipboardIngestCtx['onOmitted'];\n };\n}\n\nexport interface CanvasIngestion {\n /** `SceneCanvasApi.ingest`. */\n ingest(input: File[] | IngestItem[], point?: { x: number; y: number }): boolean;\n /** For the `ingestion` dep. Absent, so the kit weasel-JSON handler declines, when\n * `clipboard.enabled` is false or the adapter cannot `commitPaste`. */\n clipboard: ClipboardIngestCtx | undefined;\n}\n\n/**\n * One canvas's share of ingestion: its content handlers for as long as it is mounted, the\n * clipboard seam pastes re-materialize through, and the imperative `ingest`, which triggers\n * the `ingest` action so its deps resolve as they do on the dispatcher path.\n *\n * `getRegistry` answers null until the canvas's action registry is reachable.\n */\nexport function useCanvasIngestion(\n adapter: InsertAdapter<{ id: string }>,\n getRegistry: () => ActionsRegistry | null,\n options: CanvasIngestionOptions | undefined,\n): CanvasIngestion {\n // The kit's default handlers are refcounted across mounted canvases.\n const handlers = options?.handlers;\n useEffect(() => {\n const disposers = [acquireKitContentHandlers()];\n for (const h of handlers ?? []) disposers.push(registerContentHandler(h));\n return () => disposers.forEach((d) => d());\n }, [handlers]);\n\n const reviver = options?.clipboard?.reviver;\n const enabled = options?.clipboard?.enabled !== false;\n const onOmitted = useLatest(options?.clipboard?.onOmitted);\n const clipboard = useMemo<ClipboardIngestCtx | undefined>(() => {\n if (!enabled || !adapter.commitPaste) return undefined;\n return {\n adapter,\n ...(reviver ? { reviver } : {}),\n onOmitted: (omitted) => onOmitted.current?.(omitted),\n };\n }, [adapter, enabled, reviver, onOmitted]);\n\n const registryOf = useLatest(getRegistry);\n const ingest = useCallback<CanvasIngestion['ingest']>((input, point) => {\n const items: IngestItem[] = (input as (File | IngestItem)[]).map((entry) =>\n entry instanceof File ? itemsFromFiles([entry])[0] : entry,\n );\n if (items.length === 0) return false;\n const registry = registryOf.current();\n if (!registry) {\n dwarn('ingest', 'CanvasExtensionApi.ingest called before the action registry mounted — call ignored. Defer to an effect or event handler.');\n return false;\n }\n const params = { items, ...(point ? { worldX: point.x, worldY: point.y } : {}) };\n const ran = registry.trigger('ingest', params);\n if (!ran) dwarn('ingest', 'CanvasExtensionApi.ingest ran nothing: this canvas has no `ingest` action. Add `ingest` to `features`.');\n return ran;\n }, [registryOf]);\n\n return { ingest, clipboard };\n}\n"],"mappings":";;;;;;;AAkCA,SAAgBA,EACd,GACA,GACA,GACiB;CAEjB,IAAMC,IAAWC,GAAS;CAC1B,QAAgB;EACd,IAAMC,IAAY,CAACC,EAA0B,CAAC;EAC9C,KAAK,IAAMC,KAAKJ,KAAY,CAAC,GAAG,EAAU,KAAKK,EAAuBD,CAAC,CAAC;EACxE,aAAaF,EAAU,SAAS,MAAMI,EAAE,CAAC;CAC3C,GAAG,CAACN,CAAQ,CAAC;CAEb,IAAMO,IAAUN,GAAS,WAAW,SAC9BO,IAAUP,GAAS,WAAW,YAAY,IAC1CQ,IAAYC,EAAUT,GAAS,WAAW,SAAS,GACnDU,IAAYC,QAA8C;EAC9D,IAAKJ,KAAYK,EAAQ,aACzB,OAAO;GACL;GACA,GAAIN,IAAU,EAAE,WAAQ,IAAI,CAAC;GAC7B,YAAY,MAAYE,EAAU,UAAUK,CAAO;EACrD;CACF,GAAG;EAACD;EAASL;EAASD;EAASE;CAAS,CAAC,GAEnCM,IAAaL,EAAUM,CAAW;CAiBxC,OAAO;EAAE,QAhBMC,GAAwC,GAAO,MAAU;GACtE,IAAMC,IAAuBC,EAAgC,KAAK,MAChEC,aAAiB,OAAOC,EAAe,CAACD,CAAK,CAAC,CAAC,CAAC,KAAKA,CACvD;GACA,IAAIF,EAAM,WAAW,GAAG,OAAO;GAC/B,IAAMI,IAAWP,EAAW,QAAQ;GACpC,IAAI,CAACO,GAEH,OADAC,EAAM,UAAU,0HAA0H,GACnI;GAET,IAAMC,IAAS;IAAE;IAAO,GAAIC,IAAQ;KAAE,QAAQA,EAAM;KAAG,QAAQA,EAAM;IAAE,IAAI,CAAC;GAAG,GACzEC,IAAMJ,EAAS,QAAQ,UAAUE,CAAM;GAE7C,OADKE,KAAKH,EAAM,UAAU,wGAAwG,GAC3HG;EACT,GAAG,CAACX,CAAU,CAEL;EAAQ;CAAU;AAC7B"}
|
|
@@ -7,6 +7,11 @@ var c = (e) => e.includes("\"weaselClipboard\"") && s(e) && i(e) !== null, l = {
|
|
|
7
7
|
id: "kit:weasel-json",
|
|
8
8
|
priority: -50,
|
|
9
9
|
match: (e) => e.kind === "string" && (e.mime === n || e.mime === r || e.mime === "text/plain" && (o(e.text) || c(e.text))),
|
|
10
|
+
types: [
|
|
11
|
+
n,
|
|
12
|
+
r,
|
|
13
|
+
"text/plain"
|
|
14
|
+
],
|
|
10
15
|
handle(n, r) {
|
|
11
16
|
let o = r.clipboard;
|
|
12
17
|
if (!o) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weaselJsonHandler.js","names":["isMetadataBearingSvg","text","sniffSvgText","extractWeaselClipboardFromSvg","kitWeaselJsonHandler","item","WEASEL_CLIPBOARD_MIME","WEASEL_CLIPBOARD_MIME_WEB","sniffWeaselClipboardText","clipboard","ctx","items","it","nodes","parseWeaselClipboardText","snapshot","result","materializePaste"],"sources":["../../../src/features/ingestion/weaselJsonHandler.ts"],"sourcesContent":["/**\n * The kit's weasel-JSON clipboard content handler.\n *\n * Consumes `application/x-weasel-clipboard+json` payloads
|
|
1
|
+
{"version":3,"file":"weaselJsonHandler.js","names":["isMetadataBearingSvg","text","sniffSvgText","extractWeaselClipboardFromSvg","kitWeaselJsonHandler","item","WEASEL_CLIPBOARD_MIME","WEASEL_CLIPBOARD_MIME_WEB","sniffWeaselClipboardText","clipboard","ctx","items","it","nodes","parseWeaselClipboardText","snapshot","result","materializePaste"],"sources":["../../../src/features/ingestion/weaselJsonHandler.ts"],"sourcesContent":["/**\n * The kit's weasel-JSON clipboard content handler.\n *\n * Consumes `application/x-weasel-clipboard+json` payloads in either MIME\n * spelling (Chromium's async-clipboard API round-trips custom formats with\n * a `web ` prefix), `text/plain` that sniffs as the wire format, and\n * `text/plain` SVG carrying the wire format embedded in a `<metadata>`\n * element (Chromium's DOM paste event exposes ONLY `text/plain`). It replays\n * them as a paste through the hosting canvas's adapter, mirroring\n * `useClipboardOps.paste`'s op construction exactly so OS-arriving pastes\n * and in-memory pastes are indistinguishable in history.\n *\n * Declines when `ctx.clipboard` is absent or the payload fails to parse.\n * `runIngest` consumes items at *match* time, so \"leave it for other\n * handlers\" is the sniff's job: non-weasel `text/plain` never matches.\n */\nimport type { NodeId } from 'core/scene/types';\nimport type { ClipboardSnapshot } from 'core/adapters/types';\nimport { materializePaste } from 'interactions/actions/clipboard/materializePaste';\nimport {\n WEASEL_CLIPBOARD_MIME,\n WEASEL_CLIPBOARD_MIME_WEB,\n sniffWeaselClipboardText,\n parseWeaselClipboardText,\n extractWeaselClipboardFromSvg,\n} from 'interactions/actions/clipboard/wireFormat';\nimport { dwarn } from '../../debug';\nimport type { ContentHandlerEntry, IngestCtx } from './contentHandlers';\n// Direct module import (not the ./index barrel) to avoid a cycle — the\n// barrel re-exports this handler.\nimport { sniffSvgText } from './svgHandler';\n\n/** text/plain SVG whose `<metadata>` carries a verified weasel payload —\n * the draw→draw DOM-paste flavor (Chromium exposes only text/plain there).\n * The `\"weaselClipboard\"` substring guard keeps match cheap on arbitrary\n * external SVG pastes before the extraction regex runs. */\nconst isMetadataBearingSvg = (text: string): boolean =>\n text.includes('\"weaselClipboard\"')\n && sniffSvgText(text)\n && extractWeaselClipboardFromSvg(text) !== null;\n\nexport const kitWeaselJsonHandler: ContentHandlerEntry = {\n id: 'kit:weasel-json',\n // Above the other kit handlers (-100/-90) so weasel payloads never fall\n // through to the SVG/text paths; still below consumer handlers (default 0).\n priority: -50,\n match: (item) =>\n item.kind === 'string'\n && (item.mime === WEASEL_CLIPBOARD_MIME\n || item.mime === WEASEL_CLIPBOARD_MIME_WEB\n || (item.mime === 'text/plain'\n && (sniffWeaselClipboardText(item.text) || isMetadataBearingSvg(item.text)))),\n types: [WEASEL_CLIPBOARD_MIME, WEASEL_CLIPBOARD_MIME_WEB, 'text/plain'],\n handle(items, ctx: IngestCtx) {\n const clipboard = ctx.clipboard;\n if (!clipboard) {\n dwarn('clipboard', 'weasel payload arrived but ctx.clipboard is not wired (ingestion.clipboard disabled or absent) — declining');\n return;\n }\n if (!clipboard.adapter.commitPaste) {\n dwarn('clipboard', 'weasel payload arrived but the clipboard adapter lacks commitPaste — declining');\n return;\n }\n const item = items.find((it) => it.kind === 'string');\n if (!item || item.kind !== 'string') return;\n // The metadata-bearing-SVG flavor: unwrap the embedded payload before\n // parsing. Extraction was already verified at match time, so a null here\n // is the same inert-decline class as a corrupt custom-MIME payload.\n const text = sniffSvgText(item.text)\n ? extractWeaselClipboardFromSvg(item.text)\n : item.text;\n if (text === null) {\n dwarn('clipboard', 'weasel payload vanished from the SVG metadata between match and handle — declining');\n return;\n }\n const nodes = parseWeaselClipboardText(text, clipboard.reviver);\n if (nodes === null) {\n dwarn('clipboard', 'weasel payload unusable — declining (see prior warning if the parse threw)');\n return;\n }\n // `ctx.point` is null for paste, so no dropPoint is threaded — the\n // cascade offset is the placement.\n const snapshot: ClipboardSnapshot = { items: nodes };\n const result = materializePaste(clipboard.adapter, snapshot, {\n currentSelection: ctx.selection.get(),\n onOmitted: clipboard.onOmitted,\n });\n if (!result) return;\n ctx.applyOps(result.ops, 'Paste');\n ctx.selection.set(result.newIds as NodeId[]);\n // So kit:svg's text/plain fallback declines the SVG flavor of this copy.\n // WARNING: do not add an `await` earlier in this handle — the flag must\n // be written before lower-priority handlers' microtasks run.\n ctx.consumedWeaselPayload = true;\n },\n};\n"],"mappings":";;;;;AAoCA,IAAMA,KAAwB,MAC5BC,EAAK,SAAS,qBAAmB,KAC9BC,EAAaD,CAAI,KACjBE,EAA8BF,CAAI,MAAM,MAEhCG,IAA4C;CACvD,IAAI;CAGJ,UAAU;CACV,QAAQ,MACNC,EAAK,SAAS,aACVA,EAAK,SAASC,KACbD,EAAK,SAASE,KACbF,EAAK,SAAS,iBACZG,EAAyBH,EAAK,IAAI,KAAKL,EAAqBK,EAAK,IAAI;CAC/E,OAAO;EAACC;EAAuBC;EAA2B;CAAY;CACtE,OAAO,GAAO,GAAgB;EAC5B,IAAME,IAAYC,EAAI;EACtB,IAAI,CAACD,GAAW;GACd,EAAM,aAAa,4GAA4G;GAC/H;EACF;EACA,IAAI,CAACA,EAAU,QAAQ,aAAa;GAClC,EAAM,aAAa,gFAAgF;GACnG;EACF;EACA,IAAMJ,IAAOM,EAAM,MAAM,MAAOC,EAAG,SAAS,QAAQ;EACpD,IAAI,CAACP,KAAQA,EAAK,SAAS,UAAU;EAIrC,IAAMJ,IAAOC,EAAaG,EAAK,IAAI,IAC/BF,EAA8BE,EAAK,IAAI,IACvCA,EAAK;EACT,IAAIJ,MAAS,MAAM;GACjB,EAAM,aAAa,oFAAoF;GACvG;EACF;EACA,IAAMY,IAAQC,EAAyBb,GAAMQ,EAAU,OAAO;EAC9D,IAAII,MAAU,MAAM;GAClB,EAAM,aAAa,4EAA4E;GAC/F;EACF;EAGA,IAAME,IAA8B,EAAE,OAAOF,EAAM,GAC7CG,IAASC,EAAiBR,EAAU,SAASM,GAAU;GAC3D,kBAAkBL,EAAI,UAAU,IAAI;GACpC,WAAWD,EAAU;EACvB,CAAC;EACD,AAAKO,MACLN,EAAI,SAASM,EAAO,KAAK,OAAO,GAChCN,EAAI,UAAU,IAAIM,EAAO,MAAkB,GAI3C,EAAI,wBAAwB;CAC9B;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"longPressFeedback.js","names":["LONG_PRESS_FEEDBACK_ID","RING_SEGMENTS","TRACK_OPACITY","nowMs","prefersReducedMotion","arcPath","n","t","pts","i","a","cx","cy","polylineFromPoints","circlePath","ellipsePath","viewIdOf","data","createLongPressFeedbackContribution","id","opts","radius","width","delay","state","color","reduced","showing","p","now","stroke","opacity","x","y","store","deps","appear","onChange","accentColorOf","api","wait","offStore","ctx"],"sources":["../../../src/features/longPress/longPressFeedback.ts"],"sourcesContent":["/**\n * The default \"press is registering\" feedback for a touch or pen long-press: a\n * ring around the press point that fills over the hold. It reads the `longPress`\n * dep the gesture dispatcher publishes, so it shows only for a press some\n * binding would fire on, and disappears when the press fires, moves past the\n * drag threshold, lifts, or is canceled.\n */\nimport type { LongPressState } from '@weasel-js/routing';\nimport type { RenderLayer } from 'core/layers/render';\nimport { ellipsePath, polylineFromPoints, type Path } from '@weasel-js/geom';\nimport type { DrawCommand } from '
|
|
1
|
+
{"version":3,"file":"longPressFeedback.js","names":["circlePath","LONG_PRESS_FEEDBACK_ID","RING_SEGMENTS","TRACK_OPACITY","nowMs","prefersReducedMotion","arcPath","n","t","pts","i","a","cx","cy","polylineFromPoints","circlePath$1","ellipsePath","viewIdOf","data","createLongPressFeedbackContribution","id","opts","radius","width","delay","state","color","reduced","showing","p","now","stroke","opacity","x","y","store","deps","appear","onChange","accentColorOf","api","wait","offStore","ctx"],"sources":["../../../src/features/longPress/longPressFeedback.ts"],"sourcesContent":["/**\n * The default \"press is registering\" feedback for a touch or pen long-press: a\n * ring around the press point that fills over the hold. It reads the `longPress`\n * dep the gesture dispatcher publishes, so it shows only for a press some\n * binding would fire on, and disappears when the press fires, moves past the\n * drag threshold, lifts, or is canceled.\n */\nimport type { LongPressState } from '@weasel-js/routing';\nimport type { RenderLayer } from 'core/layers/render';\nimport { ellipsePath, polylineFromPoints, type Path } from '@weasel-js/geom';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { CanvasExtensionApi } from '../../canvas/canvasExtension';\nimport type { ContributionDepReader, SurfaceContribution } from '../../canvas/surfaceContribution';\nimport { accentColorOf } from '../../canvas/accentColor';\n\n/** Entry and layer id of the default feedback, so a host can find or order it. */\nexport const LONG_PRESS_FEEDBACK_ID = 'long-press-feedback';\n\n/** Options for {@link createLongPressFeedbackContribution}. */\nexport interface LongPressFeedbackOptions {\n /** Entry and layer id. Default {@link LONG_PRESS_FEEDBACK_ID}. */\n id?: string;\n /** Ring radius in CSS pixels. Default 22 — clear of a fingertip. */\n radius?: number;\n /** Ring stroke width in CSS pixels. Default 3. */\n width?: number;\n /** Ring color. Default the theme's `--wzl-accent`, read off the canvas\n * element when each press starts. */\n color?: string | (() => string);\n /** How long a press is held before the ring appears, in ms, so an ordinary\n * tap shows nothing. Default 120. */\n delay?: number;\n /** `true` shows a static full ring instead of one that fills, and runs no\n * frame loop. Default `'auto'`: follow `prefers-reduced-motion`, read when\n * each press starts. */\n reducedMotion?: boolean | 'auto';\n}\n\nconst RING_SEGMENTS = 64;\nconst TRACK_OPACITY = 0.3;\n\nconst nowMs = (): number => performance.now();\n\nfunction prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function'\n && matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/** An open arc from 12 o'clock, clockwise on a y-down screen, through `t` of a turn. */\nfunction arcPath(cx: number, cy: number, r: number, t: number): Path {\n const n = Math.max(1, Math.ceil(RING_SEGMENTS * t));\n const pts: { x: number; y: number }[] = [];\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * t * Math.PI * 2;\n pts.push({ x: cx + r * Math.sin(a), y: cy - r * Math.cos(a) });\n }\n return polylineFromPoints(pts);\n}\n\nfunction circlePath(cx: number, cy: number, r: number): Path {\n return ellipsePath({ x: cx - r, y: cy - r, width: 2 * r, height: 2 * r });\n}\n\nconst viewIdOf = (data: unknown): string | null =>\n (data as { viewId?: string | null } | null)?.viewId ?? null;\n\n/**\n * The default long-press feedback, as one entry. `<SceneCanvas>` installs it\n * unless `longPress={{ feedback: false }}`; pass a contribution of your own there to\n * replace it — it reads the same `longPress` dep this one does.\n */\nexport function createLongPressFeedbackContribution(\n opts: LongPressFeedbackOptions = {},\n): SurfaceContribution {\n const id = opts.id ?? LONG_PRESS_FEEDBACK_ID;\n const radius = opts.radius ?? 22;\n const width = opts.width ?? 3;\n const delay = opts.delay ?? 120;\n\n let state: LongPressState | undefined;\n let color = '';\n let reduced = false;\n\n const showing = (): boolean => {\n const p = state?.get();\n return !!p && p.armed;\n };\n\n const layer: RenderLayer<unknown> = {\n id,\n label: 'Long-press feedback',\n space: 'screen',\n draw: (data): DrawCommand[] => {\n const p = state?.get();\n // Screen space is the whole canvas, so the root pass draws the ring\n // wherever the press routed; a view pass drawing it too would double it.\n if (!state || !p || !p.armed || viewIdOf(data) !== null) return [];\n const now = nowMs();\n if (now - p.startedAt < delay) return [];\n const { x, y } = p.local;\n const stroke = (opacity?: number) => ({\n paint: { color, ...(opacity !== undefined ? { opacity } : {}) },\n width: { px: width },\n cap: 'round' as const,\n });\n if (reduced) return [{ kind: 'path', path: circlePath(x, y, radius), stroke: stroke() }];\n return [\n { kind: 'path', path: circlePath(x, y, radius), stroke: stroke(TRACK_OPACITY) },\n { kind: 'path', path: arcPath(x, y, radius, state.progress(now)), stroke: stroke() },\n ];\n },\n };\n\n const attach = (api: CanvasExtensionApi, deps: ContributionDepReader): (() => void) => {\n const store = deps.get('longPress');\n if (!store) return () => {};\n state = store;\n let appear: ReturnType<typeof setTimeout> | undefined;\n\n const onChange = (): void => {\n clearTimeout(appear);\n appear = undefined;\n const p = store.get();\n if (p?.armed) {\n color = typeof opts.color === 'function' ? opts.color() : (opts.color ?? accentColorOf(api.element));\n reduced = opts.reducedMotion === 'auto' || opts.reducedMotion === undefined\n ? prefersReducedMotion()\n : opts.reducedMotion;\n // A static ring changes once, when it appears; nothing needs frames.\n const wait = delay - (nowMs() - p.startedAt);\n if (reduced && wait > 0) appear = setTimeout(() => { api.requestRedraw(); }, wait);\n }\n api.requestRedraw();\n };\n\n const offStore = store.subscribe(onChange);\n onChange();\n return () => {\n offStore();\n clearTimeout(appear);\n state = undefined;\n api.requestRedraw();\n };\n };\n\n return {\n id,\n eligibility: { always: true },\n overlay: layer,\n attach,\n // The filling ring asks for the next frame from each painted one while it shows.\n afterPaint: (ctx) => {\n if (!reduced && showing()) ctx.requestFrame();\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -21,8 +21,8 @@ function r(r) {
|
|
|
21
21
|
width: n,
|
|
22
22
|
height: r
|
|
23
23
|
},
|
|
24
|
-
fill: c.gradient ? {
|
|
25
|
-
|
|
24
|
+
fill: { paint: c.gradient ? {
|
|
25
|
+
kind: "linear-gradient",
|
|
26
26
|
from: i,
|
|
27
27
|
to: a,
|
|
28
28
|
stops: [{
|
|
@@ -34,10 +34,10 @@ function r(r) {
|
|
|
34
34
|
}],
|
|
35
35
|
opacity: u
|
|
36
36
|
} : {
|
|
37
|
-
|
|
37
|
+
kind: "solid",
|
|
38
38
|
color: l,
|
|
39
39
|
opacity: u
|
|
40
|
-
}
|
|
40
|
+
} }
|
|
41
41
|
}), m = () => [c.gradient === "top-down" ? p(0, 0, d, f, {
|
|
42
42
|
x: 0,
|
|
43
43
|
y: 0
|
|
@@ -62,11 +62,11 @@ function r(r) {
|
|
|
62
62
|
width: d,
|
|
63
63
|
height: f
|
|
64
64
|
},
|
|
65
|
-
fill: {
|
|
66
|
-
|
|
65
|
+
fill: { paint: {
|
|
66
|
+
kind: "solid",
|
|
67
67
|
color: l,
|
|
68
68
|
opacity: u
|
|
69
|
-
}
|
|
69
|
+
} }
|
|
70
70
|
}];
|
|
71
71
|
let T = [], E = (e, t, n, r, i, a) => {
|
|
72
72
|
n > 0 && r > 0 && T.push(p(e, t, n, r, i, a));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modeLayers.js","names":["DEFAULT_INTENSITY","workspaceTintLayer","opts","registry","ws","tint","opacity","W","H","dims","strip","whole","page","t","viewToTransform","view","sx0","sy0","worldToScreen","sx1","sy1","pl","pt","pr","pb","cmds","push","w","h","x","y","from","to","modeDecorationLayer","decorations"],"sources":["../../../src/features/modes/modeLayers.ts"],"sourcesContent":["import type { Rect } from '@weasel-js/geom';\nimport type { ModeDecorations, ModeRegistry } from '@weasel-js/modes';\nimport type { DrawCommand } from '
|
|
1
|
+
{"version":3,"file":"modeLayers.js","names":["DEFAULT_INTENSITY","workspaceTintLayer","opts","registry","ws","tint","opacity","W","H","dims","strip","whole","page","t","viewToTransform","view","sx0","sy0","worldToScreen","sx1","sy1","pl","pt","pr","pb","cmds","push","w","h","x","y","from","to","modeDecorationLayer","decorations"],"sources":["../../../src/features/modes/modeLayers.ts"],"sourcesContent":["import type { Rect } from '@weasel-js/geom';\nimport type { ModeDecorations, ModeRegistry } from '@weasel-js/modes';\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';\n\n/** Options for {@link workspaceTintLayer}. */\nexport interface WorkspaceTintLayerOptions {\n registry: ModeRegistry;\n /** The page, in world coordinates. When given, the tint covers only the\n * workspace around it, each strip fading toward the page edge if the mode\n * names a gradient. Without it the tint covers the whole canvas. */\n page?: () => Rect | null;\n /** Opacity for every mode's tint, in place of its `workspace.intensity`. */\n intensity?: number;\n id?: string;\n label?: string;\n}\n\nconst DEFAULT_INTENSITY = 0.12;\n\n/**\n * A screen-space layer painting the active mode's `WorkspaceVisual`: nothing in\n * a mode without a tint, otherwise a wash at the mode's intensity, bottom-up or\n * top-down when the mode names a gradient. It subscribes to the registry, so a\n * mode switch repaints it.\n */\nexport function workspaceTintLayer(opts: WorkspaceTintLayerOptions): RenderLayer<unknown> {\n const { registry } = opts;\n return {\n id: opts.id ?? 'mode-tint',\n label: opts.label ?? 'Mode tint',\n space: 'screen',\n subscribe: registry.subscribe,\n draw: (_data, view, dims) => {\n const ws = registry.current().workspace;\n const tint = ws?.tint;\n if (!tint || tint === 'transparent') return [];\n const opacity = opts.intensity ?? ws.intensity ?? DEFAULT_INTENSITY;\n const { width: W, height: H } = dims;\n\n const strip = (\n x: number, y: number, width: number, height: number,\n from: { x: number; y: number }, to: { x: number; y: number },\n ): DrawCommand => ({\n kind: 'path',\n path: { kind: 'rect', x, y, width, height },\n fill: { paint: ws.gradient\n ? { kind: 'linear-gradient', from, to, stops: [{ offset: 0, color: tint }, { offset: 1, color: 'transparent' }], opacity }\n : { kind: 'solid', color: tint, opacity } },\n });\n\n const whole = (): DrawCommand[] => [\n ws.gradient === 'top-down'\n ? strip(0, 0, W, H, { x: 0, y: 0 }, { x: 0, y: H })\n : strip(0, 0, W, H, { x: 0, y: H }, { x: 0, y: 0 }),\n ];\n\n const page = opts.page?.();\n if (!page) return whole();\n\n const t = viewToTransform(view);\n const [sx0, sy0] = worldToScreen(page.x, page.y, t);\n const [sx1, sy1] = worldToScreen(page.x + page.width, page.y + page.height, t);\n const pl = Math.max(0, Math.min(sx0, sx1));\n const pt = Math.max(0, Math.min(sy0, sy1));\n const pr = Math.min(W, Math.max(sx0, sx1));\n const pb = Math.min(H, Math.max(sy0, sy1));\n if (pr <= pl || pb <= pt) {\n return [{ kind: 'path', path: { kind: 'rect', x: 0, y: 0, width: W, height: H }, fill: { paint: { kind: 'solid', color: tint, opacity } } }];\n }\n\n const cmds: DrawCommand[] = [];\n const push = (\n x: number, y: number, w: number, h: number,\n from: { x: number; y: number }, to: { x: number; y: number },\n ): void => { if (w > 0 && h > 0) cmds.push(strip(x, y, w, h, from, to)); };\n push(0, 0, W, pt, { x: 0, y: 0 }, { x: 0, y: pt });\n push(0, pb, W, H - pb, { x: 0, y: H }, { x: 0, y: pb });\n push(0, pt, pl, pb - pt, { x: 0, y: 0 }, { x: pl, y: 0 });\n push(pr, pt, W - pr, pb - pt, { x: W, y: 0 }, { x: pr, y: 0 });\n return cmds;\n },\n };\n}\n\n/** A world-space layer drawing a `ModeDecorations`' active painter. It\n * subscribes to the decorations, so a mode switch or a new painter repaints\n * it. */\nexport function modeDecorationLayer(\n decorations: ModeDecorations,\n opts: { id?: string; label?: string } = {},\n): RenderLayer<unknown> {\n return {\n id: opts.id ?? 'mode-decorations',\n label: opts.label ?? 'Mode decorations',\n subscribe: decorations.subscribe,\n draw: () => decorations.paint() as DrawCommand[],\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { isRectPose as e } from "../../core/geometry/autoPoseDescriptor.js";
|
|
2
|
+
import { pathFromPlane as t } from "../../canvas/planeClips.js";
|
|
3
|
+
import { pathInWorld as n, worldEditToStorage as r } from "@weasel-js/geom";
|
|
4
|
+
//#region src/features/paths/editablePath.ts
|
|
5
|
+
function i(t) {
|
|
6
|
+
if (!t) return null;
|
|
7
|
+
if (t.pose?.kind === "polygon") return { kind: "pose" };
|
|
8
|
+
let n = t.data;
|
|
9
|
+
return n?.path && n.path.kind === "polygon" && e(t.pose) ? {
|
|
10
|
+
kind: "data",
|
|
11
|
+
pose: t.pose,
|
|
12
|
+
data: n
|
|
13
|
+
} : null;
|
|
14
|
+
}
|
|
15
|
+
function a(e) {
|
|
16
|
+
if (!e) return null;
|
|
17
|
+
let t = i(e);
|
|
18
|
+
return t ? t.kind === "pose" ? e.pose : n(t.data.path, t.pose) : null;
|
|
19
|
+
}
|
|
20
|
+
function o(e, t) {
|
|
21
|
+
let n = i(e);
|
|
22
|
+
if (!n) return null;
|
|
23
|
+
if (n.kind === "pose") return {
|
|
24
|
+
pose: t,
|
|
25
|
+
data: e.data
|
|
26
|
+
};
|
|
27
|
+
let { pose: a, path: o } = r(n.pose, t);
|
|
28
|
+
return {
|
|
29
|
+
pose: a,
|
|
30
|
+
data: {
|
|
31
|
+
...n.data,
|
|
32
|
+
path: o
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function s(e, t, n) {
|
|
37
|
+
let r = t.pose, i = t.data, a = !1;
|
|
38
|
+
for (let t of n) {
|
|
39
|
+
let n = t.previewIds?.();
|
|
40
|
+
if (!n) continue;
|
|
41
|
+
let o = !1;
|
|
42
|
+
for (let t of n) if (t === e) {
|
|
43
|
+
o = !0;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
if (!o) continue;
|
|
47
|
+
let s = t.previewPose?.(e);
|
|
48
|
+
s != null && !a && (r = s, a = !0);
|
|
49
|
+
let c = t.previewData?.(e);
|
|
50
|
+
c != null && (i = c, a = !0);
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
pose: r,
|
|
54
|
+
data: i
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function c(e, n, r, i) {
|
|
58
|
+
return n ? t(a(s(e, n, r)), i) : null;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { i as classifyPathStorage, c as liveEditablePath, a as resolveEditablePathOf, o as storeEditablePath };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=editablePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editablePath.js","names":["classifyPathStorage","node","data","isRectPose","resolveEditablePathOf","storage","pathInWorld","storeEditablePath","worldPath","worldEditToStorage","previewedShape","pose","touched","source","previews","previewIds","owns","pid","id","p","d","liveEditablePath","pathFromPlane","plane"],"sources":["../../../src/features/paths/editablePath.ts"],"sourcesContent":["/**\n * A node's editable polygon. It lives in one of two places: the pose itself\n * (`pose.kind === 'polygon'`), or `data.path` with a rect pose, stored pose-local.\n */\nimport { pathInWorld, worldEditToStorage, type Path, type PolygonPath } from '@weasel-js/geom';\nimport type { GesturePreviewSource } from 'canvas/gestureBounds';\nimport { pathFromPlane } from 'canvas/planeClips';\nimport { isRectPose } from 'core/geometry/autoPoseDescriptor';\nimport type { RectPose } from 'core/scene/types';\nimport type { PlaneMap } from 'core/viewport/parallax';\n\n/** The two fields of a node the editable path is read from. */\nexport interface EditableShape {\n pose: unknown;\n data: unknown;\n}\n\n/** Resolve where a node's editable polygon lives. Returns null when the\n * node has neither a polygon pose nor a polygon on `data.path`. */\nexport function classifyPathStorage(\n node: EditableShape | undefined | null,\n): { kind: 'pose' } | { kind: 'data'; pose: RectPose; data: { path: PolygonPath } } | null {\n if (!node) return null;\n const pose = node.pose as { kind?: string } | undefined;\n if (pose?.kind === 'polygon') return { kind: 'pose' };\n const data = node.data as { path?: Path } | null;\n if (data?.path && (data.path as { kind?: string }).kind === 'polygon' && isRectPose(node.pose)) {\n return {\n kind: 'data',\n pose: node.pose,\n data: data as { path: PolygonPath },\n };\n }\n return null;\n}\n\n/** A node's editable polygon in world coords. Does NOT consult any preview state —\n * callers that want live state read in-flight handles themselves. */\nexport function resolveEditablePathOf(\n node: EditableShape | undefined | null,\n): PolygonPath | null {\n if (!node) return null;\n const storage = classifyPathStorage(node);\n if (!storage) return null;\n // Pose-as-polygon: the pose IS the polygon (polygon poses can't carry\n // rotation), so it's already world.\n if (storage.kind === 'pose') return (node as { pose: PolygonPath }).pose;\n // data.path: translate to the pose origin AND bake `pose.rotation`, so anchors render on\n // the rotated contour the renderer draws.\n return pathInWorld(storage.data.path, storage.pose) as PolygonPath;\n}\n\n/**\n * The pose and data that store `worldPath` where `node` stores its editable\n * polygon — the inverse of {@link resolveEditablePathOf}, so a `data.path`\n * node keeps its rotation. Null when `node` has no editable polygon.\n */\nexport function storeEditablePath(\n node: EditableShape | undefined | null,\n worldPath: PolygonPath,\n): EditableShape | null {\n const storage = classifyPathStorage(node);\n if (!storage) return null;\n if (storage.kind === 'pose') return { pose: worldPath, data: node!.data };\n const { pose, path } = worldEditToStorage(storage.pose, worldPath);\n return { pose, data: { ...storage.data, path } };\n}\n\n/** `node` as the in-flight gestures in `previews` would leave it: a handle\n * previewing `id` contributes its pose and its data. */\nfunction previewedShape(\n id: string,\n node: EditableShape,\n previews: readonly GesturePreviewSource[],\n): EditableShape {\n let pose = node.pose;\n let data = node.data;\n let touched = false;\n for (const source of previews) {\n const previewIds = source.previewIds?.();\n if (!previewIds) continue;\n let owns = false;\n for (const pid of previewIds) {\n if (pid === id) { owns = true; break; }\n }\n if (!owns) continue;\n const p = source.previewPose?.(id);\n if (p != null && !touched) { pose = p; touched = true; }\n const d = source.previewData?.(id);\n if (d != null) { data = d; touched = true; }\n }\n return { pose, data };\n}\n\n/**\n * The editable polygon of node `id` as it is drawn right now: following any\n * in-flight gesture in `previews`, and in the world of the camera whose\n * `plane` this is — a path on a parallax plane is stored in the plane's.\n */\nexport function liveEditablePath(\n id: string,\n node: EditableShape | undefined | null,\n previews: readonly GesturePreviewSource[],\n plane: PlaneMap | null,\n): PolygonPath | null {\n if (!node) return null;\n return pathFromPlane(resolveEditablePathOf(previewedShape(id, node, previews)), plane);\n}\n"],"mappings":";;;;AAmBA,SAAgBA,EACd,GACyF;CACzF,IAAI,CAACC,GAAM,OAAO;CAElB,IADaA,EAAK,MACR,SAAS,WAAW,OAAO,EAAE,MAAM,OAAO;CACpD,IAAMC,IAAOD,EAAK;CAQlB,OAPIC,GAAM,QAASA,EAAK,KAA2B,SAAS,aAAaC,EAAWF,EAAK,IAAI,IACpF;EACL,MAAM;EACN,MAAMA,EAAK;EACL;CACR,IAEK;AACT;AAIA,SAAgBG,EACd,GACoB;CACpB,IAAI,CAACH,GAAM,OAAO;CAClB,IAAMI,IAAUL,EAAoBC,CAAI;CAOxC,OANKI,IAGDA,EAAQ,SAAS,SAAgBJ,EAA+B,OAG7DK,EAAYD,EAAQ,KAAK,MAAMA,EAAQ,IAAI,IAN7B;AAOvB;AAOA,SAAgBE,EACd,GACA,GACsB;CACtB,IAAMF,IAAUL,EAAoBC,CAAI;CACxC,IAAI,CAACI,GAAS,OAAO;CACrB,IAAIA,EAAQ,SAAS,QAAQ,OAAO;EAAE,MAAMG;EAAW,MAAMP,EAAM;CAAK;CACxE,IAAM,EAAE,SAAM,YAASQ,EAAmBJ,EAAQ,MAAMG,CAAS;CACjE,OAAO;EAAE;EAAM,MAAM;GAAE,GAAGH,EAAQ;GAAM;EAAK;CAAE;AACjD;AAIA,SAASK,EACP,GACA,GACA,GACe;CACf,IAAIC,IAAOV,EAAK,MACZC,IAAOD,EAAK,MACZW,IAAU;CACd,KAAK,IAAMC,KAAUC,GAAU;EAC7B,IAAMC,IAAaF,EAAO,aAAa;EACvC,IAAI,CAACE,GAAY;EACjB,IAAIC,IAAO;EACX,KAAK,IAAMC,KAAOF,GAChB,IAAIE,MAAQC,GAAI;GAAE,IAAO;GAAM;EAAO;EAExC,IAAI,CAACF,GAAM;EACX,IAAMG,IAAIN,EAAO,cAAcK,CAAE;EACjC,AAAIC,KAAK,QAAQ,CAACP,MAAW,IAAOO,GAAG,IAAU;EACjD,IAAMC,IAAIP,EAAO,cAAcK,CAAE;EACjC,AAAIE,KAAK,SAAQ,IAAOA,GAAG,IAAU;CACvC;CACA,OAAO;EAAE;EAAM;CAAK;AACtB;AAOA,SAAgBC,EACd,GACA,GACA,GACA,GACoB;CAEpB,OADKpB,IACEqB,EAAclB,EAAsBM,EAAeQ,GAAIjB,GAAMa,CAAQ,CAAC,GAAGS,CAAK,IADnE;AAEpB"}
|
|
@@ -1,17 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import "
|
|
7
|
-
import "
|
|
8
|
-
import {
|
|
9
|
-
import { createPathEditingOverlayLayer as g } from "./pathEditingOverlayLayer.js";
|
|
10
|
-
import { createPenPreviewLayer as _ } from "./penPreviewLayer.js";
|
|
11
|
-
import { createPathLayer as v } from "./pathLayer.js";
|
|
12
|
-
import { pathOriginProjection as y } from "./originProjection.js";
|
|
13
|
-
import { strokeToPath as b } from "./strokeToPath.js";
|
|
14
|
-
import { DEFAULT_FLATTEN_TOLERANCE as x, PATH_C as S, PATH_CMD_LENGTHS as C, PATH_L as w, PATH_M as T, PATH_Q as E, PATH_Z as D, PathBuilder as O, boundsOfPath as k, composePath as A, decomposePath as j, ellipsePath as M, flattenCubic as N, flattenCubicWithArcLen as P, flattenQuadratic as F, flattenQuadraticWithArcLen as I, linePath as L, pathCommandCoordCount as R, pathContainsPoint as z, pathContainsPolygon as B, pathContainsRect as V, pathDistanceToPoint as H, pathFromD as U, pathIntersectsPolygon as W, pathIntersectsRect as G, pathSignedArea as K, pointAlongPath as q, pointInPath as J, polygonFromPoints as Y, polylineFromPoints as X, rectPath as Z, regularPolygonPath as Q, reversePath as $, scalePathToBounds as ee, splitSubpaths as te, starPath as ne, transformPath as re, translatePath as ie, unionBoundsPath as ae } from "@weasel-js/geom";
|
|
15
|
-
import { snipPathByPolyline as oe, splitPathByPolyline as se, splitPathBySegment as ce } from "@weasel-js/geom/booleans";
|
|
1
|
+
import { pathPoseDescriptor as e } from "../../core/geometry/pathPoseDescriptor.js";
|
|
2
|
+
import { createPenPreviewLayer as t } from "./penPreviewLayer.js";
|
|
3
|
+
import { createPathEditingOverlayLayer as n } from "./pathEditingOverlayLayer.js";
|
|
4
|
+
import { createPathLayer as r } from "./pathLayer.js";
|
|
5
|
+
import { pathOriginProjection as i } from "./originProjection.js";
|
|
6
|
+
import { DEFAULT_FLATTEN_TOLERANCE as a, PATH_C as o, PATH_CMD_LENGTHS as s, PATH_L as c, PATH_M as l, PATH_Q as u, PATH_Z as d, PathBuilder as f, averageAnchorsAt as p, boundsOfPath as m, circlePath as h, composePath as g, countPathAnchors as _, decomposePath as v, ellipsePath as y, flattenCubic as b, flattenCubicWithArcLen as x, flattenQuadratic as S, flattenQuadraticWithArcLen as C, hasOpenSubpath as w, joinAnchorsAt as T, linePath as E, pathCommandCoordCount as D, pathContainsPoint as O, pathContainsPolygon as k, pathContainsRect as A, pathDistanceToPoint as j, pathFromD as M, pathInPoseFrame as N, pathInWorld as P, pathIntersectsPolygon as F, pathIntersectsRect as I, pathSignedArea as L, pathThroughPoseFrame as R, pathToAnchors as z, pointAlongPath as B, pointInPath as V, polygonFromPoints as H, polylineFromPoints as U, poseFrameInverseOf as W, poseFrameOf as G, poseLinearOf as K, poseRotationOf as q, rectMarkerPath as J, rectPath as Y, regularPolygonPath as X, reversePath as Z, rotatePathAround as Q, roundRectPath as $, scalePathToBounds as ee, simplifyPath as te, splitByClosure as ne, splitSubpaths as re, squarePath as ie, starPath as ae, transformPath as oe, translatePath as se, unionBoundsPath as ce, worldEditToStorage as le } from "@weasel-js/geom";
|
|
7
|
+
import { offsetPath as ue, strokeToPath as de } from "@weasel-js/stroke";
|
|
8
|
+
import { pathDivide as fe, pathExclude as pe, pathIntersect as me, pathSubtract as he, pathUnion as ge, snipPathByPolyline as _e, snipPathsAtCrossings as ve, splitPathByPolyline as ye, splitPathBySegment as be, trianglesToPath as xe } from "@weasel-js/geom/booleans";
|
|
16
9
|
import "@weasel-js/geom/curves";
|
|
17
|
-
export {
|
|
10
|
+
export { a as DEFAULT_FLATTEN_TOLERANCE, o as PATH_C, s as PATH_CMD_LENGTHS, c as PATH_L, l as PATH_M, u as PATH_Q, d as PATH_Z, f as PathBuilder, p as averageAnchorsAt, m as boundsOfPath, h as circlePath, g as composePath, _ as countPathAnchors, n as createPathEditingOverlayLayer, r as createPathLayer, t as createPenPreviewLayer, v as decomposePath, y as ellipsePath, b as flattenCubic, x as flattenCubicWithArcLen, S as flattenQuadratic, C as flattenQuadraticWithArcLen, w as hasOpenSubpath, T as joinAnchorsAt, E as linePath, ue as offsetPath, D as pathCommandCoordCount, O as pathContainsPoint, k as pathContainsPolygon, A as pathContainsRect, j as pathDistanceToPoint, fe as pathDivide, pe as pathExclude, M as pathFromD, N as pathInPoseFrame, P as pathInWorld, me as pathIntersect, F as pathIntersectsPolygon, I as pathIntersectsRect, i as pathOriginProjection, e as pathPoseDescriptor, L as pathSignedArea, he as pathSubtract, R as pathThroughPoseFrame, z as pathToAnchors, ge as pathUnion, B as pointAlongPath, V as pointInPath, H as polygonFromPoints, U as polylineFromPoints, W as poseFrameInverseOf, G as poseFrameOf, K as poseLinearOf, q as poseRotationOf, J as rectMarkerPath, Y as rectPath, X as regularPolygonPath, Z as reversePath, Q as rotatePathAround, $ as roundRectPath, ee as scalePathToBounds, te as simplifyPath, _e as snipPathByPolyline, ve as snipPathsAtCrossings, ne as splitByClosure, ye as splitPathByPolyline, be as splitPathBySegment, re as splitSubpaths, ie as squarePath, ae as starPath, de as strokeToPath, oe as transformPath, se as translatePath, xe as trianglesToPath, ce as unionBoundsPath, le as worldEditToStorage };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createEmitter as e } from "@weasel-js/registry";
|
|
2
|
+
//#region src/features/paths/pathEditState.ts
|
|
3
|
+
var t = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set();
|
|
4
|
+
function r(e, t, n) {
|
|
5
|
+
return e.get(n) != null && t.current.includes(n);
|
|
6
|
+
}
|
|
7
|
+
function i(r = {}) {
|
|
8
|
+
let i = "", a = n, o = null, s = t, c = e(), l = c.emit, u = () => {
|
|
9
|
+
let e = r.host?.(), t = e ? e.editingId() ?? "" : i;
|
|
10
|
+
return !t || r.isAllowed && !r.isAllowed() || r.isSelectedNode && !r.isSelectedNode(t) ? "" : t;
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
getEditingId: u,
|
|
14
|
+
getEditingIds() {
|
|
15
|
+
let e = u();
|
|
16
|
+
return e ? (s.has(e) || (s = /* @__PURE__ */ new Set([e])), s) : t;
|
|
17
|
+
},
|
|
18
|
+
setEditingId(e) {
|
|
19
|
+
let t = r.host?.();
|
|
20
|
+
if (t) {
|
|
21
|
+
t.setEditingId(e);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
let n = e ?? "";
|
|
25
|
+
n !== i && (i = n, l());
|
|
26
|
+
},
|
|
27
|
+
getSelectedAnchors: () => a,
|
|
28
|
+
setSelectedAnchors(e) {
|
|
29
|
+
a = e, l();
|
|
30
|
+
},
|
|
31
|
+
getMarquee: () => o,
|
|
32
|
+
setMarquee(e) {
|
|
33
|
+
o = e, l();
|
|
34
|
+
},
|
|
35
|
+
subscribe: c.subscribe
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { i as createPathEditState, r as isSelectedNode };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=pathEditState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathEditState.js","names":["NO_IDS","NO_ANCHORS","isSelectedNode","scene","id","selection","createPathEditState","ownId","selectedAnchors","marquee","idSet","changed","createEmitter","notify","getEditingId","host","source","next","rect"],"sources":["../../../src/features/paths/pathEditState.ts"],"sourcesContent":["/**\n * Which path is being anchor-edited, which of its anchors are selected, and\n * the anchor marquee in flight: one object every reader shares — the\n * `editAnchors` dep, the anchor overlay, the selection overlay's suppressed\n * set, the chrome-caps rule context, and the select tool's shift-click lock.\n */\nimport { createEmitter } from '@weasel-js/registry';\nimport type { PathEditHost } from 'canvas/SceneCanvas/pathEditHost';\n\n/** A world-coord rect. */\nexport interface AnchorMarquee {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/**\n * What decides whether a stored edit target is still one: its node exists and\n * is selected, and the mode permits anchor editing. Each is read at the\n * moment of the question.\n */\nexport interface PathEditSource {\n /** Whether `id` names a node that exists and is selected. Absent means\n * every id does. */\n isSelectedNode?(id: string): boolean;\n /** A host that owns the id; the state then keeps none of its own. */\n host?(): PathEditHost | undefined;\n /**\n * Whether anchor editing is permitted right now — whether the active mode\n * allows the `edits-anchors` capability.\n *\n * **Omit this when no mode registry is wired.** Absent means \"no modality,\n * so nothing revokes edit mode\"; a predicate built from an empty capability\n * set would revoke edit mode instantly.\n */\n isAllowed?(): boolean;\n}\n\nexport interface PathEditState {\n /**\n * The node whose anchors are editable now, or `''`: the stored id, or the\n * host's, while `PathEditSource` still lets it stand. Masked rather than\n * cleared: a host's mode machine can leave path-edit mode without running\n * `exitPathEdit`, and nothing re-renders when it does, so there is no\n * moment to write the id back.\n */\n getEditingId(): string;\n /** `getEditingId()` as the set the selection overlay skips. */\n getEditingIds(): ReadonlySet<string>;\n setEditingId(id: string | null): void;\n /** Selected anchors (flat indices) of the path being edited. */\n getSelectedAnchors(): ReadonlySet<number>;\n setSelectedAnchors(next: ReadonlySet<number>): void;\n /** The in-flight anchor-marquee rect, in the edited path's world. */\n getMarquee(): AnchorMarquee | null;\n setMarquee(rect: AnchorMarquee | null): void;\n /** Notified when a write changes what the anchor overlay paints. A host\n * that owns the id announces its own changes. */\n subscribe(listener: () => void): () => void;\n}\n\nconst NO_IDS: ReadonlySet<string> = new Set();\nconst NO_ANCHORS: ReadonlySet<number> = new Set();\n\n/** Whether `id` names a node `scene` holds and `selection` includes. */\nexport function isSelectedNode(\n scene: { get(id: never): unknown },\n selection: { readonly current: readonly string[] },\n id: string,\n): boolean {\n return scene.get(id as never) != null && selection.current.includes(id);\n}\n\nexport function createPathEditState(source: PathEditSource = {}): PathEditState {\n let ownId = '';\n let selectedAnchors = NO_ANCHORS;\n let marquee: AnchorMarquee | null = null;\n let idSet = NO_IDS;\n const changed = createEmitter();\n const notify = changed.emit;\n\n const getEditingId = (): string => {\n const host = source.host?.();\n const id = host ? host.editingId() ?? '' : ownId;\n if (!id) return '';\n if (source.isAllowed && !source.isAllowed()) return '';\n if (source.isSelectedNode && !source.isSelectedNode(id)) return '';\n return id;\n };\n\n return {\n getEditingId,\n getEditingIds() {\n const id = getEditingId();\n if (!id) return NO_IDS;\n if (!idSet.has(id)) idSet = new Set([id]);\n return idSet;\n },\n setEditingId(id) {\n const host = source.host?.();\n if (host) { host.setEditingId(id); return; }\n const next = id ?? '';\n if (next === ownId) return;\n ownId = next;\n notify();\n },\n getSelectedAnchors: () => selectedAnchors,\n setSelectedAnchors(next) {\n selectedAnchors = next;\n notify();\n },\n getMarquee: () => marquee,\n setMarquee(rect) {\n marquee = rect;\n notify();\n },\n subscribe: changed.subscribe,\n };\n}\n"],"mappings":";;AA8DA,IAAMA,oBAA8B,IAAI,IAAI,GACtCC,oBAAkC,IAAI,IAAI;AAGhD,SAAgBC,EACd,GACA,GACA,GACS;CACT,OAAOC,EAAM,IAAIC,CAAW,KAAK,QAAQC,EAAU,QAAQ,SAASD,CAAE;AACxE;AAEA,SAAgBE,EAAoB,IAAyB,CAAC,GAAkB;CAC9E,IAAIC,IAAQ,IACRC,IAAkBP,GAClBQ,IAAgC,MAChCC,IAAQV,GACNW,IAAUC,EAAc,GACxBC,IAASF,EAAQ,MAEjBG,UAA6B;EACjC,IAAMC,IAAOC,EAAO,OAAO,GACrBZ,IAAKW,IAAOA,EAAK,UAAU,KAAK,KAAKR;EAI3C,OAHI,CAACH,KACDY,EAAO,aAAa,CAACA,EAAO,UAAU,KACtCA,EAAO,kBAAkB,CAACA,EAAO,eAAeZ,CAAE,IAAU,KACzDA;CACT;CAEA,OAAO;EACL;EACA,gBAAgB;GACd,IAAMA,IAAKU,EAAa;GAGxB,OAFKV,KACAM,EAAM,IAAIN,CAAE,MAAG,oBAAQ,IAAI,IAAI,CAACA,CAAE,CAAC,IACjCM,KAFSV;EAGlB;EACA,aAAa,GAAI;GACf,IAAMe,IAAOC,EAAO,OAAO;GAC3B,IAAID,GAAM;IAAE,EAAK,aAAaX,CAAE;IAAG;GAAQ;GAC3C,IAAMa,IAAOb,KAAM;GACnB,AAAIa,MAASV,MACb,IAAQU,GACRJ,EAAO;EACT;EACA,0BAA0BL;EAC1B,mBAAmB,GAAM;GAEvB,AADA,IAAkBS,GAClBJ,EAAO;EACT;EACA,kBAAkBJ;EAClB,WAAW,GAAM;GAEf,AADA,IAAUS,GACVL,EAAO;EACT;EACA,WAAWF,EAAQ;CACrB;AACF"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { circlePath as r, rectMarkerPath as i, squarePath as a } from "./markers.js";
|
|
4
|
-
import { linePath as o } from "@weasel-js/geom";
|
|
1
|
+
import { isVisibleFrom as e, previewSourcesFrom as t } from "../../canvas/drawEnvelope.js";
|
|
2
|
+
import { circlePath as n, linePath as r, pathToAnchors as i, rectMarkerPath as a, squarePath as o } from "@weasel-js/geom";
|
|
5
3
|
//#region src/features/paths/pathEditingOverlayLayer.ts
|
|
6
4
|
var s = {
|
|
7
5
|
anchorSizePx: 8,
|
|
@@ -29,79 +27,79 @@ function u(u) {
|
|
|
29
27
|
draw: (s, f) => {
|
|
30
28
|
let p = u.getEditingId();
|
|
31
29
|
if (!p) return [];
|
|
32
|
-
let m =
|
|
30
|
+
let m = e(s);
|
|
33
31
|
if (m && !m("path-edit.anchors")) return [];
|
|
34
|
-
let h = u.getPose(p,
|
|
32
|
+
let h = u.getPose(p, t(s), f);
|
|
35
33
|
if (!h || h.kind !== "polygon") return [];
|
|
36
|
-
let { anchors: g } =
|
|
34
|
+
let { anchors: g } = i(h), _ = u.getSelectedAnchors?.() ?? c, v = [], y = 0;
|
|
37
35
|
for (let e of g) for (let t of e) {
|
|
38
36
|
let e = _.has(y);
|
|
39
37
|
y++;
|
|
40
|
-
let [
|
|
38
|
+
let [i, a] = l(t.x, t.y, f);
|
|
41
39
|
if (t.inHandle) {
|
|
42
|
-
let [e,
|
|
40
|
+
let [e, o] = l(t.inHandle.x, t.inHandle.y, f);
|
|
43
41
|
v.push({
|
|
44
42
|
kind: "path",
|
|
45
|
-
path:
|
|
46
|
-
x:
|
|
47
|
-
y:
|
|
43
|
+
path: r({
|
|
44
|
+
x: i,
|
|
45
|
+
y: a
|
|
48
46
|
}, {
|
|
49
47
|
x: e,
|
|
50
|
-
y:
|
|
48
|
+
y: o
|
|
51
49
|
}),
|
|
52
50
|
stroke: {
|
|
53
51
|
paint: {
|
|
54
|
-
|
|
52
|
+
kind: "solid",
|
|
55
53
|
color: d.handleStroke
|
|
56
54
|
},
|
|
57
55
|
width: 1
|
|
58
56
|
}
|
|
59
57
|
}), v.push({
|
|
60
58
|
kind: "path",
|
|
61
|
-
path:
|
|
62
|
-
fill: {
|
|
63
|
-
|
|
59
|
+
path: n(e, o, d.handleDotRadiusPx),
|
|
60
|
+
fill: { paint: {
|
|
61
|
+
kind: "solid",
|
|
64
62
|
color: d.handleDotFill
|
|
65
|
-
}
|
|
63
|
+
} }
|
|
66
64
|
});
|
|
67
65
|
}
|
|
68
66
|
if (t.outHandle) {
|
|
69
|
-
let [e,
|
|
67
|
+
let [e, o] = l(t.outHandle.x, t.outHandle.y, f);
|
|
70
68
|
v.push({
|
|
71
69
|
kind: "path",
|
|
72
|
-
path:
|
|
73
|
-
x:
|
|
74
|
-
y:
|
|
70
|
+
path: r({
|
|
71
|
+
x: i,
|
|
72
|
+
y: a
|
|
75
73
|
}, {
|
|
76
74
|
x: e,
|
|
77
|
-
y:
|
|
75
|
+
y: o
|
|
78
76
|
}),
|
|
79
77
|
stroke: {
|
|
80
78
|
paint: {
|
|
81
|
-
|
|
79
|
+
kind: "solid",
|
|
82
80
|
color: d.handleStroke
|
|
83
81
|
},
|
|
84
82
|
width: 1
|
|
85
83
|
}
|
|
86
84
|
}), v.push({
|
|
87
85
|
kind: "path",
|
|
88
|
-
path:
|
|
89
|
-
fill: {
|
|
90
|
-
|
|
86
|
+
path: n(e, o, d.handleDotRadiusPx),
|
|
87
|
+
fill: { paint: {
|
|
88
|
+
kind: "solid",
|
|
91
89
|
color: d.handleDotFill
|
|
92
|
-
}
|
|
90
|
+
} }
|
|
93
91
|
});
|
|
94
92
|
}
|
|
95
93
|
v.push({
|
|
96
94
|
kind: "path",
|
|
97
|
-
path:
|
|
98
|
-
fill: {
|
|
99
|
-
|
|
95
|
+
path: o(i, a, d.anchorSizePx),
|
|
96
|
+
fill: { paint: {
|
|
97
|
+
kind: "solid",
|
|
100
98
|
color: e ? d.anchorFillSelected : d.anchorFill
|
|
101
|
-
},
|
|
99
|
+
} },
|
|
102
100
|
stroke: {
|
|
103
101
|
paint: {
|
|
104
|
-
|
|
102
|
+
kind: "solid",
|
|
105
103
|
color: d.anchorStroke
|
|
106
104
|
},
|
|
107
105
|
width: 1
|
|
@@ -113,14 +111,14 @@ function u(u) {
|
|
|
113
111
|
let [e, t] = l(b.x, b.y, f), [n, r] = l(b.x + b.width, b.y + b.height, f);
|
|
114
112
|
v.push({
|
|
115
113
|
kind: "path",
|
|
116
|
-
path:
|
|
117
|
-
fill: {
|
|
118
|
-
|
|
114
|
+
path: a(e, t, n - e, r - t),
|
|
115
|
+
fill: { paint: {
|
|
116
|
+
kind: "solid",
|
|
119
117
|
color: d.marqueeFill
|
|
120
|
-
},
|
|
118
|
+
} },
|
|
121
119
|
stroke: {
|
|
122
120
|
paint: {
|
|
123
|
-
|
|
121
|
+
kind: "solid",
|
|
124
122
|
color: d.marqueeStroke
|
|
125
123
|
},
|
|
126
124
|
width: 1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pathEditingOverlayLayer.js","names":["DEFAULT_STYLE","EMPTY_SELECTION","w2s","wx","view","wy","createPathEditingOverlayLayer","style","opts","id","isVisible","isVisibleFrom","data","pose","previewSourcesFrom","pathToAnchors","selected","out","flat","sub","anchors","a","isSelected","ax","ay","hx","hy","linePath","circlePath","squarePath","marquee","mx","my","mx2","my2","rectMarkerPath"],"sources":["../../../src/features/paths/pathEditingOverlayLayer.ts"],"sourcesContent":["/**\n * Screen-space render layer for path-editing chrome — anchor squares,\n * tangent lines, and control-point dots for a polygon path that is the\n * current edit target. Companion to the kit's `editAnchorsAction` /\n * `buildAffordanceAt` hit-test wiring: the gesture works without chrome,\n * but a human user needs to see what's hittable.\n *\n * The layer reads the live edit target each frame via the supplied\n * `getEditingId()` + `getPose(...)` thunks, resolving the path against the\n * drawing view's own previews. Returns `[]` when no editing target is set or\n * the target isn't a polygon — the layer never throws.\n *\n * Anchors render as small white-filled stroked squares — filled solid\n * when selected; control points as small filled circles connected to\n * their anchor by a thin stem line. This is the kit's only anchor\n * chrome; the pen tool's parallel overlay and `apps/draw`'s\n * mode-decoration painter both drew the same thing from different state\n * and have been removed.\n *\n * All coordinates are projected via `worldToScreen` so the marker sizes\n * stay constant regardless of zoom.\n */\n\nimport type { DrawCommand } from '../../renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport { type Path, type PolygonPath, linePath } from '@weasel-js/geom';\nimport type { GesturePreviewSource } from 'canvas/gestureBounds';\nimport { previewSourcesFrom, isVisibleFrom } from 'canvas/drawEnvelope';\nimport { pathToAnchors } from './anchors';\nimport { circlePath, rectMarkerPath, squarePath } from './markers';\n\ninterface View { x: number; y: number; scale: { x: number; y: number } }\n\n/** Options for `createPathEditingOverlayLayer`. Everything is read per frame,\n * so the layer follows a changing edit target without being rebuilt. */\nexport interface CreatePathEditingOverlayLayerOptions {\n /** Returns the id of the polygon currently in anchor-edit mode, or null\n * when no node is being edited. Read each frame so live selection /\n * edit-target changes show up without re-creating the layer. */\n getEditingId(): string | null;\n /**\n * Returns the pose for an id, or null if the node has been deleted.\n * Non-polygon poses are tolerated (the layer no-ops on them).\n *\n * `previews` are the drawing view's in-flight preview surfaces, so an\n * anchor dragged in one panel does not move in the others. Resolve against\n * them before falling back to the committed pose.\n *\n * `view` is the drawing view's camera. Answer in its world: a node whose\n * layer is a parallax plane stores its path in the plane's.\n */\n getPose(id: string, previews: readonly GesturePreviewSource[], view: View): Path | null;\n /** Flat indices of the selected anchors. Selected anchors render\n * filled; unselected ones hollow — the standard vector-editor cue for\n * \"these are what the arrow keys and Delete will act on\". Omit when\n * the consumer has no anchor selection to show. */\n getSelectedAnchors?(): ReadonlySet<number>;\n /** In-flight anchor-marquee rect in world coords, or null. Drawn as a\n * rubber band while `marqueeAnchorsAction` is dragging. */\n getMarquee?(view: View): { x: number; y: number; width: number; height: number } | null;\n /** Optional styling overrides. */\n style?: PathEditingOverlayStyle;\n}\n\n/** Appearance of the anchor and handle markers. */\nexport interface PathEditingOverlayStyle {\n anchorSizePx?: number;\n handleDotRadiusPx?: number;\n anchorFill?: string;\n anchorStroke?: string;\n handleStroke?: string;\n /** Fill of the control-point circle. Defaults to the handleStroke color\n * at 50% alpha — keeps the marker readable but lets the underlying\n * curve / background show through, which matches Figma's \"translucent\n * handle dot\" idiom. */\n handleDotFill?: string;\n /** Fill of a selected anchor square. Defaults to the anchor stroke\n * color, so selection reads as \"the marker filled in\". */\n anchorFillSelected?: string;\n /** Stroke of the marquee rubber band. */\n marqueeStroke?: string;\n /** Fill of the marquee rubber band. */\n marqueeFill?: string;\n}\n\nconst DEFAULT_STYLE: Required<PathEditingOverlayStyle> = {\n anchorSizePx: 8,\n // Control-point markers were 2px radius (4px diameter) — too small to\n // grab reliably with a mouse and visually lost against the curve.\n // 5px radius (10px diameter) is closer to typical Figma / Illustrator.\n handleDotRadiusPx: 5,\n anchorFill: '#ffffff',\n anchorStroke: '#3478f6',\n handleStroke: '#7da7e8',\n // 50%-opacity handle-stroke color. #7da7e8 → rgba(125, 167, 232, 0.5).\n handleDotFill: 'rgba(125, 167, 232, 0.5)',\n anchorFillSelected: '#3478f6',\n marqueeStroke: '#3478f6',\n marqueeFill: 'rgba(52, 120, 246, 0.08)',\n};\n\nconst EMPTY_SELECTION: ReadonlySet<number> = new Set();\n\nfunction w2s(wx: number, wy: number, view: View): [number, number] {\n return [(wx - view.x) * view.scale.x, (wy - view.y) * view.scale.y];\n}\n\n/** Render layer that draws the anchors and control handles of the path\n * currently being anchor-edited. Draws nothing when no path is being\n * edited. */\nexport function createPathEditingOverlayLayer(\n opts: CreatePathEditingOverlayLayerOptions,\n): RenderLayer<unknown> {\n const style = { ...DEFAULT_STYLE, ...(opts.style ?? {}) };\n\n return {\n id: 'path-editing-overlay',\n label: 'Path editing',\n space: 'screen',\n draw: (data, view) => {\n const id = opts.getEditingId();\n if (!id) return [];\n // Chrome-caps gate off the envelope, so paint and the anchor hit-test in\n // `affordanceAt` consult the same rule — otherwise a consumer that hides\n // the chrome still gets grabbable invisible anchors, or vice versa.\n const isVisible = isVisibleFrom(data);\n if (isVisible && !isVisible('path-edit.anchors')) return [];\n const pose = opts.getPose(id, previewSourcesFrom(data), view);\n if (!pose || pose.kind !== 'polygon') return [];\n\n const { anchors } = pathToAnchors(pose as PolygonPath);\n const selected = opts.getSelectedAnchors?.() ?? EMPTY_SELECTION;\n const out: DrawCommand[] = [];\n\n // Flat anchor index, incremented in walk order so it lines up with\n // `enumerateAnchors` — the same numbering the affordances and the\n // anchor selection use. See `anchorEdits` for why they agree.\n let flat = 0;\n for (const sub of anchors) {\n for (const a of sub) {\n const isSelected = selected.has(flat);\n flat++;\n const [ax, ay] = w2s(a.x, a.y, view);\n\n // Tangent stems + handle dots first so the anchor square paints on top.\n if (a.inHandle) {\n const [hx, hy] = w2s(a.inHandle.x, a.inHandle.y, view);\n out.push({\n kind: 'path',\n path: linePath({ x: ax, y: ay }, { x: hx, y: hy }),\n stroke: { paint: { fill: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: circlePath(hx, hy, style.handleDotRadiusPx),\n fill: { fill: 'solid', color: style.handleDotFill },\n });\n }\n if (a.outHandle) {\n const [hx, hy] = w2s(a.outHandle.x, a.outHandle.y, view);\n out.push({\n kind: 'path',\n path: linePath({ x: ax, y: ay }, { x: hx, y: hy }),\n stroke: { paint: { fill: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: circlePath(hx, hy, style.handleDotRadiusPx),\n fill: { fill: 'solid', color: style.handleDotFill },\n });\n }\n\n // Anchor square — drawn on top.\n out.push({\n kind: 'path',\n path: squarePath(ax, ay, style.anchorSizePx),\n fill: {\n fill: 'solid',\n color: isSelected ? style.anchorFillSelected : style.anchorFill,\n },\n stroke: { paint: { fill: 'solid', color: style.anchorStroke }, width: 1 },\n });\n }\n }\n\n // Marquee rubber band, on top of everything.\n const marquee = opts.getMarquee?.(view);\n if (marquee) {\n const [mx, my] = w2s(marquee.x, marquee.y, view);\n const [mx2, my2] = w2s(marquee.x + marquee.width, marquee.y + marquee.height, view);\n out.push({\n kind: 'path',\n path: rectMarkerPath(mx, my, mx2 - mx, my2 - my),\n fill: { fill: 'solid', color: style.marqueeFill },\n stroke: { paint: { fill: 'solid', color: style.marqueeStroke }, width: 1 },\n });\n }\n\n return out;\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pathEditingOverlayLayer.js","names":["DEFAULT_STYLE","EMPTY_SELECTION","w2s","wx","view","wy","createPathEditingOverlayLayer","style","opts","id","isVisible","isVisibleFrom","data","pose","previewSourcesFrom","pathToAnchors","selected","out","flat","sub","anchors","a","isSelected","ax","ay","hx","hy","linePath","circlePath","squarePath","marquee","mx","my","mx2","my2","rectMarkerPath"],"sources":["../../../src/features/paths/pathEditingOverlayLayer.ts"],"sourcesContent":["/**\n * Screen-space render layer for path-editing chrome — anchor squares,\n * tangent lines, and control-point dots for a polygon path that is the\n * current edit target. Marker sizes stay constant regardless of zoom.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport { type Path, type PolygonPath, type View, linePath, pathToAnchors, circlePath, rectMarkerPath, squarePath } from '@weasel-js/geom';\nimport type { GesturePreviewSource } from 'canvas/gestureBounds';\nimport { previewSourcesFrom, isVisibleFrom } from 'canvas/drawEnvelope';\n\n/** Options for `createPathEditingOverlayLayer`. Everything is read per frame,\n * so the layer follows a changing edit target without being rebuilt. */\nexport interface CreatePathEditingOverlayLayerOptions {\n /** Returns the id of the polygon currently in anchor-edit mode, or null\n * when no node is being edited. */\n getEditingId(): string | null;\n /**\n * Returns the pose for an id, or null if the node has been deleted.\n * Non-polygon poses are tolerated (the layer no-ops on them).\n *\n * `previews` are the drawing view's in-flight preview surfaces, so an\n * anchor dragged in one panel does not move in the others. Resolve against\n * them before falling back to the committed pose.\n *\n * `view` is the drawing view's camera. Answer in its world: a node whose\n * layer is a parallax plane stores its path in the plane's.\n */\n getPose(id: string, previews: readonly GesturePreviewSource[], view: View): Path | null;\n /** Flat indices of the selected anchors. Selected anchors render\n * filled; unselected ones hollow. */\n getSelectedAnchors?(): ReadonlySet<number>;\n /** In-flight anchor-marquee rect in world coords, or null. Drawn as a\n * rubber band while `marqueeAnchorsAction` is dragging. */\n getMarquee?(view: View): { x: number; y: number; width: number; height: number } | null;\n /** Optional styling overrides. */\n style?: PathEditingOverlayStyle;\n}\n\n/** Appearance of the anchor and handle markers. */\nexport interface PathEditingOverlayStyle {\n anchorSizePx?: number;\n handleDotRadiusPx?: number;\n anchorFill?: string;\n anchorStroke?: string;\n handleStroke?: string;\n /** Fill of the control-point circle. Defaults to the handleStroke color\n * at 50% alpha. */\n handleDotFill?: string;\n /** Fill of a selected anchor square. Defaults to the anchor stroke color. */\n anchorFillSelected?: string;\n /** Stroke of the marquee rubber band. */\n marqueeStroke?: string;\n /** Fill of the marquee rubber band. */\n marqueeFill?: string;\n}\n\nconst DEFAULT_STYLE: Required<PathEditingOverlayStyle> = {\n anchorSizePx: 8,\n handleDotRadiusPx: 5,\n anchorFill: '#ffffff',\n anchorStroke: '#3478f6',\n handleStroke: '#7da7e8',\n // 50%-opacity handle-stroke color. #7da7e8 → rgba(125, 167, 232, 0.5).\n handleDotFill: 'rgba(125, 167, 232, 0.5)',\n anchorFillSelected: '#3478f6',\n marqueeStroke: '#3478f6',\n marqueeFill: 'rgba(52, 120, 246, 0.08)',\n};\n\nconst EMPTY_SELECTION: ReadonlySet<number> = new Set();\n\nfunction w2s(wx: number, wy: number, view: View): [number, number] {\n return [(wx - view.x) * view.scale.x, (wy - view.y) * view.scale.y];\n}\n\n/** Render layer that draws the anchors and control handles of the path\n * currently being anchor-edited. Draws nothing when no path is being\n * edited. */\nexport function createPathEditingOverlayLayer(\n opts: CreatePathEditingOverlayLayerOptions,\n): RenderLayer<unknown> {\n const style = { ...DEFAULT_STYLE, ...(opts.style ?? {}) };\n\n return {\n id: 'path-editing-overlay',\n label: 'Path editing',\n space: 'screen',\n draw: (data, view) => {\n const id = opts.getEditingId();\n if (!id) return [];\n // Chrome-caps gate off the envelope, so paint and the anchor hit-test in\n // `affordanceAt` consult the same rule — otherwise a consumer that hides\n // the chrome still gets grabbable invisible anchors, or vice versa.\n const isVisible = isVisibleFrom(data);\n if (isVisible && !isVisible('path-edit.anchors')) return [];\n const pose = opts.getPose(id, previewSourcesFrom(data), view);\n if (!pose || pose.kind !== 'polygon') return [];\n\n const { anchors } = pathToAnchors(pose as PolygonPath);\n const selected = opts.getSelectedAnchors?.() ?? EMPTY_SELECTION;\n const out: DrawCommand[] = [];\n\n // Flat anchor index, incremented in walk order so it lines up with\n // `enumerateAnchors` — the same numbering the affordances and the\n // anchor selection use. See `anchorEdits` for why they agree.\n let flat = 0;\n for (const sub of anchors) {\n for (const a of sub) {\n const isSelected = selected.has(flat);\n flat++;\n const [ax, ay] = w2s(a.x, a.y, view);\n\n // Tangent stems + handle dots first so the anchor square paints on top.\n if (a.inHandle) {\n const [hx, hy] = w2s(a.inHandle.x, a.inHandle.y, view);\n out.push({\n kind: 'path',\n path: linePath({ x: ax, y: ay }, { x: hx, y: hy }),\n stroke: { paint: { kind: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: circlePath(hx, hy, style.handleDotRadiusPx),\n fill: { paint: { kind: 'solid', color: style.handleDotFill } },\n });\n }\n if (a.outHandle) {\n const [hx, hy] = w2s(a.outHandle.x, a.outHandle.y, view);\n out.push({\n kind: 'path',\n path: linePath({ x: ax, y: ay }, { x: hx, y: hy }),\n stroke: { paint: { kind: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: circlePath(hx, hy, style.handleDotRadiusPx),\n fill: { paint: { kind: 'solid', color: style.handleDotFill } },\n });\n }\n\n // Anchor square — drawn on top.\n out.push({\n kind: 'path',\n path: squarePath(ax, ay, style.anchorSizePx),\n fill: { paint: {\n kind: 'solid',\n color: isSelected ? style.anchorFillSelected : style.anchorFill,\n } },\n stroke: { paint: { kind: 'solid', color: style.anchorStroke }, width: 1 },\n });\n }\n }\n\n // Marquee rubber band, on top of everything.\n const marquee = opts.getMarquee?.(view);\n if (marquee) {\n const [mx, my] = w2s(marquee.x, marquee.y, view);\n const [mx2, my2] = w2s(marquee.x + marquee.width, marquee.y + marquee.height, view);\n out.push({\n kind: 'path',\n path: rectMarkerPath(mx, my, mx2 - mx, my2 - my),\n fill: { paint: { kind: 'solid', color: style.marqueeFill } },\n stroke: { paint: { kind: 'solid', color: style.marqueeStroke }, width: 1 },\n });\n }\n\n return out;\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import "@weasel-js/renderer";
|
|
2
|
+
import { countPathAnchors as e } from "@weasel-js/geom";
|
|
2
3
|
import "@weasel-js/paint";
|
|
3
4
|
//#region src/features/paths/pathLayer.ts
|
|
4
|
-
var t = { color: "#ffffff" }, n = {
|
|
5
|
+
var t = { paint: { color: "#ffffff" } }, n = {
|
|
5
6
|
paint: { color: "#ffffff" },
|
|
6
7
|
width: 1
|
|
7
8
|
};
|