@weasel-js/core 1.13.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 +300 -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 +15 -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/buildSceneTree.js +5 -3
- package/dist/canvas/buildSceneTree.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 +3 -2
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/surfaceContribution.js.map +1 -1
- package/dist/canvas/useCanvasPaint.js +10 -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-CpIQzKWQ.d.ts → depSchema-C3BwxitB.d.ts} +119 -99
- 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 +1 -1
- 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 +1441 -1050
- 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,6 +1,6 @@
|
|
|
1
1
|
import { toPlane } from "../../../core/viewport/parallax.js";
|
|
2
2
|
import { composeWorldPose } from "../../../core/scene/composeFrame.js";
|
|
3
|
-
import { translatePoseViaDescriptor } from "../../../core/geometry/poseDescriptor.js";
|
|
3
|
+
import { leadUnder, translatePoseViaDescriptor } from "../../../core/geometry/poseDescriptor.js";
|
|
4
4
|
import { planeOf } from "../planeInput.js";
|
|
5
5
|
|
|
6
6
|
//#region src/interactions/actions/move/delta.ts
|
|
@@ -18,18 +18,64 @@ function localDelta(session, id, dx0, dy0) {
|
|
|
18
18
|
const { pc } = session;
|
|
19
19
|
const d = session.descriptorOf(id);
|
|
20
20
|
const from = d.getBounds(pc.decompose(f.frameWorld, f.world));
|
|
21
|
-
const to = d.getBounds(pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d)));
|
|
21
|
+
const to = d.getBounds(pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d, leadFor(session, id, dx0, dy0))));
|
|
22
22
|
return {
|
|
23
23
|
dx: to.x - from.x,
|
|
24
24
|
dy: to.y - from.y
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
+
var leads = /* @__PURE__ */ new WeakMap();
|
|
28
|
+
/** The move's first root, at press and dragged by `(dx0, dy0)`, in world
|
|
29
|
+
* space. Kept for the last drag asked about, since every id asks per frame. */
|
|
30
|
+
function moveLead(session, dx0, dy0) {
|
|
31
|
+
const last = leads.get(session);
|
|
32
|
+
if (last && last.dx0 === dx0 && last.dy0 === dy0) return last;
|
|
33
|
+
const id = session.ids.find((r) => session.startPoses.has(r) && !session.carried.has(r) && !session.caught.has(r));
|
|
34
|
+
let next = {
|
|
35
|
+
dx0,
|
|
36
|
+
dy0,
|
|
37
|
+
dx: dx0,
|
|
38
|
+
dy: dy0,
|
|
39
|
+
lead: null
|
|
40
|
+
};
|
|
41
|
+
if (id !== void 0) {
|
|
42
|
+
const from = session.frames.get(id)?.world ?? session.startPoses.get(id);
|
|
43
|
+
const { dx, dy } = planeDelta(session, id, dx0, dy0);
|
|
44
|
+
next = {
|
|
45
|
+
dx0,
|
|
46
|
+
dy0,
|
|
47
|
+
dx,
|
|
48
|
+
dy,
|
|
49
|
+
lead: {
|
|
50
|
+
from,
|
|
51
|
+
to: translatePoseViaDescriptor(from, dx, dy, session.descriptorOf(id))
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
leads.set(session, next);
|
|
56
|
+
return next;
|
|
57
|
+
}
|
|
58
|
+
/** The lead to translate `id`'s world pose with under the drag `(dx0, dy0)`:
|
|
59
|
+
* the move's first root, when `id` measures the drag as the same delta. */
|
|
60
|
+
function leadFor(session, id, dx0, dy0) {
|
|
61
|
+
if (session.caught.has(id)) return void 0;
|
|
62
|
+
const m = moveLead(session, dx0, dy0);
|
|
63
|
+
if (!m.lead) return void 0;
|
|
64
|
+
const own = planeDelta(session, id, dx0, dy0);
|
|
65
|
+
return own.dx === m.dx && own.dy === m.dy ? m.lead : void 0;
|
|
66
|
+
}
|
|
67
|
+
/** The lead for translating `id`'s stored pose: the world lead, carried into
|
|
68
|
+
* the frame `id` is stored in. */
|
|
69
|
+
function storedLeadFor(session, id, dx0, dy0) {
|
|
70
|
+
const lead = leadFor(session, id, dx0, dy0);
|
|
71
|
+
return lead && leadUnder(session.pc, session.frames.get(id)?.frameWorld ?? null, lead);
|
|
72
|
+
}
|
|
27
73
|
/** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored
|
|
28
74
|
* pose at press. Unmoved when its frame is what moves. */
|
|
29
75
|
function draggedStoredPose(session, id, start, dx, dy) {
|
|
30
76
|
if (session.carried.has(id)) return start;
|
|
31
77
|
const l = localDelta(session, id, dx, dy);
|
|
32
|
-
return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id));
|
|
78
|
+
return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id), storedLeadFor(session, id, dx, dy));
|
|
33
79
|
}
|
|
34
80
|
/** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in
|
|
35
81
|
* the world its own layer stores it in. */
|
|
@@ -65,9 +111,9 @@ function grabbedPoseAdapter(session, adapter) {
|
|
|
65
111
|
function draggedWorldPose(session, adapter, id, delta) {
|
|
66
112
|
const start = composeWorldPose(adapter, id, session.pc.compose);
|
|
67
113
|
const own = planeDelta(session, id, delta.dx, delta.dy);
|
|
68
|
-
return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id));
|
|
114
|
+
return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id), leadFor(session, id, delta.dx, delta.dy));
|
|
69
115
|
}
|
|
70
116
|
|
|
71
117
|
//#endregion
|
|
72
|
-
export { draggedStoredPose, draggedWorldPose, grabbedPoseAdapter, localDelta, planeDelta };
|
|
118
|
+
export { draggedStoredPose, draggedWorldPose, grabbedPoseAdapter, localDelta, planeDelta, storedLeadFor };
|
|
73
119
|
//# sourceMappingURL=delta.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delta.js","names":[],"sources":["../../../../src/interactions/actions/move/delta.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, type PoseAdapter } from 'core/scene/composePose';\nimport { planeOf } from '../planeInput';\nimport type { MoveSession } from './session';\n\n/**\n * The world drag `(dx, dy)` as a translation of `id`'s stored pose. A pose is\n * stored in its frame, so under a turned frame the two point different ways.\n */\nexport function localDelta(\n session: MoveSession,\n id: NodeId,\n dx0: number,\n dy0: number,\n): { dx: number; dy: number } {\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n const f = session.frames.get(id);\n if (f === undefined) return { dx, dy };\n const { pc } = session;\n const d = session.descriptorOf(id);\n const from = d.getBounds(pc.decompose(f.frameWorld, f.world));\n const to = d.getBounds(\n pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d)),\n );\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n\n/** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored\n * pose at press. Unmoved when its frame is what moves. */\nexport function draggedStoredPose(session: MoveSession, id: NodeId, start: unknown, dx: number, dy: number): unknown {\n if (session.carried.has(id)) return start;\n const l = localDelta(session, id, dx, dy);\n return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id));\n}\n\n/** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in\n * the world its own layer stores it in. */\nexport function planeDelta(\n session: MoveSession,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n const layer = session.scene.get(id)?.layer;\n const ref = layer === undefined ? undefined : session.planeRefs.get(layer);\n if (!ref) return { dx, dy };\n const out = planeOf(session.view, layer!);\n const at = { x: ref.edited.x + dx, y: ref.edited.y + dy };\n const p = out ? toPlane(out, at) : at;\n return { dx: p.x - ref.own.x, dy: p.y - ref.own.y };\n}\n\n/** `adapter`, except that an id caught mid-glide answers with the pose it was\n * grabbed at — where the drag measures it from. */\nexport function grabbedPoseAdapter(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n): PoseAdapter<unknown> {\n if (session.caught.size === 0) return adapter;\n return {\n ...adapter,\n getPose: (id) => (session.caught.has(id as NodeId)\n ? session.startPoses.get(id as NodeId)\n : adapter.getPose(id)),\n };\n}\n\n/** The world pose `id` was dragged to: its pose at press composed up through\n * `adapter`, moved by the drag as its own layer's plane measures it. */\nexport function draggedWorldPose(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n id: NodeId,\n delta: { dx: number; dy: number },\n): unknown {\n const start = composeWorldPose(adapter, id as string, session.pc.compose);\n const own = planeDelta(session, id, delta.dx, delta.dy);\n return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id));\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,WACd,SACA,IACA,KACA,KAC4B;CAC5B,MAAM,EAAE,IAAI,OAAO,WAAW,SAAS,IAAI,KAAK,GAAG;CACnD,MAAM,IAAI,QAAQ,OAAO,IAAI,EAAE;CAC/B,IAAI,MAAM,QAAW,OAAO;EAAE;EAAI;CAAG;CACrC,MAAM,EAAE,OAAO;CACf,MAAM,IAAI,QAAQ,aAAa,EAAE;CACjC,MAAM,OAAO,EAAE,UAAU,GAAG,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC;CAC5D,MAAM,KAAK,EAAE,UACX,GAAG,UAAU,EAAE,YAAY,2BAA2B,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"delta.js","names":[],"sources":["../../../../src/interactions/actions/move/delta.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { leadUnder, translatePoseViaDescriptor, type TranslateLead } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, type PoseAdapter } from 'core/scene/composePose';\nimport { planeOf } from '../planeInput';\nimport type { MoveSession } from './session';\n\n/**\n * The world drag `(dx, dy)` as a translation of `id`'s stored pose. A pose is\n * stored in its frame, so under a turned frame the two point different ways.\n */\nexport function localDelta(\n session: MoveSession,\n id: NodeId,\n dx0: number,\n dy0: number,\n): { dx: number; dy: number } {\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n const f = session.frames.get(id);\n if (f === undefined) return { dx, dy };\n const { pc } = session;\n const d = session.descriptorOf(id);\n const from = d.getBounds(pc.decompose(f.frameWorld, f.world));\n const to = d.getBounds(\n pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d, leadFor(session, id, dx0, dy0))),\n );\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n\ninterface MoveLead {\n readonly dx0: number;\n readonly dy0: number;\n /** The lead's own delta, as its layer's plane measures the drag. */\n readonly dx: number;\n readonly dy: number;\n readonly lead: TranslateLead<unknown> | null;\n}\n\nconst leads = new WeakMap<MoveSession, MoveLead>();\n\n/** The move's first root, at press and dragged by `(dx0, dy0)`, in world\n * space. Kept for the last drag asked about, since every id asks per frame. */\nfunction moveLead(session: MoveSession, dx0: number, dy0: number): MoveLead {\n const last = leads.get(session);\n if (last && last.dx0 === dx0 && last.dy0 === dy0) return last;\n const id = session.ids.find((r) =>\n session.startPoses.has(r) && !session.carried.has(r) && !session.caught.has(r));\n let next: MoveLead = { dx0, dy0, dx: dx0, dy: dy0, lead: null };\n if (id !== undefined) {\n const from = session.frames.get(id)?.world ?? session.startPoses.get(id);\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n next = { dx0, dy0, dx, dy, lead: { from, to: translatePoseViaDescriptor(from, dx, dy, session.descriptorOf(id)) } };\n }\n leads.set(session, next);\n return next;\n}\n\n/** The lead to translate `id`'s world pose with under the drag `(dx0, dy0)`:\n * the move's first root, when `id` measures the drag as the same delta. */\nfunction leadFor(session: MoveSession, id: NodeId, dx0: number, dy0: number): TranslateLead<unknown> | undefined {\n if (session.caught.has(id)) return undefined;\n const m = moveLead(session, dx0, dy0);\n if (!m.lead) return undefined;\n const own = planeDelta(session, id, dx0, dy0);\n return own.dx === m.dx && own.dy === m.dy ? m.lead : undefined;\n}\n\n/** The lead for translating `id`'s stored pose: the world lead, carried into\n * the frame `id` is stored in. */\nexport function storedLeadFor(session: MoveSession, id: NodeId, dx0: number, dy0: number): TranslateLead<unknown> | undefined {\n const lead = leadFor(session, id, dx0, dy0);\n return lead && leadUnder(session.pc, session.frames.get(id)?.frameWorld ?? null, lead);\n}\n\n/** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored\n * pose at press. Unmoved when its frame is what moves. */\nexport function draggedStoredPose(session: MoveSession, id: NodeId, start: unknown, dx: number, dy: number): unknown {\n if (session.carried.has(id)) return start;\n const l = localDelta(session, id, dx, dy);\n return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id), storedLeadFor(session, id, dx, dy));\n}\n\n/** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in\n * the world its own layer stores it in. */\nexport function planeDelta(\n session: MoveSession,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n const layer = session.scene.get(id)?.layer;\n const ref = layer === undefined ? undefined : session.planeRefs.get(layer);\n if (!ref) return { dx, dy };\n const out = planeOf(session.view, layer!);\n const at = { x: ref.edited.x + dx, y: ref.edited.y + dy };\n const p = out ? toPlane(out, at) : at;\n return { dx: p.x - ref.own.x, dy: p.y - ref.own.y };\n}\n\n/** `adapter`, except that an id caught mid-glide answers with the pose it was\n * grabbed at — where the drag measures it from. */\nexport function grabbedPoseAdapter(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n): PoseAdapter<unknown> {\n if (session.caught.size === 0) return adapter;\n return {\n ...adapter,\n getPose: (id) => (session.caught.has(id as NodeId)\n ? session.startPoses.get(id as NodeId)\n : adapter.getPose(id)),\n };\n}\n\n/** The world pose `id` was dragged to: its pose at press composed up through\n * `adapter`, moved by the drag as its own layer's plane measures it. */\nexport function draggedWorldPose(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n id: NodeId,\n delta: { dx: number; dy: number },\n): unknown {\n const start = composeWorldPose(adapter, id as string, session.pc.compose);\n const own = planeDelta(session, id, delta.dx, delta.dy);\n return translatePoseViaDescriptor(\n start, own.dx, own.dy, session.descriptorOf(id), leadFor(session, id, delta.dx, delta.dy),\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { draggedStoredPose } from "./delta.js";
|
|
2
2
|
import { pointerStateOf } from "../pointerState.js";
|
|
3
|
-
import { snapMods } from "../../../
|
|
3
|
+
import { snapMods } from "../../../domains/snap/roles.js";
|
|
4
4
|
|
|
5
5
|
//#region src/interactions/actions/move/frame.ts
|
|
6
6
|
function foldBehaviors(session, readers, moveCtx, dx, dy) {
|
|
7
7
|
const posed = /* @__PURE__ */ new Map();
|
|
8
8
|
const opaque = /* @__PURE__ */ new Set();
|
|
9
|
+
const overlays = [];
|
|
9
10
|
const gctx = session.gestureCtx;
|
|
10
11
|
gctx.modifiers = { ...moveCtx.modifiers };
|
|
11
12
|
gctx.pointer = pointerStateOf(moveCtx.drag.current, moveCtx);
|
|
@@ -22,6 +23,7 @@ function foldBehaviors(session, readers, moveCtx, dx, dy) {
|
|
|
22
23
|
if (!r) continue;
|
|
23
24
|
if (r.poses) for (const [id, pose] of r.poses) posed.set(id, pose);
|
|
24
25
|
if (r.opaque) for (const id of r.opaque) opaque.add(id);
|
|
26
|
+
if (r.overlays) overlays.push(...r.overlays);
|
|
25
27
|
if (r.transform) transform = r.transform;
|
|
26
28
|
if (r.snap !== void 0) gctx.snap = r.snap;
|
|
27
29
|
}
|
|
@@ -29,7 +31,8 @@ function foldBehaviors(session, readers, moveCtx, dx, dy) {
|
|
|
29
31
|
dx: transform.dx,
|
|
30
32
|
dy: transform.dy,
|
|
31
33
|
posed,
|
|
32
|
-
opaque
|
|
34
|
+
opaque,
|
|
35
|
+
overlays
|
|
33
36
|
};
|
|
34
37
|
}
|
|
35
38
|
/** The pointer's delta, moved so the subject lands on what the snap session
|
|
@@ -55,7 +58,7 @@ function snapDelta(session, moveCtx) {
|
|
|
55
58
|
* behaviors posed. */
|
|
56
59
|
function nextFrame(session, readers, moveCtx) {
|
|
57
60
|
const snapped = snapDelta(session, moveCtx);
|
|
58
|
-
const { dx, dy, posed, opaque } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);
|
|
61
|
+
const { dx, dy, posed, opaque, overlays } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);
|
|
59
62
|
const delta = {
|
|
60
63
|
dx,
|
|
61
64
|
dy
|
|
@@ -69,7 +72,8 @@ function nextFrame(session, readers, moveCtx) {
|
|
|
69
72
|
return {
|
|
70
73
|
delta,
|
|
71
74
|
previews,
|
|
72
|
-
opaque
|
|
75
|
+
opaque,
|
|
76
|
+
overlays
|
|
73
77
|
};
|
|
74
78
|
}
|
|
75
79
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/move/frame.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { BehaviorResult, GroupTransform } from '../../gestures/types';\nimport { draggedStoredPose } from './delta';\nimport { snapMods } from '
|
|
1
|
+
{"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/move/frame.ts"],"sourcesContent":["import type { InvocationCtx, OngoingOverlay } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { BehaviorResult, GroupTransform } from '../../gestures/types';\nimport { draggedStoredPose } from './delta';\nimport { snapMods } from 'domains/snap/roles';\nimport type { MoveFrame, MoveSession } from './session';\n\nfunction foldBehaviors(\n session: MoveSession,\n readers: GestureReaders,\n moveCtx: InvocationCtx,\n dx: number,\n dy: number,\n): { dx: number; dy: number; posed: Map<NodeId, unknown>; opaque: Set<NodeId>; overlays: OngoingOverlay[] } {\n const posed = new Map<NodeId, unknown>();\n const opaque = new Set<NodeId>();\n const overlays: OngoingOverlay[] = [];\n const gctx = session.gestureCtx;\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.drag!.current, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n // `current` is pre-populated from the raw cursor delta BEFORE\n // any behavior shapes `transform`. Unlike `onEnd`, it is NOT\n // refreshed after each behavior runs — so onMove behaviors\n // should derive position from `origin` + the `proposed`\n // GroupTransform arg, NOT from `ctx.current` (which reflects\n // the unmodified delta at this frame's start).\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n let transform: GroupTransform = { kind: 'translate', dx, dy };\n for (const b of session.behaviors) {\n const r: BehaviorResult<unknown> | void = b.onMove?.(gctx, transform);\n if (!r) continue;\n if (r.poses) for (const [id, pose] of r.poses) posed.set(id as NodeId, pose);\n if (r.opaque) for (const id of r.opaque) opaque.add(id as NodeId);\n if (r.overlays) overlays.push(...r.overlays);\n if (r.transform) transform = r.transform;\n if (r.snap !== undefined) gctx.snap = r.snap;\n }\n return { dx: transform.dx, dy: transform.dy, posed, opaque, overlays };\n}\n\n/** The pointer's delta, moved so the subject lands on what the snap session\n * holds it to. */\nfunction snapDelta(session: MoveSession, moveCtx: InvocationCtx): { dx: number; dy: number } {\n const d = moveCtx.drag!.delta;\n if (!session.snap) return { dx: d.x, dy: d.y };\n const { press } = session;\n const out = session.snap.at({ x: press.x + d.x, y: press.y + d.y }, snapMods(moveCtx));\n return { dx: out.point.x - press.x, dy: out.point.y - press.y };\n}\n\n/** One move's delta and previews: the pointer's delta as the behaviors shaped\n * it, every displaced id's stored pose under it, and whatever else the\n * behaviors posed. */\nexport function nextFrame(session: MoveSession, readers: GestureReaders, moveCtx: InvocationCtx): MoveFrame {\n const snapped = snapDelta(session, moveCtx);\n const { dx, dy, posed, opaque, overlays } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);\n\n // The delta stays in the frame — no scene writes, no history entries.\n const delta = { dx, dy };\n // Every displaced id's pose (roots + cascade), published to the scene's\n // overrides by the action.\n const previews = new Map<NodeId, unknown>();\n for (const [id, ori] of session.startPoses) {\n const dragged = draggedStoredPose(session, id, ori, dx, dy);\n previews.set(id, session.carried.has(id) ? dragged : posed.get(id) ?? dragged);\n }\n for (const [id, pose] of posed) if (!session.startPoses.has(id)) previews.set(id, pose);\n return { delta, previews, opaque, overlays };\n}\n"],"mappings":";;;;;AASA,SAAS,cACP,SACA,SACA,SACA,IACA,IAC0G;CAC1G,MAAM,wBAAQ,IAAI,IAAqB;CACvC,MAAM,yBAAS,IAAI,IAAY;CAC/B,MAAM,WAA6B,CAAC;CACpC,MAAM,OAAO,QAAQ;CACrB,KAAK,YAAY,EAAE,GAAG,QAAQ,UAAU;CACxC,KAAK,UAAU,eAAe,QAAQ,KAAM,SAAS,OAAO;CAC5D,KAAK,OAAO,QAAQ,KAAK;CACzB,KAAK,QAAQ,QAAQ,MAAM;CAO3B,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAC9B,KAAK,QAAQ,IAAI,IAAc,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;CAE5E,IAAI,YAA4B;EAAE,MAAM;EAAa;EAAI;CAAG;CAC5D,KAAK,MAAM,KAAK,QAAQ,WAAW;EACjC,MAAM,IAAoC,EAAE,SAAS,MAAM,SAAS;EACpE,IAAI,CAAC,GAAG;EACR,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,OAAO,MAAM,IAAI,IAAc,IAAI;EAC3E,IAAI,EAAE,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,OAAO,IAAI,EAAY;EAChE,IAAI,EAAE,UAAU,SAAS,KAAK,GAAG,EAAE,QAAQ;EAC3C,IAAI,EAAE,WAAW,YAAY,EAAE;EAC/B,IAAI,EAAE,SAAS,QAAW,KAAK,OAAO,EAAE;CAC1C;CACA,OAAO;EAAE,IAAI,UAAU;EAAI,IAAI,UAAU;EAAI;EAAO;EAAQ;CAAS;AACvE;;;AAIA,SAAS,UAAU,SAAsB,SAAoD;CAC3F,MAAM,IAAI,QAAQ,KAAM;CACxB,IAAI,CAAC,QAAQ,MAAM,OAAO;EAAE,IAAI,EAAE;EAAG,IAAI,EAAE;CAAE;CAC7C,MAAM,EAAE,UAAU;CAClB,MAAM,MAAM,QAAQ,KAAK,GAAG;EAAE,GAAG,MAAM,IAAI,EAAE;EAAG,GAAG,MAAM,IAAI,EAAE;CAAE,GAAG,SAAS,OAAO,CAAC;CACrF,OAAO;EAAE,IAAI,IAAI,MAAM,IAAI,MAAM;EAAG,IAAI,IAAI,MAAM,IAAI,MAAM;CAAE;AAChE;;;;AAKA,SAAgB,UAAU,SAAsB,SAAyB,SAAmC;CAC1G,MAAM,UAAU,UAAU,SAAS,OAAO;CAC1C,MAAM,EAAE,IAAI,IAAI,OAAO,QAAQ,aAAa,cAAc,SAAS,SAAS,SAAS,QAAQ,IAAI,QAAQ,EAAE;CAG3G,MAAM,QAAQ;EAAE;EAAI;CAAG;CAGvB,MAAM,2BAAW,IAAI,IAAqB;CAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAAY;EAC1C,MAAM,UAAU,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE;EAC1D,SAAS,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,IAAI,UAAU,MAAM,IAAI,EAAE,KAAK,OAAO;CAC/E;CACA,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,GAAG,SAAS,IAAI,IAAI,IAAI;CACtF,OAAO;EAAE;EAAO;EAAU;EAAQ;CAAS;AAC7C"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { toPlane } from "../../../../core/viewport/parallax.js";
|
|
2
|
-
import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
|
|
2
|
+
import { childFrameAt, composeWorldPose } from "../../../../core/scene/composeFrame.js";
|
|
3
3
|
import { poseDescriptorForNode } from "../../../../core/geometry/poseDescriptor.js";
|
|
4
|
-
import {
|
|
4
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
5
5
|
import { planeOf } from "../../planeInput.js";
|
|
6
|
+
import { boxOf, containerView, draggedInView } from "./view.js";
|
|
6
7
|
import { carryDragged } from "./dragged.js";
|
|
8
|
+
import { refusalOf } from "../../dropVerdict.js";
|
|
7
9
|
import { pointInPath } from "@weasel-js/geom";
|
|
8
10
|
|
|
9
11
|
//#region src/interactions/actions/move/layout/container.ts
|
|
@@ -55,7 +57,7 @@ function pickContainer(session, dragged, center) {
|
|
|
55
57
|
if (!layoutDep) return null;
|
|
56
58
|
const scene = session.scene;
|
|
57
59
|
const pc = session.pc;
|
|
58
|
-
const poseAdapter =
|
|
60
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
59
61
|
const d = session.projection;
|
|
60
62
|
const draggedIds = new Set(dragged.map((c) => c.id));
|
|
61
63
|
const candidates = [];
|
|
@@ -76,25 +78,33 @@ function pickContainer(session, dragged, center) {
|
|
|
76
78
|
const node = scene.get(id);
|
|
77
79
|
if (!node) return;
|
|
78
80
|
const worldPose = composeWorldPose(poseAdapter, id, pc.compose);
|
|
79
|
-
const
|
|
81
|
+
const g = poseDescriptorForNode(d, node);
|
|
82
|
+
const worldAABB = g.getBounds(worldPose);
|
|
80
83
|
const plane = planeOf(session.view, node.layer);
|
|
81
84
|
const at = plane ? toPlane(plane, center) : center;
|
|
82
85
|
if (!testInside(id, worldPose, worldAABB, layout, at)) return;
|
|
83
|
-
|
|
84
|
-
if (
|
|
86
|
+
const verdict = session.verdict(id);
|
|
87
|
+
if (verdict === false) return;
|
|
88
|
+
const refused = refusalOf(verdict);
|
|
89
|
+
const view = containerView(pc, g, worldPose);
|
|
90
|
+
const content = boxOf(g, view.toStrategy(childFrameAt(poseAdapter, id, worldPose)));
|
|
91
|
+
if (refused === null && layout.acceptsDrop) {
|
|
85
92
|
const arg = {
|
|
86
93
|
id,
|
|
87
|
-
bounds:
|
|
94
|
+
bounds: content
|
|
88
95
|
};
|
|
89
|
-
for (const c of dragged) if (!layout.acceptsDrop(arg, carryDragged(session, c, plane).arg)) return;
|
|
96
|
+
for (const c of dragged) if (!layout.acceptsDrop(arg, draggedInView(view, carryDragged(session, c, plane).arg))) return;
|
|
90
97
|
}
|
|
91
98
|
candidates.push({
|
|
92
99
|
id,
|
|
93
100
|
bounds: worldAABB,
|
|
101
|
+
content,
|
|
102
|
+
view,
|
|
94
103
|
layout,
|
|
95
104
|
zPath,
|
|
96
105
|
depth: zPath.length,
|
|
97
|
-
plane
|
|
106
|
+
plane,
|
|
107
|
+
...refused !== null ? { refused } : {}
|
|
98
108
|
});
|
|
99
109
|
};
|
|
100
110
|
const walk = (parentId, parentPath) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/container.ts"],"sourcesContent":["import { pointInPath } from '@weasel-js/geom';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"container.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/container.ts"],"sourcesContent":["import { pointInPath } from '@weasel-js/geom';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { childFrameAt, composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { DropRegion, LayoutContainer, LayoutStrategy } from '../../../../layout/types';\nimport type { LayoutDep } from '../../depSchema';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { carryDragged, type DraggedChild } from './dragged';\nimport { refusalOf } from '../../dropVerdict';\nimport type { StrategyView } from 'core/scene/strategyView';\nimport { boxOf, containerView, draggedInView } from './view';\n\nexport interface Bounds4 { x: number; y: number; width: number; height: number }\nexport function pointInBounds(b: Bounds4, at: { x: number; y: number }): boolean {\n return at.x >= b.x && at.x < b.x + b.width && at.y >= b.y && at.y < b.y + b.height;\n}\n\ntype Layout = LayoutStrategy<unknown>;\nexport interface Candidate {\n id: NodeId;\n /** The container's body in world: what the pointer is tested against. */\n bounds: Bounds4;\n /** Its content's frame, `bounds` moved by its scroll offset, in `view`'s\n * space: the `LayoutContainer.bounds` its strategy is handed, so the slots\n * it places agree with its children as they are shown. */\n content: Bounds4;\n /** The container as its strategy sees it: upright, in its own frame. */\n view: StrategyView<unknown>;\n layout: LayoutStrategy<unknown>;\n zPath: number[];\n depth: number;\n /** The edited plane into this container's. */\n plane: PlaneMap | null;\n /** The reason it refuses the drop, when it does: it still blocks the containers around it. */\n refused?: string;\n}\n\n/** Whether a world point falls in a drop region, which is authored relative to\n * the top-left of the container's world bounds. */\nfunction regionContains(\n region: DropRegion,\n bounds: { x: number; y: number },\n point: { x: number; y: number },\n): boolean {\n const local = { x: point.x - bounds.x, y: point.y - bounds.y };\n return typeof region === 'function'\n ? region(local)\n : pointInPath(region, local.x, local.y);\n}\n\nfunction chooseContainer(\n scene: Scene<unknown, string, unknown>,\n mode: NonNullable<LayoutDep['dropTarget']>,\n candidates: readonly Candidate[],\n): Candidate | null {\n let dest: Candidate | null = null;\n if (mode === 'topmost') {\n // Painted last wins, in the scene's own render order — which crosses\n // subtrees and layers, where a sibling-index path cannot.\n const byId = new Map<NodeId, Candidate>(candidates.map((c) => [c.id, c]));\n for (const id of scene.renderOrder()) dest = byId.get(id) ?? dest;\n } else {\n // Deepest wins; sibling-index path breaks ties (higher z = later index).\n for (const c of candidates) {\n if (dest === null) { dest = c; continue; }\n if (c.depth > dest.depth) { dest = c; continue; }\n if (c.depth < dest.depth) continue;\n let cAfter = false;\n for (let i = 0; i < c.zPath.length; i++) {\n if (c.zPath[i] > dest.zPath[i]) { cAfter = true; break; }\n if (c.zPath[i] < dest.zPath[i]) { cAfter = false; break; }\n }\n if (cAfter) dest = c;\n }\n }\n return dest;\n}\n\n/** The layout container that takes the drop at `center`, or null. */\nexport function pickContainer(\n session: MoveSession,\n dragged: readonly DraggedChild[],\n center: { x: number; y: number },\n): Candidate | null {\n const layoutDep = session.layout;\n if (!layoutDep) return null;\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const d = session.projection;\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const candidates: Candidate[] = [];\n const mode = layoutDep.dropTarget ?? 'innermost';\n const testInside = (\n id: NodeId, cPose: unknown, aabb: Bounds4, layout: Layout, at: { x: number; y: number },\n ): boolean => {\n const region = layout.dropRegion?.({ id: id as string, bounds: aabb }) ?? null;\n if (region) return regionContains(region, aabb, at);\n if (mode === 'region') return false;\n if (layout.contains) return layout.contains(cPose, at);\n return pointInBounds(aabb, at);\n };\n const consider = (id: NodeId, zPath: number[]): void => {\n const layout = layoutDep.getLayout(id as string);\n if (!layout) return;\n const node = scene.get(id);\n if (!node) return;\n const worldPose = composeWorldPose(poseAdapter, id as string, pc.compose);\n const g = poseDescriptorForNode(d, node);\n const worldAABB = g.getBounds(worldPose);\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n if (!testInside(id, worldPose, worldAABB, layout, at)) return;\n const verdict = session.verdict(id);\n if (verdict === false) return;\n const refused = refusalOf(verdict);\n const view = containerView(pc, g, worldPose);\n const content = boxOf(g, view.toStrategy(childFrameAt(poseAdapter, id as string, worldPose)));\n if (refused === null && layout.acceptsDrop) {\n const arg: LayoutContainer = { id: id as string, bounds: content };\n for (const c of dragged) {\n if (!layout.acceptsDrop(arg, draggedInView(view, carryDragged(session, c, plane).arg))) return;\n }\n }\n candidates.push({\n id,\n bounds: worldAABB,\n content,\n view,\n layout,\n zPath,\n depth: zPath.length,\n plane,\n ...(refused !== null ? { refused } : {}),\n });\n };\n const walk = (parentId: NodeId | null, parentPath: number[]): void => {\n const childIds = parentId === null ? scene.roots : scene.childrenOf(parentId);\n for (let i = 0; i < childIds.length; i++) {\n // A dragged root's subtree goes with it: dropping into one of its own\n // descendants would reparent it under itself.\n if (draggedIds.has(childIds[i])) continue;\n const childPath = [...parentPath, i];\n consider(childIds[i], childPath);\n walk(childIds[i], childPath);\n }\n };\n walk(null, []);\n\n return chooseContainer(scene, mode, candidates);\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toPlane } from "../../../../core/viewport/parallax.js";
|
|
2
2
|
import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
|
|
3
3
|
import { poseDescriptorForNode, translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
|
|
4
|
-
import {
|
|
4
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
5
5
|
import { carryPose, invertPlane, planeOf } from "../../planeInput.js";
|
|
6
6
|
import { grabbedPoseAdapter, planeDelta } from "../delta.js";
|
|
7
7
|
|
|
@@ -10,7 +10,7 @@ import { grabbedPoseAdapter, planeDelta } from "../delta.js";
|
|
|
10
10
|
function gatherDragged(session, delta) {
|
|
11
11
|
const scene = session.scene;
|
|
12
12
|
const pc = session.pc;
|
|
13
|
-
const poseAdapter =
|
|
13
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
14
14
|
const { dx, dy } = delta;
|
|
15
15
|
const d = session.projection;
|
|
16
16
|
const grabAdapter = grabbedPoseAdapter(session, poseAdapter);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dragged.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dragged.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"dragged.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dragged.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutDragged } from '../../../../layout/types';\nimport { carryPose, invertPlane, planeOf } from '../../planeInput';\nimport { grabbedPoseAdapter, planeDelta } from '../delta';\nimport type { MoveSession } from '../session';\n\nexport interface DraggedChild {\n id: NodeId;\n arg: LayoutDragged<unknown>;\n center: { x: number; y: number };\n}\n\n/** Each dragged root in world, in the edited plane. */\nexport function gatherDragged(session: MoveSession, delta: { dx: number; dy: number }): DraggedChild[] {\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const { dx, dy } = delta;\n // Each dragged preview in WORLD: compose the committed start pose up the\n // parent chain, then add the world drag delta (same math as `applyReparent`).\n // The LayoutStrategy contract is world-framed, so every pose handed to it\n // below is composed to world; reflow results are rebased back to local.\n // A selection spanning planes is gathered in the edited plane, and handed\n // to each container carried into the plane that container is stored in.\n const d = session.projection;\n const grabAdapter = grabbedPoseAdapter(session, poseAdapter);\n const dragged: DraggedChild[] = [];\n for (const id of session.ids) {\n const node = scene.get(id);\n if (!node) continue;\n const startWorld = composeWorldPose(grabAdapter, id as string, pc.compose);\n const g = poseDescriptorForNode(d, node);\n const own = planeDelta(session, id, dx, dy);\n const toEdited = invertPlane(planeOf(session.view, node.layer));\n const world = carryPose(g, translatePoseViaDescriptor(startWorld, own.dx, own.dy, g), toEdited);\n const b = g.getBounds(world);\n dragged.push({\n id,\n arg: {\n id: id as string,\n originPose: carryPose(g, startWorld, toEdited),\n pose: world,\n sourceContainerId: (node.parent ?? null) as string | null,\n },\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n });\n }\n return dragged;\n}\n\n/** `c` carried into the plane `m` maps to; `c` itself when `m` is null. */\nexport function carryDragged(session: MoveSession, c: DraggedChild, m: PlaneMap | null): DraggedChild {\n const { scene, projection: d } = session;\n if (m === null) return c;\n const g = poseDescriptorForNode(d, scene.get(c.id)!);\n return {\n id: c.id,\n arg: { ...c.arg, originPose: carryPose(g, c.arg.originPose, m), pose: carryPose(g, c.arg.pose, m) },\n center: toPlane(m, c.center),\n };\n}\n\n/** Center of the bounds of everything dragged. */\nexport function selectionCenter(session: MoveSession, dragged: readonly DraggedChild[]): { x: number; y: number } {\n const d = session.projection;\n // The selection lands as a unit, so one point decides the container: the\n // center of the whole dragged group. Hit-testing each child on its own\n // would scatter a selection straddling two containers.\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const c of dragged) {\n const b = d.getBounds(c.arg.pose);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,cAAc,SAAsB,OAAmD;CACrG,MAAM,QAAQ,QAAQ;CACtB,MAAM,KAAK,QAAQ;CACnB,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,EAAE,IAAI,OAAO;CAOnB,MAAM,IAAI,QAAQ;CAClB,MAAM,cAAc,mBAAmB,SAAS,WAAW;CAC3D,MAAM,UAA0B,CAAC;CACjC,KAAK,MAAM,MAAM,QAAQ,KAAK;EAC5B,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,aAAa,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACzE,MAAM,IAAI,sBAAsB,GAAG,IAAI;EACvC,MAAM,MAAM,WAAW,SAAS,IAAI,IAAI,EAAE;EAC1C,MAAM,WAAW,YAAY,QAAQ,QAAQ,MAAM,KAAK,KAAK,CAAC;EAC9D,MAAM,QAAQ,UAAU,GAAG,2BAA2B,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,QAAQ;EAC9F,MAAM,IAAI,EAAE,UAAU,KAAK;EAC3B,QAAQ,KAAK;GACX;GACA,KAAK;IACC;IACJ,YAAY,UAAU,GAAG,YAAY,QAAQ;IAC7C,MAAM;IACN,mBAAoB,KAAK,UAAU;GACrC;GACA,QAAQ;IAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;IAAG,GAAG,EAAE,IAAI,EAAE,SAAS;GAAE;EACxD,CAAC;CACH;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,SAAsB,GAAiB,GAAkC;CACpG,MAAM,EAAE,OAAO,YAAY,MAAM;CACjC,IAAI,MAAM,MAAM,OAAO;CACvB,MAAM,IAAI,sBAAsB,GAAG,MAAM,IAAI,EAAE,EAAE,CAAE;CACnD,OAAO;EACL,IAAI,EAAE;EACN,KAAK;GAAE,GAAG,EAAE;GAAK,YAAY,UAAU,GAAG,EAAE,IAAI,YAAY,CAAC;GAAG,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAC;EAAE;EAClG,QAAQ,QAAQ,GAAG,EAAE,MAAM;CAC7B;AACF;;AAGA,SAAgB,gBAAgB,SAAsB,SAA4D;CAChH,MAAM,IAAI,QAAQ;CAIlB,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI;EAChC,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK;EACnC,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM;CACtC;CACA,OAAO;EAAE,IAAI,OAAO,QAAQ;EAAG,IAAI,OAAO,QAAQ;CAAE;AACtD"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { toPlane } from "../../../../core/viewport/parallax.js";
|
|
2
2
|
import { composeWorldPose, rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
|
|
3
|
-
import { translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
|
|
4
|
-
import {
|
|
3
|
+
import { poseDescriptorForNode, translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
|
|
4
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
5
5
|
import { carriedDescendants, sceneCarrySource } from "../../../../core/scene/carryDescendants.js";
|
|
6
6
|
import { asNodeId } from "../../../../core/scene/types.js";
|
|
7
|
+
import { boxOf, containerView, draggedInView, pointInView } from "./view.js";
|
|
7
8
|
import { carryDragged, gatherDragged, selectionCenter } from "./dragged.js";
|
|
8
9
|
import { pickContainer } from "./container.js";
|
|
9
10
|
|
|
@@ -28,12 +29,12 @@ function groupBySourceContainer(dragged, exclude) {
|
|
|
28
29
|
* any of them: a container that cannot take every member takes none. */
|
|
29
30
|
function placeAll(session, dest, container, dragged, probeOffset) {
|
|
30
31
|
const { scene, pc } = session;
|
|
31
|
-
const poseAdapter =
|
|
32
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
32
33
|
const draggedIds = new Set(dragged.map((c) => c.id));
|
|
33
|
-
const layout = dest
|
|
34
|
+
const { layout, view } = dest;
|
|
34
35
|
const working = scene.childrenOf(dest.id).map((cid) => ({
|
|
35
36
|
id: cid,
|
|
36
|
-
pose: composeWorldPose(poseAdapter, cid, pc.compose)
|
|
37
|
+
pose: view.toStrategy(composeWorldPose(poseAdapter, cid, pc.compose))
|
|
37
38
|
}));
|
|
38
39
|
const setWorking = (id, pose) => {
|
|
39
40
|
const at = working.findIndex((c) => c.id === id);
|
|
@@ -51,25 +52,28 @@ function placeAll(session, dest, container, dragged, probeOffset) {
|
|
|
51
52
|
const destPlane = dest.plane;
|
|
52
53
|
for (const edited of dragged) {
|
|
53
54
|
const dc = carryDragged(session, edited, destPlane);
|
|
55
|
+
const arg = draggedInView(view, dc.arg);
|
|
54
56
|
const children = working.map((c) => ({ ...c }));
|
|
55
|
-
const targets = layout.getDropTargets(container, children,
|
|
57
|
+
const targets = layout.getDropTargets(container, children, arg);
|
|
56
58
|
const probe = {
|
|
57
59
|
x: edited.center.x + probeOffset.x,
|
|
58
60
|
y: edited.center.y + probeOffset.y
|
|
59
61
|
};
|
|
60
|
-
const
|
|
62
|
+
const g = poseDescriptorForNode(session.projection, scene.get(edited.id));
|
|
63
|
+
const at = pointInView(view, g, dc.arg.pose, destPlane ? toPlane(destPlane, probe) : probe);
|
|
64
|
+
const target = layout.snap.pickTarget(targets, at);
|
|
61
65
|
if (!target) return null;
|
|
62
66
|
placements.push({
|
|
63
|
-
dragged:
|
|
67
|
+
dragged: arg,
|
|
64
68
|
children,
|
|
65
69
|
target
|
|
66
70
|
});
|
|
67
|
-
const poses = layout.reflowPoses(container, children,
|
|
71
|
+
const poses = layout.reflowPoses(container, children, arg, target);
|
|
68
72
|
for (const [cid, pose] of poses) {
|
|
69
73
|
setWorking(cid, pose);
|
|
70
|
-
if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), pose);
|
|
74
|
+
if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), view.toWorld(pose));
|
|
71
75
|
}
|
|
72
|
-
setWorking(
|
|
76
|
+
setWorking(arg.id, poses.get(arg.id) ?? target.pose);
|
|
73
77
|
}
|
|
74
78
|
return {
|
|
75
79
|
placements,
|
|
@@ -79,7 +83,7 @@ function placeAll(session, dest, container, dragged, probeOffset) {
|
|
|
79
83
|
/** World poses of the leftovers that moved in each container the selection left. */
|
|
80
84
|
function sourceReflow(session, dragged, destId) {
|
|
81
85
|
const { scene, pc, projection: d } = session;
|
|
82
|
-
const poseAdapter =
|
|
86
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
83
87
|
const sourceReflow = /* @__PURE__ */ new Map();
|
|
84
88
|
const layoutDep = session.layout;
|
|
85
89
|
if (!layoutDep) return sourceReflow;
|
|
@@ -90,15 +94,18 @@ function sourceReflow(session, dragged, destId) {
|
|
|
90
94
|
const srcLayout = layoutDep.getLayout(srcId);
|
|
91
95
|
const srcNode = scene.get(asNodeId(srcId));
|
|
92
96
|
if (!srcLayout || !srcNode) continue;
|
|
97
|
+
const g = poseDescriptorForNode(d, srcNode);
|
|
98
|
+
const view = containerView(pc, g, composeWorldPose(poseAdapter, srcId, pc.compose));
|
|
93
99
|
const srcContainer = {
|
|
94
100
|
id: srcId,
|
|
95
|
-
bounds:
|
|
101
|
+
bounds: boxOf(g, view.upright)
|
|
96
102
|
};
|
|
97
103
|
const srcChildren = scene.childrenOf(asNodeId(srcId)).filter((cid) => !leaving.has(cid)).map((cid) => ({
|
|
98
104
|
id: cid,
|
|
99
|
-
pose: composeWorldPose(poseAdapter, cid, pc.compose)
|
|
105
|
+
pose: view.toStrategy(composeWorldPose(poseAdapter, cid, pc.compose))
|
|
100
106
|
}));
|
|
101
|
-
for (const [cid,
|
|
107
|
+
for (const [cid, placed] of srcLayout.childPoses(srcContainer, srcChildren)) {
|
|
108
|
+
const pose = view.toWorld(placed);
|
|
102
109
|
const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));
|
|
103
110
|
const next = d.getBounds(pose);
|
|
104
111
|
if (cur.x === next.x && cur.y === next.y && cur.width === next.width && cur.height === next.height) continue;
|
|
@@ -110,7 +117,7 @@ function sourceReflow(session, dragged, destId) {
|
|
|
110
117
|
/** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */
|
|
111
118
|
function reflowCarry(session, id, world, moving) {
|
|
112
119
|
const { scene, pc, projection: d } = session;
|
|
113
|
-
const a = d.getBounds(composeWorldPose(
|
|
120
|
+
const a = d.getBounds(composeWorldPose(sceneViewPoseAdapter(scene), id, pc.compose));
|
|
114
121
|
const b = d.getBounds(world);
|
|
115
122
|
const dx = b.x - a.x;
|
|
116
123
|
const dy = b.y - a.y;
|
|
@@ -121,7 +128,7 @@ function reflowCarry(session, id, world, moving) {
|
|
|
121
128
|
function runDropPass(session, delta, pointer) {
|
|
122
129
|
if (!session.layout) return null;
|
|
123
130
|
const { scene, pc } = session;
|
|
124
|
-
const poseAdapter =
|
|
131
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
125
132
|
const dragged = gatherDragged(session, delta);
|
|
126
133
|
if (dragged.length === 0) return null;
|
|
127
134
|
const dropCenter = selectionCenter(session, dragged);
|
|
@@ -135,9 +142,19 @@ function runDropPass(session, delta, pointer) {
|
|
|
135
142
|
pass: null,
|
|
136
143
|
reflow: /* @__PURE__ */ new Map()
|
|
137
144
|
};
|
|
145
|
+
if (dest.refused !== void 0) return {
|
|
146
|
+
dropCenter,
|
|
147
|
+
pass: null,
|
|
148
|
+
reflow: /* @__PURE__ */ new Map(),
|
|
149
|
+
refused: {
|
|
150
|
+
id: dest.id,
|
|
151
|
+
bounds: dest.bounds,
|
|
152
|
+
reason: dest.refused
|
|
153
|
+
}
|
|
154
|
+
};
|
|
138
155
|
const container = {
|
|
139
156
|
id: dest.id,
|
|
140
|
-
bounds: dest.
|
|
157
|
+
bounds: dest.content
|
|
141
158
|
};
|
|
142
159
|
const placed = placeAll(session, dest, container, dragged, probeOffset);
|
|
143
160
|
if (!placed) return {
|
|
@@ -168,6 +185,7 @@ function runDropPass(session, delta, pointer) {
|
|
|
168
185
|
pass: {
|
|
169
186
|
layout: dest.layout,
|
|
170
187
|
container,
|
|
188
|
+
view: dest.view,
|
|
171
189
|
placements: placed.placements,
|
|
172
190
|
sourceReflow: leftovers,
|
|
173
191
|
reflowIds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropPass.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dropPass.ts"],"sourcesContent":["import { asNodeId, type NodeId } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, rebaseLocalPose } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport { carriedDescendants, sceneCarrySource } from 'core/scene/carryDescendants';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport type { LayoutChild, LayoutContainer } from '../../../../layout/types';\nimport type { MoveSession } from '../session';\nimport { pickContainer, type Candidate } from './container';\nimport { carryDragged, gatherDragged, selectionCenter, type DraggedChild } from './dragged';\nimport type { DropPass, LayoutPlacement } from './types';\n\n/** Dragged ids grouped by the container they are leaving, skipping any that\n * stay put (`exclude` is the destination) or that had no container. */\nexport function groupBySourceContainer(\n dragged: ReadonlyArray<{ id: NodeId; sourceContainerId: string | null }>,\n exclude: string | null,\n): Map<string, Set<NodeId>> {\n const out = new Map<string, Set<NodeId>>();\n for (const d of dragged) {\n const src = d.sourceContainerId;\n if (!src || src === exclude) continue;\n let set = out.get(src);\n if (!set) { set = new Set<NodeId>(); out.set(src, set); }\n set.add(d.id);\n }\n return out;\n}\n\n/** Place each dragged child in `dest` in turn. Null when the snap rejects\n * any of them: a container that cannot take every member takes none. */\nfunction placeAll(\n session: MoveSession,\n dest: Candidate,\n container: LayoutContainer,\n dragged: readonly DraggedChild[],\n probeOffset: { x: number; y: number },\n): { placements: LayoutPlacement[]; destReflow: Map<NodeId, unknown> } | null {\n const { scene, pc } = session;\n const poseAdapter = scenePoseAdapter(scene);\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const layout = dest.layout;\n // The container state the placements run against, advanced by each one.\n const working: LayoutChild<unknown>[] = scene.childrenOf(dest.id).map((cid) => ({\n id: cid as string,\n pose: composeWorldPose(poseAdapter, cid as string, pc.compose),\n }));\n const setWorking = (id: string, pose: unknown): void => {\n const at = working.findIndex((c) => c.id === id);\n if (at >= 0) working[at] = { id, pose };\n else working.push({ id, pose });\n };\n\n const placements: LayoutPlacement[] = [];\n const destReflow = new Map<NodeId, unknown>();\n const destPlane = dest.plane;\n for (const edited of dragged) {\n const dc = carryDragged(session, edited, destPlane);\n const children = working.map((c) => ({ ...c }));\n const targets = layout.getDropTargets(container, children, dc.arg);\n const probe = { x: edited.center.x + probeOffset.x, y: edited.center.y + probeOffset.y };\n const target = layout.snap.pickTarget(targets, destPlane ? toPlane(destPlane, probe) : probe);\n // All-or-nothing: a container that cannot take every member takes none\n // rather than splitting the selection between two homes.\n if (!target) return null;\n placements.push({ dragged: dc.arg, children, target });\n const poses = layout.reflowPoses(container, children, dc.arg, target);\n for (const [cid, pose] of poses) {\n setWorking(cid, pose);\n if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), pose);\n }\n setWorking(dc.arg.id, poses.get(dc.arg.id) ?? target.pose);\n }\n return { placements, destReflow };\n}\n\n/** World poses of the leftovers that moved in each container the selection left. */\nfunction sourceReflow(\n session: MoveSession, dragged: readonly DraggedChild[], destId: string,\n): Map<string, unknown> {\n const { scene, pc, projection: d } = session;\n const poseAdapter = scenePoseAdapter(scene);\n // Source reflow (cross-container) → fold changed leftovers into previews.\n // One pass per container the selection left behind, with everything that\n // left it withdrawn at once.\n const sourceReflow = new Map<string, unknown>();\n const layoutDep = session.layout;\n if (!layoutDep) return sourceReflow;\n for (const [srcId, leaving] of groupBySourceContainer(dragged.map((c) => ({\n id: c.id,\n sourceContainerId: c.arg.sourceContainerId,\n })), destId)) {\n const srcLayout = layoutDep.getLayout(srcId);\n const srcNode = scene.get(asNodeId(srcId));\n if (!srcLayout || !srcNode) continue;\n const srcContainer: LayoutContainer = {\n id: srcId,\n bounds: d.getBounds(composeWorldPose(poseAdapter, srcId, pc.compose)),\n };\n const srcChildren: LayoutChild<unknown>[] = scene.childrenOf(asNodeId(srcId))\n .filter((cid) => !leaving.has(cid))\n .map((cid) => ({\n id: cid as string,\n pose: composeWorldPose(poseAdapter, cid as string, pc.compose),\n }));\n for (const [cid, pose] of srcLayout.childPoses(srcContainer, srcChildren)) {\n const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));\n const next = d.getBounds(pose);\n const same = cur.x === next.x && cur.y === next.y\n && cur.width === next.width && cur.height === next.height;\n if (same) continue;\n sourceReflow.set(cid, pose); // WORLD — rebased at each consumption point\n }\n }\n return sourceReflow;\n}\n\n/** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */\nfunction reflowCarry(\n session: MoveSession, id: NodeId, world: unknown, moving: (id: NodeId) => boolean,\n): Map<NodeId, unknown> {\n const { scene, pc, projection: d } = session;\n const a = d.getBounds(composeWorldPose(scenePoseAdapter(scene), id as string, pc.compose));\n const b = d.getBounds(world);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (dx === 0 && dy === 0) return new Map();\n return carriedDescendants(sceneCarrySource(scene), id, (pose) => translatePoseViaDescriptor(pose, dx, dy, d), moving);\n}\n\n/** One frame's layout result, or null with no layout dep or nothing dragged. */\nexport function runDropPass(\n session: MoveSession,\n delta: { dx: number; dy: number },\n pointer: { x: number; y: number },\n): DropPass | null {\n if (!session.layout) return null;\n const { scene, pc } = session;\n const poseAdapter = scenePoseAdapter(scene);\n const dragged = gatherDragged(session, delta);\n if (dragged.length === 0) return null;\n const dropCenter = selectionCenter(session, dragged);\n // Each child is snapped at its own position, displaced by however far the\n // pointer sits from that center — the group keeps its shape, and a lone\n // child is still probed at the pointer itself.\n const probeOffset = {\n x: pointer.x - dropCenter.x,\n y: pointer.y - dropCenter.y,\n };\n\n const dest = pickContainer(session, dragged, dropCenter);\n if (!dest) return { dropCenter, pass: null, reflow: new Map() };\n\n const container: LayoutContainer = { id: dest.id as string, bounds: dest.bounds };\n const placed = placeAll(session, dest, container, dragged, probeOffset);\n if (!placed) return { dropCenter, pass: null, reflow: new Map() };\n\n // Destination reflow → fold into previews (the dragged children keep their\n // pointer-following ghosts). `reflowPoses` returns world; previews are\n // local, so rebase to the child's current parent frame first.\n const reflow = new Map<NodeId, unknown>();\n const reflowIds = new Set<NodeId>();\n for (const [cid, pose] of placed.destReflow) {\n const parent = scene.get(cid)?.parent ?? null;\n reflow.set(cid, rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(cid);\n }\n\n const leftovers = sourceReflow(session, dragged, container.id);\n for (const [cid, pose] of leftovers) {\n const parent = scene.get(asNodeId(cid))?.parent ?? null;\n reflow.set(asNodeId(cid), rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(asNodeId(cid));\n }\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n for (const [cid, pose] of [...placed.destReflow, ...leftovers] as [string, unknown][]) {\n for (const [id, carried] of reflowCarry(session, asNodeId(cid), pose, (d) => reflow.has(d) || draggedIds.has(d))) {\n reflow.set(id, carried);\n reflowIds.add(id);\n }\n }\n\n return {\n dropCenter,\n pass: { layout: dest.layout, container, placements: placed.placements, sourceReflow: leftovers, reflowIds },\n reflow,\n };\n}\n"],"mappings":";;;;;;;;;;;;AAcA,SAAgB,uBACd,SACA,SAC0B;CAC1B,MAAM,sBAAM,IAAI,IAAyB;CACzC,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,MAAM,EAAE;EACd,IAAI,CAAC,OAAO,QAAQ,SAAS;EAC7B,IAAI,MAAM,IAAI,IAAI,GAAG;EACrB,IAAI,CAAC,KAAK;GAAE,sBAAM,IAAI,IAAY;GAAG,IAAI,IAAI,KAAK,GAAG;EAAG;EACxD,IAAI,IAAI,EAAE,EAAE;CACd;CACA,OAAO;AACT;;;AAIA,SAAS,SACP,SACA,MACA,WACA,SACA,aAC4E;CAC5E,MAAM,EAAE,OAAO,OAAO;CACtB,MAAM,cAAc,iBAAiB,KAAK;CAC1C,MAAM,aAAa,IAAI,IAAY,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC;CAC3D,MAAM,SAAS,KAAK;CAEpB,MAAM,UAAkC,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC,KAAK,SAAS;EAC9E,IAAI;EACJ,MAAM,iBAAiB,aAAa,KAAe,GAAG,OAAO;CAC/D,EAAE;CACF,MAAM,cAAc,IAAY,SAAwB;EACtD,MAAM,KAAK,QAAQ,WAAW,MAAM,EAAE,OAAO,EAAE;EAC/C,IAAI,MAAM,GAAG,QAAQ,MAAM;GAAE;GAAI;EAAK;OACjC,QAAQ,KAAK;GAAE;GAAI;EAAK,CAAC;CAChC;CAEA,MAAM,aAAgC,CAAC;CACvC,MAAM,6BAAa,IAAI,IAAqB;CAC5C,MAAM,YAAY,KAAK;CACvB,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,KAAK,aAAa,SAAS,QAAQ,SAAS;EAClD,MAAM,WAAW,QAAQ,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;EAC9C,MAAM,UAAU,OAAO,eAAe,WAAW,UAAU,GAAG,GAAG;EACjE,MAAM,QAAQ;GAAE,GAAG,OAAO,OAAO,IAAI,YAAY;GAAG,GAAG,OAAO,OAAO,IAAI,YAAY;EAAE;EACvF,MAAM,SAAS,OAAO,KAAK,WAAW,SAAS,YAAY,QAAQ,WAAW,KAAK,IAAI,KAAK;EAG5F,IAAI,CAAC,QAAQ,OAAO;EACpB,WAAW,KAAK;GAAE,SAAS,GAAG;GAAK;GAAU;EAAO,CAAC;EACrD,MAAM,QAAQ,OAAO,YAAY,WAAW,UAAU,GAAG,KAAK,MAAM;EACpE,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO;GAC/B,WAAW,KAAK,IAAI;GACpB,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,CAAC,GAAG,WAAW,IAAI,SAAS,GAAG,GAAG,IAAI;EACxE;EACA,WAAW,GAAG,IAAI,IAAI,MAAM,IAAI,GAAG,IAAI,EAAE,KAAK,OAAO,IAAI;CAC3D;CACA,OAAO;EAAE;EAAY;CAAW;AAClC;;AAGA,SAAS,aACP,SAAsB,SAAkC,QAClC;CACtB,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,cAAc,iBAAiB,KAAK;CAI1C,MAAM,+BAAe,IAAI,IAAqB;CAC9C,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,WAAW,OAAO;CACvB,KAAK,MAAM,CAAC,OAAO,YAAY,uBAAuB,QAAQ,KAAK,OAAO;EACxE,IAAI,EAAE;EACN,mBAAmB,EAAE,IAAI;CAC3B,EAAE,GAAG,MAAM,GAAG;EACZ,MAAM,YAAY,UAAU,UAAU,KAAK;EAC3C,MAAM,UAAU,MAAM,IAAI,SAAS,KAAK,CAAC;EACzC,IAAI,CAAC,aAAa,CAAC,SAAS;EAC5B,MAAM,eAAgC;GACpC,IAAI;GACJ,QAAQ,EAAE,UAAU,iBAAiB,aAAa,OAAO,GAAG,OAAO,CAAC;EACtE;EACA,MAAM,cAAsC,MAAM,WAAW,SAAS,KAAK,CAAC,CAAC,CAC1E,QAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAClC,KAAK,SAAS;GACb,IAAI;GACJ,MAAM,iBAAiB,aAAa,KAAe,GAAG,OAAO;EAC/D,EAAE;EACJ,KAAK,MAAM,CAAC,KAAK,SAAS,UAAU,WAAW,cAAc,WAAW,GAAG;GACzE,MAAM,MAAM,EAAE,UAAU,iBAAiB,aAAa,KAAK,GAAG,OAAO,CAAC;GACtE,MAAM,OAAO,EAAE,UAAU,IAAI;GAG7B,IAFa,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAC3C,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,QAC3C;GACV,aAAa,IAAI,KAAK,IAAI;EAC5B;CACF;CACA,OAAO;AACT;;AAGA,SAAS,YACP,SAAsB,IAAY,OAAgB,QAC5B;CACtB,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,IAAI,EAAE,UAAU,iBAAiB,iBAAiB,KAAK,GAAG,IAAc,GAAG,OAAO,CAAC;CACzF,MAAM,IAAI,EAAE,UAAU,KAAK;CAC3B,MAAM,KAAK,EAAE,IAAI,EAAE;CACnB,MAAM,KAAK,EAAE,IAAI,EAAE;CACnB,IAAI,OAAO,KAAK,OAAO,GAAG,uBAAO,IAAI,IAAI;CACzC,OAAO,mBAAmB,iBAAiB,KAAK,GAAG,KAAK,SAAS,2BAA2B,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM;AACtH;;AAGA,SAAgB,YACd,SACA,OACA,SACiB;CACjB,IAAI,CAAC,QAAQ,QAAQ,OAAO;CAC5B,MAAM,EAAE,OAAO,OAAO;CACtB,MAAM,cAAc,iBAAiB,KAAK;CAC1C,MAAM,UAAU,cAAc,SAAS,KAAK;CAC5C,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,aAAa,gBAAgB,SAAS,OAAO;CAInD,MAAM,cAAc;EAClB,GAAG,QAAQ,IAAI,WAAW;EAC1B,GAAG,QAAQ,IAAI,WAAW;CAC5B;CAEA,MAAM,OAAO,cAAc,SAAS,SAAS,UAAU;CACvD,IAAI,CAAC,MAAM,OAAO;EAAE;EAAY,MAAM;EAAM,wBAAQ,IAAI,IAAI;CAAE;CAE9D,MAAM,YAA6B;EAAE,IAAI,KAAK;EAAc,QAAQ,KAAK;CAAO;CAChF,MAAM,SAAS,SAAS,SAAS,MAAM,WAAW,SAAS,WAAW;CACtE,IAAI,CAAC,QAAQ,OAAO;EAAE;EAAY,MAAM;EAAM,wBAAQ,IAAI,IAAI;CAAE;CAKhE,MAAM,yBAAS,IAAI,IAAqB;CACxC,MAAM,4BAAY,IAAI,IAAY;CAClC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,YAAY;EAC3C,MAAM,SAAS,MAAM,IAAI,GAAG,CAAC,EAAE,UAAU;EACzC,OAAO,IAAI,KAAK,gBAAgB,aAAa,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;EACpF,UAAU,IAAI,GAAG;CACnB;CAEA,MAAM,YAAY,aAAa,SAAS,SAAS,UAAU,EAAE;CAC7D,KAAK,MAAM,CAAC,KAAK,SAAS,WAAW;EACnC,MAAM,SAAS,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU;EACnD,OAAO,IAAI,SAAS,GAAG,GAAG,gBAAgB,aAAa,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;EAC9F,UAAU,IAAI,SAAS,GAAG,CAAC;CAC7B;CACA,MAAM,aAAa,IAAI,IAAY,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC;CAC3D,KAAK,MAAM,CAAC,KAAK,SAAS,CAAC,GAAG,OAAO,YAAY,GAAG,SAAS,GAC3D,KAAK,MAAM,CAAC,IAAI,YAAY,YAAY,SAAS,SAAS,GAAG,GAAG,OAAO,MAAM,OAAO,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG;EAChH,OAAO,IAAI,IAAI,OAAO;EACtB,UAAU,IAAI,EAAE;CAClB;CAGF,OAAO;EACL;EACA,MAAM;GAAE,QAAQ,KAAK;GAAQ;GAAW,YAAY,OAAO;GAAY,cAAc;GAAW;EAAU;EAC1G;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"dropPass.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dropPass.ts"],"sourcesContent":["import { asNodeId, type NodeId } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, rebaseLocalPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport { carriedDescendants, sceneCarrySource } from 'core/scene/carryDescendants';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport type { LayoutChild, LayoutContainer } from '../../../../layout/types';\nimport type { MoveSession } from '../session';\nimport { pickContainer, type Candidate } from './container';\nimport { carryDragged, gatherDragged, selectionCenter, type DraggedChild } from './dragged';\nimport type { DropPass, LayoutPlacement } from './types';\nimport { boxOf, containerView, draggedInView, pointInView } from './view';\n\n/** Dragged ids grouped by the container they are leaving, skipping any that\n * stay put (`exclude` is the destination) or that had no container. */\nexport function groupBySourceContainer(\n dragged: ReadonlyArray<{ id: NodeId; sourceContainerId: string | null }>,\n exclude: string | null,\n): Map<string, Set<NodeId>> {\n const out = new Map<string, Set<NodeId>>();\n for (const d of dragged) {\n const src = d.sourceContainerId;\n if (!src || src === exclude) continue;\n let set = out.get(src);\n if (!set) { set = new Set<NodeId>(); out.set(src, set); }\n set.add(d.id);\n }\n return out;\n}\n\n/** Place each dragged child in `dest` in turn. Null when the snap rejects\n * any of them: a container that cannot take every member takes none. */\nfunction placeAll(\n session: MoveSession,\n dest: Candidate,\n container: LayoutContainer,\n dragged: readonly DraggedChild[],\n probeOffset: { x: number; y: number },\n): { placements: LayoutPlacement[]; destReflow: Map<NodeId, unknown> } | null {\n const { scene, pc } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const { layout, view } = dest;\n // The container state the placements run against, advanced by each one,\n // in the strategy's space.\n const working: LayoutChild<unknown>[] = scene.childrenOf(dest.id).map((cid) => ({\n id: cid as string,\n pose: view.toStrategy(composeWorldPose(poseAdapter, cid as string, pc.compose)),\n }));\n const setWorking = (id: string, pose: unknown): void => {\n const at = working.findIndex((c) => c.id === id);\n if (at >= 0) working[at] = { id, pose };\n else working.push({ id, pose });\n };\n\n const placements: LayoutPlacement[] = [];\n const destReflow = new Map<NodeId, unknown>();\n const destPlane = dest.plane;\n for (const edited of dragged) {\n const dc = carryDragged(session, edited, destPlane);\n const arg = draggedInView(view, dc.arg);\n const children = working.map((c) => ({ ...c }));\n const targets = layout.getDropTargets(container, children, arg);\n const probe = { x: edited.center.x + probeOffset.x, y: edited.center.y + probeOffset.y };\n const g = poseDescriptorForNode(session.projection, scene.get(edited.id)!);\n const at = pointInView(view, g, dc.arg.pose, destPlane ? toPlane(destPlane, probe) : probe);\n const target = layout.snap.pickTarget(targets, at);\n // All-or-nothing: a container that cannot take every member takes none\n // rather than splitting the selection between two homes.\n if (!target) return null;\n placements.push({ dragged: arg, children, target });\n const poses = layout.reflowPoses(container, children, arg, target);\n for (const [cid, pose] of poses) {\n setWorking(cid, pose);\n if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), view.toWorld(pose));\n }\n setWorking(arg.id, poses.get(arg.id) ?? target.pose);\n }\n return { placements, destReflow };\n}\n\n/** World poses of the leftovers that moved in each container the selection left. */\nfunction sourceReflow(\n session: MoveSession, dragged: readonly DraggedChild[], destId: string,\n): Map<string, unknown> {\n const { scene, pc, projection: d } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n // Source reflow (cross-container) → fold changed leftovers into previews.\n // One pass per container the selection left behind, with everything that\n // left it withdrawn at once.\n const sourceReflow = new Map<string, unknown>();\n const layoutDep = session.layout;\n if (!layoutDep) return sourceReflow;\n for (const [srcId, leaving] of groupBySourceContainer(dragged.map((c) => ({\n id: c.id,\n sourceContainerId: c.arg.sourceContainerId,\n })), destId)) {\n const srcLayout = layoutDep.getLayout(srcId);\n const srcNode = scene.get(asNodeId(srcId));\n if (!srcLayout || !srcNode) continue;\n const g = poseDescriptorForNode(d, srcNode);\n const view = containerView(pc, g, composeWorldPose(poseAdapter, srcId, pc.compose));\n const srcContainer: LayoutContainer = { id: srcId, bounds: boxOf(g, view.upright) };\n const srcChildren: LayoutChild<unknown>[] = scene.childrenOf(asNodeId(srcId))\n .filter((cid) => !leaving.has(cid))\n .map((cid) => ({\n id: cid as string,\n pose: view.toStrategy(composeWorldPose(poseAdapter, cid as string, pc.compose)),\n }));\n for (const [cid, placed] of srcLayout.childPoses(srcContainer, srcChildren)) {\n const pose = view.toWorld(placed);\n const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));\n const next = d.getBounds(pose);\n const same = cur.x === next.x && cur.y === next.y\n && cur.width === next.width && cur.height === next.height;\n if (same) continue;\n sourceReflow.set(cid, pose); // WORLD — rebased at each consumption point\n }\n }\n return sourceReflow;\n}\n\n/** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */\nfunction reflowCarry(\n session: MoveSession, id: NodeId, world: unknown, moving: (id: NodeId) => boolean,\n): Map<NodeId, unknown> {\n const { scene, pc, projection: d } = session;\n const a = d.getBounds(composeWorldPose(sceneViewPoseAdapter(scene), id as string, pc.compose));\n const b = d.getBounds(world);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (dx === 0 && dy === 0) return new Map();\n return carriedDescendants(sceneCarrySource(scene), id, (pose) => translatePoseViaDescriptor(pose, dx, dy, d), moving);\n}\n\n/** One frame's layout result, or null with no layout dep or nothing dragged. */\nexport function runDropPass(\n session: MoveSession,\n delta: { dx: number; dy: number },\n pointer: { x: number; y: number },\n): DropPass | null {\n if (!session.layout) return null;\n const { scene, pc } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const dragged = gatherDragged(session, delta);\n if (dragged.length === 0) return null;\n const dropCenter = selectionCenter(session, dragged);\n // Each child is snapped at its own position, displaced by however far the\n // pointer sits from that center — the group keeps its shape, and a lone\n // child is still probed at the pointer itself.\n const probeOffset = {\n x: pointer.x - dropCenter.x,\n y: pointer.y - dropCenter.y,\n };\n\n const dest = pickContainer(session, dragged, dropCenter);\n if (!dest) return { dropCenter, pass: null, reflow: new Map() };\n if (dest.refused !== undefined) {\n return { dropCenter, pass: null, reflow: new Map(), refused: { id: dest.id, bounds: dest.bounds, reason: dest.refused } };\n }\n\n const container: LayoutContainer = { id: dest.id as string, bounds: dest.content };\n const placed = placeAll(session, dest, container, dragged, probeOffset);\n if (!placed) return { dropCenter, pass: null, reflow: new Map() };\n\n // Destination reflow → fold into previews (the dragged children keep their\n // pointer-following ghosts). `reflowPoses` returns world; previews are\n // local, so rebase to the child's current parent frame first.\n const reflow = new Map<NodeId, unknown>();\n const reflowIds = new Set<NodeId>();\n for (const [cid, pose] of placed.destReflow) {\n const parent = scene.get(cid)?.parent ?? null;\n reflow.set(cid, rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(cid);\n }\n\n const leftovers = sourceReflow(session, dragged, container.id);\n for (const [cid, pose] of leftovers) {\n const parent = scene.get(asNodeId(cid))?.parent ?? null;\n reflow.set(asNodeId(cid), rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(asNodeId(cid));\n }\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n for (const [cid, pose] of [...placed.destReflow, ...leftovers] as [string, unknown][]) {\n for (const [id, carried] of reflowCarry(session, asNodeId(cid), pose, (d) => reflow.has(d) || draggedIds.has(d))) {\n reflow.set(id, carried);\n reflowIds.add(id);\n }\n }\n\n return {\n dropCenter,\n pass: {\n layout: dest.layout, container, view: dest.view, placements: placed.placements, sourceReflow: leftovers, reflowIds,\n },\n reflow,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAeA,SAAgB,uBACd,SACA,SAC0B;CAC1B,MAAM,sBAAM,IAAI,IAAyB;CACzC,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,MAAM,EAAE;EACd,IAAI,CAAC,OAAO,QAAQ,SAAS;EAC7B,IAAI,MAAM,IAAI,IAAI,GAAG;EACrB,IAAI,CAAC,KAAK;GAAE,sBAAM,IAAI,IAAY;GAAG,IAAI,IAAI,KAAK,GAAG;EAAG;EACxD,IAAI,IAAI,EAAE,EAAE;CACd;CACA,OAAO;AACT;;;AAIA,SAAS,SACP,SACA,MACA,WACA,SACA,aAC4E;CAC5E,MAAM,EAAE,OAAO,OAAO;CACtB,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,aAAa,IAAI,IAAY,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC;CAC3D,MAAM,EAAE,QAAQ,SAAS;CAGzB,MAAM,UAAkC,MAAM,WAAW,KAAK,EAAE,CAAC,CAAC,KAAK,SAAS;EAC9E,IAAI;EACJ,MAAM,KAAK,WAAW,iBAAiB,aAAa,KAAe,GAAG,OAAO,CAAC;CAChF,EAAE;CACF,MAAM,cAAc,IAAY,SAAwB;EACtD,MAAM,KAAK,QAAQ,WAAW,MAAM,EAAE,OAAO,EAAE;EAC/C,IAAI,MAAM,GAAG,QAAQ,MAAM;GAAE;GAAI;EAAK;OACjC,QAAQ,KAAK;GAAE;GAAI;EAAK,CAAC;CAChC;CAEA,MAAM,aAAgC,CAAC;CACvC,MAAM,6BAAa,IAAI,IAAqB;CAC5C,MAAM,YAAY,KAAK;CACvB,KAAK,MAAM,UAAU,SAAS;EAC5B,MAAM,KAAK,aAAa,SAAS,QAAQ,SAAS;EAClD,MAAM,MAAM,cAAc,MAAM,GAAG,GAAG;EACtC,MAAM,WAAW,QAAQ,KAAK,OAAO,EAAE,GAAG,EAAE,EAAE;EAC9C,MAAM,UAAU,OAAO,eAAe,WAAW,UAAU,GAAG;EAC9D,MAAM,QAAQ;GAAE,GAAG,OAAO,OAAO,IAAI,YAAY;GAAG,GAAG,OAAO,OAAO,IAAI,YAAY;EAAE;EACvF,MAAM,IAAI,sBAAsB,QAAQ,YAAY,MAAM,IAAI,OAAO,EAAE,CAAE;EACzE,MAAM,KAAK,YAAY,MAAM,GAAG,GAAG,IAAI,MAAM,YAAY,QAAQ,WAAW,KAAK,IAAI,KAAK;EAC1F,MAAM,SAAS,OAAO,KAAK,WAAW,SAAS,EAAE;EAGjD,IAAI,CAAC,QAAQ,OAAO;EACpB,WAAW,KAAK;GAAE,SAAS;GAAK;GAAU;EAAO,CAAC;EAClD,MAAM,QAAQ,OAAO,YAAY,WAAW,UAAU,KAAK,MAAM;EACjE,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO;GAC/B,WAAW,KAAK,IAAI;GACpB,IAAI,CAAC,WAAW,IAAI,SAAS,GAAG,CAAC,GAAG,WAAW,IAAI,SAAS,GAAG,GAAG,KAAK,QAAQ,IAAI,CAAC;EACtF;EACA,WAAW,IAAI,IAAI,MAAM,IAAI,IAAI,EAAE,KAAK,OAAO,IAAI;CACrD;CACA,OAAO;EAAE;EAAY;CAAW;AAClC;;AAGA,SAAS,aACP,SAAsB,SAAkC,QAClC;CACtB,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,cAAc,qBAAqB,KAAK;CAI9C,MAAM,+BAAe,IAAI,IAAqB;CAC9C,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,WAAW,OAAO;CACvB,KAAK,MAAM,CAAC,OAAO,YAAY,uBAAuB,QAAQ,KAAK,OAAO;EACxE,IAAI,EAAE;EACN,mBAAmB,EAAE,IAAI;CAC3B,EAAE,GAAG,MAAM,GAAG;EACZ,MAAM,YAAY,UAAU,UAAU,KAAK;EAC3C,MAAM,UAAU,MAAM,IAAI,SAAS,KAAK,CAAC;EACzC,IAAI,CAAC,aAAa,CAAC,SAAS;EAC5B,MAAM,IAAI,sBAAsB,GAAG,OAAO;EAC1C,MAAM,OAAO,cAAc,IAAI,GAAG,iBAAiB,aAAa,OAAO,GAAG,OAAO,CAAC;EAClF,MAAM,eAAgC;GAAE,IAAI;GAAO,QAAQ,MAAM,GAAG,KAAK,OAAO;EAAE;EAClF,MAAM,cAAsC,MAAM,WAAW,SAAS,KAAK,CAAC,CAAC,CAC1E,QAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAClC,KAAK,SAAS;GACb,IAAI;GACJ,MAAM,KAAK,WAAW,iBAAiB,aAAa,KAAe,GAAG,OAAO,CAAC;EAChF,EAAE;EACJ,KAAK,MAAM,CAAC,KAAK,WAAW,UAAU,WAAW,cAAc,WAAW,GAAG;GAC3E,MAAM,OAAO,KAAK,QAAQ,MAAM;GAChC,MAAM,MAAM,EAAE,UAAU,iBAAiB,aAAa,KAAK,GAAG,OAAO,CAAC;GACtE,MAAM,OAAO,EAAE,UAAU,IAAI;GAG7B,IAFa,IAAI,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,KAC3C,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,QAC3C;GACV,aAAa,IAAI,KAAK,IAAI;EAC5B;CACF;CACA,OAAO;AACT;;AAGA,SAAS,YACP,SAAsB,IAAY,OAAgB,QAC5B;CACtB,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,IAAI,EAAE,UAAU,iBAAiB,qBAAqB,KAAK,GAAG,IAAc,GAAG,OAAO,CAAC;CAC7F,MAAM,IAAI,EAAE,UAAU,KAAK;CAC3B,MAAM,KAAK,EAAE,IAAI,EAAE;CACnB,MAAM,KAAK,EAAE,IAAI,EAAE;CACnB,IAAI,OAAO,KAAK,OAAO,GAAG,uBAAO,IAAI,IAAI;CACzC,OAAO,mBAAmB,iBAAiB,KAAK,GAAG,KAAK,SAAS,2BAA2B,MAAM,IAAI,IAAI,CAAC,GAAG,MAAM;AACtH;;AAGA,SAAgB,YACd,SACA,OACA,SACiB;CACjB,IAAI,CAAC,QAAQ,QAAQ,OAAO;CAC5B,MAAM,EAAE,OAAO,OAAO;CACtB,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,UAAU,cAAc,SAAS,KAAK;CAC5C,IAAI,QAAQ,WAAW,GAAG,OAAO;CACjC,MAAM,aAAa,gBAAgB,SAAS,OAAO;CAInD,MAAM,cAAc;EAClB,GAAG,QAAQ,IAAI,WAAW;EAC1B,GAAG,QAAQ,IAAI,WAAW;CAC5B;CAEA,MAAM,OAAO,cAAc,SAAS,SAAS,UAAU;CACvD,IAAI,CAAC,MAAM,OAAO;EAAE;EAAY,MAAM;EAAM,wBAAQ,IAAI,IAAI;CAAE;CAC9D,IAAI,KAAK,YAAY,QACnB,OAAO;EAAE;EAAY,MAAM;EAAM,wBAAQ,IAAI,IAAI;EAAG,SAAS;GAAE,IAAI,KAAK;GAAI,QAAQ,KAAK;GAAQ,QAAQ,KAAK;EAAQ;CAAE;CAG1H,MAAM,YAA6B;EAAE,IAAI,KAAK;EAAc,QAAQ,KAAK;CAAQ;CACjF,MAAM,SAAS,SAAS,SAAS,MAAM,WAAW,SAAS,WAAW;CACtE,IAAI,CAAC,QAAQ,OAAO;EAAE;EAAY,MAAM;EAAM,wBAAQ,IAAI,IAAI;CAAE;CAKhE,MAAM,yBAAS,IAAI,IAAqB;CACxC,MAAM,4BAAY,IAAI,IAAY;CAClC,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,YAAY;EAC3C,MAAM,SAAS,MAAM,IAAI,GAAG,CAAC,EAAE,UAAU;EACzC,OAAO,IAAI,KAAK,gBAAgB,aAAa,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;EACpF,UAAU,IAAI,GAAG;CACnB;CAEA,MAAM,YAAY,aAAa,SAAS,SAAS,UAAU,EAAE;CAC7D,KAAK,MAAM,CAAC,KAAK,SAAS,WAAW;EACnC,MAAM,SAAS,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU;EACnD,OAAO,IAAI,SAAS,GAAG,GAAG,gBAAgB,aAAa,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;EAC9F,UAAU,IAAI,SAAS,GAAG,CAAC;CAC7B;CACA,MAAM,aAAa,IAAI,IAAY,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC;CAC3D,KAAK,MAAM,CAAC,KAAK,SAAS,CAAC,GAAG,OAAO,YAAY,GAAG,SAAS,GAC3D,KAAK,MAAM,CAAC,IAAI,YAAY,YAAY,SAAS,SAAS,GAAG,GAAG,OAAO,MAAM,OAAO,IAAI,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,GAAG;EAChH,OAAO,IAAI,IAAI,OAAO;EACtB,UAAU,IAAI,EAAE;CAClB;CAGF,OAAO;EACL;EACA,MAAM;GACJ,QAAQ,KAAK;GAAQ;GAAW,MAAM,KAAK;GAAM,YAAY,OAAO;GAAY,cAAc;GAAW;EAC3G;EACA;CACF;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toPlane } from "../../../../core/viewport/parallax.js";
|
|
2
2
|
import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
|
|
3
3
|
import { poseDescriptorForNode } from "../../../../core/geometry/poseDescriptor.js";
|
|
4
|
-
import {
|
|
4
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
5
5
|
import { planeOf } from "../../planeInput.js";
|
|
6
6
|
import { pointInBounds } from "./container.js";
|
|
7
7
|
|
|
@@ -18,7 +18,7 @@ function resolveLayoutExits(session, dropCenter, ids) {
|
|
|
18
18
|
const center = dropCenter;
|
|
19
19
|
if (!layoutDep || !center) return out;
|
|
20
20
|
const { scene, pc, projection: d } = session;
|
|
21
|
-
const poseAdapter =
|
|
21
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
22
22
|
const excluded = /* @__PURE__ */ new Set([...session.ids, ...session.cascadeIds]);
|
|
23
23
|
const holds = (id, layout) => {
|
|
24
24
|
const node = scene.get(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exits.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/exits.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"exits.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/exits.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutStrategy } from '../../../../layout/types';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { pointInBounds } from './container';\n\n/** Where each dragged root that leaves its layout container on release lands.\n * A root leaves when the drop center falls outside the body of the layout\n * container holding it, and lands under the innermost plain container beneath\n * the drop that admits it (`canDropInto`) — a layout container there has\n * already declined it — or at the top level of its layer. A root whose parent\n * has no layout is not this pass's to move; `reparentOnDrop` decides for those. */\nexport function resolveLayoutExits(\n session: MoveSession, dropCenter: { x: number; y: number } | null, ids: Iterable<NodeId>,\n): Map<NodeId, NodeId | null> {\n const out = new Map<NodeId, NodeId | null>();\n const layoutDep = session.layout;\n const center = dropCenter;\n if (!layoutDep || !center) return out;\n const { scene, pc, projection: d } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const excluded = new Set<NodeId>([...session.ids, ...session.cascadeIds]);\n const holds = (id: NodeId, layout: LayoutStrategy<unknown> | null): boolean => {\n const node = scene.get(id)!;\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n const pose = composeWorldPose(poseAdapter, id as string, pc.compose);\n if (layout?.contains) return layout.contains(pose, at);\n const b = poseDescriptorForNode(d, node).getBounds(pose);\n return pointInBounds(b, at);\n };\n const landings = new Map<string, NodeId | null>();\n const landingOn = (layer: string): NodeId | null => {\n if (landings.has(layer)) return landings.get(layer)!;\n // Deepest wins; among equals, the later sibling (painted over the other).\n let best: NodeId | null = null;\n let bestDepth = -1;\n const walk = (parentId: NodeId | null, depth: number): void => {\n for (const id of parentId === null ? scene.roots : scene.childrenOf(parentId)) {\n if (excluded.has(id)) continue;\n const node = scene.get(id);\n if (!node) continue;\n if (node.layer === layer && depth >= bestDepth\n && layoutDep.getLayout(id as string) === null && holds(id, null) && session.admits(id)) {\n best = id;\n bestDepth = depth;\n }\n walk(id, depth + 1);\n }\n };\n walk(null, 0);\n landings.set(layer, best);\n return best;\n };\n for (const id of ids) {\n const node = scene.get(id);\n const parent = node?.parent ?? null;\n if (!node || parent === null) continue;\n const layout = layoutDep.getLayout(parent as string);\n if (!layout || holds(parent, layout)) continue;\n out.set(id, landingOn(node.layer));\n }\n return out;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,mBACd,SAAsB,YAA6C,KACvC;CAC5B,MAAM,sBAAM,IAAI,IAA2B;CAC3C,MAAM,YAAY,QAAQ;CAC1B,MAAM,SAAS;CACf,IAAI,CAAC,aAAa,CAAC,QAAQ,OAAO;CAClC,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,2BAAW,IAAI,IAAY,CAAC,GAAG,QAAQ,KAAK,GAAG,QAAQ,UAAU,CAAC;CACxE,MAAM,SAAS,IAAY,WAAoD;EAC7E,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,KAAK;EAC9C,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM,IAAI;EAC5C,MAAM,OAAO,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACnE,IAAI,QAAQ,UAAU,OAAO,OAAO,SAAS,MAAM,EAAE;EACrD,MAAM,IAAI,sBAAsB,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI;EACvD,OAAO,cAAc,GAAG,EAAE;CAC5B;CACA,MAAM,2BAAW,IAAI,IAA2B;CAChD,MAAM,aAAa,UAAiC;EAClD,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,SAAS,IAAI,KAAK;EAElD,IAAI,OAAsB;EAC1B,IAAI,YAAY;EAChB,MAAM,QAAQ,UAAyB,UAAwB;GAC7D,KAAK,MAAM,MAAM,aAAa,OAAO,MAAM,QAAQ,MAAM,WAAW,QAAQ,GAAG;IAC7E,IAAI,SAAS,IAAI,EAAE,GAAG;IACtB,MAAM,OAAO,MAAM,IAAI,EAAE;IACzB,IAAI,CAAC,MAAM;IACX,IAAI,KAAK,UAAU,SAAS,SAAS,aAChC,UAAU,UAAU,EAAY,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,QAAQ,OAAO,EAAE,GAAG;KACxF,OAAO;KACP,YAAY;IACd;IACA,KAAK,IAAI,QAAQ,CAAC;GACpB;EACF;EACA,KAAK,MAAM,CAAC;EACZ,SAAS,IAAI,OAAO,IAAI;EACxB,OAAO;CACT;CACA,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,SAAS,MAAM,UAAU;EAC/B,IAAI,CAAC,QAAQ,WAAW,MAAM;EAC9B,MAAM,SAAS,UAAU,UAAU,MAAgB;EACnD,IAAI,CAAC,UAAU,MAAM,QAAQ,MAAM,GAAG;EACtC,IAAI,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC;CACnC;CACA,OAAO;AACT"}
|