@weasel-js/core 1.13.0-rc.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +408 -0
- package/README.md +8 -12
- package/dist/affordances/hitAffordanceRegions.js +1 -1
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/animation/clipTargets.js +1 -1
- package/dist/animation/clipTargets.js.map +1 -1
- package/dist/animation/poseTarget.js +5 -32
- package/dist/animation/poseTarget.js.map +1 -1
- package/dist/{autoPoseDescriptor-CZ1eXbzY.d.ts → autoPoseDescriptor-C25QVb0W.d.ts} +1 -1
- package/dist/barrel/canvas.js +8 -8
- package/dist/barrel/chrome.js +9 -9
- package/dist/barrel/input.js +1 -1
- package/dist/barrel/interactions.js +3 -3
- package/dist/barrel/paint.js +2 -2
- package/dist/barrel/paths.js +19 -17
- package/dist/barrel/renderer.js +11 -7
- package/dist/barrel/routing.js +4 -1
- package/dist/barrel/scene.js +16 -12
- package/dist/barrel/text.js +5 -5
- package/dist/barrel/viewport.js +8 -8
- package/dist/canvas/Canvas.js +2 -2
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +20 -14
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/GestureReason.js +64 -0
- package/dist/canvas/GestureReason.js.map +1 -0
- package/dist/canvas/GestureReason.module.js +7 -0
- package/dist/canvas/GestureReason.module.js.map +1 -0
- package/dist/canvas/LeanSceneCanvas.js +3 -1
- package/dist/canvas/LeanSceneCanvas.js.map +1 -1
- package/dist/canvas/NodeShape.js +2 -0
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js +7 -3
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/CanvasKitProviders.js +1 -1
- package/dist/canvas/SceneCanvas/CanvasKitProviders.js.map +1 -1
- package/dist/canvas/SceneCanvas/DevHuds.js +2 -2
- package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -1
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +4 -2
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js +3 -1
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
- package/dist/canvas/SceneCanvas/brushOverlay.js.map +1 -1
- package/dist/canvas/SceneCanvas/builtinToolSets.js +17 -9
- package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -1
- package/dist/canvas/SceneCanvas/canvasPassThrough.js +2 -1
- package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +75 -19
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +7 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultTextEditor.js +108 -0
- package/dist/canvas/SceneCanvas/defaultTextEditor.js.map +1 -0
- package/dist/canvas/SceneCanvas/describePresets.js +47 -0
- package/dist/canvas/SceneCanvas/describePresets.js.map +1 -0
- package/dist/canvas/SceneCanvas/features.js +57 -16
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/mergeLayers.js +10 -1
- package/dist/canvas/SceneCanvas/mergeLayers.js.map +1 -1
- package/dist/canvas/SceneCanvas/namedPresets.js +52 -24
- package/dist/canvas/SceneCanvas/namedPresets.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/arrange.js +35 -10
- package/dist/canvas/SceneCanvas/presets/arrange.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/baseline.js +9 -0
- package/dist/canvas/SceneCanvas/presets/baseline.js.map +1 -0
- package/dist/canvas/SceneCanvas/presets/chrome.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/composites.js +43 -0
- package/dist/canvas/SceneCanvas/presets/composites.js.map +1 -0
- package/dist/canvas/SceneCanvas/presets/edit.js +79 -26
- package/dist/canvas/SceneCanvas/presets/edit.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/ingest.js +1 -0
- package/dist/canvas/SceneCanvas/presets/ingest.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/paths.js +58 -16
- package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/select.js +4 -2
- package/dist/canvas/SceneCanvas/presets/select.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/tools.js +24 -0
- package/dist/canvas/SceneCanvas/presets/tools.js.map +1 -0
- package/dist/canvas/SceneCanvas/presets/transform.js +4 -0
- package/dist/canvas/SceneCanvas/presets/transform.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/view.js +3 -1
- package/dist/canvas/SceneCanvas/presets/view.js.map +1 -1
- package/dist/canvas/SceneCanvas/props.js.map +1 -1
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +1 -1
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/toolRegistry.js +5 -4
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasTools.js +26 -10
- package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useContributionRoles.js +17 -2
- package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +5 -4
- package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +1 -1
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +9 -8
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +2 -2
- package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +4 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneChrome.js +7 -4
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +9 -9
- package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
- package/dist/canvas/SceneCanvas/useScenePicking.js +4 -7
- package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +2 -1
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +6 -6
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js +2 -2
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +1 -1
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js.map +1 -1
- package/dist/canvas/SceneCanvas/useToolKeybindings.js +2 -2
- package/dist/canvas/SceneCanvas/useToolKeybindings.js.map +1 -1
- package/dist/canvas/SceneCanvas/useViewportActions.js +5 -2
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
- package/dist/canvas/SceneCanvas.js +22 -11
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +1 -0
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/ViewMarker.js.map +1 -1
- package/dist/canvas/accentColor.js +14 -1
- package/dist/canvas/accentColor.js.map +1 -1
- package/dist/canvas/affordanceAt.js +2 -2
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +1 -1
- package/dist/canvas/buildSceneLayer.js.map +1 -1
- package/dist/canvas/buildSceneTree.js +5 -3
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +6 -2
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/deps/editAnchors.js +4 -4
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/enteredGroup.js +14 -5
- package/dist/canvas/deps/enteredGroup.js.map +1 -1
- package/dist/canvas/deps/ingestion.js +5 -1
- package/dist/canvas/deps/ingestion.js.map +1 -1
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/insertSite.js +5 -3
- package/dist/canvas/deps/insertSite.js.map +1 -1
- package/dist/canvas/deps/nodeAtPoint.js +1 -12
- package/dist/canvas/deps/nodeAtPoint.js.map +1 -1
- package/dist/canvas/deps/pathEditCommits.js +3 -3
- package/dist/canvas/deps/pathEditCommits.js.map +1 -1
- package/dist/canvas/deps/slice.js +16 -2
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/snap.js +5 -5
- package/dist/canvas/deps/snap.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +5 -6
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/derivedPath.js +8 -3
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +2 -2
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/insertPreviewExtent.js.map +1 -1
- package/dist/canvas/layerSlots.js.map +1 -1
- package/dist/canvas/nodeShapes/measurePainter.js +1 -1
- package/dist/canvas/nodeShapes/measurePainter.js.map +1 -1
- package/dist/canvas/nodeShapes/strokedBounds.js +5 -3
- package/dist/canvas/nodeShapes/strokedBounds.js.map +1 -1
- package/dist/canvas/overlayRoleStrokes.js +6 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/pickIndex/scenePickIndex.js +10 -12
- package/dist/canvas/pickIndex/scenePickIndex.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +10 -19
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +17 -4
- package/dist/canvas/sceneClipboard.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +7 -5
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/surfaceContribution.js.map +1 -1
- package/dist/canvas/useCanvasPaint.js +12 -4
- package/dist/canvas/useCanvasPaint.js.map +1 -1
- package/dist/canvas/useHitObserver.js +1 -1
- package/dist/canvas/useHitObserver.js.map +1 -1
- package/dist/canvas/useViewAim.js +1 -1
- package/dist/canvas/useViewAim.js.map +1 -1
- package/dist/canvas/useViewHelpers.js +8 -5
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/canvas/useViewNesting.js +39 -12
- package/dist/canvas/useViewNesting.js.map +1 -1
- package/dist/canvas/viewInputs.js.map +1 -1
- package/dist/canvas/viewMarkers.js +2 -2
- package/dist/canvas/viewMarkers.js.map +1 -1
- package/dist/canvas/viewRegistry.js +2 -2
- package/dist/canvas/viewRegistry.js.map +1 -1
- package/dist/canvas/viewSnap.js +67 -0
- package/dist/canvas/viewSnap.js.map +1 -0
- package/dist/clipboard.d.ts +6 -12
- package/dist/{clone-qb2e1F5p.d.ts → clone-Bz4iqGfE.d.ts} +10 -5
- package/dist/clone.d.ts +5 -5
- package/dist/core/geometry/booleanOfPaths.js +23 -0
- package/dist/core/geometry/booleanOfPaths.js.map +1 -0
- package/dist/core/geometry/pathPoseDescriptor.js +12 -9
- package/dist/core/geometry/pathPoseDescriptor.js.map +1 -1
- package/dist/core/geometry/poseDescriptor.js +12 -3
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/targetFrame.js +2 -13
- package/dist/core/geometry/targetFrame.js.map +1 -1
- package/dist/core/layers/render.js +2 -1
- package/dist/core/layers/render.js.map +1 -1
- package/dist/core/layers/retain.js +5 -3
- package/dist/core/layers/retain.js.map +1 -1
- package/dist/core/ops/setPath.js +3 -0
- package/dist/core/ops/setPath.js.map +1 -1
- package/dist/core/paint/meshKindLazy.js.map +1 -1
- package/dist/core/paint/paintKindEntry.js.map +1 -1
- package/dist/core/paint/paintKinds.js +8 -1
- package/dist/core/paint/paintKinds.js.map +1 -1
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/NodeRouting.js.map +1 -1
- package/dist/core/scene/booleanGroup.js +33 -0
- package/dist/core/scene/booleanGroup.js.map +1 -0
- package/dist/core/scene/booleanOfChildren.js +53 -0
- package/dist/core/scene/booleanOfChildren.js.map +1 -0
- package/dist/core/scene/carryDescendants.js +18 -6
- package/dist/core/scene/carryDescendants.js.map +1 -1
- package/dist/core/scene/composeFrame.js +42 -5
- package/dist/core/scene/composeFrame.js.map +1 -1
- package/dist/core/scene/composePose.js +35 -16
- package/dist/core/scene/composePose.js.map +1 -1
- package/dist/core/scene/depMemo.js +36 -18
- package/dist/core/scene/depMemo.js.map +1 -1
- package/dist/core/scene/derivedParts.js +2 -23
- package/dist/core/scene/derivedParts.js.map +1 -1
- package/dist/core/scene/effectivePose.js +10 -0
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/historyForm.js +5 -4
- package/dist/core/scene/historyForm.js.map +1 -1
- package/dist/core/scene/kitOps.js +5 -71
- package/dist/core/scene/kitOps.js.map +1 -1
- package/dist/core/scene/kitRegistry.js +5 -0
- package/dist/core/scene/kitRegistry.js.map +1 -1
- package/dist/core/scene/layerOps.js +82 -0
- package/dist/core/scene/layerOps.js.map +1 -0
- package/dist/core/scene/layoutPass.js +14 -12
- package/dist/core/scene/layoutPass.js.map +1 -1
- package/dist/core/scene/lockGuard.js +9 -3
- package/dist/core/scene/lockGuard.js.map +1 -1
- package/dist/core/scene/nestedHit.js +5 -5
- package/dist/core/scene/nestedHit.js.map +1 -1
- package/dist/core/scene/nodeFlags.js +8 -2
- package/dist/core/scene/nodeFlags.js.map +1 -1
- package/dist/core/scene/nodeGates.js +31 -2
- package/dist/core/scene/nodeGates.js.map +1 -1
- package/dist/core/scene/pathEffects/effects.js +22 -3
- package/dist/core/scene/pathEffects/effects.js.map +1 -1
- package/dist/core/scene/pathEffects/textAlong.js +16 -3
- package/dist/core/scene/pathEffects/textAlong.js.map +1 -1
- package/dist/core/scene/pathEffects/textAlongBands.js +65 -0
- package/dist/core/scene/pathEffects/textAlongBands.js.map +1 -0
- package/dist/core/scene/reconcileSpecs.js +1 -1
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/scene.js +11 -5
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneEdits.js +5 -2
- package/dist/core/scene/sceneEdits.js.map +1 -1
- package/dist/core/scene/scenePoseAdapter.js +10 -1
- package/dist/core/scene/scenePoseAdapter.js.map +1 -1
- package/dist/core/scene/scrollOffsets.js +93 -0
- package/dist/core/scene/scrollOffsets.js.map +1 -0
- package/dist/core/scene/serialization.js +15 -5
- package/dist/core/scene/serialization.js.map +1 -1
- package/dist/core/scene/statedFields.js +2 -1
- package/dist/core/scene/statedFields.js.map +1 -1
- package/dist/core/scene/strategyView.js +35 -0
- package/dist/core/scene/strategyView.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/scene/useScene.js +2 -0
- package/dist/core/scene/useScene.js.map +1 -1
- package/dist/core/scene/worldSave.js +87 -0
- package/dist/core/scene/worldSave.js.map +1 -0
- package/dist/core/selection/selectionTarget.js +1 -1
- package/dist/core/selection/selectionTarget.js.map +1 -1
- package/dist/{cornerHandles-CNCb7aTY.d.ts → cornerHandles-DpmQM_z5.d.ts} +1 -1
- package/dist/{depSchema-B1RS-IJx.d.ts → depSchema-C3BwxitB.d.ts} +130 -104
- package/dist/devtools-protocol.d.ts +2 -2
- package/dist/devtools.d.ts +2 -2
- package/dist/{features → domains}/chrome-caps/buildChromeCtx.js +1 -1
- package/dist/domains/chrome-caps/buildChromeCtx.js.map +1 -0
- package/dist/{features → domains}/chrome-caps/conditions.js +1 -1
- package/dist/domains/chrome-caps/conditions.js.map +1 -0
- package/dist/{features → domains}/chrome-caps/defaults.js +1 -1
- package/dist/domains/chrome-caps/defaults.js.map +1 -0
- package/dist/{features → domains}/chrome-caps/resolve.js +1 -1
- package/dist/domains/chrome-caps/resolve.js.map +1 -0
- package/dist/{features → domains}/chrome-caps/useChromeCaps.js +1 -1
- package/dist/domains/chrome-caps/useChromeCaps.js.map +1 -0
- package/dist/{features → domains}/chrome-caps/useHoverTracking.js +1 -1
- package/dist/domains/chrome-caps/useHoverTracking.js.map +1 -0
- package/dist/{features → domains}/ingestion/contentHandlers.js +20 -3
- package/dist/domains/ingestion/contentHandlers.js.map +1 -0
- package/dist/domains/ingestion/ghost.js +56 -0
- package/dist/domains/ingestion/ghost.js.map +1 -0
- package/dist/{features → domains}/ingestion/imageHandler.js +1 -1
- package/dist/domains/ingestion/imageHandler.js.map +1 -0
- package/dist/domains/ingestion/kitHandlers.js +22 -0
- package/dist/domains/ingestion/kitHandlers.js.map +1 -0
- package/dist/{features → domains}/ingestion/openFilePicker.js +1 -1
- package/dist/domains/ingestion/openFilePicker.js.map +1 -0
- package/dist/{features → domains}/ingestion/placement.js +1 -1
- package/dist/domains/ingestion/placement.js.map +1 -0
- package/dist/{features → domains}/ingestion/svgHandler.js +1 -1
- package/dist/domains/ingestion/svgHandler.js.map +1 -0
- package/dist/{features → domains}/ingestion/textHandler.js +9 -7
- package/dist/domains/ingestion/textHandler.js.map +1 -0
- package/dist/{features → domains}/ingestion/useCanvasIngestion.js +13 -15
- package/dist/domains/ingestion/useCanvasIngestion.js.map +1 -0
- package/dist/{features → domains}/ingestion/weaselJsonHandler.js +1 -1
- package/dist/domains/ingestion/weaselJsonHandler.js.map +1 -0
- package/dist/{features → domains}/longPress/longPressFeedback.js +1 -1
- package/dist/domains/longPress/longPressFeedback.js.map +1 -0
- package/dist/{features → domains}/measure/actionIds.js +1 -1
- package/dist/domains/measure/actionIds.js.map +1 -0
- package/dist/{features → domains}/measure/measureCommands.js +1 -1
- package/dist/domains/measure/measureCommands.js.map +1 -0
- package/dist/{features → domains}/measure/measureContribution.js +1 -1
- package/dist/domains/measure/measureContribution.js.map +1 -0
- package/dist/{features → domains}/measure/measureEdits.js +1 -1
- package/dist/domains/measure/measureEdits.js.map +1 -0
- package/dist/{features → domains}/measure/measureGestures.js +4 -7
- package/dist/domains/measure/measureGestures.js.map +1 -0
- package/dist/{features → domains}/measure/measureHit.js +1 -1
- package/dist/domains/measure/measureHit.js.map +1 -0
- package/dist/{features → domains}/measure/measureLayer.js +1 -1
- package/dist/domains/measure/measureLayer.js.map +1 -0
- package/dist/{features → domains}/measure/measurement.js +1 -1
- package/dist/domains/measure/measurement.js.map +1 -0
- package/dist/{features → domains}/measure/measurements.js +2 -2
- package/dist/domains/measure/measurements.js.map +1 -0
- package/dist/{features → domains}/modes/modeLayers.js +1 -1
- package/dist/domains/modes/modeLayers.js.map +1 -0
- package/dist/{features → domains}/modes/modeTriggers.js +3 -6
- package/dist/domains/modes/modeTriggers.js.map +1 -0
- package/dist/{features → domains}/pathEffects/effectSources.js +1 -1
- package/dist/domains/pathEffects/effectSources.js.map +1 -0
- package/dist/{features → domains}/pathEffects/index.js +1 -1
- package/dist/domains/pathEffects/index.js.map +1 -0
- package/dist/{features → domains}/pathEffects/readSource.js +1 -1
- package/dist/domains/pathEffects/readSource.js.map +1 -0
- package/dist/{features → domains}/pathEffects/textItems.js +11 -2
- package/dist/domains/pathEffects/textItems.js.map +1 -0
- package/dist/{features → domains}/pathEffects/useEffectSourcesLayer.js +1 -1
- package/dist/domains/pathEffects/useEffectSourcesLayer.js.map +1 -0
- package/dist/{features → domains}/paths/anchorData.js +1 -1
- package/dist/domains/paths/anchorData.js.map +1 -0
- package/dist/{features → domains}/paths/anchorMarkers.js +9 -7
- package/dist/domains/paths/anchorMarkers.js.map +1 -0
- package/dist/{features → domains}/paths/editablePath.js +1 -1
- package/dist/domains/paths/editablePath.js.map +1 -0
- package/dist/{features → domains}/paths/index.js +3 -3
- package/dist/{features → domains}/paths/originProjection.js +1 -1
- package/dist/domains/paths/originProjection.js.map +1 -0
- package/dist/{features → domains}/paths/pathEditExtension.js +1 -1
- package/dist/domains/paths/pathEditExtension.js.map +1 -0
- package/dist/{features → domains}/paths/pathEditState.js +1 -1
- package/dist/domains/paths/pathEditState.js.map +1 -0
- package/dist/{features → domains}/paths/pathEditingOverlayLayer.js +1 -1
- package/dist/domains/paths/pathEditingOverlayLayer.js.map +1 -0
- package/dist/{features → domains}/paths/pathLayer.js +1 -1
- package/dist/domains/paths/pathLayer.js.map +1 -0
- package/dist/{features → domains}/paths/pathRepresentation.js +1 -1
- package/dist/domains/paths/pathRepresentation.js.map +1 -0
- package/dist/{features → domains}/paths/pathSnap/glyphs.js +1 -1
- package/dist/domains/paths/pathSnap/glyphs.js.map +1 -0
- package/dist/{features → domains}/paths/pathSnap/pathSnapSource.js +1 -1
- package/dist/domains/paths/pathSnap/pathSnapSource.js.map +1 -0
- package/dist/{features → domains}/paths/pathSnap/sceneIndex.js +1 -1
- package/dist/domains/paths/pathSnap/sceneIndex.js.map +1 -0
- package/dist/{features → domains}/paths/pathSnap/snapGeometry.js +3 -2
- package/dist/domains/paths/pathSnap/snapGeometry.js.map +1 -0
- package/dist/{features → domains}/paths/penPreviewLayer.js +1 -1
- package/dist/domains/paths/penPreviewLayer.js.map +1 -0
- package/dist/{features → domains}/paths/shapeGenerator.js +6 -4
- package/dist/domains/paths/shapeGenerator.js.map +1 -0
- package/dist/{features → domains}/paths/strokeOutline.js +1 -1
- package/dist/domains/paths/strokeOutline.js.map +1 -0
- package/dist/{features → domains}/paths/useAnchorFields.js +1 -1
- package/dist/domains/paths/useAnchorFields.js.map +1 -0
- package/dist/{features → domains}/paths/usePathEdit.js +1 -1
- package/dist/domains/paths/usePathEdit.js.map +1 -0
- package/dist/{features → domains}/poseRun/usePoseRun.js +1 -1
- package/dist/domains/poseRun/usePoseRun.js.map +1 -0
- package/dist/{features → domains}/selection/enteredGroupFrame.js +49 -10
- package/dist/domains/selection/enteredGroupFrame.js.map +1 -0
- package/dist/{features → domains}/selection/enteredGroupScope.js +1 -1
- package/dist/domains/selection/enteredGroupScope.js.map +1 -0
- package/dist/domains/selection/enteredOperands.js +29 -0
- package/dist/domains/selection/enteredOperands.js.map +1 -0
- package/dist/{features → domains}/selection/handleCommands.js +1 -1
- package/dist/domains/selection/handleCommands.js.map +1 -0
- package/dist/{features → domains}/selection/overlay.js +1 -1
- package/dist/domains/selection/overlay.js.map +1 -0
- package/dist/{features → domains}/selection/selectionPose.js +1 -1
- package/dist/domains/selection/selectionPose.js.map +1 -0
- package/dist/{features → domains}/snap/angle2d.js +1 -1
- package/dist/domains/snap/angle2d.js.map +1 -0
- package/dist/{features → domains}/snap/debugCandidates.js +1 -1
- package/dist/domains/snap/debugCandidates.js.map +1 -0
- package/dist/{features → domains}/snap/gather.js +1 -1
- package/dist/domains/snap/gather.js.map +1 -0
- package/dist/{features → domains}/snap/inputSubspace.js +1 -1
- package/dist/domains/snap/inputSubspace.js.map +1 -0
- package/dist/{features → domains}/snap/lazySession.js +1 -1
- package/dist/domains/snap/lazySession.js.map +1 -0
- package/dist/{features → domains}/snap/marks.js +1 -1
- package/dist/domains/snap/marks.js.map +1 -0
- package/dist/{features → domains}/snap/outcomeStore.js +1 -1
- package/dist/domains/snap/outcomeStore.js.map +1 -0
- package/dist/{features → domains}/snap/pointSnap.js +1 -1
- package/dist/domains/snap/pointSnap.js.map +1 -0
- package/dist/{features → domains}/snap/probes2d.js +1 -1
- package/dist/domains/snap/probes2d.js.map +1 -0
- package/dist/{features → domains}/snap/readoutDraw.js +1 -1
- package/dist/domains/snap/readoutDraw.js.map +1 -0
- package/dist/{features → domains}/snap/readoutLayer.js +1 -1
- package/dist/domains/snap/readoutLayer.js.map +1 -0
- package/dist/{features → domains}/snap/registry.js +1 -1
- package/dist/domains/snap/registry.js.map +1 -0
- package/dist/{features → domains}/snap/resizeBox.js +1 -1
- package/dist/domains/snap/resizeBox.js.map +1 -0
- package/dist/{features → domains}/snap/roles.js +1 -1
- package/dist/domains/snap/roles.js.map +1 -0
- package/dist/{features → domains}/snap/rotationSource.js +1 -1
- package/dist/domains/snap/rotationSource.js.map +1 -0
- package/dist/{features → domains}/snap/sceneReads.js +24 -3
- package/dist/domains/snap/sceneReads.js.map +1 -0
- package/dist/{features → domains}/snap/sceneSession2d.js +3 -2
- package/dist/domains/snap/sceneSession2d.js.map +1 -0
- package/dist/{features → domains}/snap/screen.js +1 -1
- package/dist/domains/snap/screen.js.map +1 -0
- package/dist/{features → domains}/snap/session2d.js +3 -2
- package/dist/domains/snap/session2d.js.map +1 -0
- package/dist/{features → domains}/snap/spanSnap.js +1 -1
- package/dist/domains/snap/spanSnap.js.map +1 -0
- package/dist/{features → domains}/snap/stepAngles.js +1 -1
- package/dist/domains/snap/stepAngles.js.map +1 -0
- package/dist/{features → domains}/text/editingDrawOne.js +4 -4
- package/dist/domains/text/editingDrawOne.js.map +1 -0
- package/dist/domains/text/hostTextEditors.js +24 -0
- package/dist/domains/text/hostTextEditors.js.map +1 -0
- package/dist/{features → domains}/text/index.js +1 -1
- package/dist/{features → domains}/text/sceneTextDrafts.js +1 -1
- package/dist/domains/text/sceneTextDrafts.js.map +1 -0
- package/dist/{features → domains}/text/textHitAt.js +18 -2
- package/dist/domains/text/textHitAt.js.map +1 -0
- package/dist/{features → domains}/text/textLayer.js +1 -1
- package/dist/domains/text/textLayer.js.map +1 -0
- package/dist/{features → domains}/text/useSceneTextEdit.js +11 -3
- package/dist/domains/text/useSceneTextEdit.js.map +1 -0
- package/dist/{features → domains}/viewports/aim.js +1 -1
- package/dist/domains/viewports/aim.js.map +1 -0
- package/dist/{features → domains}/viewports/viewMarker.js +23 -5
- package/dist/domains/viewports/viewMarker.js.map +1 -0
- package/dist/{features → domains}/viewports/viewMarkerDrag.js +3 -3
- package/dist/domains/viewports/viewMarkerDrag.js.map +1 -0
- package/dist/{features → domains}/viewports/viewResolver.js +1 -1
- package/dist/domains/viewports/viewResolver.js.map +1 -0
- package/dist/{features → domains}/viewports/viewportLayer.js +3 -2
- package/dist/domains/viewports/viewportLayer.js.map +1 -0
- package/dist/icons.table.js +1 -1
- package/dist/icons.table.js.map +1 -1
- package/dist/icons.table.json +106 -6
- package/dist/index.d.ts +1445 -1053
- package/dist/index.js +90 -77
- package/dist/interactions/actions/admitsChild.js +6 -2
- package/dist/interactions/actions/admitsChild.js.map +1 -1
- package/dist/interactions/actions/align/align.js +1 -4
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/booleanGroupAction.js +66 -0
- package/dist/interactions/actions/booleans/booleanGroupAction.js.map +1 -0
- package/dist/interactions/actions/booleans/keymap.js +52 -0
- package/dist/interactions/actions/booleans/keymap.js.map +1 -0
- package/dist/interactions/actions/booleans/operands.js +1 -1
- package/dist/interactions/actions/booleans/pieces.js +4 -11
- package/dist/interactions/actions/booleans/pieces.js.map +1 -1
- package/dist/interactions/actions/clipboard/action.js +3 -7
- package/dist/interactions/actions/clipboard/action.js.map +1 -1
- package/dist/interactions/actions/clipboard/clipboardOps.js +1 -1
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +6 -6
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
- package/dist/interactions/actions/defaults/containerScroll.js +170 -0
- package/dist/interactions/actions/defaults/containerScroll.js.map +1 -0
- package/dist/interactions/actions/defaults/contextMenu.js +2 -5
- package/dist/interactions/actions/defaults/contextMenu.js.map +1 -1
- package/dist/interactions/actions/defaults/delete.js +1 -1
- package/dist/interactions/actions/defaults/delete.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +1 -3
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterGroup.js +7 -12
- package/dist/interactions/actions/defaults/enterGroup.js.map +1 -1
- package/dist/interactions/actions/defaults/enterPathEdit.js +4 -8
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +12 -24
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +18 -10
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +3 -3
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudgeSteps.js +3 -21
- package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
- package/dist/interactions/actions/defaults/pathEditMarks.js.map +1 -1
- package/dist/interactions/actions/defaults/selectDeep.js +2 -2
- package/dist/interactions/actions/defaults/selectDeep.js.map +1 -1
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/dropVerdict.js +9 -0
- package/dist/interactions/actions/dropVerdict.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/action.js +2 -2
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/extensionDrags.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/geometry.js +8 -6
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/handleDrag.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/preview.js +1 -1
- package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
- package/dist/interactions/actions/flip/action.js +3 -2
- package/dist/interactions/actions/flip/action.js.map +1 -1
- package/dist/interactions/actions/geometryProjection.js +8 -3
- package/dist/interactions/actions/geometryProjection.js.map +1 -1
- package/dist/interactions/actions/gestureFrames.js +1 -0
- package/dist/interactions/actions/gestureFrames.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +6 -2
- package/dist/interactions/actions/insert/action.js.map +1 -1
- package/dist/interactions/actions/insert/frame.js +1 -1
- package/dist/interactions/actions/insert/frame.js.map +1 -1
- package/dist/interactions/actions/insert/placeAction.js +6 -8
- package/dist/interactions/actions/insert/placeAction.js.map +1 -1
- package/dist/interactions/actions/insert/session.js +2 -2
- package/dist/interactions/actions/insert/session.js.map +1 -1
- package/dist/interactions/actions/move/action.js +6 -15
- package/dist/interactions/actions/move/action.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +12 -2
- package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +29 -10
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -1
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +42 -6
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +4 -8
- package/dist/interactions/actions/move/capture.js.map +1 -1
- package/dist/interactions/actions/move/commit/index.js.map +1 -1
- package/dist/interactions/actions/move/commit/layoutDrop.js +4 -3
- package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -1
- package/dist/interactions/actions/move/commit/layoutRelease.js +15 -9
- package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -1
- package/dist/interactions/actions/move/commit/reparent.js +19 -13
- package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
- package/dist/interactions/actions/move/delta.js +51 -5
- package/dist/interactions/actions/move/delta.js.map +1 -1
- package/dist/interactions/actions/move/frame.js +8 -4
- package/dist/interactions/actions/move/frame.js.map +1 -1
- package/dist/interactions/actions/move/layout/container.js +19 -9
- package/dist/interactions/actions/move/layout/container.js.map +1 -1
- package/dist/interactions/actions/move/layout/dragged.js +2 -2
- package/dist/interactions/actions/move/layout/dragged.js.map +1 -1
- package/dist/interactions/actions/move/layout/dropPass.js +36 -18
- package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
- package/dist/interactions/actions/move/layout/exits.js +2 -2
- package/dist/interactions/actions/move/layout/exits.js.map +1 -1
- package/dist/interactions/actions/move/layout/glide.js +5 -5
- package/dist/interactions/actions/move/layout/glide.js.map +1 -1
- package/dist/interactions/actions/move/layout/view.js +55 -0
- package/dist/interactions/actions/move/layout/view.js.map +1 -0
- package/dist/interactions/actions/move/refusal.js +52 -0
- package/dist/interactions/actions/move/refusal.js.map +1 -0
- package/dist/interactions/actions/move/session.js +9 -8
- package/dist/interactions/actions/move/session.js.map +1 -1
- package/dist/interactions/actions/move/translate.js +10 -4
- package/dist/interactions/actions/move/translate.js.map +1 -1
- package/dist/interactions/actions/moveNodes.js +21 -5
- package/dist/interactions/actions/moveNodes.js.map +1 -1
- package/dist/interactions/actions/pathCommands/pathNodes.js +3 -3
- package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -1
- package/dist/interactions/actions/planeInput.js +14 -13
- package/dist/interactions/actions/planeInput.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +21 -8
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/resize/action.js +1 -1
- package/dist/interactions/actions/resize/action.js.map +1 -1
- package/dist/interactions/actions/resize/aspect.js +1 -1
- package/dist/interactions/actions/resize/aspect.js.map +1 -1
- package/dist/interactions/actions/resize/commit.js +10 -1
- package/dist/interactions/actions/resize/commit.js.map +1 -1
- package/dist/interactions/actions/resize/frame.js +3 -2
- package/dist/interactions/actions/resize/frame.js.map +1 -1
- package/dist/interactions/actions/resize/held.js +44 -0
- package/dist/interactions/actions/resize/held.js.map +1 -0
- package/dist/interactions/actions/resize/session.js +3 -1
- package/dist/interactions/actions/resize/session.js.map +1 -1
- package/dist/interactions/actions/resolveOverlays.js +9 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -1
- package/dist/interactions/actions/resolvePreviews.js +23 -7
- package/dist/interactions/actions/resolvePreviews.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +1 -1
- package/dist/interactions/actions/rotate/action.js.map +1 -1
- package/dist/interactions/actions/rotate/frame.js +1 -1
- package/dist/interactions/actions/rotate/frame.js.map +1 -1
- package/dist/interactions/actions/rotate/session.js +2 -2
- package/dist/interactions/actions/rotate/session.js.map +1 -1
- package/dist/interactions/actions/selectionSubtree.js +2 -4
- package/dist/interactions/actions/selectionSubtree.js.map +1 -1
- package/dist/interactions/actions/spatialReference.js +4 -9
- package/dist/interactions/actions/spatialReference.js.map +1 -1
- package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -1
- package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -1
- package/dist/kitSettingsSchema.js +2 -2
- package/dist/kitSettingsSchema.js.map +1 -1
- package/dist/{math-C_elShP_.d.ts → math-B_unOnF4.d.ts} +2 -2
- package/dist/math.d.ts +3 -3
- package/dist/move.d.ts +6 -6
- package/dist/{options-ClEm3SEl.d.ts → options-DAjkhbcs.d.ts} +5 -5
- package/dist/{poseDescriptor-DN2yfnq_.d.ts → poseDescriptor-CvSxVhCd.d.ts} +17 -4
- package/dist/resize.d.ts +6 -6
- package/dist/style.css +14 -0
- package/dist/test-seams.d.ts +11 -15
- package/dist/test-seams.js +1 -1
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js +3 -6
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/measure/useMeasureTool.js +2 -2
- package/dist/tools/builtin/measure/useMeasureTool.js.map +1 -1
- package/dist/tools/builtin/pen/penHandle.js +2 -2
- package/dist/tools/builtin/pen/penHandle.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +13 -19
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/select/groupEntry.js +1 -1
- package/dist/tools/builtin/select/groupEntry.js.map +1 -1
- package/dist/tools/builtin/select/selectionContributions.js +1 -1
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +7 -7
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/slice/useSliceTool.js +5 -8
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js +1 -1
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/{types-49uYJN3j.d.ts → types-A_sNJYRd.d.ts} +8 -0
- package/dist/{types-BEdRIhNc.d.ts → types-DW14eu9B.d.ts} +131 -36
- package/dist/{types-p2alu-R1.d.ts → types-VCtfchp-.d.ts} +4 -6
- package/dist/util/color.js +12 -14
- package/dist/util/color.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +25 -24
- package/dist/canvas/poseCascade.js +0 -65
- package/dist/canvas/poseCascade.js.map +0 -1
- package/dist/features/chrome-caps/buildChromeCtx.js.map +0 -1
- package/dist/features/chrome-caps/conditions.js.map +0 -1
- package/dist/features/chrome-caps/defaults.js.map +0 -1
- package/dist/features/chrome-caps/resolve.js.map +0 -1
- package/dist/features/chrome-caps/useChromeCaps.js.map +0 -1
- package/dist/features/chrome-caps/useHoverTracking.js.map +0 -1
- package/dist/features/ingestion/contentHandlers.js.map +0 -1
- package/dist/features/ingestion/imageHandler.js.map +0 -1
- package/dist/features/ingestion/openFilePicker.js.map +0 -1
- package/dist/features/ingestion/placement.js.map +0 -1
- package/dist/features/ingestion/registerKitHandlers.js +0 -43
- package/dist/features/ingestion/registerKitHandlers.js.map +0 -1
- package/dist/features/ingestion/svgHandler.js.map +0 -1
- package/dist/features/ingestion/textHandler.js.map +0 -1
- package/dist/features/ingestion/useCanvasIngestion.js.map +0 -1
- package/dist/features/ingestion/weaselJsonHandler.js.map +0 -1
- package/dist/features/longPress/longPressFeedback.js.map +0 -1
- package/dist/features/measure/actionIds.js.map +0 -1
- package/dist/features/measure/measureCommands.js.map +0 -1
- package/dist/features/measure/measureContribution.js.map +0 -1
- package/dist/features/measure/measureEdits.js.map +0 -1
- package/dist/features/measure/measureGestures.js.map +0 -1
- package/dist/features/measure/measureHit.js.map +0 -1
- package/dist/features/measure/measureLayer.js.map +0 -1
- package/dist/features/measure/measurement.js.map +0 -1
- package/dist/features/measure/measurements.js.map +0 -1
- package/dist/features/modes/modeLayers.js.map +0 -1
- package/dist/features/modes/modeTriggers.js.map +0 -1
- package/dist/features/pathEffects/effectSources.js.map +0 -1
- package/dist/features/pathEffects/index.js.map +0 -1
- package/dist/features/pathEffects/readSource.js.map +0 -1
- package/dist/features/pathEffects/textItems.js.map +0 -1
- package/dist/features/pathEffects/useEffectSourcesLayer.js.map +0 -1
- package/dist/features/paths/anchorData.js.map +0 -1
- package/dist/features/paths/anchorMarkers.js.map +0 -1
- package/dist/features/paths/editablePath.js.map +0 -1
- package/dist/features/paths/originProjection.js.map +0 -1
- package/dist/features/paths/pathEditExtension.js.map +0 -1
- package/dist/features/paths/pathEditState.js.map +0 -1
- package/dist/features/paths/pathEditingOverlayLayer.js.map +0 -1
- package/dist/features/paths/pathLayer.js.map +0 -1
- package/dist/features/paths/pathRepresentation.js.map +0 -1
- package/dist/features/paths/pathSnap/glyphs.js.map +0 -1
- package/dist/features/paths/pathSnap/pathSnapSource.js.map +0 -1
- package/dist/features/paths/pathSnap/sceneIndex.js.map +0 -1
- package/dist/features/paths/pathSnap/snapGeometry.js.map +0 -1
- package/dist/features/paths/penPreviewLayer.js.map +0 -1
- package/dist/features/paths/shapeGenerator.js.map +0 -1
- package/dist/features/paths/strokeOutline.js.map +0 -1
- package/dist/features/paths/useAnchorFields.js.map +0 -1
- package/dist/features/paths/usePathEdit.js.map +0 -1
- package/dist/features/poseRun/usePoseRun.js.map +0 -1
- package/dist/features/selection/enteredGroupFrame.js.map +0 -1
- package/dist/features/selection/enteredGroupScope.js.map +0 -1
- package/dist/features/selection/handleCommands.js.map +0 -1
- package/dist/features/selection/overlay.js.map +0 -1
- package/dist/features/selection/selectionPose.js.map +0 -1
- package/dist/features/snap/angle2d.js.map +0 -1
- package/dist/features/snap/debugCandidates.js.map +0 -1
- package/dist/features/snap/gather.js.map +0 -1
- package/dist/features/snap/inputSubspace.js.map +0 -1
- package/dist/features/snap/lazySession.js.map +0 -1
- package/dist/features/snap/marks.js.map +0 -1
- package/dist/features/snap/outcomeStore.js.map +0 -1
- package/dist/features/snap/pointSnap.js.map +0 -1
- package/dist/features/snap/probes2d.js.map +0 -1
- package/dist/features/snap/readoutDraw.js.map +0 -1
- package/dist/features/snap/readoutLayer.js.map +0 -1
- package/dist/features/snap/registry.js.map +0 -1
- package/dist/features/snap/resizeBox.js.map +0 -1
- package/dist/features/snap/roles.js.map +0 -1
- package/dist/features/snap/rotationSource.js.map +0 -1
- package/dist/features/snap/sceneReads.js.map +0 -1
- package/dist/features/snap/sceneSession2d.js.map +0 -1
- package/dist/features/snap/screen.js.map +0 -1
- package/dist/features/snap/session2d.js.map +0 -1
- package/dist/features/snap/spanSnap.js.map +0 -1
- package/dist/features/snap/stepAngles.js.map +0 -1
- package/dist/features/text/editingDrawOne.js.map +0 -1
- package/dist/features/text/sceneTextDrafts.js.map +0 -1
- package/dist/features/text/textHitAt.js.map +0 -1
- package/dist/features/text/textLayer.js.map +0 -1
- package/dist/features/text/useSceneTextEdit.js.map +0 -1
- package/dist/features/viewports/aim.js.map +0 -1
- package/dist/features/viewports/viewMarker.js.map +0 -1
- package/dist/features/viewports/viewMarkerDrag.js.map +0 -1
- package/dist/features/viewports/viewResolver.js.map +0 -1
- package/dist/features/viewports/viewportLayer.js.map +0 -1
- /package/dist/{features → domains}/chrome-caps/index.js +0 -0
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { composeWorldPose, composesFrames } from "../../core/scene/composeFrame.js";
|
|
2
|
+
import { definesFrame, effectivePose } from "../../core/scene/effectivePose.js";
|
|
3
|
+
import { viewPoseAdapter } from "../../core/scene/scrollOffsets.js";
|
|
2
4
|
import { asNodeId } from "../../core/scene/types.js";
|
|
3
5
|
|
|
4
6
|
//#region src/interactions/actions/resolvePreviews.ts
|
|
@@ -14,6 +16,9 @@ function firstNonNull(sources, id, read) {
|
|
|
14
16
|
* The previewing subtrees, as roots. A previewed node whose parent is also
|
|
15
17
|
* previewing is a child of that parent's entry rather than a root of its own,
|
|
16
18
|
* which is what lets a caller draw a container and its contents as one thing.
|
|
19
|
+
* A previewed container whose pose is a frame brings every child it carries,
|
|
20
|
+
* previewed or not. A source previews a pose in the frame the node is stored
|
|
21
|
+
* in; each entry's pose is in world.
|
|
17
22
|
*
|
|
18
23
|
* An id with no node is skipped: an insert previews before the node it will
|
|
19
24
|
* create exists.
|
|
@@ -33,23 +38,34 @@ function resolvePreviews(sources, scene) {
|
|
|
33
38
|
if (!settled) continue;
|
|
34
39
|
for (const id of settled) opaque.add(id);
|
|
35
40
|
}
|
|
36
|
-
const
|
|
41
|
+
const composition = scene.composition;
|
|
42
|
+
const framed = composesFrames(composition);
|
|
43
|
+
const shown = viewPoseAdapter(scene, {
|
|
44
|
+
getPose: (id) => firstNonNull(list, id, (s, i) => s.previewPose?.(i)) ?? effectivePose(scene, scene.get(asNodeId(id))),
|
|
45
|
+
getParent: (id) => scene.get(asNodeId(id))?.parent ?? null,
|
|
46
|
+
definesFrame: (id) => {
|
|
47
|
+
const node = scene.get(asNodeId(id));
|
|
48
|
+
return node === void 0 || definesFrame(node);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const build = (id, carriedOpaque = false, riding = false) => {
|
|
37
52
|
const node = scene.get(asNodeId(id));
|
|
38
53
|
if (!node) return null;
|
|
39
|
-
const pose = firstNonNull(list, id, (s, i) => s.previewPose?.(i));
|
|
40
54
|
const data = firstNonNull(list, id, (s, i) => s.previewData?.(i));
|
|
55
|
+
const isOpaque = carriedOpaque || opaque.has(id);
|
|
56
|
+
const carries = framed && (definesFrame(node) || riding);
|
|
41
57
|
const children = [];
|
|
42
58
|
for (const childId of scene.childrenOf(asNodeId(id))) {
|
|
43
|
-
if (!ids.has(childId)) continue;
|
|
44
|
-
const child = build(childId);
|
|
59
|
+
if (!ids.has(childId) && !carries) continue;
|
|
60
|
+
const child = build(childId, isOpaque && !ids.has(childId), carries);
|
|
45
61
|
if (child) children.push(child);
|
|
46
62
|
}
|
|
47
63
|
return {
|
|
48
64
|
id: asNodeId(id),
|
|
49
65
|
node,
|
|
50
|
-
pose:
|
|
66
|
+
pose: composeWorldPose(shown, id, composition.compose),
|
|
51
67
|
data: data ?? node.data,
|
|
52
|
-
opaque:
|
|
68
|
+
opaque: isOpaque,
|
|
53
69
|
children
|
|
54
70
|
};
|
|
55
71
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolvePreviews.js","names":[],"sources":["../../../src/interactions/actions/resolvePreviews.ts"],"sourcesContent":["/**\n * What an in-flight gesture is proposing, resolved against the scene.\n *\n * An ongoing action names the ids it previews on its handle. A transform —\n * move, resize, rotate — publishes their poses to the scene's overrides, and\n * other actions answer `previewPose` on the handle. Resolving them means\n * knowing which ids are in flight, which of those are roots, whose preview\n * wins when two sources name the same id, and which are merely displaced\n * rather than dragged. None of that is about drawing, and a consumer with its\n * own renderer needs all of it.\n */\n\nimport type { GesturePreviewSource } from '../../canvas/gestureBounds';\nimport type { Node, NodeId, Scene } from '../../core/scene/types';\nimport { asNodeId } from '../../core/scene/types';\nimport { effectivePose } from '../../core/scene/effectivePose';\n\n/** One node an in-flight gesture is previewing, as {@link resolvePreviews} returns it. */\nexport interface PreviewNode<TData, TLayer extends string, TPose> {\n id: NodeId;\n /** The node as committed. */\n node: Node<TData, TLayer, TPose>;\n /**
|
|
1
|
+
{"version":3,"file":"resolvePreviews.js","names":[],"sources":["../../../src/interactions/actions/resolvePreviews.ts"],"sourcesContent":["/**\n * What an in-flight gesture is proposing, resolved against the scene.\n *\n * An ongoing action names the ids it previews on its handle. A transform —\n * move, resize, rotate — publishes their poses to the scene's overrides, and\n * other actions answer `previewPose` on the handle. Resolving them means\n * knowing which ids are in flight, which of those are roots, whose preview\n * wins when two sources name the same id, and which are merely displaced\n * rather than dragged. None of that is about drawing, and a consumer with its\n * own renderer needs all of it.\n */\n\nimport type { GesturePreviewSource } from '../../canvas/gestureBounds';\nimport type { Node, NodeId, Scene } from '../../core/scene/types';\nimport { asNodeId } from '../../core/scene/types';\nimport { definesFrame, effectivePose } from '../../core/scene/effectivePose';\nimport { composeWorldPose, composesFrames, type PoseAdapter } from '../../core/scene/composeFrame';\nimport { viewPoseAdapter } from '../../core/scene/scrollOffsets';\n\n/** One node an in-flight gesture is previewing, as {@link resolvePreviews} returns it. */\nexport interface PreviewNode<TData, TLayer extends string, TPose> {\n id: NodeId;\n /** The node as committed. */\n node: Node<TData, TLayer, TPose>;\n /** Where the node draws, in world: the pose a source previews, else its\n * effective pose — where the scene's overrides put it mid-transform —\n * folded through every container's frame, previewed or not, and scrolled\n * as the view scrolls it. */\n pose: TPose;\n /** The interim data, or the committed one when only the pose is in flight. */\n data: TData;\n /**\n * The gesture is not carrying this one under the pointer — a layout sibling\n * reflowing into its destination slot. It reads better painted settled.\n */\n opaque: boolean;\n /** Previewed descendants, and those a previewed frame carries, so a\n * container's ghost brings its children. */\n children: PreviewNode<TData, TLayer, TPose>[];\n}\n\n/** First non-null answer across sources, in the order given. */\nfunction firstNonNull<T>(\n sources: readonly GesturePreviewSource[],\n id: string,\n read: (source: GesturePreviewSource, id: string) => unknown,\n): T | null {\n for (const source of sources) {\n const value = read(source, id);\n if (value != null) return value as T;\n }\n return null;\n}\n\n/**\n * The previewing subtrees, as roots. A previewed node whose parent is also\n * previewing is a child of that parent's entry rather than a root of its own,\n * which is what lets a caller draw a container and its contents as one thing.\n * A previewed container whose pose is a frame brings every child it carries,\n * previewed or not. A source previews a pose in the frame the node is stored\n * in; each entry's pose is in world.\n *\n * An id with no node is skipped: an insert previews before the node it will\n * create exists.\n */\nexport function resolvePreviews<TData, TLayer extends string, TPose>(\n sources: Iterable<GesturePreviewSource>,\n scene: Scene<TData, TLayer, TPose>,\n): PreviewNode<TData, TLayer, TPose>[] {\n const list = [...sources];\n const ids = new Set<string>();\n for (const source of list) {\n const previewing = source.previewIds?.();\n if (!previewing) continue;\n for (const id of previewing) ids.add(id);\n }\n if (ids.size === 0) return [];\n\n const opaque = new Set<string>();\n for (const source of list) {\n const settled = source.previewOpaqueIds?.();\n if (!settled) continue;\n for (const id of settled) opaque.add(id);\n }\n\n const composition = scene.composition;\n const framed = composesFrames(composition);\n const shown: PoseAdapter<TPose> = viewPoseAdapter(scene, {\n getPose: (id) => firstNonNull<TPose>(list, id, (s, i) => s.previewPose?.(i)) ?? effectivePose(scene, scene.get(asNodeId(id))!),\n getParent: (id) => scene.get(asNodeId(id))?.parent ?? null,\n definesFrame: (id) => {\n const node = scene.get(asNodeId(id));\n return node === undefined || definesFrame(node);\n },\n } as PoseAdapter<TPose>);\n\n // `riding`: the frame `id` is stored in is drawn here, which an envelope's\n // children share with it.\n const build = (id: string, carriedOpaque = false, riding = false): PreviewNode<TData, TLayer, TPose> | null => {\n const node = scene.get(asNodeId(id));\n if (!node) return null;\n const data = firstNonNull<TData>(list, id, (s, i) => s.previewData?.(i));\n const isOpaque = carriedOpaque || opaque.has(id);\n const carries = framed && (definesFrame(node) || riding);\n\n const children: PreviewNode<TData, TLayer, TPose>[] = [];\n for (const childId of scene.childrenOf(asNodeId(id))) {\n if (!ids.has(childId) && !carries) continue;\n const child = build(childId, isOpaque && !ids.has(childId), carries);\n if (child) children.push(child);\n }\n\n return {\n id: asNodeId(id),\n node,\n pose: composeWorldPose(shown, id, composition.compose),\n data: data ?? node.data,\n opaque: isOpaque,\n children,\n };\n };\n\n const roots: PreviewNode<TData, TLayer, TPose>[] = [];\n for (const id of ids) {\n const parent = scene.get(asNodeId(id))?.parent;\n if (parent != null && ids.has(parent)) continue;\n const root = build(id);\n if (root) roots.push(root);\n }\n return roots;\n}\n\n/** Every entry in the forest, parents before their children. */\nexport function flattenPreviews<TData, TLayer extends string, TPose>(\n roots: readonly PreviewNode<TData, TLayer, TPose>[],\n): PreviewNode<TData, TLayer, TPose>[] {\n const out: PreviewNode<TData, TLayer, TPose>[] = [];\n const walk = (entry: PreviewNode<TData, TLayer, TPose>) => {\n out.push(entry);\n for (const child of entry.children) walk(child);\n };\n for (const root of roots) walk(root);\n return out;\n}\n"],"mappings":";;;;;;;AA0CA,SAAS,aACP,SACA,IACA,MACU;CACV,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,QAAQ,KAAK,QAAQ,EAAE;EAC7B,IAAI,SAAS,MAAM,OAAO;CAC5B;CACA,OAAO;AACT;;;;;;;;;;;;AAaA,SAAgB,gBACd,SACA,OACqC;CACrC,MAAM,OAAO,CAAC,GAAG,OAAO;CACxB,MAAM,sBAAM,IAAI,IAAY;CAC5B,KAAK,MAAM,UAAU,MAAM;EACzB,MAAM,aAAa,OAAO,aAAa;EACvC,IAAI,CAAC,YAAY;EACjB,KAAK,MAAM,MAAM,YAAY,IAAI,IAAI,EAAE;CACzC;CACA,IAAI,IAAI,SAAS,GAAG,OAAO,CAAC;CAE5B,MAAM,yBAAS,IAAI,IAAY;CAC/B,KAAK,MAAM,UAAU,MAAM;EACzB,MAAM,UAAU,OAAO,mBAAmB;EAC1C,IAAI,CAAC,SAAS;EACd,KAAK,MAAM,MAAM,SAAS,OAAO,IAAI,EAAE;CACzC;CAEA,MAAM,cAAc,MAAM;CAC1B,MAAM,SAAS,eAAe,WAAW;CACzC,MAAM,QAA4B,gBAAgB,OAAO;EACvD,UAAU,OAAO,aAAoB,MAAM,KAAK,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC,KAAK,cAAc,OAAO,MAAM,IAAI,SAAS,EAAE,CAAC,CAAE;EAC7H,YAAY,OAAO,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU;EACtD,eAAe,OAAO;GACpB,MAAM,OAAO,MAAM,IAAI,SAAS,EAAE,CAAC;GACnC,OAAO,SAAS,UAAa,aAAa,IAAI;EAChD;CACF,CAAuB;CAIvB,MAAM,SAAS,IAAY,gBAAgB,OAAO,SAAS,UAAoD;EAC7G,MAAM,OAAO,MAAM,IAAI,SAAS,EAAE,CAAC;EACnC,IAAI,CAAC,MAAM,OAAO;EAClB,MAAM,OAAO,aAAoB,MAAM,KAAK,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;EACvE,MAAM,WAAW,iBAAiB,OAAO,IAAI,EAAE;EAC/C,MAAM,UAAU,WAAW,aAAa,IAAI,KAAK;EAEjD,MAAM,WAAgD,CAAC;EACvD,KAAK,MAAM,WAAW,MAAM,WAAW,SAAS,EAAE,CAAC,GAAG;GACpD,IAAI,CAAC,IAAI,IAAI,OAAO,KAAK,CAAC,SAAS;GACnC,MAAM,QAAQ,MAAM,SAAS,YAAY,CAAC,IAAI,IAAI,OAAO,GAAG,OAAO;GACnE,IAAI,OAAO,SAAS,KAAK,KAAK;EAChC;EAEA,OAAO;GACL,IAAI,SAAS,EAAE;GACf;GACA,MAAM,iBAAiB,OAAO,IAAI,YAAY,OAAO;GACrD,MAAM,QAAQ,KAAK;GACnB,QAAQ;GACR;EACF;CACF;CAEA,MAAM,QAA6C,CAAC;CACpD,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,SAAS,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,EAAE;EACxC,IAAI,UAAU,QAAQ,IAAI,IAAI,MAAM,GAAG;EACvC,MAAM,OAAO,MAAM,EAAE;EACrB,IAAI,MAAM,MAAM,KAAK,IAAI;CAC3B;CACA,OAAO;AACT;;AAGA,SAAgB,gBACd,OACqC;CACrC,MAAM,MAA2C,CAAC;CAClD,MAAM,QAAQ,UAA6C;EACzD,IAAI,KAAK,KAAK;EACd,KAAK,MAAM,SAAS,MAAM,UAAU,KAAK,KAAK;CAChD;CACA,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI;CACnC,OAAO;AACT"}
|
|
@@ -2,7 +2,7 @@ import { rotateCursorAt } from "../../../affordances/rotateCursor.js";
|
|
|
2
2
|
import { transformPreview } from "../transformFinish.js";
|
|
3
3
|
import { closeGesture, runBehaviorCancel } from "../gestureLifecycle.js";
|
|
4
4
|
import { inPlane, selectionLayer } from "../planeInput.js";
|
|
5
|
-
import { SNAP_ROLES } from "../../../
|
|
5
|
+
import { SNAP_ROLES } from "../../../domains/snap/roles.js";
|
|
6
6
|
import { recordTransform } from "../transform-again/memory.js";
|
|
7
7
|
import { nextFrame } from "./frame.js";
|
|
8
8
|
import { commitRotate } from "./commit.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/rotate/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { BindingOpts, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport { transformPreview } from '../transformFinish';\nimport { closeGesture, runBehaviorCancel } from '../gestureLifecycle';\nimport { inPlane, selectionLayer } from '../planeInput';\nimport { rotateCursorAt } from 'affordances/rotateCursor';\nimport { commitRotate } from './commit';\nimport { nextFrame } from './frame';\nimport { beginRotate, type RotateFrame } from './session';\nimport { recordTransform } from '../transform-again/memory';\nimport { SNAP_ROLES } from '
|
|
1
|
+
{"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/rotate/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { BindingOpts, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport { transformPreview } from '../transformFinish';\nimport { closeGesture, runBehaviorCancel } from '../gestureLifecycle';\nimport { inPlane, selectionLayer } from '../planeInput';\nimport { rotateCursorAt } from 'affordances/rotateCursor';\nimport { commitRotate } from './commit';\nimport { nextFrame } from './frame';\nimport { beginRotate, type RotateFrame } from './session';\nimport { recordTransform } from '../transform-again/memory';\nimport { SNAP_ROLES } from 'domains/snap/roles';\n\n/**\n * Pointer-driven rotation of the selection, committed as one undo entry.\n *\n * A pose whose descriptor has no `withRotation`, or reports\n * `supportsRotation` false, is left alone. The first rotated node's angle\n * snaps through the `snap` dep's session — quarter turns and other nodes'\n * angles, 15 degree steps while `snap.constrain` (Shift) is held — and the\n * rest of the selection turns by the same amount. Behaviors\n * (`opts.behaviors`) then see that node's turned pose; a pose one returns\n * from `onMove` sets the rotation for the whole selection.\n */\nexport const rotateAction: Action & { requires: string[] } = inPlane({\n id: 'rotate',\n label: 'Rotate',\n // No default binding: a bare `{ kind: 'drag' }` makes any drag no active\n // tool claimed rotate a non-empty selection. The rotation handle binds it\n // (`selectionRotateBindings`).\n eligible: { capability: 'transforms-selection' },\n modifierRoles: SNAP_ROLES,\n requires: ['selection', 'scene', 'applyOps', 'poseDescriptor', 'view', 'boundsIncludeStroke', 'kitSettings', 'snap', 'transformFollowers'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const begun = beginRotate(ctx, opts);\n if (!begun) return {};\n const { session, readers } = begun;\n const subject = [...(ctx.deps.selection?.get() ?? [])] as string[];\n const hold = session.scene.overrides.hold();\n const preview = transformPreview(ctx.deps, session.scene, () => frame.previews);\n let frame: RotateFrame = { delta: 0, previews: new Map() };\n let pointer = ctx.world;\n session.lifecycle.start(session.gestureCtx.draggedIds);\n return {\n kind: 'rotate',\n cursor: () => {\n const scale = ctx.deps.view?.get().scale;\n return scale ? rotateCursorAt(session.turn.pivot, pointer, scale) : undefined;\n },\n onMove(moveCtx: InvocationCtx): void {\n pointer = moveCtx.world;\n frame = nextFrame(session, readers, moveCtx);\n hold.set(preview.poses());\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n if (reason === 'commit') {\n committed = commitRotate(session, frame);\n if (committed) {\n const pivot = session.ids.length > 1 && !session.turn.useUnionPivot ? 'each' : 'union';\n recordTransform(session.scene, { kind: 'rotate', angle: frame.delta, pivot }, subject);\n }\n } else runBehaviorCancel(session.behaviors, session.gestureCtx);\n } finally {\n session.snap.end();\n closeGesture({ hold, previews: frame.previews, behaviors: session.behaviors, ctx: session.gestureCtx, lifecycle: session.lifecycle }, committed);\n }\n },\n previewIds: preview.previewIds,\n previewData: preview.previewData,\n };\n },\n },\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAa,eAAgD,QAAQ;CACnE,IAAI;CACJ,OAAO;CAIP,UAAU,EAAE,YAAY,uBAAuB;CAC/C,eAAe;CACf,UAAU;EAAC;EAAa;EAAS;EAAY;EAAkB;EAAQ;EAAuB;EAAe;EAAQ;CAAoB;CACzI,SAAS;EACP,QAAQ;EACR,MAAM,KAAoB,MAAmC;GAC3D,MAAM,QAAQ,YAAY,KAAK,IAAI;GACnC,IAAI,CAAC,OAAO,OAAO,CAAC;GACpB,MAAM,EAAE,SAAS,YAAY;GAC7B,MAAM,UAAU,CAAC,GAAI,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,CAAE;GACrD,MAAM,OAAO,QAAQ,MAAM,UAAU,KAAK;GAC1C,MAAM,UAAU,iBAAiB,IAAI,MAAM,QAAQ,aAAa,MAAM,QAAQ;GAC9E,IAAI,QAAqB;IAAE,OAAO;IAAG,0BAAU,IAAI,IAAI;GAAE;GACzD,IAAI,UAAU,IAAI;GAClB,QAAQ,UAAU,MAAM,QAAQ,WAAW,UAAU;GACrD,OAAO;IACL,MAAM;IACN,cAAc;KACZ,MAAM,QAAQ,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC;KACnC,OAAO,QAAQ,eAAe,QAAQ,KAAK,OAAO,SAAS,KAAK,IAAI;IACtE;IACA,OAAO,SAA8B;KACnC,UAAU,QAAQ;KAClB,QAAQ,UAAU,SAAS,SAAS,OAAO;KAC3C,KAAK,IAAI,QAAQ,MAAM,CAAC;IAC1B;IACA,MAAM,SAAwB,QAAmC;KAC/D,IAAI,YAAY;KAChB,IAAI;MACF,IAAI,WAAW,UAAU;OACvB,YAAY,aAAa,SAAS,KAAK;OACvC,IAAI,WAAW;QACb,MAAM,QAAQ,QAAQ,IAAI,SAAS,KAAK,CAAC,QAAQ,KAAK,gBAAgB,SAAS;QAC/E,gBAAgB,QAAQ,OAAO;SAAE,MAAM;SAAU,OAAO,MAAM;SAAO;QAAM,GAAG,OAAO;OACvF;MACF,OAAO,kBAAkB,QAAQ,WAAW,QAAQ,UAAU;KAChE,UAAU;MACR,QAAQ,KAAK,IAAI;MACjB,aAAa;OAAE;OAAM,UAAU,MAAM;OAAU,WAAW,QAAQ;OAAW,KAAK,QAAQ;OAAY,WAAW,QAAQ;MAAU,GAAG,SAAS;KACjJ;IACF;IACA,YAAY,QAAQ;IACpB,aAAa,QAAQ;GACvB;EACF;CACF;CACA,eAAe;AACjB,GAAG,cAAc"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { translatePoseViaDescriptor } from "../../../core/geometry/poseDescriptor.js";
|
|
2
2
|
import { carryPose, planeOf } from "../planeInput.js";
|
|
3
3
|
import { pointerStateOf } from "../pointerState.js";
|
|
4
|
-
import { snapMods } from "../../../
|
|
4
|
+
import { snapMods } from "../../../domains/snap/roles.js";
|
|
5
5
|
|
|
6
6
|
//#region src/interactions/actions/rotate/frame.ts
|
|
7
7
|
/** `origin` turned by `delta` radians, its center orbiting `pivot` when one
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/rotate/frame.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport { snapMods } from '
|
|
1
|
+
{"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/rotate/frame.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport { snapMods } from 'domains/snap/roles';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, RotateBehavior, RotateProposed } from '../../gestures/types';\nimport { carryPose, planeOf } from '../planeInput';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport type { RotateFrame, RotateSession, Turn, TurnOrigin } from './session';\n\n/** `origin` turned by `delta` radians, its center orbiting `pivot` when one\n * is given. */\nfunction turnPose(\n d: PoseDescriptor<unknown>,\n origin: TurnOrigin,\n delta: number,\n pivot: { x: number; y: number } | null,\n): unknown {\n const rotated = d.withRotation!(origin.world, origin.rotation + delta);\n if (!pivot) return rotated;\n const cos = Math.cos(delta);\n const sin = Math.sin(delta);\n const ox = origin.center.x - pivot.x;\n const oy = origin.center.y - pivot.y;\n const nx = pivot.x + ox * cos - oy * sin;\n const ny = pivot.y + ox * sin + oy * cos;\n return translatePoseViaDescriptor(rotated, nx - origin.center.x, ny - origin.center.y, d);\n}\n\n/** Each rotated node's world pose turned by `delta`. */\nexport function turnedWorlds(turn: Turn, delta: number): Map<NodeId, unknown> {\n const out = new Map<NodeId, unknown>();\n const pivot = turn.useUnionPivot ? turn.pivot : null;\n for (const [id, origin] of turn.origins) {\n out.set(id, turnPose(turn.descriptorOf(id), origin, delta, pivot));\n }\n return out;\n}\n\n/** Write the poses a turn by `delta` gives into `gctx.current`. */\nexport function syncGestureCurrent(\n gctx: GestureContext<unknown>,\n turn: Turn,\n delta: number,\n): Map<NodeId, unknown> {\n const turned = turnedWorlds(turn, delta);\n for (const [id, pose] of turned) gctx.current.set(id as string, pose);\n return turned;\n}\n\n/** The pointer's delta as the behaviors reshape it. */\nfunction shapeDelta(\n turn: Turn,\n behaviors: readonly RotateBehavior<unknown>[],\n gctx: GestureContext<unknown>,\n readers: GestureReaders,\n moveCtx: InvocationCtx,\n raw: number,\n): number {\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.world, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n const primary = turn.origins.keys().next().value as NodeId;\n const originRotation = turn.origins.get(primary)?.rotation ?? 0;\n let delta = raw;\n let proposed: RotateProposed<unknown> = {\n pose: syncGestureCurrent(gctx, turn, raw).get(primary),\n rotation: originRotation + raw,\n };\n for (const b of behaviors) {\n const r = b.onMove?.(gctx, proposed);\n if (!r) continue;\n if (r.rotation !== undefined) {\n delta = r.rotation - originRotation;\n proposed = { pose: syncGestureCurrent(gctx, turn, delta).get(primary), rotation: r.rotation };\n continue;\n }\n if (r.pose === undefined) continue;\n const rotation = turn.descriptorOf(primary).getRotation?.(r.pose) ?? 0;\n delta = rotation - originRotation;\n proposed = { pose: r.pose, rotation };\n }\n return delta;\n}\n\n/** Every rotated id's stored pose under a turn by `delta`; none at zero. */\nexport function storedPreviews(\n session: Pick<RotateSession, 'scene' | 'turn' | 'poseFrame' | 'view'>,\n delta: number,\n): Map<NodeId, unknown> {\n const previews = new Map<NodeId, unknown>();\n if (delta === 0) return previews;\n for (const [id, turned] of turnedWorlds(session.turn, delta)) {\n const layer = session.scene.get(id)?.layer;\n const own = layer === undefined ? null : planeOf(session.view, layer);\n previews.set(id, session.poseFrame.local(id, carryPose(session.turn.descriptorOf(id), turned, own)));\n }\n return previews;\n}\n\n/** One move's delta and previews: the pointer's angle since press as the\n * snap session and then the behaviors shaped it, and every rotated id's stored pose under it. */\nexport function nextFrame(session: RotateSession, readers: GestureReaders, moveCtx: InvocationCtx): RotateFrame {\n const { pivot } = session.turn;\n const pointerAngle = Math.atan2(moveCtx.world.y - pivot.y, moveCtx.world.x - pivot.x);\n const raw = pointerAngle - session.startPointerAngle;\n const snapped = session.snap.angle(session.theta0 + raw, snapMods(moveCtx)).theta - session.theta0;\n const delta = session.behaviors.length > 0\n ? shapeDelta(session.turn, session.behaviors, session.gestureCtx, readers, moveCtx, snapped)\n : snapped;\n return { delta, previews: storedPreviews(session, delta) };\n}\n"],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ import { pointerStateOf } from "../pointerState.js";
|
|
|
10
10
|
import { drawnBoxes } from "../drawnBoxes.js";
|
|
11
11
|
import { sceneGestureFrames } from "../gestureFrames.js";
|
|
12
12
|
import { moveGestureAdapter } from "../move/gestureAdapter.js";
|
|
13
|
-
import { SNAP_ANGLE_STEP } from "../../../
|
|
14
|
-
import { inputSession } from "../../../
|
|
13
|
+
import { SNAP_ANGLE_STEP } from "../../../domains/snap/roles.js";
|
|
14
|
+
import { inputSession } from "../../../domains/snap/session2d.js";
|
|
15
15
|
import { resolveParams } from "@weasel-js/routing";
|
|
16
16
|
|
|
17
17
|
//#region src/interactions/actions/rotate/session.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","names":[],"sources":["../../../../src/interactions/actions/rotate/session.ts"],"sourcesContent":["import type { ActionDeps, BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport { transformFinisher, type TransformFinisher } from '../transformFinish';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { resolveParams } from '@weasel-js/routing';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, RotateBehavior } from '../../gestures/types';\nimport { readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { moveGestureAdapter } from '../move/gestureAdapter';\nimport { carryPose, invertPlane, planeOf } from '../planeInput';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { drawnBoxes, type DrawnBoxes } from '../drawnBoxes';\nimport { shapeSources } from '../selectionSubtree';\nimport type { SnapBegin, SnapSession } from '../snapDep';\nimport { inputSession } from 'features/snap/session2d';\nimport { SNAP_ANGLE_STEP } from 'features/snap/roles';\n\n/** One rotated node as the press found it, in the plane the pointer's angle\n * is read in. */\nexport interface TurnOrigin {\n readonly world: unknown;\n /** Center of `world`'s bounds. */\n readonly center: { x: number; y: number };\n readonly rotation: number;\n}\n\n/** What a turn by some delta is computed from. */\nexport interface Turn {\n readonly origins: ReadonlyMap<NodeId, TurnOrigin>;\n /** The point the pointer orbits: the center of what the selection draws. */\n readonly pivot: { x: number; y: number };\n /** Orbit each node's center around `pivot`, for a multi-selection. Off,\n * each node turns about its own center. */\n readonly useUnionPivot: boolean;\n readonly descriptorOf: (id: NodeId) => PoseDescriptor<unknown>;\n}\n\n/** What a rotate captured at press. Nothing here changes during the drag. */\nexport interface RotateSession {\n readonly scene: Scene<unknown, string, unknown>;\n readonly ids: readonly NodeId[];\n readonly turn: Turn;\n /** World reads and local writes over the scene's composition strategy. */\n readonly poseFrame: PoseFrame<unknown>;\n readonly view: unknown;\n /** Each rotated node's pose as stored: the `from` of its op. */\n readonly originPoses: ReadonlyMap<NodeId, unknown>;\n /** Pointer angle around the pivot at press. */\n readonly startPointerAngle: number;\n /** The first rotated node's rotation at press: the angle that snaps. */\n readonly theta0: number;\n /** The drag's snapping: the `snap` dep's session, else one that only\n * steps while `snap.constrain` is held. */\n readonly snap: SnapSession;\n readonly behaviors: readonly RotateBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly applyOps?: (ops: Op[], label: string) => void;\n /** Finishes the committed batch with the other nodes that change with it. */\n readonly finish?: TransformFinisher;\n readonly selectionMethods: SelectionApi['adapterMethods'] | undefined;\n readonly lifecycle: GestureLifecycle;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface RotateFrame {\n /** Radians turned since press, as the behaviors shaped it. */\n readonly delta: number;\n /** Stored-frame pose of every rotated id; empty at a zero delta. */\n readonly previews: Map<NodeId, unknown>;\n}\n\nfunction captureOrigins(\n view: unknown,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>,\n poseFrame: PoseFrame<unknown>,\n boxes: DrawnBoxes,\n): { originPoses: Map<NodeId, unknown>; origins: Map<NodeId, TurnOrigin>; visual: Bounds[] } {\n const originPoses = new Map<NodeId, unknown>();\n const origins = new Map<NodeId, TurnOrigin>();\n const visual: Bounds[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n const g = descriptorOf(id);\n if (!g.withRotation || g.supportsRotation?.(node.pose) === false) continue;\n originPoses.set(id, node.pose);\n // The pivot is a world point, so every measurement the gesture orbits\n // is taken from the world pose, not the stored one — carried into the\n // plane the edit is measured in, where the pointer's angle is read.\n const world = carryPose(g, poseFrame.world(id), invertPlane(planeOf(view, node.layer)));\n const b = g.getBounds(world);\n origins.set(id, {\n world,\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n rotation: g.getRotation?.(world) ?? 0,\n });\n visual.push(boxes.aabb(id, world));\n }\n return { originPoses, origins, visual };\n}\n\nfunction buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n origins: ReadonlyMap<NodeId, TurnOrigin>,\n readers: GestureReaders,\n selectionMethods: SelectionApi['adapterMethods'],\n): GestureContext<unknown> {\n return {\n draggedIds: [...origins.keys()] as string[],\n origin: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n current: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n kitSettings: readers.kitSettings,\n frames: sceneGestureFrames(scene, ctx.deps),\n adapter: moveGestureAdapter(scene, undefined, selectionMethods) as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n}\n\n/** What turning `ids` (already resolved to shape sources) is computed from,\n * with each one's pose as stored. Null when none of them can turn. */\nexport function captureTurn(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n deps: Pick<ActionDeps, 'view' | 'poseDescriptor' | 'boundsIncludeStroke'>,\n pivot: 'union' | 'each',\n): { turn: Turn; originPoses: Map<NodeId, unknown>; poseFrame: PoseFrame<unknown> } | null {\n const view = deps.view;\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(deps.poseDescriptor));\n // The pivot the pointer orbits is a world point, so every pose the\n // gesture turns is a world pose. Each turned result is stored back in\n // the node's own parent frame at preview and commit alike.\n const poseFrame = scenePoseFrame(scene);\n // A selection turns about the center of the box its chrome draws.\n const boxes = drawnBoxes({ ...deps, scene }, poseFrame);\n const { originPoses, origins, visual } = captureOrigins(view, scene, ids, descriptorOf, poseFrame, boxes);\n if (originPoses.size === 0) return null;\n const union = unionAABB(visual)!;\n return {\n turn: {\n origins,\n pivot: { x: union.x + union.width / 2, y: union.y + union.height / 2 },\n useUnionPivot: ids.length > 1 && pivot !== 'each',\n descriptorOf,\n },\n originPoses,\n poseFrame,\n };\n}\n\n/** The drag's snap session: the first rotated node's angle about the pivot,\n * stepping by `SNAP_ANGLE_STEP` while `snap.constrain` is held. */\nfunction beginSnap(ctx: InvocationCtx, ids: readonly string[], pivot: { x: number; y: number }, theta0: number): SnapSession {\n const req: SnapBegin = {\n gesture: 'rotate', ids, press: ctx.world, pivot, theta0, constrain: { step: SNAP_ANGLE_STEP },\n };\n return ctx.deps.snap?.begin(req) ?? inputSession(req);\n}\n\n/** Capture a rotate at press. Null when nothing selected can turn. Runs each\n * behavior's `onStart`. */\nexport function beginRotate(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n): { session: RotateSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const params = resolveParams(opts?.params);\n const behaviors = (opts?.behaviors ?? []) as readonly RotateBehavior<unknown>[];\n\n if (!selection || !scene) return null;\n\n // A group whose pose derives from its children turns by turning them.\n const ids = shapeSources(scene, selection.get()) as NodeId[];\n if (ids.length === 0) return null;\n\n const captured = captureTurn(scene, ids, ctx.deps, params?.['pivot'] === 'each' ? 'each' : 'union');\n if (!captured) return null;\n const { turn, originPoses, poseFrame } = captured;\n const { origins, pivot } = turn;\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, origins, readers, selection.adapterMethods);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n const theta0 = origins.values().next().value?.rotation ?? 0;\n\n const session: RotateSession = {\n scene,\n ids,\n turn,\n poseFrame,\n view: ctx.deps.view,\n originPoses,\n startPointerAngle: Math.atan2(ctx.world.y - pivot.y, ctx.world.x - pivot.x),\n theta0,\n snap: beginSnap(ctx, [...new Set([...selection.get(), ...ids])], pivot, theta0),\n behaviors,\n gestureCtx,\n applyOps: ctx.deps.applyOps,\n finish: transformFinisher(ctx.deps),\n selectionMethods: selection.adapterMethods,\n lifecycle: readGestureLifecycle(params, 'Rotate', behaviors),\n };\n return { session, readers };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session.js","names":[],"sources":["../../../../src/interactions/actions/rotate/session.ts"],"sourcesContent":["import type { ActionDeps, BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport { transformFinisher, type TransformFinisher } from '../transformFinish';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { resolveParams } from '@weasel-js/routing';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { GestureContext, RotateBehavior } from '../../gestures/types';\nimport { readGestureLifecycle, type GestureLifecycle } from '../gestureLifecycle';\nimport { moveGestureAdapter } from '../move/gestureAdapter';\nimport { carryPose, invertPlane, planeOf } from '../planeInput';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { drawnBoxes, type DrawnBoxes } from '../drawnBoxes';\nimport { shapeSources } from '../selectionSubtree';\nimport type { SnapBegin, SnapSession } from '../snapDep';\nimport { inputSession } from 'domains/snap/session2d';\nimport { SNAP_ANGLE_STEP } from 'domains/snap/roles';\n\n/** One rotated node as the press found it, in the plane the pointer's angle\n * is read in. */\nexport interface TurnOrigin {\n readonly world: unknown;\n /** Center of `world`'s bounds. */\n readonly center: { x: number; y: number };\n readonly rotation: number;\n}\n\n/** What a turn by some delta is computed from. */\nexport interface Turn {\n readonly origins: ReadonlyMap<NodeId, TurnOrigin>;\n /** The point the pointer orbits: the center of what the selection draws. */\n readonly pivot: { x: number; y: number };\n /** Orbit each node's center around `pivot`, for a multi-selection. Off,\n * each node turns about its own center. */\n readonly useUnionPivot: boolean;\n readonly descriptorOf: (id: NodeId) => PoseDescriptor<unknown>;\n}\n\n/** What a rotate captured at press. Nothing here changes during the drag. */\nexport interface RotateSession {\n readonly scene: Scene<unknown, string, unknown>;\n readonly ids: readonly NodeId[];\n readonly turn: Turn;\n /** World reads and local writes over the scene's composition strategy. */\n readonly poseFrame: PoseFrame<unknown>;\n readonly view: unknown;\n /** Each rotated node's pose as stored: the `from` of its op. */\n readonly originPoses: ReadonlyMap<NodeId, unknown>;\n /** Pointer angle around the pivot at press. */\n readonly startPointerAngle: number;\n /** The first rotated node's rotation at press: the angle that snaps. */\n readonly theta0: number;\n /** The drag's snapping: the `snap` dep's session, else one that only\n * steps while `snap.constrain` is held. */\n readonly snap: SnapSession;\n readonly behaviors: readonly RotateBehavior<unknown>[];\n /** Reused across the drag; behaviors mutate its `scratch`. */\n readonly gestureCtx: GestureContext<unknown>;\n readonly applyOps?: (ops: Op[], label: string) => void;\n /** Finishes the committed batch with the other nodes that change with it. */\n readonly finish?: TransformFinisher;\n readonly selectionMethods: SelectionApi['adapterMethods'] | undefined;\n readonly lifecycle: GestureLifecycle;\n}\n\n/** What one `onMove` produced. Replaced, not mutated, by the next. */\nexport interface RotateFrame {\n /** Radians turned since press, as the behaviors shaped it. */\n readonly delta: number;\n /** Stored-frame pose of every rotated id; empty at a zero delta. */\n readonly previews: Map<NodeId, unknown>;\n}\n\nfunction captureOrigins(\n view: unknown,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>,\n poseFrame: PoseFrame<unknown>,\n boxes: DrawnBoxes,\n): { originPoses: Map<NodeId, unknown>; origins: Map<NodeId, TurnOrigin>; visual: Bounds[] } {\n const originPoses = new Map<NodeId, unknown>();\n const origins = new Map<NodeId, TurnOrigin>();\n const visual: Bounds[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n const g = descriptorOf(id);\n if (!g.withRotation || g.supportsRotation?.(node.pose) === false) continue;\n originPoses.set(id, node.pose);\n // The pivot is a world point, so every measurement the gesture orbits\n // is taken from the world pose, not the stored one — carried into the\n // plane the edit is measured in, where the pointer's angle is read.\n const world = carryPose(g, poseFrame.world(id), invertPlane(planeOf(view, node.layer)));\n const b = g.getBounds(world);\n origins.set(id, {\n world,\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n rotation: g.getRotation?.(world) ?? 0,\n });\n visual.push(boxes.aabb(id, world));\n }\n return { originPoses, origins, visual };\n}\n\nfunction buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n origins: ReadonlyMap<NodeId, TurnOrigin>,\n readers: GestureReaders,\n selectionMethods: SelectionApi['adapterMethods'],\n): GestureContext<unknown> {\n return {\n draggedIds: [...origins.keys()] as string[],\n origin: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n current: new Map([...origins].map(([id, o]) => [id as string, o.world])),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n kitSettings: readers.kitSettings,\n frames: sceneGestureFrames(scene, ctx.deps),\n adapter: moveGestureAdapter(scene, undefined, selectionMethods) as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n}\n\n/** What turning `ids` (already resolved to shape sources) is computed from,\n * with each one's pose as stored. Null when none of them can turn. */\nexport function captureTurn(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n deps: Pick<ActionDeps, 'view' | 'poseDescriptor' | 'boundsIncludeStroke'>,\n pivot: 'union' | 'each',\n): { turn: Turn; originPoses: Map<NodeId, unknown>; poseFrame: PoseFrame<unknown> } | null {\n const view = deps.view;\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(deps.poseDescriptor));\n // The pivot the pointer orbits is a world point, so every pose the\n // gesture turns is a world pose. Each turned result is stored back in\n // the node's own parent frame at preview and commit alike.\n const poseFrame = scenePoseFrame(scene);\n // A selection turns about the center of the box its chrome draws.\n const boxes = drawnBoxes({ ...deps, scene }, poseFrame);\n const { originPoses, origins, visual } = captureOrigins(view, scene, ids, descriptorOf, poseFrame, boxes);\n if (originPoses.size === 0) return null;\n const union = unionAABB(visual)!;\n return {\n turn: {\n origins,\n pivot: { x: union.x + union.width / 2, y: union.y + union.height / 2 },\n useUnionPivot: ids.length > 1 && pivot !== 'each',\n descriptorOf,\n },\n originPoses,\n poseFrame,\n };\n}\n\n/** The drag's snap session: the first rotated node's angle about the pivot,\n * stepping by `SNAP_ANGLE_STEP` while `snap.constrain` is held. */\nfunction beginSnap(ctx: InvocationCtx, ids: readonly string[], pivot: { x: number; y: number }, theta0: number): SnapSession {\n const req: SnapBegin = {\n gesture: 'rotate', ids, press: ctx.world, pivot, theta0, constrain: { step: SNAP_ANGLE_STEP },\n };\n return ctx.deps.snap?.begin(req) ?? inputSession(req);\n}\n\n/** Capture a rotate at press. Null when nothing selected can turn. Runs each\n * behavior's `onStart`. */\nexport function beginRotate(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n): { session: RotateSession; readers: GestureReaders } | null {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const params = resolveParams(opts?.params);\n const behaviors = (opts?.behaviors ?? []) as readonly RotateBehavior<unknown>[];\n\n if (!selection || !scene) return null;\n\n // A group whose pose derives from its children turns by turning them.\n const ids = shapeSources(scene, selection.get()) as NodeId[];\n if (ids.length === 0) return null;\n\n const captured = captureTurn(scene, ids, ctx.deps, params?.['pivot'] === 'each' ? 'each' : 'union');\n if (!captured) return null;\n const { turn, originPoses, poseFrame } = captured;\n const { origins, pivot } = turn;\n const readers = gestureReaders(ctx.deps);\n const gestureCtx = buildGestureContext(ctx, scene, origins, readers, selection.adapterMethods);\n for (const b of behaviors) b.onStart?.(gestureCtx);\n const theta0 = origins.values().next().value?.rotation ?? 0;\n\n const session: RotateSession = {\n scene,\n ids,\n turn,\n poseFrame,\n view: ctx.deps.view,\n originPoses,\n startPointerAngle: Math.atan2(ctx.world.y - pivot.y, ctx.world.x - pivot.x),\n theta0,\n snap: beginSnap(ctx, [...new Set([...selection.get(), ...ids])], pivot, theta0),\n behaviors,\n gestureCtx,\n applyOps: ctx.deps.applyOps,\n finish: transformFinisher(ctx.deps),\n selectionMethods: selection.adapterMethods,\n lifecycle: readGestureLifecycle(params, 'Rotate', behaviors),\n };\n return { session, readers };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA+EA,SAAS,eACP,MACA,OACA,KACA,cACA,WACA,OAC2F;CAC3F,MAAM,8BAAc,IAAI,IAAqB;CAC7C,MAAM,0BAAU,IAAI,IAAwB;CAC5C,MAAM,SAAmB,CAAC;CAC1B,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,IAAI,aAAa,EAAE;EACzB,IAAI,CAAC,EAAE,gBAAgB,EAAE,mBAAmB,KAAK,IAAI,MAAM,OAAO;EAClE,YAAY,IAAI,IAAI,KAAK,IAAI;EAI7B,MAAM,QAAQ,UAAU,GAAG,UAAU,MAAM,EAAE,GAAG,YAAY,QAAQ,MAAM,KAAK,KAAK,CAAC,CAAC;EACtF,MAAM,IAAI,EAAE,UAAU,KAAK;EAC3B,QAAQ,IAAI,IAAI;GACd;GACA,QAAQ;IAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;IAAG,GAAG,EAAE,IAAI,EAAE,SAAS;GAAE;GACtD,UAAU,EAAE,cAAc,KAAK,KAAK;EACtC,CAAC;EACD,OAAO,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC;CACnC;CACA,OAAO;EAAE;EAAa;EAAS;CAAO;AACxC;AAEA,SAAS,oBACP,KACA,OACA,SACA,SACA,kBACyB;CACzB,OAAO;EACL,YAAY,CAAC,GAAG,QAAQ,KAAK,CAAC;EAC9B,QAAQ,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAc,EAAE,KAAK,CAAC,CAAC;EACtE,SAAS,IAAI,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,IAAc,EAAE,KAAK,CAAC,CAAC;EACvE,MAAM;EACN,WAAW,EAAE,GAAG,IAAI,UAAU;EAC9B,SAAS,eAAe,IAAI,OAAO,GAAG;EACtC,MAAM,QAAQ,KAAK;EACnB,OAAO,QAAQ,MAAM;EACrB,aAAa,QAAQ;EACrB,QAAQ,mBAAmB,OAAO,IAAI,IAAI;EAC1C,SAAS,mBAAmB,OAAO,QAAW,gBAAgB;EAC9D,SAAS,CAAC;CACZ;AACF;;;AAIA,SAAgB,YACd,OACA,KACA,MACA,OACyF;CACzF,MAAM,OAAO,KAAK;CAClB,MAAM,eAAe,gBAAgB,OAAO,iBAAiB,KAAK,cAAc,CAAC;CAIjF,MAAM,YAAY,eAAe,KAAK;CAGtC,MAAM,EAAE,aAAa,SAAS,WAAW,eAAe,MAAM,OAAO,KAAK,cAAc,WAD1E,WAAW;EAAE,GAAG;EAAM;CAAM,GAAG,SACsD,CAAK;CACxG,IAAI,YAAY,SAAS,GAAG,OAAO;CACnC,MAAM,QAAQ,UAAU,MAAM;CAC9B,OAAO;EACL,MAAM;GACJ;GACA,OAAO;IAAE,GAAG,MAAM,IAAI,MAAM,QAAQ;IAAG,GAAG,MAAM,IAAI,MAAM,SAAS;GAAE;GACrE,eAAe,IAAI,SAAS,KAAK,UAAU;GAC3C;EACF;EACA;EACA;CACF;AACF;;;AAIA,SAAS,UAAU,KAAoB,KAAwB,OAAiC,QAA6B;CAC3H,MAAM,MAAiB;EACrB,SAAS;EAAU;EAAK,OAAO,IAAI;EAAO;EAAO;EAAQ,WAAW,EAAE,MAAM,gBAAgB;CAC9F;CACA,OAAO,IAAI,KAAK,MAAM,MAAM,GAAG,KAAK,aAAa,GAAG;AACtD;;;AAIA,SAAgB,YACd,KACA,MAC4D;CAC5D,MAAM,YAAY,IAAI,KAAK;CAC3B,MAAM,QAAQ,IAAI,KAAK;CACvB,MAAM,SAAS,cAAc,MAAM,MAAM;CACzC,MAAM,YAAa,MAAM,aAAa,CAAC;CAEvC,IAAI,CAAC,aAAa,CAAC,OAAO,OAAO;CAGjC,MAAM,MAAM,aAAa,OAAO,UAAU,IAAI,CAAC;CAC/C,IAAI,IAAI,WAAW,GAAG,OAAO;CAE7B,MAAM,WAAW,YAAY,OAAO,KAAK,IAAI,MAAM,SAAS,aAAa,SAAS,SAAS,OAAO;CAClG,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,EAAE,MAAM,aAAa,cAAc;CACzC,MAAM,EAAE,SAAS,UAAU;CAC3B,MAAM,UAAU,eAAe,IAAI,IAAI;CACvC,MAAM,aAAa,oBAAoB,KAAK,OAAO,SAAS,SAAS,UAAU,cAAc;CAC7F,KAAK,MAAM,KAAK,WAAW,EAAE,UAAU,UAAU;CACjD,MAAM,SAAS,QAAQ,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,YAAY;CAmB1D,OAAO;EAAE;GAhBP;GACA;GACA;GACA;GACA,MAAM,IAAI,KAAK;GACf;GACA,mBAAmB,KAAK,MAAM,IAAI,MAAM,IAAI,MAAM,GAAG,IAAI,MAAM,IAAI,MAAM,CAAC;GAC1E;GACA,MAAM,UAAU,KAAK,CAAC,mBAAG,IAAI,IAAI,CAAC,GAAG,UAAU,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,MAAM;GAC9E;GACA;GACA,UAAU,IAAI,KAAK;GACnB,QAAQ,kBAAkB,IAAI,IAAI;GAClC,kBAAkB,UAAU;GAC5B,WAAW,qBAAqB,QAAQ,UAAU,SAAS;EAEpD;EAAS;CAAQ;AAC5B"}
|
|
@@ -89,13 +89,11 @@ function subtreeIds(scene, id) {
|
|
|
89
89
|
/**
|
|
90
90
|
* The nodes whose stored pose has to change for `ids` to move as a unit: each
|
|
91
91
|
* selected node and its descendants, less any stored in the frame of another
|
|
92
|
-
* node in the set, which that frame carries.
|
|
93
|
-
* nothing is carried and every descendant is written.
|
|
92
|
+
* node in the set, which that frame carries.
|
|
94
93
|
*/
|
|
95
94
|
function translateTargets(scene, frame, ids) {
|
|
96
95
|
const moving = /* @__PURE__ */ new Set();
|
|
97
96
|
for (const root of selectedRoots(scene, ids)) for (const id of subtreeIds(scene, root)) moving.add(id);
|
|
98
|
-
if (frame.pc.closure === "identity") return [...moving];
|
|
99
97
|
return [...moving].filter((id) => {
|
|
100
98
|
const storedIn = frame.frame(id);
|
|
101
99
|
return storedIn === null || !moving.has(storedIn);
|
|
@@ -138,7 +136,7 @@ function translateEach(scene, frame, descriptor, moves, finish, label = "Transla
|
|
|
138
136
|
/** The world translation `(dx, dy)` as a translation of `id`'s stored pose,
|
|
139
137
|
* which under a turned frame points another way. */
|
|
140
138
|
function storedDelta(frame, descriptor, id, dx, dy) {
|
|
141
|
-
if (frame.
|
|
139
|
+
if (frame.frame(id) === null) return {
|
|
142
140
|
dx,
|
|
143
141
|
dy
|
|
144
142
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectionSubtree.js","names":[],"sources":["../../../src/interactions/actions/selectionSubtree.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { PoseFrame } from './poseFrame';\nimport type { TransformFinisher } from './transformFinish';\nimport { createTransformOp } from 'core/ops/transform';\nimport { sceneMutators } from 'core/scene/sceneMutators';\nimport { poseDescriptorForNode, translatePoseViaDescriptor, type PoseDescriptor } from 'core/geometry/poseDescriptor';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** True when any ancestor of `id` is also in `set` — acting on that ancestor\n * already reaches this node, so acting on it again would double it. */\nexport function hasSelectedAncestor(\n parentOf: (id: string) => string | null,\n id: string,\n set: ReadonlySet<string>,\n): boolean {\n return selectedAncestor(parentOf, id, set) !== null;\n}\n\n/** The nearest ancestor of `id` that is in `set`, or `null`. */\nexport function selectedAncestor(\n parentOf: (id: string) => string | null,\n id: string,\n set: ReadonlySet<string>,\n): string | null {\n let parent = parentOf(id);\n while (parent != null) {\n if (set.has(parent)) return parent;\n parent = parentOf(parent);\n }\n return null;\n}\n\n/** The ids in `ids` that are in the scene and have no selected ancestor. */\nexport function selectedRoots(scene: AnyScene, ids: readonly string[]): NodeId[] {\n const set = new Set<string>(ids);\n const parentOf = (id: string) => scene.get(asNodeId(id))?.parent ?? null;\n return ids\n .map((id) => asNodeId(id))\n .filter((id) => scene.get(id) !== undefined && !hasSelectedAncestor(parentOf, id, set));\n}\n\n/** Whether `id` draws a path derived from other nodes. Its pose is a\n * placeholder: the path follows the nodes it derives from. */\nfunction derivesPathOnly(scene: AnyScene, id: string): boolean {\n const node = scene.get(asNodeId(id));\n return node?.derivePath !== undefined && node.derivePose === undefined\n && Array.isArray(node.dependsOn) && node.dependsOn.length > 0;\n}\n\n/**\n * The nodes a translation of `ids` has to act on. A node whose pose is derived\n * from an id list cannot be moved itself, since a pose written to it is\n * overwritten on the next read, so the nodes it derives from stand in for it,\n * through however many derived nodes that takes. A node reached that way which\n * derives only its path — a wire under a label — follows its own dependencies\n * and is not written. Each id appears once, in the order it was first reached.\n */\nexport function moveSources(scene: AnyScene, ids: readonly string[]): string[] {\n const out = new Set<string>();\n const walked = new Set<string>();\n const visit = (id: string, reached: boolean): void => {\n if (walked.has(id)) return;\n walked.add(id);\n if (reached && derivesPathOnly(scene, id)) return;\n const node = scene.get(asNodeId(id));\n const deps = node?.derivePose !== undefined && Array.isArray(node.dependsOn) ? node.dependsOn : [];\n if (deps.length === 0) out.add(id);\n else for (const dep of deps) visit(dep, true);\n };\n for (const id of ids) visit(id, false);\n return [...out];\n}\n\n/**\n * The nodes a resize, rotation, flip, or alignment of `ids` has to write. A\n * node whose pose is derived cannot be written itself, so what it derives\n * from stands in for it — a container's children, or the ids a node names —\n * through however many derived nodes that takes, leaving out one reached that\n * way which derives only its path, as {@link moveSources} does. Each id appears once, in the order it\n * was first reached.\n */\nexport function shapeSources(scene: AnyScene, ids: readonly string[]): string[] {\n const out = new Set<string>();\n const walked = new Set<string>();\n const visit = (id: string, reached: boolean): void => {\n if (walked.has(id)) return;\n walked.add(id);\n if (reached && derivesPathOnly(scene, id)) return;\n const node = scene.get(asNodeId(id));\n const deps = node?.derivePose === undefined\n ? []\n : node.dependsOn === 'children' ? scene.childrenOf(asNodeId(id)) : node.dependsOn ?? [];\n if (deps.length === 0 && node?.dependsOn !== 'children') out.add(id);\n else for (const dep of deps) visit(dep, true);\n };\n for (const id of ids) visit(id, false);\n return [...out];\n}\n\n/** `id` and everything under it, a parent ahead of its children. */\nexport function subtreeIds(scene: AnyScene, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const walk = (at: NodeId): void => {\n out.push(at);\n for (const child of scene.childrenOf(at)) walk(child);\n };\n walk(id);\n return out;\n}\n\n/**\n * The nodes whose stored pose has to change for `ids` to move as a unit: each\n * selected node and its descendants, less any stored in the frame of another\n * node in the set, which that frame carries. With the default absolute poses\n * nothing is carried and every descendant is written.\n */\nexport function translateTargets(\n scene: AnyScene,\n frame: PoseFrame<unknown>,\n ids: readonly string[],\n): NodeId[] {\n const moving = new Set<NodeId>();\n for (const root of selectedRoots(scene, ids)) {\n for (const id of subtreeIds(scene, root)) moving.add(id);\n }\n if (frame.pc.closure === 'identity') return [...moving];\n return [...moving].filter((id) => {\n const storedIn = frame.frame(id);\n return storedIn === null || !moving.has(storedIn);\n });\n}\n\n/**\n * Move each of `moves` by its own delta, taking along whatever has to be\n * written for that node to move as a unit ({@link translateTargets}). Every\n * world pose is read before the first write, so one move cannot shift what a\n * later one reads. Call inside a `scene.batch`.\n */\nexport function translateEach(\n scene: AnyScene,\n frame: PoseFrame<unknown>,\n descriptor: PoseDescriptor<unknown>,\n moves: readonly { id: string; dx: number; dy: number }[],\n finish?: TransformFinisher,\n label = 'Translate',\n): void {\n const writes: { id: NodeId; to: unknown }[] = [];\n const seen = new Set<NodeId>();\n for (const { id, dx, dy } of moves) {\n if (dx === 0 && dy === 0) continue;\n for (const target of translateTargets(scene, frame, [id])) {\n if (seen.has(target)) continue;\n seen.add(target);\n const node = scene.get(target);\n if (!node) continue;\n const d = poseDescriptorForNode(descriptor, node);\n writes.push({ id: target, to: frame.local(target, translatePoseViaDescriptor(frame.world(target), dx, dy, d)) });\n }\n }\n const ops = writes.map(({ id, to }) => createTransformOp({ id, from: scene.get(id)!.pose, to, label }));\n const all = finish && ops.length > 0 ? finish(ops, label) : ops;\n if (!all) return;\n const adapter = sceneMutators(scene);\n for (const op of all) op.apply(adapter);\n}\n\n/** The world translation `(dx, dy)` as a translation of `id`'s stored pose,\n * which under a turned frame points another way. */\nexport function storedDelta(\n frame: PoseFrame<unknown>,\n descriptor: PoseDescriptor<unknown>,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n if (frame.pc.closure === 'identity' || frame.frame(id) === null) return { dx, dy };\n const world = frame.world(id);\n const from = descriptor.getBounds(frame.local(id, world));\n const to = descriptor.getBounds(frame.local(id, translatePoseViaDescriptor(world, dx, dy, descriptor)));\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selectionSubtree.js","names":[],"sources":["../../../src/interactions/actions/selectionSubtree.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { PoseFrame } from './poseFrame';\nimport type { TransformFinisher } from './transformFinish';\nimport { createTransformOp } from 'core/ops/transform';\nimport { sceneMutators } from 'core/scene/sceneMutators';\nimport { poseDescriptorForNode, translatePoseViaDescriptor, type PoseDescriptor } from 'core/geometry/poseDescriptor';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** True when any ancestor of `id` is also in `set` — acting on that ancestor\n * already reaches this node, so acting on it again would double it. */\nexport function hasSelectedAncestor(\n parentOf: (id: string) => string | null,\n id: string,\n set: ReadonlySet<string>,\n): boolean {\n return selectedAncestor(parentOf, id, set) !== null;\n}\n\n/** The nearest ancestor of `id` that is in `set`, or `null`. */\nexport function selectedAncestor(\n parentOf: (id: string) => string | null,\n id: string,\n set: ReadonlySet<string>,\n): string | null {\n let parent = parentOf(id);\n while (parent != null) {\n if (set.has(parent)) return parent;\n parent = parentOf(parent);\n }\n return null;\n}\n\n/** The ids in `ids` that are in the scene and have no selected ancestor. */\nexport function selectedRoots(scene: AnyScene, ids: readonly string[]): NodeId[] {\n const set = new Set<string>(ids);\n const parentOf = (id: string) => scene.get(asNodeId(id))?.parent ?? null;\n return ids\n .map((id) => asNodeId(id))\n .filter((id) => scene.get(id) !== undefined && !hasSelectedAncestor(parentOf, id, set));\n}\n\n/** Whether `id` draws a path derived from other nodes. Its pose is a\n * placeholder: the path follows the nodes it derives from. */\nfunction derivesPathOnly(scene: AnyScene, id: string): boolean {\n const node = scene.get(asNodeId(id));\n return node?.derivePath !== undefined && node.derivePose === undefined\n && Array.isArray(node.dependsOn) && node.dependsOn.length > 0;\n}\n\n/**\n * The nodes a translation of `ids` has to act on. A node whose pose is derived\n * from an id list cannot be moved itself, since a pose written to it is\n * overwritten on the next read, so the nodes it derives from stand in for it,\n * through however many derived nodes that takes. A node reached that way which\n * derives only its path — a wire under a label — follows its own dependencies\n * and is not written. Each id appears once, in the order it was first reached.\n */\nexport function moveSources(scene: AnyScene, ids: readonly string[]): string[] {\n const out = new Set<string>();\n const walked = new Set<string>();\n const visit = (id: string, reached: boolean): void => {\n if (walked.has(id)) return;\n walked.add(id);\n if (reached && derivesPathOnly(scene, id)) return;\n const node = scene.get(asNodeId(id));\n const deps = node?.derivePose !== undefined && Array.isArray(node.dependsOn) ? node.dependsOn : [];\n if (deps.length === 0) out.add(id);\n else for (const dep of deps) visit(dep, true);\n };\n for (const id of ids) visit(id, false);\n return [...out];\n}\n\n/**\n * The nodes a resize, rotation, flip, or alignment of `ids` has to write. A\n * node whose pose is derived cannot be written itself, so what it derives\n * from stands in for it — a container's children, or the ids a node names —\n * through however many derived nodes that takes, leaving out one reached that\n * way which derives only its path, as {@link moveSources} does. Each id appears once, in the order it\n * was first reached.\n */\nexport function shapeSources(scene: AnyScene, ids: readonly string[]): string[] {\n const out = new Set<string>();\n const walked = new Set<string>();\n const visit = (id: string, reached: boolean): void => {\n if (walked.has(id)) return;\n walked.add(id);\n if (reached && derivesPathOnly(scene, id)) return;\n const node = scene.get(asNodeId(id));\n const deps = node?.derivePose === undefined\n ? []\n : node.dependsOn === 'children' ? scene.childrenOf(asNodeId(id)) : node.dependsOn ?? [];\n if (deps.length === 0 && node?.dependsOn !== 'children') out.add(id);\n else for (const dep of deps) visit(dep, true);\n };\n for (const id of ids) visit(id, false);\n return [...out];\n}\n\n/** `id` and everything under it, a parent ahead of its children. */\nexport function subtreeIds(scene: AnyScene, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const walk = (at: NodeId): void => {\n out.push(at);\n for (const child of scene.childrenOf(at)) walk(child);\n };\n walk(id);\n return out;\n}\n\n/**\n * The nodes whose stored pose has to change for `ids` to move as a unit: each\n * selected node and its descendants, less any stored in the frame of another\n * node in the set, which that frame carries.\n */\nexport function translateTargets(\n scene: AnyScene,\n frame: PoseFrame<unknown>,\n ids: readonly string[],\n): NodeId[] {\n const moving = new Set<NodeId>();\n for (const root of selectedRoots(scene, ids)) {\n for (const id of subtreeIds(scene, root)) moving.add(id);\n }\n return [...moving].filter((id) => {\n const storedIn = frame.frame(id);\n return storedIn === null || !moving.has(storedIn);\n });\n}\n\n/**\n * Move each of `moves` by its own delta, taking along whatever has to be\n * written for that node to move as a unit ({@link translateTargets}). Every\n * world pose is read before the first write, so one move cannot shift what a\n * later one reads. Call inside a `scene.batch`.\n */\nexport function translateEach(\n scene: AnyScene,\n frame: PoseFrame<unknown>,\n descriptor: PoseDescriptor<unknown>,\n moves: readonly { id: string; dx: number; dy: number }[],\n finish?: TransformFinisher,\n label = 'Translate',\n): void {\n const writes: { id: NodeId; to: unknown }[] = [];\n const seen = new Set<NodeId>();\n for (const { id, dx, dy } of moves) {\n if (dx === 0 && dy === 0) continue;\n for (const target of translateTargets(scene, frame, [id])) {\n if (seen.has(target)) continue;\n seen.add(target);\n const node = scene.get(target);\n if (!node) continue;\n const d = poseDescriptorForNode(descriptor, node);\n writes.push({ id: target, to: frame.local(target, translatePoseViaDescriptor(frame.world(target), dx, dy, d)) });\n }\n }\n const ops = writes.map(({ id, to }) => createTransformOp({ id, from: scene.get(id)!.pose, to, label }));\n const all = finish && ops.length > 0 ? finish(ops, label) : ops;\n if (!all) return;\n const adapter = sceneMutators(scene);\n for (const op of all) op.apply(adapter);\n}\n\n/** The world translation `(dx, dy)` as a translation of `id`'s stored pose,\n * which under a turned frame points another way. */\nexport function storedDelta(\n frame: PoseFrame<unknown>,\n descriptor: PoseDescriptor<unknown>,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n if (frame.frame(id) === null) return { dx, dy };\n const world = frame.world(id);\n const from = descriptor.getBounds(frame.local(id, world));\n const to = descriptor.getBounds(frame.local(id, translatePoseViaDescriptor(world, dx, dy, descriptor)));\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n"],"mappings":"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"}
|
|
@@ -26,19 +26,14 @@ function resolveSpatialReference(ref, src) {
|
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
28
|
/** The sources an immediate action resolves a reference from. A click's
|
|
29
|
-
* `
|
|
29
|
+
* `world` param outranks the `pointer` dep. */
|
|
30
30
|
function actionReferenceSources(params, pointer, scene, frame, boxes) {
|
|
31
31
|
return {
|
|
32
32
|
pointer: () => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
y: params.worldY
|
|
36
|
-
};
|
|
33
|
+
const world = params?.world;
|
|
34
|
+
if (world) return world;
|
|
37
35
|
const p = pointer?.get();
|
|
38
|
-
return p ?
|
|
39
|
-
x: p.worldX,
|
|
40
|
-
y: p.worldY
|
|
41
|
-
} : null;
|
|
36
|
+
return p ? p.world : null;
|
|
42
37
|
},
|
|
43
38
|
nodeBounds: (id) => scene.get(id) === void 0 ? null : boxes.aabb(id, frame.world(id))
|
|
44
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatialReference.js","names":[],"sources":["../../../src/interactions/actions/spatialReference.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { PointerContextValue } from '@weasel-js/routing/react';\nimport type { PoseFrame } from './poseFrame';\nimport type { DrawnBoxes } from './drawnBoxes';\n\n/**\n * A world-space place a selection transform lines up against — what align\n * aligns to, what flip mirrors about — other than the selection itself:\n *\n * - `'pointer'` — where the pointer is: the click's world point when a click\n * invoked the action, otherwise the latest position in the `pointer` dep.\n * - `{ x, y, width?, height? }` — a world point, or a world rect when it has\n * extent.\n * - `{ node }` — that node's box as drawn (a key object; it does not move).\n */\nexport type SpatialReference =\n | 'pointer'\n | { x: number; y: number; width?: number; height?: number }\n | { node: NodeId };\n\n/** Where `resolveSpatialReference` reads a reference's inputs. */\nexport interface SpatialReferenceSources {\n /** The pointer's world position, or `null` when it is over no canvas. */\n pointer(): { x: number; y: number } | null;\n /** A node's world box as drawn, or `null` when it is not in the scene. */\n nodeBounds(id: NodeId): Bounds | null;\n}\n\n/**\n * The world bounds `ref` names — a point comes back as a zero-size rect — or\n * `null` when it names nothing right now (no pointer, a missing node, a\n * malformed value).\n */\nexport function resolveSpatialReference(\n ref: SpatialReference | unknown,\n src: SpatialReferenceSources,\n): Bounds | null {\n if (ref === 'pointer') {\n const p = src.pointer();\n return p ? { x: p.x, y: p.y, width: 0, height: 0 } : null;\n }\n if (typeof ref !== 'object' || ref === null) return null;\n if ('node' in ref) return src.nodeBounds((ref as { node: NodeId }).node);\n const r = ref as { x?: unknown; y?: unknown; width?: unknown; height?: unknown };\n if (typeof r.x !== 'number' || typeof r.y !== 'number') return null;\n return {\n x: r.x,\n y: r.y,\n width: typeof r.width === 'number' ? r.width : 0,\n height: typeof r.height === 'number' ? r.height : 0,\n };\n}\n\n/** The sources an immediate action resolves a reference from. A click's\n * `
|
|
1
|
+
{"version":3,"file":"spatialReference.js","names":[],"sources":["../../../src/interactions/actions/spatialReference.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { PointerContextValue } from '@weasel-js/routing/react';\nimport type { PoseFrame } from './poseFrame';\nimport type { DrawnBoxes } from './drawnBoxes';\nimport type { ImmediateParams } from '@weasel-js/routing';\n\n/**\n * A world-space place a selection transform lines up against — what align\n * aligns to, what flip mirrors about — other than the selection itself:\n *\n * - `'pointer'` — where the pointer is: the click's world point when a click\n * invoked the action, otherwise the latest position in the `pointer` dep.\n * - `{ x, y, width?, height? }` — a world point, or a world rect when it has\n * extent.\n * - `{ node }` — that node's box as drawn (a key object; it does not move).\n */\nexport type SpatialReference =\n | 'pointer'\n | { x: number; y: number; width?: number; height?: number }\n | { node: NodeId };\n\n/** Where `resolveSpatialReference` reads a reference's inputs. */\nexport interface SpatialReferenceSources {\n /** The pointer's world position, or `null` when it is over no canvas. */\n pointer(): { x: number; y: number } | null;\n /** A node's world box as drawn, or `null` when it is not in the scene. */\n nodeBounds(id: NodeId): Bounds | null;\n}\n\n/**\n * The world bounds `ref` names — a point comes back as a zero-size rect — or\n * `null` when it names nothing right now (no pointer, a missing node, a\n * malformed value).\n */\nexport function resolveSpatialReference(\n ref: SpatialReference | unknown,\n src: SpatialReferenceSources,\n): Bounds | null {\n if (ref === 'pointer') {\n const p = src.pointer();\n return p ? { x: p.x, y: p.y, width: 0, height: 0 } : null;\n }\n if (typeof ref !== 'object' || ref === null) return null;\n if ('node' in ref) return src.nodeBounds((ref as { node: NodeId }).node);\n const r = ref as { x?: unknown; y?: unknown; width?: unknown; height?: unknown };\n if (typeof r.x !== 'number' || typeof r.y !== 'number') return null;\n return {\n x: r.x,\n y: r.y,\n width: typeof r.width === 'number' ? r.width : 0,\n height: typeof r.height === 'number' ? r.height : 0,\n };\n}\n\n/** The sources an immediate action resolves a reference from. A click's\n * `world` param outranks the `pointer` dep. */\nexport function actionReferenceSources(\n params: Record<string, unknown> | undefined,\n pointer: PointerContextValue | undefined,\n scene: Scene<unknown, string, unknown>,\n frame: PoseFrame<unknown>,\n boxes: DrawnBoxes,\n): SpatialReferenceSources {\n return {\n pointer: () => {\n const world = (params as ImmediateParams | undefined)?.world;\n if (world) return world;\n const p = pointer?.get();\n return p ? p.world : null;\n },\n nodeBounds: (id) => (scene.get(id) === undefined\n ? null\n : boxes.aabb(id, frame.world(id))),\n };\n}\n"],"mappings":";;;;;;AAmCA,SAAgB,wBACd,KACA,KACe;CACf,IAAI,QAAQ,WAAW;EACrB,MAAM,IAAI,IAAI,QAAQ;EACtB,OAAO,IAAI;GAAE,GAAG,EAAE;GAAG,GAAG,EAAE;GAAG,OAAO;GAAG,QAAQ;EAAE,IAAI;CACvD;CACA,IAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM,OAAO;CACpD,IAAI,UAAU,KAAK,OAAO,IAAI,WAAY,IAAyB,IAAI;CACvE,MAAM,IAAI;CACV,IAAI,OAAO,EAAE,MAAM,YAAY,OAAO,EAAE,MAAM,UAAU,OAAO;CAC/D,OAAO;EACL,GAAG,EAAE;EACL,GAAG,EAAE;EACL,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;EAC/C,QAAQ,OAAO,EAAE,WAAW,WAAW,EAAE,SAAS;CACpD;AACF;;;AAIA,SAAgB,uBACd,QACA,SACA,OACA,OACA,OACyB;CACzB,OAAO;EACL,eAAe;GACb,MAAM,QAAS,QAAwC;GACvD,IAAI,OAAO,OAAO;GAClB,MAAM,IAAI,SAAS,IAAI;GACvB,OAAO,IAAI,EAAE,QAAQ;EACvB;EACA,aAAa,OAAQ,MAAM,IAAI,EAAE,MAAM,SACnC,OACA,MAAM,KAAK,IAAI,MAAM,MAAM,EAAE,CAAC;CACpC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragRadial.js","names":[],"sources":["../../../../src/interactions/gestures/dragRadial/dragRadial.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { useDragGesture } from '../dragGesture';\nimport type { ModifierState } from '../types';\nimport { dlog } from '../../../debug/flag';\n\n/** A point in world coordinates. */\nexport
|
|
1
|
+
{"version":3,"file":"dragRadial.js","names":[],"sources":["../../../../src/interactions/gestures/dragRadial/dragRadial.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { useDragGesture } from '../dragGesture';\nimport type { ModifierState } from '../types';\nimport type { WorldPoint } from '@weasel-js/routing';\nimport { dlog } from '../../../debug/flag';\n\n/** A point in world coordinates. */\nexport type DragRadialPoint = WorldPoint;\n\n/** A radial drag expressed as its center and the polar coordinates of the\n * cursor relative to it. */\nexport interface DragRadialState {\n center: DragRadialPoint;\n radius: number;\n rotation: number;\n}\n\n/** Live state of a radial drag, handed to each lifecycle callback. */\nexport interface DragRadialCtx<TScratch = unknown> extends DragRadialState {\n modifiers: ModifierState;\n scratch: TScratch;\n}\n\n/** The context handed to `onEnd`, adding whether the final radius is too\n * small to be meaningful. */\nexport interface DragRadialEndCtx<TScratch = unknown> extends DragRadialCtx<TScratch> {\n /** True at end time if the radius is at or below `minRadius`. */\n isSubThreshold: boolean;\n}\n\n/** Options for `useDragRadial`. */\nexport interface UseDragRadialOptions<TScratch = unknown> {\n minRadius?: number;\n initScratch?: () => TScratch;\n onStart?: (ctx: DragRadialCtx<TScratch>) => void;\n onMove?: (ctx: DragRadialCtx<TScratch>) => void;\n onEnd?: (ctx: DragRadialEndCtx<TScratch>) => boolean | void;\n onCancel?: (ctx: DragRadialCtx<TScratch>) => void;\n onGestureStart?: () => void;\n onGestureEnd?: (committed: boolean) => void;\n}\n\n/** Drives a radial drag and publishes the live center/radius/rotation for\n * overlay drawing. */\nexport interface DragRadialController {\n start(worldX: number, worldY: number, modifiers: ModifierState): void;\n move(worldX: number, worldY: number, modifiers: ModifierState): boolean;\n end(): void;\n cancel(): void;\n overlay: DragRadialState | null;\n readonly isActive: boolean;\n}\n\ninterface DragRadialScratch<TConsumer> {\n center: DragRadialPoint;\n current: DragRadialPoint;\n modifiers: ModifierState;\n consumer: TConsumer;\n}\n\nfunction stateFrom(s: DragRadialScratch<unknown>): DragRadialState {\n const dx = s.current.x - s.center.x;\n const dy = s.current.y - s.center.y;\n return {\n center: { ...s.center },\n radius: Math.hypot(dx, dy),\n rotation: dx === 0 && dy === 0 ? 0 : Math.atan2(dy, dx),\n };\n}\n\n/**\n * Radial gesture: pointerdown sets center, pointermove updates radius (Math.hypot\n * of delta) and rotation (Math.atan2 of delta), pointerup commits. Shared by polygon\n * and star tools. Modifier key state is read at end time from `ctx.modifiers`.\n */\nexport function useDragRadial<TScratch = unknown>(\n options: UseDragRadialOptions<TScratch> = {},\n): DragRadialController {\n const optsRef = useLatest(options);\n\n const [overlay, setOverlay] = useState<DragRadialState | null>(null);\n\n const scratchRef = useRef<DragRadialScratch<TScratch> | null>(null);\n\n const writeOverlay = useCallback(() => {\n const s = scratchRef.current;\n if (!s) return;\n setOverlay(stateFrom(s));\n }, []);\n\n const buildCtx = useCallback((): DragRadialCtx<TScratch> => {\n const s = scratchRef.current!;\n const state = stateFrom(s);\n return {\n ...state,\n modifiers: s.modifiers,\n scratch: s.consumer,\n };\n }, []);\n\n const gesture = useDragGesture<DragRadialScratch<TScratch>>({\n initScratch: () => {\n const init = optsRef.current.initScratch\n ? optsRef.current.initScratch()\n : ({} as TScratch);\n return {\n center: { x: 0, y: 0 },\n current: { x: 0, y: 0 },\n modifiers: { shift: false, alt: false, meta: false, ctrl: false },\n consumer: init,\n };\n },\n onStart: (ctx) => {\n const opts = optsRef.current;\n const p: DragRadialPoint = { x: ctx.start.worldX, y: ctx.start.worldY };\n ctx.scratch.center = p;\n ctx.scratch.current = p;\n ctx.scratch.modifiers = ctx.modifiers;\n scratchRef.current = ctx.scratch;\n setOverlay({ center: p, radius: 0, rotation: 0 });\n dlog('drag-radial', 'start', p);\n opts.onStart?.(buildCtx());\n },\n onMove: (ctx) => {\n const opts = optsRef.current;\n ctx.scratch.current = { x: ctx.current.worldX, y: ctx.current.worldY };\n ctx.scratch.modifiers = ctx.modifiers;\n writeOverlay();\n opts.onMove?.(buildCtx());\n },\n onEnd: (ctx) => {\n const opts = optsRef.current;\n const state = stateFrom(ctx.scratch);\n const min = opts.minRadius ?? 0;\n const endCtx: DragRadialEndCtx<TScratch> = {\n ...state,\n modifiers: ctx.scratch.modifiers,\n scratch: ctx.scratch.consumer,\n isSubThreshold: state.radius <= min,\n };\n dlog('drag-radial', 'end', { radius: state.radius, rotation: state.rotation, isSubThreshold: endCtx.isSubThreshold });\n let r: boolean | void;\n try {\n r = opts.onEnd?.(endCtx);\n } finally {\n scratchRef.current = null;\n setOverlay(null);\n }\n return r;\n },\n onCancel: () => {\n dlog('drag-radial', 'cancel');\n optsRef.current.onCancel?.(buildCtx());\n scratchRef.current = null;\n setOverlay(null);\n },\n onGestureStart: () => optsRef.current.onGestureStart?.(),\n onGestureEnd: (committed) => optsRef.current.onGestureEnd?.(committed),\n });\n\n const start = useCallback((worldX: number, worldY: number, modifiers: ModifierState) => {\n gesture.start({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n const move = useCallback((worldX: number, worldY: number, modifiers: ModifierState): boolean => {\n return gesture.move({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n return useMemo<DragRadialController>(() => ({\n start,\n move,\n end: gesture.end,\n cancel: gesture.cancel,\n overlay,\n isActive: overlay !== null,\n }), [start, move, gesture.end, gesture.cancel, overlay]);\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragRect.js","names":[],"sources":["../../../../src/interactions/gestures/dragRect/dragRect.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { useDragGesture } from '../dragGesture';\nimport type { ModifierState } from '../types';\nimport { dlog } from '../../../debug/flag';\n\n/** A point in world coordinates. */\nexport interface DragRectPoint { x: number; y: number }\n/** The axis-aligned box between the drag's two corners, always with\n * non-negative extents regardless of drag direction. */\nexport interface DragRectBounds { x: number; y: number; width: number; height: number }\n\n/** Live state of a rectangle drag, handed to each lifecycle callback. Either\n * corner can be moved mid-gesture, which is how a tool re-anchors a drag\n * without restarting it. */\nexport interface DragRectCtx<TScratch = unknown> {\n start: DragRectPoint;\n current: DragRectPoint;\n bounds: DragRectBounds;\n modifiers: ModifierState;\n scratch: TScratch;\n /** Override the start point mid-gesture. Recomputes bounds and updates the\n * live overlay so the next move (and the end ctx) reflect the new value. */\n setStart(p: DragRectPoint): void;\n /** Override the current point mid-gesture (between start and end). */\n setCurrent(p: DragRectPoint): void;\n}\n\n/** The context handed to `onEnd`, adding whether the final box is too small\n * to be meaningful. */\nexport interface DragRectEndCtx<TScratch = unknown> extends DragRectCtx<TScratch> {\n /** True if the end-time bounds are at or below `minBounds` on either axis.\n * Present-tense state check — distinct from the base's retrospective\n * `wasSubThreshold`. Computed by this wrapper, not by `useDragGesture`. */\n isSubThreshold: boolean;\n}\n\n/** Options for `useDragRect`. */\nexport interface UseDragRectOptions<TScratch = unknown> {\n minBounds?: { width: number; height: number };\n initScratch?: () => TScratch;\n onStart?: (ctx: DragRectCtx<TScratch>) => void;\n onMove?: (ctx: DragRectCtx<TScratch>) => void;\n onEnd?: (ctx: DragRectEndCtx<TScratch>) => boolean | void;\n onCancel?: (ctx: DragRectCtx<TScratch>) => void;\n onGestureStart?: () => void;\n onGestureEnd?: (committed: boolean) => void;\n}\n\n/** Drives a rectangle drag and publishes the live box for overlay drawing. */\nexport interface DragRectController {\n start(worldX: number, worldY: number, modifiers: ModifierState): void;\n move(worldX: number, worldY: number, modifiers: ModifierState): boolean;\n end(): void;\n cancel(): void;\n overlay: { start: DragRectPoint; current: DragRectPoint; bounds: DragRectBounds } | null;\n readonly isActive: boolean;\n}\n\nfunction boundsFrom(start: DragRectPoint, current: DragRectPoint): DragRectBounds {\n return {\n x: Math.min(start.x, current.x),\n y: Math.min(start.y, current.y),\n width: Math.abs(current.x - start.x),\n height: Math.abs(current.y - start.y),\n };\n}\n\ninterface DragRectScratch<TConsumer> {\n start: DragRectPoint;\n current: DragRectPoint;\n modifiers: ModifierState;\n consumer: TConsumer;\n}\n\n/**\n * The gesture \"the user drew a rectangle\": press, drag, release, with the\n * resulting box reported live and at commit.\n *\n * It is a spatial input primitive, not an insert mechanism — what the box\n * means is entirely up to whoever consumes it. Marquee selection, cropping and\n * shape insertion all sit on top of the same gesture.\n */\nexport function useDragRect<TScratch = unknown>(\n options: UseDragRectOptions<TScratch> = {},\n): DragRectController {\n const optsRef = useLatest(options);\n\n const [overlay, setOverlay] = useState<DragRectController['overlay']>(null);\n\n const scratchRef = useRef<DragRectScratch<TScratch> | null>(null);\n\n const writeOverlay = useCallback(() => {\n const s = scratchRef.current;\n if (!s) return;\n setOverlay({\n start: s.start,\n current: s.current,\n bounds: boundsFrom(s.start, s.current),\n });\n }, []);\n\n const buildConsumerCtx = useCallback((): DragRectCtx<TScratch> => {\n const s = scratchRef.current!;\n return {\n get start() { return s.start; },\n get current() { return s.current; },\n get bounds() { return boundsFrom(s.start, s.current); },\n get modifiers() { return s.modifiers; },\n get scratch() { return s.consumer; },\n setStart(p) { s.start = p; writeOverlay(); },\n setCurrent(p) { s.current = p; writeOverlay(); },\n };\n }, [writeOverlay]);\n\n const gesture = useDragGesture<DragRectScratch<TScratch>>({\n initScratch: () => {\n const init = optsRef.current.initScratch\n ? optsRef.current.initScratch()\n : ({} as TScratch);\n return {\n start: { x: 0, y: 0 },\n current: { x: 0, y: 0 },\n modifiers: { shift: false, alt: false, meta: false, ctrl: false },\n consumer: init,\n };\n },\n onStart: (ctx) => {\n const opts = optsRef.current;\n const p: DragRectPoint = { x: ctx.start.worldX, y: ctx.start.worldY };\n dlog('drag-rect', 'start', p);\n ctx.scratch.start = p;\n ctx.scratch.current = p;\n scratchRef.current = ctx.scratch;\n ctx.scratch.modifiers = ctx.modifiers;\n setOverlay({ start: p, current: p, bounds: { x: p.x, y: p.y, width: 0, height: 0 } });\n opts.onStart?.(buildConsumerCtx());\n },\n onMove: (ctx) => {\n const opts = optsRef.current;\n ctx.scratch.current = { x: ctx.current.worldX, y: ctx.current.worldY };\n ctx.scratch.modifiers = ctx.modifiers;\n writeOverlay();\n opts.onMove?.(buildConsumerCtx());\n },\n onEnd: (ctx) => {\n const opts = optsRef.current;\n const min = opts.minBounds ?? { width: 0, height: 0 };\n const b = boundsFrom(ctx.scratch.start, ctx.scratch.current);\n const isSubThreshold = b.width <= min.width || b.height <= min.height;\n const s = ctx.scratch;\n const endCtx: DragRectEndCtx<TScratch> = {\n get start() { return s.start; },\n get current() { return s.current; },\n get bounds() { return boundsFrom(s.start, s.current); },\n get modifiers() { return s.modifiers; },\n get scratch() { return s.consumer; },\n setStart(p) { s.start = p; writeOverlay(); },\n setCurrent(p) { s.current = p; writeOverlay(); },\n isSubThreshold,\n };\n dlog('drag-rect', 'end', { bounds: b, isSubThreshold });\n let r: boolean | void;\n try {\n r = opts.onEnd?.(endCtx);\n } finally {\n scratchRef.current = null;\n setOverlay(null);\n }\n return r;\n },\n onCancel: () => {\n dlog('drag-rect', 'cancel');\n optsRef.current.onCancel?.(buildConsumerCtx());\n scratchRef.current = null;\n setOverlay(null);\n },\n onGestureStart: () => optsRef.current.onGestureStart?.(),\n onGestureEnd: (committed) => optsRef.current.onGestureEnd?.(committed),\n });\n\n const start = useCallback((worldX: number, worldY: number, modifiers: ModifierState) => {\n gesture.start({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n const move = useCallback((worldX: number, worldY: number, modifiers: ModifierState): boolean => {\n return gesture.move({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n return useMemo<DragRectController>(() => ({\n start,\n move,\n end: gesture.end,\n cancel: gesture.cancel,\n overlay,\n isActive: overlay !== null,\n }), [start, move, gesture.end, gesture.cancel, overlay]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dragRect.js","names":[],"sources":["../../../../src/interactions/gestures/dragRect/dragRect.ts"],"sourcesContent":["import { useCallback, useMemo, useRef, useState } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { useDragGesture } from '../dragGesture';\nimport type { ModifierState } from '../types';\nimport type { WorldPoint } from '@weasel-js/routing';\nimport { dlog } from '../../../debug/flag';\n\n/** A point in world coordinates. */\nexport type DragRectPoint = WorldPoint;\n/** The axis-aligned box between the drag's two corners, always with\n * non-negative extents regardless of drag direction. */\nexport interface DragRectBounds { x: number; y: number; width: number; height: number }\n\n/** Live state of a rectangle drag, handed to each lifecycle callback. Either\n * corner can be moved mid-gesture, which is how a tool re-anchors a drag\n * without restarting it. */\nexport interface DragRectCtx<TScratch = unknown> {\n start: DragRectPoint;\n current: DragRectPoint;\n bounds: DragRectBounds;\n modifiers: ModifierState;\n scratch: TScratch;\n /** Override the start point mid-gesture. Recomputes bounds and updates the\n * live overlay so the next move (and the end ctx) reflect the new value. */\n setStart(p: DragRectPoint): void;\n /** Override the current point mid-gesture (between start and end). */\n setCurrent(p: DragRectPoint): void;\n}\n\n/** The context handed to `onEnd`, adding whether the final box is too small\n * to be meaningful. */\nexport interface DragRectEndCtx<TScratch = unknown> extends DragRectCtx<TScratch> {\n /** True if the end-time bounds are at or below `minBounds` on either axis.\n * Present-tense state check — distinct from the base's retrospective\n * `wasSubThreshold`. Computed by this wrapper, not by `useDragGesture`. */\n isSubThreshold: boolean;\n}\n\n/** Options for `useDragRect`. */\nexport interface UseDragRectOptions<TScratch = unknown> {\n minBounds?: { width: number; height: number };\n initScratch?: () => TScratch;\n onStart?: (ctx: DragRectCtx<TScratch>) => void;\n onMove?: (ctx: DragRectCtx<TScratch>) => void;\n onEnd?: (ctx: DragRectEndCtx<TScratch>) => boolean | void;\n onCancel?: (ctx: DragRectCtx<TScratch>) => void;\n onGestureStart?: () => void;\n onGestureEnd?: (committed: boolean) => void;\n}\n\n/** Drives a rectangle drag and publishes the live box for overlay drawing. */\nexport interface DragRectController {\n start(worldX: number, worldY: number, modifiers: ModifierState): void;\n move(worldX: number, worldY: number, modifiers: ModifierState): boolean;\n end(): void;\n cancel(): void;\n overlay: { start: DragRectPoint; current: DragRectPoint; bounds: DragRectBounds } | null;\n readonly isActive: boolean;\n}\n\nfunction boundsFrom(start: DragRectPoint, current: DragRectPoint): DragRectBounds {\n return {\n x: Math.min(start.x, current.x),\n y: Math.min(start.y, current.y),\n width: Math.abs(current.x - start.x),\n height: Math.abs(current.y - start.y),\n };\n}\n\ninterface DragRectScratch<TConsumer> {\n start: DragRectPoint;\n current: DragRectPoint;\n modifiers: ModifierState;\n consumer: TConsumer;\n}\n\n/**\n * The gesture \"the user drew a rectangle\": press, drag, release, with the\n * resulting box reported live and at commit.\n *\n * It is a spatial input primitive, not an insert mechanism — what the box\n * means is entirely up to whoever consumes it. Marquee selection, cropping and\n * shape insertion all sit on top of the same gesture.\n */\nexport function useDragRect<TScratch = unknown>(\n options: UseDragRectOptions<TScratch> = {},\n): DragRectController {\n const optsRef = useLatest(options);\n\n const [overlay, setOverlay] = useState<DragRectController['overlay']>(null);\n\n const scratchRef = useRef<DragRectScratch<TScratch> | null>(null);\n\n const writeOverlay = useCallback(() => {\n const s = scratchRef.current;\n if (!s) return;\n setOverlay({\n start: s.start,\n current: s.current,\n bounds: boundsFrom(s.start, s.current),\n });\n }, []);\n\n const buildConsumerCtx = useCallback((): DragRectCtx<TScratch> => {\n const s = scratchRef.current!;\n return {\n get start() { return s.start; },\n get current() { return s.current; },\n get bounds() { return boundsFrom(s.start, s.current); },\n get modifiers() { return s.modifiers; },\n get scratch() { return s.consumer; },\n setStart(p) { s.start = p; writeOverlay(); },\n setCurrent(p) { s.current = p; writeOverlay(); },\n };\n }, [writeOverlay]);\n\n const gesture = useDragGesture<DragRectScratch<TScratch>>({\n initScratch: () => {\n const init = optsRef.current.initScratch\n ? optsRef.current.initScratch()\n : ({} as TScratch);\n return {\n start: { x: 0, y: 0 },\n current: { x: 0, y: 0 },\n modifiers: { shift: false, alt: false, meta: false, ctrl: false },\n consumer: init,\n };\n },\n onStart: (ctx) => {\n const opts = optsRef.current;\n const p: DragRectPoint = { x: ctx.start.worldX, y: ctx.start.worldY };\n dlog('drag-rect', 'start', p);\n ctx.scratch.start = p;\n ctx.scratch.current = p;\n scratchRef.current = ctx.scratch;\n ctx.scratch.modifiers = ctx.modifiers;\n setOverlay({ start: p, current: p, bounds: { x: p.x, y: p.y, width: 0, height: 0 } });\n opts.onStart?.(buildConsumerCtx());\n },\n onMove: (ctx) => {\n const opts = optsRef.current;\n ctx.scratch.current = { x: ctx.current.worldX, y: ctx.current.worldY };\n ctx.scratch.modifiers = ctx.modifiers;\n writeOverlay();\n opts.onMove?.(buildConsumerCtx());\n },\n onEnd: (ctx) => {\n const opts = optsRef.current;\n const min = opts.minBounds ?? { width: 0, height: 0 };\n const b = boundsFrom(ctx.scratch.start, ctx.scratch.current);\n const isSubThreshold = b.width <= min.width || b.height <= min.height;\n const s = ctx.scratch;\n const endCtx: DragRectEndCtx<TScratch> = {\n get start() { return s.start; },\n get current() { return s.current; },\n get bounds() { return boundsFrom(s.start, s.current); },\n get modifiers() { return s.modifiers; },\n get scratch() { return s.consumer; },\n setStart(p) { s.start = p; writeOverlay(); },\n setCurrent(p) { s.current = p; writeOverlay(); },\n isSubThreshold,\n };\n dlog('drag-rect', 'end', { bounds: b, isSubThreshold });\n let r: boolean | void;\n try {\n r = opts.onEnd?.(endCtx);\n } finally {\n scratchRef.current = null;\n setOverlay(null);\n }\n return r;\n },\n onCancel: () => {\n dlog('drag-rect', 'cancel');\n optsRef.current.onCancel?.(buildConsumerCtx());\n scratchRef.current = null;\n setOverlay(null);\n },\n onGestureStart: () => optsRef.current.onGestureStart?.(),\n onGestureEnd: (committed) => optsRef.current.onGestureEnd?.(committed),\n });\n\n const start = useCallback((worldX: number, worldY: number, modifiers: ModifierState) => {\n gesture.start({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n const move = useCallback((worldX: number, worldY: number, modifiers: ModifierState): boolean => {\n return gesture.move({ worldX, worldY, clientX: worldX, clientY: worldY }, modifiers);\n }, [gesture]);\n\n return useMemo<DragRectController>(() => ({\n start,\n move,\n end: gesture.end,\n cancel: gesture.cancel,\n overlay,\n isActive: overlay !== null,\n }), [start, move, gesture.end, gesture.cancel, overlay]);\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { ANCHOR_HIT_BASE_PX, HANDLE_BASE_PX, ROTATION_HANDLE_BASE_PX } from "./core/device/targets.js";
|
|
2
2
|
import { DEFAULT_VIEW_ANIMATION_MS } from "./core/viewport/useViewAnimation.js";
|
|
3
|
-
import { DEFAULT_SNAP_PX } from "./
|
|
3
|
+
import { DEFAULT_SNAP_PX } from "./domains/snap/session2d.js";
|
|
4
4
|
import { ANCHOR_CLICK_PX } from "./interactions/actions/defaults/anchorEditing.js";
|
|
5
5
|
import { SEGMENT_HIT_PX } from "./interactions/actions/defaults/segmentUnder.js";
|
|
6
|
-
import { ANCHOR_RADIUS_PX, CLOSE_HINT_RADIUS_PX, HANDLE_DOT_RADIUS_PX, PEN_CLOSE_HIT_PX } from "./
|
|
6
|
+
import { ANCHOR_RADIUS_PX, CLOSE_HINT_RADIUS_PX, HANDLE_DOT_RADIUS_PX, PEN_CLOSE_HIT_PX } from "./domains/paths/penPreviewLayer.js";
|
|
7
7
|
import { SLICE_CLOSE_HIT_PX, VERTEX_RADIUS_PX } from "./tools/builtin/slice/useSliceTool.js";
|
|
8
8
|
import { DEFAULT_PICK_TOLERANCE_PX } from "./canvas/SceneCanvas/useSceneSelectTool.js";
|
|
9
9
|
import { DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX, DRAG_THRESHOLD_PX, LONG_PRESS_MS, TAP_THRESHOLD_PX } from "@weasel-js/gestures";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kitSettingsSchema.js","names":[],"sources":["../src/kitSettingsSchema.ts"],"sourcesContent":["import { pref } from '@weasel-js/prefs';\nimport {\n DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX, DRAG_THRESHOLD_PX, LONG_PRESS_MS, TAP_THRESHOLD_PX,\n} from '@weasel-js/gestures';\nimport { ANCHOR_HIT_BASE_PX, HANDLE_BASE_PX, ROTATION_HANDLE_BASE_PX } from 'core/device/targets';\nimport { DEFAULT_VIEW_ANIMATION_MS } from 'core/viewport/useViewAnimation';\nimport { DEFAULT_PICK_TOLERANCE_PX } from 'canvas/SceneCanvas/useSceneSelectTool';\nimport { SEGMENT_HIT_PX } from 'interactions/actions/defaults/segmentUnder';\nimport { ANCHOR_CLICK_PX } from 'interactions/actions/defaults/anchorEditing';\nimport {\n ANCHOR_RADIUS_PX, CLOSE_HINT_RADIUS_PX, HANDLE_DOT_RADIUS_PX, PEN_CLOSE_HIT_PX,\n} from '
|
|
1
|
+
{"version":3,"file":"kitSettingsSchema.js","names":[],"sources":["../src/kitSettingsSchema.ts"],"sourcesContent":["import { pref } from '@weasel-js/prefs';\nimport {\n DOUBLE_CLICK_MAX_MS, DOUBLE_CLICK_MAX_PX, DRAG_THRESHOLD_PX, LONG_PRESS_MS, TAP_THRESHOLD_PX,\n} from '@weasel-js/gestures';\nimport { ANCHOR_HIT_BASE_PX, HANDLE_BASE_PX, ROTATION_HANDLE_BASE_PX } from 'core/device/targets';\nimport { DEFAULT_VIEW_ANIMATION_MS } from 'core/viewport/useViewAnimation';\nimport { DEFAULT_PICK_TOLERANCE_PX } from 'canvas/SceneCanvas/useSceneSelectTool';\nimport { SEGMENT_HIT_PX } from 'interactions/actions/defaults/segmentUnder';\nimport { ANCHOR_CLICK_PX } from 'interactions/actions/defaults/anchorEditing';\nimport {\n ANCHOR_RADIUS_PX, CLOSE_HINT_RADIUS_PX, HANDLE_DOT_RADIUS_PX, PEN_CLOSE_HIT_PX,\n} from 'domains/paths/penPreviewLayer';\nimport { DEFAULT_SNAP_PX } from 'domains/snap/session2d';\nimport { SLICE_CLOSE_HIT_PX, VERTEX_RADIUS_PX } from 'tools/builtin/slice/useSliceTool';\n\nconst ms = { scale: 1, suffix: 'ms' };\nconst px = { scale: 1, suffix: 'px' };\nconst pxLeaf = (name: string, def: number, max = 48) => pref.number(name, def, { unit: px, min: 1, max, step: 0.5 });\nconst msLeaf = (name: string, def: number, min = 50, max = 2000) => pref.number(name, def, { unit: ms, min, max, step: 10 });\n\n/**\n * Core's kit settings — gestures, core's `targets` leaves, and view — as a\n * prefs group whose paths are the `KitSettings` paths. Compose it beside the\n * other packages' groups to build a settings page.\n */\nexport const coreKitSettingsSchema = pref.group('Canvas', {\n gestures: pref.group('Gestures', {\n doubleClickMs: msLeaf('Double-click interval', DOUBLE_CLICK_MAX_MS),\n doubleClickPx: pxLeaf('Double-click distance', DOUBLE_CLICK_MAX_PX),\n longPressMs: msLeaf('Long-press hold', LONG_PRESS_MS),\n tapPx: pxLeaf('Tap travel', TAP_THRESHOLD_PX),\n dragPx: pxLeaf('Drag threshold', DRAG_THRESHOLD_PX),\n keymapUnbound: pref.enum('Keys a keymap does not bind', 'modal', [\n { value: 'modal', label: 'Ignore them' },\n { value: 'cascade', label: 'Close it and pass them on' },\n ]),\n }),\n targets: pref.group('Targets', {\n handlePx: pxLeaf('Selection handle', HANDLE_BASE_PX),\n anchorHitPx: pxLeaf('Anchor reach', ANCHOR_HIT_BASE_PX),\n rotationDistancePx: pxLeaf('Rotation handle distance', ROTATION_HANDLE_BASE_PX, 96),\n segmentHitPx: pxLeaf('Segment reach', SEGMENT_HIT_PX),\n anchorClickPx: pxLeaf('Anchor click reach', ANCHOR_CLICK_PX),\n pickTolerancePx: pref.number('Shape pick slop', DEFAULT_PICK_TOLERANCE_PX, { unit: px, min: 0, max: 24, step: 0.5 }),\n snapPx: pref.number('Snap reach', DEFAULT_SNAP_PX, { unit: px, min: 0, max: 48, step: 0.5 }),\n penAnchorRadiusPx: pxLeaf('Pen anchor dot', ANCHOR_RADIUS_PX, 16),\n penHandleDotRadiusPx: pxLeaf('Pen handle dot', HANDLE_DOT_RADIUS_PX, 16),\n penCloseHintRadiusPx: pxLeaf('Pen close hint', CLOSE_HINT_RADIUS_PX, 24),\n penCloseHitPx: pxLeaf('Pen close reach', PEN_CLOSE_HIT_PX),\n sliceVertexRadiusPx: pxLeaf('Slice vertex dot', VERTEX_RADIUS_PX, 16),\n sliceCloseHitPx: pxLeaf('Slice close reach', SLICE_CLOSE_HIT_PX),\n }),\n view: pref.group('View', {\n animationMs: msLeaf('Camera animation', DEFAULT_VIEW_ANIMATION_MS, 0),\n }),\n});\n"],"mappings":";;;;;;;;;;;;AAeA,IAAM,KAAK;CAAE,OAAO;CAAG,QAAQ;AAAK;AACpC,IAAM,KAAK;CAAE,OAAO;CAAG,QAAQ;AAAK;AACpC,IAAM,UAAU,MAAc,KAAa,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK;CAAE,MAAM;CAAI,KAAK;CAAG;CAAK,MAAM;AAAI,CAAC;AACnH,IAAM,UAAU,MAAc,KAAa,MAAM,IAAI,MAAM,QAAS,KAAK,OAAO,MAAM,KAAK;CAAE,MAAM;CAAI;CAAK;CAAK,MAAM;AAAG,CAAC;;;;;;AAO3H,IAAa,wBAAwB,KAAK,MAAM,UAAU;CACxD,UAAU,KAAK,MAAM,YAAY;EAC/B,eAAe,OAAO,yBAAyB,mBAAmB;EAClE,eAAe,OAAO,yBAAyB,mBAAmB;EAClE,aAAa,OAAO,mBAAmB,aAAa;EACpD,OAAO,OAAO,cAAc,gBAAgB;EAC5C,QAAQ,OAAO,kBAAkB,iBAAiB;EAClD,eAAe,KAAK,KAAK,+BAA+B,SAAS,CAC/D;GAAE,OAAO;GAAS,OAAO;EAAc,GACvC;GAAE,OAAO;GAAW,OAAO;EAA4B,CACzD,CAAC;CACH,CAAC;CACD,SAAS,KAAK,MAAM,WAAW;EAC7B,UAAU,OAAO,oBAAoB,cAAc;EACnD,aAAa,OAAO,gBAAgB,kBAAkB;EACtD,oBAAoB,OAAO,4BAA4B,yBAAyB,EAAE;EAClF,cAAc,OAAO,iBAAiB,cAAc;EACpD,eAAe,OAAO,sBAAsB,eAAe;EAC3D,iBAAiB,KAAK,OAAO,mBAAmB,2BAA2B;GAAE,MAAM;GAAI,KAAK;GAAG,KAAK;GAAI,MAAM;EAAI,CAAC;EACnH,QAAQ,KAAK,OAAO,cAAc,iBAAiB;GAAE,MAAM;GAAI,KAAK;GAAG,KAAK;GAAI,MAAM;EAAI,CAAC;EAC3F,mBAAmB,OAAO,kBAAkB,kBAAkB,EAAE;EAChE,sBAAsB,OAAO,kBAAkB,sBAAsB,EAAE;EACvE,sBAAsB,OAAO,kBAAkB,sBAAsB,EAAE;EACvE,eAAe,OAAO,mBAAmB,gBAAgB;EACzD,qBAAqB,OAAO,oBAAoB,kBAAkB,EAAE;EACpE,iBAAiB,OAAO,qBAAqB,kBAAkB;CACjE,CAAC;CACD,MAAM,KAAK,MAAM,QAAQ,EACvB,aAAa,OAAO,oBAAoB,2BAA2B,CAAC,EACtE,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { FramedBox } from '@weasel-js/geom';
|
|
2
|
-
import { b as RotatedPose } from './poseDescriptor-
|
|
2
|
+
import { b as RotatedPose } from './poseDescriptor-CvSxVhCd.js';
|
|
3
3
|
import '@weasel-js/simulation';
|
|
4
|
-
import './autoPoseDescriptor-
|
|
4
|
+
import './autoPoseDescriptor-C25QVb0W.js';
|
|
5
5
|
|
|
6
6
|
/** AABB center of an unrotated rect — the canonical rotation pivot. */
|
|
7
7
|
declare function aabbCenter(bounds: FramedBox): {
|
package/dist/math.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { DEFAULT_FLATTEN_TOLERANCE, PATH_C, PATH_CMD_LENGTHS, PATH_L, PATH_M, PATH_Q, PATH_Z, Path, PathBuilder, PathFillRule, PolygonPath, RectPath, Point as Vec2, flattenCubic, flattenCubicWithArcLen, flattenQuadratic, flattenQuadraticWithArcLen, pathCommandCoordCount, pointAlongPath, polygonFromPoints, polylineFromPoints, rectPath } from '@weasel-js/geom';
|
|
2
|
-
export { P as PoseDescriptor, t as translatePoseViaDescriptor } from './poseDescriptor-
|
|
2
|
+
export { P as PoseDescriptor, t as translatePoseViaDescriptor } from './poseDescriptor-CvSxVhCd.js';
|
|
3
3
|
export { Simulation, SimulationCore, SimulationForce, SimulationNode, SimulationOptions, createSimulation } from '@weasel-js/simulation';
|
|
4
|
-
export { A as AUTO_POSE_DESCRIPTOR } from './autoPoseDescriptor-
|
|
5
|
-
export { C as CLIP_NOTHING, c as clipNothing, b as rotatePoint } from './math-
|
|
4
|
+
export { A as AUTO_POSE_DESCRIPTOR } from './autoPoseDescriptor-C25QVb0W.js';
|
|
5
|
+
export { C as CLIP_NOTHING, c as clipNothing, b as rotatePoint } from './math-B_unOnF4.js';
|
|
6
6
|
import '@weasel-js/animator';
|
package/dist/move.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export { U as UseMoveOptions } from './options-
|
|
2
|
-
import { S as SnapTarget } from './types-
|
|
3
|
-
import { M as MoveBehavior } from './clone-
|
|
1
|
+
export { U as UseMoveOptions } from './options-DAjkhbcs.js';
|
|
2
|
+
import { S as SnapTarget } from './types-VCtfchp-.js';
|
|
3
|
+
import { M as MoveBehavior } from './clone-Bz4iqGfE.js';
|
|
4
4
|
import { O as OriginProjection } from './originProjection-gY0jb4Wb.js';
|
|
5
|
-
import './types-
|
|
5
|
+
import './types-A_sNJYRd.js';
|
|
6
6
|
import '@weasel-js/geom';
|
|
7
7
|
import '@weasel-js/history';
|
|
8
|
-
import './poseDescriptor-
|
|
8
|
+
import './poseDescriptor-CvSxVhCd.js';
|
|
9
9
|
import '@weasel-js/animator';
|
|
10
|
-
import '@weasel-js/react';
|
|
11
10
|
import '@weasel-js/routing';
|
|
11
|
+
import '@weasel-js/react';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Move behavior that drops the dragged nodes into a container the pointer
|