@weasel-js/core 1.9.3 → 1.9.4
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 +356 -0
- package/README.md +2 -2
- package/dist/WeaselProvider.js +5 -5
- package/dist/affordances/composeAffordanceLayer.js +10 -20
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/cornerResize.js +25 -17
- package/dist/affordances/cornerResize.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +27 -20
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/rotationHandle.js +18 -18
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/behaviors/momentum.js +93 -55
- package/dist/animation/behaviors/momentum.js.map +1 -1
- package/dist/animation/loop.js +10 -12
- package/dist/animation/loop.js.map +1 -1
- package/dist/animation/reflow.js +8 -8
- package/dist/animation/reflow.js.map +1 -1
- package/dist/animation/stagger.js +64 -56
- package/dist/animation/stagger.js.map +1 -1
- package/dist/animation/timeline/booking.js +62 -54
- package/dist/animation/timeline/booking.js.map +1 -1
- package/dist/animation/timeline/createTimeline.js +85 -76
- package/dist/animation/timeline/createTimeline.js.map +1 -1
- package/dist/animation/timeline/sampleTrack.js +13 -5
- package/dist/animation/timeline/sampleTrack.js.map +1 -1
- package/dist/animation/useAnimator.js +45 -35
- package/dist/animation/useAnimator.js.map +1 -1
- package/dist/animation/wrappers/animateLifecycle.js +31 -24
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
- package/dist/animation/wrappers/animateOnSetPose.js +28 -26
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
- package/dist/animation/wrappers/instantPose.js +13 -0
- package/dist/animation/wrappers/instantPose.js.map +1 -0
- package/dist/{poseDescriptor-D-OH-tu5.d.ts → autoPoseDescriptor-Ct7yqivU.d.ts} +28 -3
- package/dist/barrel/chrome.js +16 -0
- package/dist/barrel/input.js +19 -0
- package/dist/barrel/interactions.js +42 -0
- package/dist/barrel/paint.js +18 -0
- package/dist/barrel/paths.js +19 -0
- package/dist/barrel/renderer.js +20 -0
- package/dist/barrel/routing.js +51 -0
- package/dist/barrel/text.js +18 -0
- package/dist/barrel/viewport.js +52 -0
- package/dist/builtins-DPcdghtB.d.ts +1223 -0
- package/dist/canvas/Canvas.js +363 -448
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +164 -165
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +37 -32
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +49 -43
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/MinimapCanvas.js +26 -25
- package/dist/canvas/MinimapCanvas.js.map +1 -1
- package/dist/canvas/NodeShape.js +59 -377
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js +50 -47
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +167 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +13 -13
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +67 -0
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +16 -0
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -0
- package/dist/canvas/SceneCanvas/coordTrace.js +10 -0
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +112 -70
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +9 -8
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +1 -0
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/isDev.js +12 -0
- package/dist/canvas/SceneCanvas/isDev.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +29 -28
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/poseRegistrars.js +13 -0
- package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -0
- package/dist/canvas/SceneCanvas/props.js +38 -0
- package/dist/canvas/SceneCanvas/props.js.map +1 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +21 -62
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +46 -48
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +33 -33
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas.js +534 -788
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +45 -43
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +91 -0
- package/dist/canvas/buildSceneLayer.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +16 -19
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +68 -52
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/deps/changes.js +13 -0
- package/dist/canvas/deps/changes.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +28 -28
- package/dist/canvas/deps/insert.js +119 -91
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/slice.js +46 -45
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +10 -9
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/derivedPath.js +46 -23
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +7 -7
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/hud.module.js +1 -1
- package/dist/canvas/hud.module.js.map +1 -1
- package/dist/canvas/kitRequirements.js +2 -2
- package/dist/canvas/kitRequirements.js.map +1 -1
- package/dist/canvas/layerOrder.js +13 -6
- package/dist/canvas/layerOrder.js.map +1 -1
- package/dist/canvas/minimapMath.js +12 -10
- package/dist/canvas/minimapMath.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +34 -0
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/imagePainter.js +87 -0
- package/dist/canvas/nodeShapes/imagePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/memo.js +9 -0
- package/dist/canvas/nodeShapes/memo.js.map +1 -0
- package/dist/canvas/nodeShapes/nodePaint.js +57 -0
- package/dist/canvas/nodeShapes/nodePaint.js.map +1 -0
- package/dist/canvas/nodeShapes/pathPainter.js +38 -0
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/poseBox.js +20 -0
- package/dist/canvas/nodeShapes/poseBox.js.map +1 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +38 -0
- package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -0
- package/dist/canvas/nodeShapes/shapePainter.js +72 -0
- package/dist/canvas/nodeShapes/shapePainter.js.map +1 -0
- package/dist/canvas/nodeShapes/textPainter.js +55 -0
- package/dist/canvas/nodeShapes/textPainter.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/paintCull.js +10 -11
- package/dist/canvas/paintCull.js.map +1 -1
- package/dist/canvas/pickWalk.js +52 -63
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/poseRotation.js +11 -23
- package/dist/canvas/poseRotation.js.map +1 -1
- package/dist/canvas/renderDebugSnapshot.js +5 -5
- package/dist/canvas/renderSceneToPixels.js +3 -1
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +66 -148
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +112 -0
- package/dist/canvas/sceneClipboard.js.map +1 -0
- package/dist/canvas/sceneSlotWiring.js +4 -4
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +39 -40
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/useCanvasRenderer.js +14 -6
- package/dist/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/canvas/useCanvasView.js +58 -0
- package/dist/canvas/useCanvasView.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +35 -26
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useSceneLayerList.js +21 -0
- package/dist/canvas/useSceneLayerList.js.map +1 -0
- package/dist/clipboard.d.ts +10 -6
- package/dist/clone.d.ts +4 -3
- package/dist/core/adapters/arrayAdapter.js +48 -39
- package/dist/core/adapters/arrayAdapter.js.map +1 -1
- package/dist/core/device/index.js +5 -4
- package/dist/core/device/useDeviceProfile.js +38 -44
- package/dist/core/device/useDeviceProfile.js.map +1 -1
- package/dist/core/device/watchDevicePixelRatio.js +17 -0
- package/dist/core/device/watchDevicePixelRatio.js.map +1 -0
- package/dist/core/fillInPoseFrame.js.map +1 -1
- package/dist/core/geometry/poseDescriptor.js +21 -19
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/poseFrame.js +44 -0
- package/dist/core/geometry/poseFrame.js.map +1 -0
- package/dist/core/geometry/poseRotation.js.map +1 -1
- package/dist/core/geometry/regionHit.js +9 -10
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/unionBounds.js +31 -29
- package/dist/core/geometry/unionBounds.js.map +1 -1
- package/dist/core/isPlainObject.js +2 -11
- package/dist/core/ops/arrange.js +1 -0
- package/dist/core/ops/arrange.js.map +1 -1
- package/dist/core/ops/create.js +10 -5
- package/dist/core/ops/create.js.map +1 -1
- package/dist/core/ops/delete.js +12 -24
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/ops/reorder/index.js +43 -40
- package/dist/core/ops/reorder/index.js.map +1 -1
- package/dist/core/ops/reorder/setChildOrder.js +34 -0
- package/dist/core/ops/reorder/setChildOrder.js.map +1 -0
- package/dist/core/paintKinds.js +5 -5
- package/dist/core/paintKinds.js.map +1 -1
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/appliedLog.js +37 -0
- package/dist/core/scene/appliedLog.js.map +1 -0
- package/dist/core/scene/arrivalWindow.js +101 -0
- package/dist/core/scene/arrivalWindow.js.map +1 -0
- package/dist/core/scene/derivedPath.js.map +1 -1
- package/dist/core/scene/historyFacade.js +84 -0
- package/dist/core/scene/historyFacade.js.map +1 -0
- package/dist/core/scene/kitOps.js +173 -0
- package/dist/core/scene/kitOps.js.map +1 -0
- package/dist/core/scene/layerStack.js +38 -0
- package/dist/core/scene/layerStack.js.map +1 -0
- package/dist/core/scene/lockGuard.js +37 -0
- package/dist/core/scene/lockGuard.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +5 -6
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/nodeMemo.js +45 -19
- package/dist/core/scene/nodeMemo.js.map +1 -1
- package/dist/core/scene/nodeStore.js +126 -0
- package/dist/core/scene/nodeStore.js.map +1 -0
- package/dist/core/scene/pickability.js +6 -0
- package/dist/core/scene/pickability.js.map +1 -0
- package/dist/core/scene/poseFeed.js +38 -38
- package/dist/core/scene/poseFeed.js.map +1 -1
- package/dist/core/scene/poseOverrides.js +34 -38
- package/dist/core/scene/poseOverrides.js.map +1 -1
- package/dist/core/scene/renderOrder.js +84 -0
- package/dist/core/scene/renderOrder.js.map +1 -0
- package/dist/core/scene/scene.js +289 -866
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/serialization.js +68 -0
- package/dist/core/scene/serialization.js.map +1 -0
- package/dist/core/scene/treeOrder.js +13 -0
- package/dist/core/scene/treeOrder.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/viewport/meanScale.js +1 -1
- package/dist/core/viewport/meanScale.js.map +1 -1
- package/dist/core/viewport/view.js +12 -12
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/zoomBounds.js +10 -8
- package/dist/core/viewport/zoomBounds.js.map +1 -1
- package/dist/{cornerHandles-BCrDp_mH.d.ts → cornerHandles-CtCb8a3G.d.ts} +1 -1
- package/dist/debug/createDebugOverlayLayer.js +14 -14
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/flag.js +2 -41
- package/dist/features/chrome-caps/useHoverTracking.js +22 -17
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/focus/gateLayer.js +3 -4
- package/dist/features/focus/gateLayer.js.map +1 -1
- package/dist/features/images/imageCache.js +19 -9
- package/dist/features/images/imageCache.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +14 -11
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/ingestion/index.js +1 -1
- package/dist/features/ingestion/registerKitHandlers.js +7 -7
- package/dist/features/ingestion/weaselJsonHandler.js +17 -14
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
- package/dist/features/meshPaint/lazyKind.js +201 -35
- package/dist/features/meshPaint/lazyKind.js.map +1 -1
- package/dist/features/meshPaint/meshPaint.js +82 -79
- package/dist/features/meshPaint/meshPaint.js.map +1 -1
- package/dist/features/minimap/createMinimapContribution.js +42 -42
- package/dist/features/minimap/layers.js +44 -62
- package/dist/features/minimap/layers.js.map +1 -1
- package/dist/features/parallax/createParallaxPlane.js +10 -14
- package/dist/features/parallax/createParallaxPlane.js.map +1 -1
- package/dist/features/paths/anchorEdits.js +19 -8
- package/dist/features/paths/anchorEdits.js.map +1 -1
- package/dist/features/paths/anchors.js +31 -26
- package/dist/features/paths/anchors.js.map +1 -1
- package/dist/features/paths/booleans.js +2 -2
- package/dist/features/paths/index.js +13 -11
- package/dist/features/paths/markerCommands.js +37 -36
- package/dist/features/paths/markerCommands.js.map +1 -1
- package/dist/features/paths/pathInWorld.js +19 -19
- package/dist/features/paths/pathInWorld.js.map +1 -1
- package/dist/features/paths/pathLayer.js.map +1 -1
- package/dist/features/paths/strokeToPath.js +40 -0
- package/dist/features/paths/strokeToPath.js.map +1 -0
- package/dist/features/paths/tessellate/stroke.js.map +1 -1
- package/dist/features/patterns/commandPaint.js +18 -0
- package/dist/features/patterns/commandPaint.js.map +1 -0
- package/dist/features/patterns/index.js +5 -17
- package/dist/features/patterns/index.js.map +1 -1
- package/dist/features/patterns/rasterizeTile.js +17 -0
- package/dist/features/patterns/rasterizeTile.js.map +1 -0
- package/dist/features/patterns/resolveSpec.js +52 -44
- package/dist/features/patterns/resolveSpec.js.map +1 -1
- package/dist/features/poseRun/usePoseRun.js +8 -3
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/selection/SelectionContext.js +5 -0
- package/dist/features/selection/SelectionContext.js.map +1 -1
- package/dist/features/selection/overlay.js +18 -18
- package/dist/features/selection/overlay.js.map +1 -1
- package/dist/features/text/domOffsets.js +82 -0
- package/dist/features/text/domOffsets.js.map +1 -0
- package/dist/features/text/domRuns.js +103 -131
- package/dist/features/text/domRuns.js.map +1 -1
- package/dist/features/text/hitTest.js +5 -2
- package/dist/features/text/hitTest.js.map +1 -1
- package/dist/features/text/isTextData.js +8 -0
- package/dist/features/text/isTextData.js.map +1 -0
- package/dist/features/text/overlayDirection.js +15 -0
- package/dist/features/text/overlayDirection.js.map +1 -0
- package/dist/features/text/runs/rangeStyle.js +32 -34
- package/dist/features/text/runs/rangeStyle.js.map +1 -1
- package/dist/features/text/textCommand.js +34 -33
- package/dist/features/text/textCommand.js.map +1 -1
- package/dist/features/text/textToPath.js +40 -40
- package/dist/features/text/textToPath.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +76 -82
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/text/useTextEdit.js +184 -160
- package/dist/features/text/useTextEdit.js.map +1 -1
- package/dist/features/tiling/createTiledLayer.js +24 -22
- package/dist/features/tiling/createTiledLayer.js.map +1 -1
- package/dist/index.d.ts +11033 -7749
- package/dist/index.js +316 -309
- package/dist/input/keyState.js +42 -43
- package/dist/input/keyState.js.map +1 -1
- package/dist/input/useKeyModifiers.js +11 -0
- package/dist/input/useKeyModifiers.js.map +1 -0
- package/dist/interactions/actions/align/align.js +8 -8
- package/dist/interactions/actions/clipboard/clipboardOps.js +34 -32
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/materializePaste.js +10 -7
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -1
- package/dist/interactions/actions/defaultCommitAdapter.js +20 -18
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
- package/dist/interactions/actions/defaults/align.js +9 -10
- package/dist/interactions/actions/defaults/align.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +59 -81
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/areaSelect.js +35 -38
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/clipboard.js +26 -10
- package/dist/interactions/actions/defaults/clipboard.js.map +1 -1
- package/dist/interactions/actions/defaults/clone.js +44 -60
- package/dist/interactions/actions/defaults/clone.js.map +1 -1
- package/dist/interactions/actions/defaults/copySubtree.js +40 -0
- package/dist/interactions/actions/defaults/copySubtree.js.map +1 -0
- package/dist/interactions/actions/defaults/distribute.js +14 -13
- package/dist/interactions/actions/defaults/distribute.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +17 -57
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/editAnchors.js +18 -18
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/flip.js +52 -46
- package/dist/interactions/actions/defaults/flip.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +43 -48
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +35 -33
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insert.js +50 -51
- package/dist/interactions/actions/defaults/insert.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +7 -7
- package/dist/interactions/actions/defaults/lassoSelect.js +67 -70
- package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/move.js +267 -249
- package/dist/interactions/actions/defaults/move.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +40 -68
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/nudgeSteps.js +37 -0
- package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -0
- package/dist/interactions/actions/defaults/reorder.js +2 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -1
- package/dist/interactions/actions/defaults/resize.js +104 -98
- package/dist/interactions/actions/defaults/resize.js.map +1 -1
- package/dist/interactions/actions/defaults/rotate.js +111 -110
- package/dist/interactions/actions/defaults/rotate.js.map +1 -1
- package/dist/interactions/actions/defaults/setFill.js +7 -7
- package/dist/interactions/actions/defaults/setFillOpacity.js +4 -4
- package/dist/interactions/actions/defaults/setStroke.js +12 -12
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +6 -6
- package/dist/interactions/actions/defaults/sliceOps.js +19 -19
- package/dist/interactions/actions/defaults/viewportDragPan.js +37 -26
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/geometry.js +28 -23
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/flip/helpers.js +30 -17
- package/dist/interactions/actions/flip/helpers.js.map +1 -1
- package/dist/interactions/actions/hitSelection.js +8 -0
- package/dist/interactions/actions/hitSelection.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +14 -18
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +5 -5
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +32 -21
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/gestureAdapter.js +32 -15
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +33 -0
- package/dist/interactions/actions/move/landedDescendants.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +18 -18
- package/dist/interactions/actions/poseDescriptorDep.js +16 -4
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +11 -6
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/previewOverrides.js +5 -5
- package/dist/interactions/actions/previewOverrides.js.map +1 -1
- package/dist/interactions/actions/selectionSubtree.js +69 -0
- package/dist/interactions/actions/selectionSubtree.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +66 -62
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragGesture.js +4 -7
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
- package/dist/interactions/gestures/dragGesture/dragPointOf.js +23 -0
- package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +21 -26
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +8 -6
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +8 -4
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
- package/dist/{math-Drrw4ewZ.d.ts → math-J-ACHyEg.d.ts} +1 -2
- package/dist/math.d.ts +2 -3
- package/dist/move.d.ts +12 -11
- package/dist/{originProjection-DEklpDc_.d.ts → originProjection-gHnOup4e.d.ts} +1 -1
- package/dist/{registerProgram-BMZRDgrh.d.ts → registerProgram-T9S_PfAX.d.ts} +18 -7
- package/dist/renderer/DrawCommand.js.map +1 -1
- package/dist/renderer/WeaselRenderer.js +75 -73
- package/dist/renderer/WeaselRenderer.js.map +1 -1
- package/dist/renderer/cache/GLImageCache.js +15 -5
- package/dist/renderer/cache/GLImageCache.js.map +1 -1
- package/dist/renderer/cache/GLMeshCache.js +23 -23
- package/dist/renderer/cache/GLMeshCache.js.map +1 -1
- package/dist/renderer/cache/GLTextureCache.js +18 -1
- package/dist/renderer/cache/GLTextureCache.js.map +1 -1
- package/dist/renderer/cache/cache.js.map +1 -1
- package/dist/renderer/cache/markerCommandCache.js.map +1 -1
- package/dist/renderer/cache/strokeMeshCache.js.map +1 -1
- package/dist/renderer/cullDrawCommands.js +11 -11
- package/dist/renderer/draw/batch.js +133 -0
- package/dist/renderer/draw/batch.js.map +1 -0
- package/dist/renderer/draw/clip.js +89 -0
- package/dist/renderer/draw/clip.js.map +1 -0
- package/dist/renderer/draw/customShader.js +230 -0
- package/dist/renderer/draw/customShader.js.map +1 -0
- package/dist/renderer/draw/drawTriangles.js +8 -0
- package/dist/renderer/draw/drawTriangles.js.map +1 -0
- package/dist/renderer/draw/effects.js +28 -0
- package/dist/renderer/draw/effects.js.map +1 -0
- package/dist/renderer/draw/flushBatch.js +35 -0
- package/dist/renderer/draw/flushBatch.js.map +1 -0
- package/dist/renderer/draw/gradient.js +90 -0
- package/dist/renderer/draw/gradient.js.map +1 -0
- package/dist/renderer/draw/image.js +38 -0
- package/dist/renderer/draw/image.js.map +1 -0
- package/dist/renderer/draw/mesh.js +16 -0
- package/dist/renderer/draw/mesh.js.map +1 -0
- package/dist/renderer/draw/paintBind.js +70 -0
- package/dist/renderer/draw/paintBind.js.map +1 -0
- package/dist/renderer/draw/pathPaint.js +142 -0
- package/dist/renderer/draw/pathPaint.js.map +1 -0
- package/dist/renderer/draw/scratchPass.js +83 -0
- package/dist/renderer/draw/scratchPass.js.map +1 -0
- package/dist/renderer/draw/stencil.js +28 -0
- package/dist/renderer/draw/stencil.js.map +1 -0
- package/dist/renderer/draw/text.js +167 -0
- package/dist/renderer/draw/text.js.map +1 -0
- package/dist/renderer/draw/uniforms.js +77 -0
- package/dist/renderer/draw/uniforms.js.map +1 -0
- package/dist/renderer/draw.js +60 -1116
- package/dist/renderer/draw.js.map +1 -1
- package/dist/renderer/effects/EffectTargets.js +3 -0
- package/dist/renderer/effects/EffectTargets.js.map +1 -1
- package/dist/renderer/effects/composite.js +7 -5
- package/dist/renderer/effects/composite.js.map +1 -1
- package/dist/renderer/index.js +18 -17
- package/dist/renderer/math/color.js +63 -83
- package/dist/renderer/math/color.js.map +1 -1
- package/dist/renderer/math/mat3.js +15 -11
- package/dist/renderer/math/mat3.js.map +1 -1
- package/dist/renderer/math/viewToMat3.js +1 -1
- package/dist/renderer/math/viewToMat3.js.map +1 -1
- package/dist/renderer/shaders/ShaderProgram.js +13 -13
- package/dist/renderer/shaders/ShaderProgram.js.map +1 -1
- package/dist/renderer/shaders/glyphPaint.js +3 -3
- package/dist/renderer/shaders/glyphPaint.js.map +1 -1
- package/dist/renderer/shaders/gradFill.js +2 -1
- package/dist/renderer/shaders/gradFill.js.map +1 -1
- package/dist/renderer/shaders/pathFill.js +2 -1
- package/dist/renderer/shaders/pathFill.js.map +1 -1
- package/dist/renderer/shaders/patternFill.js +2 -1
- package/dist/renderer/shaders/patternFill.js.map +1 -1
- package/dist/renderer/shaders/registerProgram.js.map +1 -1
- package/dist/renderer/strokeLengths.js.map +1 -1
- package/dist/renderer/textures/registerTexture.js +25 -5
- package/dist/renderer/textures/registerTexture.js.map +1 -1
- package/dist/renderer.d.ts +16 -15
- package/dist/renderer.js +17 -16
- package/dist/resize.d.ts +5 -6
- package/dist/resize.js +5 -5
- package/dist/style.css +1 -1
- package/dist/test-hook/install.js +12 -6
- package/dist/test-hook/install.js.map +1 -1
- package/dist/{test-seams-CuIxe0xY.d.ts → test-seams-DM2B87-g.d.ts} +4 -4
- package/dist/test-seams.d.ts +2 -2
- package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/hand/useHandTool.js +1 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
- package/dist/tools/builtin/lasso/useLassoTool.js +11 -11
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js +1 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +153 -103
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +13 -8
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js +1 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/selectionContributions.js +24 -23
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +51 -48
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/shared/pointerFollower.js +17 -0
- package/dist/tools/builtin/shared/pointerFollower.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +49 -54
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +22 -16
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +1 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/tools/useKeybindings.js +14 -30
- package/dist/tools/useKeybindings.js.map +1 -1
- package/dist/{types-B_9g6hMM.d.ts → types-B4iJRHC3.d.ts} +5 -1
- package/dist/{types-A37hYkeR.d.ts → types-k-5Oqh-U.d.ts} +31 -7
- package/dist/util/color.js +3 -3
- package/dist/util/color.js.map +1 -1
- package/dist/util/paint.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +20 -18
- package/dist/autoPoseDescriptor-vCdt55xm.d.ts +0 -27
- package/dist/builtins-C-VgUlWI.d.ts +0 -4514
- package/dist/core/isPlainObject.js.map +0 -1
- package/dist/debug/flag.js.map +0 -1
- package/dist/interactions/actions/defaults/freshNodeId.js +0 -10
- package/dist/interactions/actions/defaults/freshNodeId.js.map +0 -1
- package/dist/renderer/shaders/imageFill.js +0 -14
- package/dist/renderer/shaders/imageFill.js.map +0 -1
- package/dist/tools/prefs.js +0 -62
- package/dist/tools/prefs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSceneSelectTool.js","names":["snap","snapBehavior","DEFAULT_PICK_TOLERANCE_PX","cameraOf","v","useSceneSelectTool","opts","args","d","AUTO_POSE_DESCRIPTOR","pickEveryProp","geometry","boundsOfProp","shapePicking","pickTolerancePx","moveOptions","snap$1","wiredMoveOptions","useMemo","merged","existing","snap","wiredHitBody","r","wx","wy","asked","view","getView","viewAlpha","alphaOf","viewLayers","layerIsPainted","camera","src","scenePickSource","scene","adapter","id","pointQuery","scale","meanScale","s","tolerance","ink","findShapeInk","n","pose","slop","derived","poseContains","px","py","poseContainsRotated","shapeCoversPoint","pathContainsPoint","clip","p","toPlane","m","pickWalk","getViewRef","useLatest","wiredPlaneOfNode","asNodeId","scenePlaneOf","wiredBoundsOfPose","g","poseDescriptorForNode","b","rot","own","plane","rectFromPlane","wiredBoundsOf","useSelectTool","ids","pickTopMostHit"],"sources":["../../../src/canvas/SceneCanvas/useSceneSelectTool.ts"],"sourcesContent":["/**\n * Scene-aware select-tool synthesis for `<SceneCanvas>`: a `useSelectTool`\n * over the caller's scene adapter, configured with kit-default pickEvery /\n * boundsOf derived from pose shape. Caller-supplied `pickEvery` / `boundsOf`\n * overrides via the `geometry` arg take precedence.\n */\nimport { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { SceneCanvasAdapter } from '../sceneAdapter';\nimport { pickWalk, scenePickSource, scenePlaneOf, type PickQuery, type ViewPickGates } from 'canvas/pickWalk';\nimport { rectFromPlane, toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { pathContainsPoint } from '@weasel-js/geom';\nimport { useSelectTool, type Bounds } from 'tools/builtin/select';\nimport { pickTopMostHit, type PickTopMostHitAdapter } from 'tools/builtin/pickTopMostHit';\nimport type { Node, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { UseMoveOptions } from 'interactions/actions/move/options';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type { SnapStrategy } from 'interactions/gestures/types';\nimport { snap as snapBehavior } from 'interactions/gestures/shared/snap';\nimport { poseDescriptorForNode, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport { poseContains, poseContainsRotated } from './poseGeometry';\nimport { shapeCoversPoint, findShapeInk } from 'canvas/NodeShape';\nimport { meanScale } from 'core/viewport/meanScale';\n\n/**\n * Default grab slop around a shape's outline, in screen pixels.\n *\n * Four is the same number the path-pose stroke test has always used, and it's\n * the difference between a hairline being clickable and not: a 1px stroke is\n * half a world unit of reach at scale 1, which no pointing device can hit\n * reliably. It also lets a filled shape be grabbed a few pixels outside its\n * edge, which is what makes edge-adjacent dragging feel possible.\n */\nexport const DEFAULT_PICK_TOLERANCE_PX = 4;\n\n/** The view a pick is asked for. A world point carries neither the scale it\n * was produced under nor what that view paints, so a caller picking for a\n * view other than the surface's says both. A gate left out is the one this\n * hook was built with. */\nexport interface PickView extends ViewPickGates {\n scale: { x: number; y: number };\n /** The rest of the asking camera. Supplied, it lets a parallax layer be\n * picked through its plane; left out, every layer is taken to move with\n * the camera. */\n x?: number;\n y?: number;\n}\n\n/** A pick view that names a whole camera, or null. */\nfunction cameraOf(v: Pick<PickView, 'scale' | 'x' | 'y'> | null): View | null {\n return v && typeof v.x === 'number' && typeof v.y === 'number'\n ? { x: v.x, y: v.y, scale: v.scale }\n : null;\n}\n\nexport interface UseSceneSelectToolArgs<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** The adapter the select tool drives, built over `scene` with the same\n * `poseDescriptor`. Its world poses are what picking and bounds read. */\n adapter: SceneCanvasAdapter<TData, TLayer, TPose>;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n geometry?: {\n pickEvery?: (worldX: number, worldY: number) => string | string[] | null;\n boundsOf?: (id: string) => Bounds | null;\n /** How the default body-pick decides a node covers the pointer. Defaults\n * to `'shape'`; `'pose'` opts back down to the bare pose rect. See\n * `SceneCanvasProps.geometry.picking`. Ignored when `pickEvery` is\n * supplied — that override owns the whole test. */\n picking?: 'pose' | 'shape';\n /** Grab slop around a shape's outline, in screen pixels. See\n * `SceneCanvasProps.geometry.pickTolerancePx`. */\n pickTolerancePx?: number;\n };\n /** The surface's camera, for converting the screen-pixel pick tolerance into\n * world units. A caller picking for another view passes that view's camera\n * to `pickEvery` / `pickBest` instead. Omitted in tests and non-viewport\n * hosts, where scale is 1. */\n getView?: () => Pick<PickView, 'scale' | 'x' | 'y'> | null;\n /** The asking view's painted alpha per node — its `alphaFor` times any\n * per-node override alpha. A node the view paints at alpha 0 is not on\n * screen, so picking must not answer for it. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\".\n * `layerVisibility` and `layerOrder` both gate a layer out of the paint\n * (`drawLayers` drops any layer missing from a supplied order), and an\n * undrawn layer must not claim clicks. */\n layerIsPainted?: (layer: string) => boolean;\n selectTool?: {\n move?: UseMoveOptions<TPose>;\n resize?: UseResizeOptions<TPose>;\n snap?: SnapStrategy<TPose>;\n /** Override the body-pick used on click/pointerdown. Alt-aware: receives\n * the live alt state + current selection so consumers can implement\n * alt-cycling through an overlapping stack. Default: top-most hit\n * (alt ignored). Forwarded verbatim to `useSelectTool`. */\n pickBest?: (worldX: number, worldY: number, alt: boolean, sel: readonly string[]) => string | null;\n /** Forwarded verbatim to `useSelectTool`. See\n * `UseSelectToolOptions.extendClickLocked`. */\n extendClickLocked?: () => boolean;\n };\n}\n\nexport interface UseSceneSelectToolReturn<TData, TLayer extends string, TPose> {\n selectTool: ReturnType<typeof useSelectTool<Node<TData, TLayer, TPose>, TPose>>;\n /** Hit-test resolved with the caller's `geometry.pickEvery` (or the\n * pose-walk default). Forward this to `<Canvas pickEvery={...}>` so the\n * dispatcher's `getNodeAtPoint` returns the same node the select tool\n * picked — drag routes keyed on `target.kind` then resolve to `'*'`\n * (move) instead of `'empty'` (marquee). */\n pickEvery: (worldX: number, worldY: number, view?: PickView | null) => string[];\n /** Single-best hit under the world point, or null. Runs `pickEvery` then\n * collapses parent/child overlap via `pickTopMostHit` — matches the id\n * the select tool's pointerdown classifier would settle on for a bare\n * click. Exposed so debug HUDs can highlight the would-be selection. */\n pickBest: (worldX: number, worldY: number, view?: PickView | null) => string | null;\n /** World-space AABB of `id`, or null. Same as what the selection overlay +\n * affordance hit-test need. Exposed so SceneCanvas can pass it to the\n * `affordanceAt` thunk without re-deriving it. `view` is the camera the\n * box is drawn under — a plane node sits somewhere else in each — and\n * defaults to the surface's. */\n boundsOf: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** How `view`'s world (the surface's camera by default) maps into the plane\n * `id` is drawn through, or null when its layer moves with the camera. */\n planeOfNode: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) => PlaneMap | null;\n /** `boundsOf` for `id` drawn at `pose` rather than its own — how chrome\n * boxes an in-flight preview. Ignores a `geometry.boundsOf` override, which\n * answers only for a node's own pose. */\n boundsOfPose: (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** `selectTool.move` with `selectTool.snap` folded into its behaviors — what\n * the `move` preset's bindings carry. */\n moveOptions: UseMoveOptions<TPose>;\n}\n\nexport function useSceneSelectTool<TData, TLayer extends string, TPose>(\n args: UseSceneSelectToolArgs<TData, TLayer, TPose>,\n): UseSceneSelectToolReturn<TData, TLayer, TPose> {\n const { scene, adapter, geometry, selectTool: opts, getView, alphaOf, layerIsPainted } = args;\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const pickEveryProp = geometry?.pickEvery;\n const boundsOfProp = geometry?.boundsOf;\n // Default. The pose rect is the wrong answer for anything that isn't a\n // rectangle, so `'pose'` is the opt-out rather than the baseline. Cheap to\n // leave on: the rect pre-filter runs first and rejects every node the\n // pointer isn't over, and the survivors' silhouettes are memoized per node.\n const shapePicking = (geometry?.picking ?? 'shape') === 'shape';\n const pickTolerancePx = geometry?.pickTolerancePx ?? DEFAULT_PICK_TOLERANCE_PX;\n const moveOptions = opts?.move;\n const snap = opts?.snap;\n\n const wiredMoveOptions = useMemo<UseMoveOptions<TPose>>(() => {\n const merged: UseMoveOptions<TPose> = { ...(moveOptions ?? {}) };\n if (snap) {\n const existing = merged.behaviors ?? [];\n merged.behaviors = [snapBehavior(snap), ...existing];\n }\n return merged;\n }, [moveOptions, snap]);\n\n // Default pickEvery: walk renderOrder() forward (back-to-front) and collect\n // every node whose pose contains the world point. Order matches the\n // `useSelectTool` contract — last element is the topmost — so `pickTopMostHit`\n // picks correctly. Wraps the caller's `pickEvery` (string-or-null) into the\n // array form `useSelectTool` expects. `poseContainsRotated` reads\n // `pose.rotation` directly (the kit's one rotation convention), so rotated\n // shapes pick against their rendered, rotated body without a per-demo override.\n const wiredHitBody = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string[] => {\n if (pickEveryProp) {\n const r = pickEveryProp(wx, wy);\n if (r == null) return [];\n return Array.isArray(r) ? r : [r];\n }\n const asked = view ?? getView?.() ?? null;\n const viewAlpha = view?.alphaOf ?? alphaOf;\n const viewLayers = view?.layerIsPainted ?? layerIsPainted;\n const camera = cameraOf(asked);\n // Through the adapter, not `n.pose`: an ephemeral override is the pose\n // the renderer draws, so it has to be the one picking tests. World, not\n // local, for the same reason — a framed child is drawn in its parent's\n // frame, not where its own pose says.\n const src = scenePickSource<TData, TLayer, TPose>(scene, {\n getPose: (id) => adapter.getWorldPose(id),\n ...(viewAlpha ? { alphaOf: viewAlpha } : {}),\n ...(viewLayers ? { layerIsPainted: viewLayers } : {}),\n ...(camera ? { camera } : {}),\n });\n // `s` makes the slop a screen distance, so the grab zone stays the same\n // apparent thickness at any zoom and on every axis. A `{ px }` stroke's\n // reach is on screen too, and joins the slop there.\n const pointQuery = (px: number, py: number, s: { x: number; y: number }): PickQuery<TPose> => {\n const scale = meanScale(s);\n const tolerance = { px: pickTolerancePx, scale: s };\n return {\n hits: (n, pose, derived) => {\n // The pre-filter has to be at least as generous as the refinement\n // that follows it, or it rejects points the refinement would have\n // claimed. A stroke reaches past the pose box by `outset` — a whole\n // stroke width for an outer align — on top of the pointer slop.\n const ink = shapePicking ? findShapeInk(n as never, pose, { scale }) : null;\n // A derived node's pose is a placeholder — typically zero-sized at\n // the origin — so its own box rejects every point the path covers.\n // The path is the region to test instead, and `poseContains` already\n // reads a path-like pose as one.\n const slop = { ...tolerance, px: tolerance.px + (ink?.outsetPx ?? 0), reach: ink?.outset ?? 0 };\n const admitted = derived\n ? poseContains(derived as never, px, py, slop, d as PoseDescriptor<unknown>)\n : poseContainsRotated(pose, px, py, slop, d as PoseDescriptor<unknown>);\n if (!admitted) return false;\n // `shapeCoversPoint` narrows the rect to the ink the painter actually\n // lays down (and answers `true` for painters that have no silhouette,\n // so nothing becomes unpickable).\n return !shapePicking\n || shapeCoversPoint(n as never, pose, px, py, {\n tolerance, scale, derivedPath: derived,\n });\n },\n clipAdmits: (clip) => pathContainsPoint(clip, px, py),\n inPlane: (m) => {\n const p = toPlane(m, { x: px, y: py });\n return pointQuery(p.x, p.y, { x: s.x / m.scale.x, y: s.y / m.scale.y });\n },\n };\n };\n return pickWalk<TPose>(src, pointQuery(wx, wy, asked?.scale ?? { x: 1, y: 1 }));\n };\n }, [scene, adapter, pickEveryProp, shapePicking, pickTolerancePx, getView,\n alphaOf, layerIsPainted, d]);\n\n // Read through a ref: this is the chrome's bounds source, and a caller's\n // inline `getView` would otherwise rebuild it, and everything keyed on it,\n // every render.\n const getViewRef = useLatest(getView);\n const wiredPlaneOfNode = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): PlaneMap | null => {\n const n = scene.get(asNodeId(id));\n const camera = cameraOf(view ?? getViewRef.current?.() ?? null);\n if (!n || !camera) return null;\n return scenePlaneOf(scene.layers, camera)?.(n.layer) ?? null;\n };\n }, [scene, getViewRef]);\n\n const wiredBoundsOfPose = useMemo(() => {\n return (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n const n = scene.get(asNodeId(id));\n if (!n) return null;\n const g = poseDescriptorForNode(d, n);\n const b = g.getBounds(pose);\n const rot = g.getRotation?.(pose) ?? (b as { rotation?: number }).rotation ?? 0;\n const own = rot ? { ...b, rotation: rot } : b;\n // A plane node is drawn where its plane puts it, and the chrome has to\n // follow it there.\n const plane = wiredPlaneOfNode(id, view);\n return plane ? rectFromPlane(plane, own) : own;\n };\n }, [scene, d, wiredPlaneOfNode]);\n\n const wiredBoundsOf = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n if (boundsOfProp) return boundsOfProp(id);\n if (!scene.get(asNodeId(id))) return null;\n // World, not local: a framed child is drawn in its parent's frame, and\n // the chrome has to land on the ink.\n return wiredBoundsOfPose(id, adapter.getWorldPose(id), view);\n };\n }, [scene, adapter, boundsOfProp, wiredBoundsOfPose]);\n\n const selectTool = useSelectTool<Node<TData, TLayer, TPose>, TPose>(adapter, {\n pickEvery: wiredHitBody,\n ...(opts?.pickBest ? { pickBest: opts.pickBest } : {}),\n ...(opts?.extendClickLocked ? { extendClickLocked: opts.extendClickLocked } : {}),\n });\n\n\n const wiredPickBest = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string | null => {\n const ids = wiredHitBody(wx, wy, view);\n return pickTopMostHit(ids, adapter as unknown as PickTopMostHitAdapter);\n };\n }, [wiredHitBody, adapter]);\n\n return {\n selectTool,\n pickEvery: wiredHitBody,\n pickBest: wiredPickBest,\n boundsOf: wiredBoundsOf,\n boundsOfPose: wiredBoundsOfPose,\n planeOfNode: wiredPlaneOfNode,\n moveOptions: wiredMoveOptions,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSceneSelectTool.js","names":["snap","snapBehavior","DEFAULT_PICK_TOLERANCE_PX","cameraOf","v","useSceneSelectTool","opts","args","d","AUTO_POSE_DESCRIPTOR","pickEveryProp","geometry","boundsOfProp","shapePicking","pickTolerancePx","moveOptions","snap$1","wiredMoveOptions","useMemo","merged","existing","snap","wiredHitBody","r","wx","wy","asked","view","getView","viewAlpha","alphaOf","viewLayers","layerIsPainted","camera","src","scenePickSource","scene","adapter","id","pointQuery","scale","meanScale","s","tolerance","ink","findShapeInk","n","pose","slop","derived","poseContains","px","py","poseContainsRotated","shapeCoversPoint","pathContainsPoint","clip","p","toPlane","m","pickWalk","getViewRef","useLatest","wiredPlaneOfNode","asNodeId","scenePlaneOf","wiredBoundsOfPose","g","poseDescriptorForNode","b","rot","own","plane","rectFromPlane","wiredBoundsOf","useSelectTool","ids","pickTopMostHit"],"sources":["../../../src/canvas/SceneCanvas/useSceneSelectTool.ts"],"sourcesContent":["/**\n * Scene-aware select-tool synthesis for `<SceneCanvas>`: a `useSelectTool`\n * over the caller's scene adapter, configured with kit-default pickEvery /\n * boundsOf derived from pose shape. Caller-supplied `pickEvery` / `boundsOf`\n * overrides via the `geometry` arg take precedence.\n */\nimport { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { SceneCanvasAdapter } from '../sceneAdapter';\nimport { pickWalk, scenePickSource, scenePlaneOf, type PickQuery, type ViewPickGates } from 'canvas/pickWalk';\nimport { rectFromPlane, toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { pathContainsPoint } from '@weasel-js/geom';\nimport { useSelectTool, type Bounds } from 'tools/builtin/select';\nimport { pickTopMostHit, type PickTopMostHitAdapter } from 'tools/builtin/pickTopMostHit';\nimport type { Node, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { UseMoveOptions } from 'interactions/actions/move/options';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type { SnapStrategy } from 'interactions/gestures/types';\nimport { snap as snapBehavior } from 'interactions/gestures/shared/snap';\nimport { poseDescriptorForNode, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport { poseContains, poseContainsRotated } from './poseGeometry';\nimport { shapeCoversPoint, findShapeInk } from 'canvas/NodeShape';\nimport { meanScale } from 'core/viewport/meanScale';\n\n/**\n * Default grab slop around a shape's outline, in screen pixels.\n *\n * Four is the same number the path-pose stroke test has always used, and it's\n * the difference between a hairline being clickable and not: a 1px stroke is\n * half a world unit of reach at scale 1, which no pointing device can hit\n * reliably. It also lets a filled shape be grabbed a few pixels outside its\n * edge, which is what makes edge-adjacent dragging feel possible.\n */\nexport const DEFAULT_PICK_TOLERANCE_PX = 4;\n\n/** The view a pick is asked for. A world point carries neither the scale it\n * was produced under nor what that view paints, so a caller picking for a\n * view other than the surface's says both. A gate left out is the one this\n * hook was built with. */\nexport interface PickView extends ViewPickGates {\n scale: { x: number; y: number };\n /** The rest of the asking camera. Supplied, it lets a parallax layer be\n * picked through its plane; left out, every layer is taken to move with\n * the camera. */\n x?: number;\n y?: number;\n}\n\n/** A pick view that names a whole camera, or null. */\nfunction cameraOf(v: Pick<PickView, 'scale' | 'x' | 'y'> | null): View | null {\n return v && typeof v.x === 'number' && typeof v.y === 'number'\n ? { x: v.x, y: v.y, scale: v.scale }\n : null;\n}\n\nexport interface UseSceneSelectToolArgs<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** The adapter the select tool drives, built over `scene` with the same\n * `poseDescriptor`. Its world poses are what picking and bounds read. */\n adapter: SceneCanvasAdapter<TData, TLayer, TPose>;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n geometry?: {\n pickEvery?: (worldX: number, worldY: number) => string | string[] | null;\n boundsOf?: (id: string) => Bounds | null;\n /** How the default body-pick decides a node covers the pointer. Defaults\n * to `'shape'`; `'pose'` opts back down to the bare pose rect. See\n * `SceneCanvasProps.geometry.picking`. Ignored when `pickEvery` is\n * supplied — that override owns the whole test. */\n picking?: 'pose' | 'shape';\n /** Grab slop around a shape's outline, in screen pixels. See\n * `SceneCanvasProps.geometry.pickTolerancePx`. */\n pickTolerancePx?: number;\n };\n /** The surface's camera, for converting the screen-pixel pick tolerance into\n * world units. A caller picking for another view passes that view's camera\n * to `pickEvery` / `pickBest` instead. Omitted in tests and non-viewport\n * hosts, where scale is 1. */\n getView?: () => Pick<PickView, 'scale' | 'x' | 'y'> | null;\n /** The asking view's painted alpha per node — its `alphaFor` times any\n * per-node override alpha. A node the view paints at alpha 0 is not on\n * screen, so picking must not answer for it. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\".\n * `layerVisibility` and `layerOrder` both gate a layer out of the paint\n * (`drawLayers` drops any layer missing from a supplied order), and an\n * undrawn layer must not claim clicks. */\n layerIsPainted?: (layer: string) => boolean;\n selectTool?: {\n move?: UseMoveOptions<TPose>;\n resize?: UseResizeOptions<TPose>;\n snap?: SnapStrategy<TPose>;\n /** Override the body-pick used on click/pointerdown. Alt-aware: receives\n * the live alt state + current selection so consumers can implement\n * alt-cycling through an overlapping stack. Default: top-most hit\n * (alt ignored). Forwarded verbatim to `useSelectTool`. */\n pickBest?: (worldX: number, worldY: number, alt: boolean, sel: readonly string[]) => string | null;\n /** Forwarded verbatim to `useSelectTool`. See\n * `UseSelectToolOptions.extendClickLocked`. */\n extendClickLocked?: () => boolean;\n };\n}\n\nexport interface UseSceneSelectToolReturn<TData, TLayer extends string, TPose> {\n selectTool: ReturnType<typeof useSelectTool<Node<TData, TLayer, TPose>, TPose>>;\n /** Every id under the world point, back-to-front (topmost last), from the\n * caller's `geometry.pickEvery` or the pose-walk default. */\n pickEvery: (worldX: number, worldY: number, view?: PickView | null) => string[];\n /** Single-best hit under the world point, or null. Runs `pickEvery` then\n * collapses parent/child overlap via `pickTopMostHit` — matches the id\n * the select tool's pointerdown classifier would settle on for a bare\n * click. The canvas's `getNodeAtPoint` resolves through it. */\n pickBest: (worldX: number, worldY: number, view?: PickView | null) => string | null;\n /** World-space AABB of `id`, or null. Same as what the selection overlay +\n * affordance hit-test need. Exposed so SceneCanvas can pass it to the\n * `affordanceAt` thunk without re-deriving it. `view` is the camera the\n * box is drawn under — a plane node sits somewhere else in each — and\n * defaults to the surface's. */\n boundsOf: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** How `view`'s world (the surface's camera by default) maps into the plane\n * `id` is drawn through, or null when its layer moves with the camera. */\n planeOfNode: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) => PlaneMap | null;\n /** `boundsOf` for `id` drawn at `pose` rather than its own — how chrome\n * boxes an in-flight preview. Ignores a `geometry.boundsOf` override, which\n * answers only for a node's own pose. */\n boundsOfPose: (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** `selectTool.move` with `selectTool.snap` folded into its behaviors — what\n * the `move` preset's bindings carry. */\n moveOptions: UseMoveOptions<TPose>;\n}\n\nexport function useSceneSelectTool<TData, TLayer extends string, TPose>(\n args: UseSceneSelectToolArgs<TData, TLayer, TPose>,\n): UseSceneSelectToolReturn<TData, TLayer, TPose> {\n const { scene, adapter, geometry, selectTool: opts, getView, alphaOf, layerIsPainted } = args;\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const pickEveryProp = geometry?.pickEvery;\n const boundsOfProp = geometry?.boundsOf;\n // Default. The pose rect is the wrong answer for anything that isn't a\n // rectangle, so `'pose'` is the opt-out rather than the baseline. Cheap to\n // leave on: the rect pre-filter runs first and rejects every node the\n // pointer isn't over, and the survivors' silhouettes are memoized per node.\n const shapePicking = (geometry?.picking ?? 'shape') === 'shape';\n const pickTolerancePx = geometry?.pickTolerancePx ?? DEFAULT_PICK_TOLERANCE_PX;\n const moveOptions = opts?.move;\n const snap = opts?.snap;\n\n const wiredMoveOptions = useMemo<UseMoveOptions<TPose>>(() => {\n const merged: UseMoveOptions<TPose> = { ...(moveOptions ?? {}) };\n if (snap) {\n const existing = merged.behaviors ?? [];\n merged.behaviors = [snapBehavior(snap), ...existing];\n }\n return merged;\n }, [moveOptions, snap]);\n\n // Default pickEvery: walk renderOrder() forward (back-to-front) and collect\n // every node whose pose contains the world point. Order matches the\n // `useSelectTool` contract — last element is the topmost — so `pickTopMostHit`\n // picks correctly. Wraps the caller's `pickEvery` (string-or-null) into the\n // array form `useSelectTool` expects. `poseContainsRotated` reads\n // `pose.rotation` directly (the kit's one rotation convention), so rotated\n // shapes pick against their rendered, rotated body without a per-demo override.\n const wiredHitBody = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string[] => {\n if (pickEveryProp) {\n const r = pickEveryProp(wx, wy);\n if (r == null) return [];\n return Array.isArray(r) ? r : [r];\n }\n const asked = view ?? getView?.() ?? null;\n const viewAlpha = view?.alphaOf ?? alphaOf;\n const viewLayers = view?.layerIsPainted ?? layerIsPainted;\n const camera = cameraOf(asked);\n // Through the adapter, not `n.pose`: an ephemeral override is the pose\n // the renderer draws, so it has to be the one picking tests. World, not\n // local, for the same reason — a framed child is drawn in its parent's\n // frame, not where its own pose says.\n const src = scenePickSource<TData, TLayer, TPose>(scene, {\n getPose: (id) => adapter.getWorldPose(id),\n ...(viewAlpha ? { alphaOf: viewAlpha } : {}),\n ...(viewLayers ? { layerIsPainted: viewLayers } : {}),\n ...(camera ? { camera } : {}),\n });\n // `s` makes the slop a screen distance, so the grab zone stays the same\n // apparent thickness at any zoom and on every axis. A `{ px }` stroke's\n // reach is on screen too, and joins the slop there.\n const pointQuery = (px: number, py: number, s: { x: number; y: number }): PickQuery<TPose> => {\n const scale = meanScale(s);\n const tolerance = { px: pickTolerancePx, scale: s };\n return {\n hits: (n, pose, derived) => {\n // The pre-filter has to be at least as generous as the refinement\n // that follows it, or it rejects points the refinement would have\n // claimed. A stroke reaches past the pose box by `outset` — a whole\n // stroke width for an outer align — on top of the pointer slop.\n const ink = shapePicking ? findShapeInk(n as never, pose, { scale }) : null;\n // A derived node's pose is a placeholder — typically zero-sized at\n // the origin — so its own box rejects every point the path covers.\n // The path is the region to test instead, and `poseContains` already\n // reads a path-like pose as one.\n const slop = { ...tolerance, px: tolerance.px + (ink?.outsetPx ?? 0), reach: ink?.outset ?? 0 };\n const admitted = derived\n ? poseContains(derived as never, px, py, slop, d as PoseDescriptor<unknown>)\n : poseContainsRotated(pose, px, py, slop, d as PoseDescriptor<unknown>);\n if (!admitted) return false;\n // `shapeCoversPoint` narrows the rect to the ink the painter actually\n // lays down (and answers `true` for painters that have no silhouette,\n // so nothing becomes unpickable).\n return !shapePicking\n || shapeCoversPoint(n as never, pose, px, py, {\n tolerance, scale, derivedPath: derived,\n });\n },\n clipAdmits: (clip) => pathContainsPoint(clip, px, py),\n inPlane: (m) => {\n const p = toPlane(m, { x: px, y: py });\n return pointQuery(p.x, p.y, { x: s.x / m.scale.x, y: s.y / m.scale.y });\n },\n };\n };\n return pickWalk<TPose>(src, pointQuery(wx, wy, asked?.scale ?? { x: 1, y: 1 }));\n };\n }, [scene, adapter, pickEveryProp, shapePicking, pickTolerancePx, getView,\n alphaOf, layerIsPainted, d]);\n\n // Read through a ref: this is the chrome's bounds source, and a caller's\n // inline `getView` would otherwise rebuild it, and everything keyed on it,\n // every render.\n const getViewRef = useLatest(getView);\n const wiredPlaneOfNode = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): PlaneMap | null => {\n const n = scene.get(asNodeId(id));\n const camera = cameraOf(view ?? getViewRef.current?.() ?? null);\n if (!n || !camera) return null;\n return scenePlaneOf(scene.layers, camera)?.(n.layer) ?? null;\n };\n }, [scene, getViewRef]);\n\n const wiredBoundsOfPose = useMemo(() => {\n return (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n const n = scene.get(asNodeId(id));\n if (!n) return null;\n const g = poseDescriptorForNode(d, n);\n const b = g.getBounds(pose);\n const rot = g.getRotation?.(pose) ?? (b as { rotation?: number }).rotation ?? 0;\n const own = rot ? { ...b, rotation: rot } : b;\n // A plane node is drawn where its plane puts it, and the chrome has to\n // follow it there.\n const plane = wiredPlaneOfNode(id, view);\n return plane ? rectFromPlane(plane, own) : own;\n };\n }, [scene, d, wiredPlaneOfNode]);\n\n const wiredBoundsOf = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n if (boundsOfProp) return boundsOfProp(id);\n if (!scene.get(asNodeId(id))) return null;\n // World, not local: a framed child is drawn in its parent's frame, and\n // the chrome has to land on the ink.\n return wiredBoundsOfPose(id, adapter.getWorldPose(id), view);\n };\n }, [scene, adapter, boundsOfProp, wiredBoundsOfPose]);\n\n const selectTool = useSelectTool<Node<TData, TLayer, TPose>, TPose>(adapter, {\n pickEvery: wiredHitBody,\n ...(opts?.pickBest ? { pickBest: opts.pickBest } : {}),\n ...(opts?.extendClickLocked ? { extendClickLocked: opts.extendClickLocked } : {}),\n });\n\n\n const wiredPickBest = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string | null => {\n const ids = wiredHitBody(wx, wy, view);\n return pickTopMostHit(ids, adapter as unknown as PickTopMostHitAdapter);\n };\n }, [wiredHitBody, adapter]);\n\n return {\n selectTool,\n pickEvery: wiredHitBody,\n pickBest: wiredPickBest,\n boundsOf: wiredBoundsOf,\n boundsOfPose: wiredBoundsOfPose,\n planeOfNode: wiredPlaneOfNode,\n moveOptions: wiredMoveOptions,\n };\n}\n"],"mappings":"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"}
|