@weasel-js/core 1.13.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +326 -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,23 +1,42 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { refusalOverlays } from "../refusal.js";
|
|
2
|
+
import { reparentOps, resolveDrop } from "../commit/reparent.js";
|
|
2
3
|
|
|
3
4
|
//#region src/interactions/actions/move/behaviors/reparentOnDrop.ts
|
|
4
5
|
/**
|
|
5
6
|
* The move behavior that reparents the selection under the node the pointer is
|
|
6
|
-
* released over, when the binding's `reparentOnDrop` param asks for it.
|
|
7
|
+
* released over, when the binding's `reparentOnDrop` param asks for it. While
|
|
8
|
+
* the pointer is over a container that refuses the drop with a reason, it draws
|
|
9
|
+
* the refusal, and a release there moves nothing.
|
|
7
10
|
*
|
|
8
11
|
* Built by the move action for one drag and run last, so a binding's behavior
|
|
9
12
|
* or a layout drop that claims the commit preempts it.
|
|
10
13
|
*/
|
|
11
14
|
function reparentOnDrop(move) {
|
|
12
|
-
|
|
13
|
-
if (end.answered) return;
|
|
15
|
+
const dropAt = (at) => {
|
|
14
16
|
const session = move.session();
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
return session.reparentOnDrop() === "off" ? null : resolveDrop(session, at);
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
onMove(ctx) {
|
|
21
|
+
if (!move.session().mayRefuse) return void 0;
|
|
22
|
+
const at = {
|
|
23
|
+
x: ctx.pointer.worldX,
|
|
24
|
+
y: ctx.pointer.worldY
|
|
25
|
+
};
|
|
26
|
+
const drop = dropAt(at);
|
|
27
|
+
return drop !== null && "refused" in drop ? { overlays: refusalOverlays(drop.refused, at) } : void 0;
|
|
28
|
+
},
|
|
29
|
+
onEnd(_ctx, end) {
|
|
30
|
+
if (end.answered) return;
|
|
31
|
+
const session = move.session();
|
|
32
|
+
const { delta } = move.frame();
|
|
33
|
+
if (delta.dx === 0 && delta.dy === 0) return;
|
|
34
|
+
const drop = dropAt(end.pointer);
|
|
35
|
+
if (drop === null) return void 0;
|
|
36
|
+
if ("refused" in drop) return null;
|
|
37
|
+
return reparentOps(session, drop, session.reparentOnDrop(), delta);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
21
40
|
}
|
|
22
41
|
|
|
23
42
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reparentOnDrop.js","names":[],"sources":["../../../../../src/interactions/actions/move/behaviors/reparentOnDrop.ts"],"sourcesContent":["import type { MoveBehavior } from '../../../gestures/types';\nimport { reparentOps,
|
|
1
|
+
{"version":3,"file":"reparentOnDrop.js","names":[],"sources":["../../../../../src/interactions/actions/move/behaviors/reparentOnDrop.ts"],"sourcesContent":["import type { MoveBehavior } from '../../../gestures/types';\nimport { reparentOps, resolveDrop } from '../commit/reparent';\nimport { refusalOverlays } from '../refusal';\nimport type { MoveGesture } from '../session';\n\n/**\n * The move behavior that reparents the selection under the node the pointer is\n * released over, when the binding's `reparentOnDrop` param asks for it. While\n * the pointer is over a container that refuses the drop with a reason, it draws\n * the refusal, and a release there moves nothing.\n *\n * Built by the move action for one drag and run last, so a binding's behavior\n * or a layout drop that claims the commit preempts it.\n */\nexport function reparentOnDrop(move: MoveGesture): MoveBehavior<unknown> {\n const dropAt = (at: { x: number; y: number }) => {\n const session = move.session();\n return session.reparentOnDrop() === 'off' ? null : resolveDrop(session, at);\n };\n return {\n onMove(ctx) {\n // Only a `canDropInto` dep refuses with a reason; without one, the hit-test waits for the release.\n if (!move.session().mayRefuse) return undefined;\n const at = { x: ctx.pointer.worldX, y: ctx.pointer.worldY };\n const drop = dropAt(at);\n return drop !== null && 'refused' in drop ? { overlays: refusalOverlays(drop.refused, at) } : undefined;\n },\n onEnd(_ctx, end) {\n if (end.answered) return;\n const session = move.session();\n const { delta } = move.frame();\n // No-op if no movement (sub-threshold drag or zero delta).\n if (delta.dx === 0 && delta.dy === 0) return;\n // Resolves the drop target via the `nodeAtPoint` dep (sourced by\n // `<SceneCanvas>`) and reparents each moved root under it, then\n // writes the translated pose in the new parent's frame so the\n // visual position is preserved across the parent swap.\n // An end with no drag carries no pointer: the dispatcher's `cancelAll`\n // reports the world origin.\n const drop = dropAt(end.pointer);\n if (drop === null) return undefined;\n if ('refused' in drop) return null;\n return reparentOps(session, drop, session.reparentOnDrop(), delta);\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;AAcA,SAAgB,eAAe,MAA0C;CACvE,MAAM,UAAU,OAAiC;EAC/C,MAAM,UAAU,KAAK,QAAQ;EAC7B,OAAO,QAAQ,eAAe,MAAM,QAAQ,OAAO,YAAY,SAAS,EAAE;CAC5E;CACA,OAAO;EACL,OAAO,KAAK;GAEV,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,WAAW,OAAO;GACtC,MAAM,KAAK;IAAE,GAAG,IAAI,QAAQ;IAAQ,GAAG,IAAI,QAAQ;GAAO;GAC1D,MAAM,OAAO,OAAO,EAAE;GACtB,OAAO,SAAS,QAAQ,aAAa,OAAO,EAAE,UAAU,gBAAgB,KAAK,SAAS,EAAE,EAAE,IAAI;EAChG;EACA,MAAM,MAAM,KAAK;GACf,IAAI,IAAI,UAAU;GAClB,MAAM,UAAU,KAAK,QAAQ;GAC7B,MAAM,EAAE,UAAU,KAAK,MAAM;GAE7B,IAAI,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG;GAOtC,MAAM,OAAO,OAAO,IAAI,OAAO;GAC/B,IAAI,SAAS,MAAM,OAAO;GAC1B,IAAI,aAAa,MAAM,OAAO;GAC9B,OAAO,YAAY,SAAS,MAAM,QAAQ,eAAe,GAAG,KAAK;EACnE;CACF;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { definesFrame } from "../../../../core/scene/effectivePose.js";
|
|
1
2
|
import { createTransformOp } from "../../../../core/ops/transform.js";
|
|
2
3
|
import { createReparentOp } from "../../../../core/ops/reparent.js";
|
|
3
4
|
import { getScratch, scratchKey, setScratch } from "@weasel-js/routing";
|
|
@@ -46,14 +47,18 @@ function snapToContainer(args) {
|
|
|
46
47
|
return slots;
|
|
47
48
|
};
|
|
48
49
|
const snapped = (ctx, snap) => {
|
|
49
|
-
const
|
|
50
|
-
const
|
|
50
|
+
const id = ctx.draggedIds[0];
|
|
51
|
+
const start = ctx.origin.get(id);
|
|
52
|
+
const startWorld = start === void 0 ? void 0 : ctx.frames?.toWorld(id, start) ?? start;
|
|
53
|
+
const toSlot = startWorld !== void 0 ? ctx.offset?.(startWorld, snap.slotPose) : void 0;
|
|
54
|
+
const poses = /* @__PURE__ */ new Map();
|
|
55
|
+
for (const [at, slot] of slotsFor(ctx, snap)) poses.set(at, ctx.frames?.toLocal(at, slot) ?? slot);
|
|
51
56
|
return {
|
|
52
57
|
...toSlot ? { transform: {
|
|
53
58
|
kind: "translate",
|
|
54
59
|
...toSlot
|
|
55
60
|
} } : {},
|
|
56
|
-
poses
|
|
61
|
+
poses,
|
|
57
62
|
snap
|
|
58
63
|
};
|
|
59
64
|
};
|
|
@@ -101,7 +106,8 @@ function snapToContainer(args) {
|
|
|
101
106
|
}));
|
|
102
107
|
};
|
|
103
108
|
const slots = slotsFor(ctx, snap);
|
|
104
|
-
for (const [id,
|
|
109
|
+
for (const [id, slot] of slots) {
|
|
110
|
+
const to = ctx.frames?.toLocalUnder(snap.parentId, slot) ?? slot;
|
|
105
111
|
ops.push(createTransformOp({
|
|
106
112
|
id,
|
|
107
113
|
from: ctx.origin.get(id),
|
|
@@ -111,12 +117,42 @@ function snapToContainer(args) {
|
|
|
111
117
|
reparent(id);
|
|
112
118
|
}
|
|
113
119
|
const rest = ctx.draggedIds.filter((id) => !slots.has(id));
|
|
114
|
-
|
|
115
|
-
|
|
120
|
+
const moved = end.translateOps(rest);
|
|
121
|
+
ops.push(...moved);
|
|
122
|
+
for (const id of rest) {
|
|
123
|
+
const was = ctx.adapter.getParent(id);
|
|
124
|
+
reparent(id);
|
|
125
|
+
if (was !== snap.parentId) ops.push(...keptInPlace(ctx, snap.parentId, id, moved, reparentLabel));
|
|
126
|
+
}
|
|
116
127
|
return ops;
|
|
117
128
|
}
|
|
118
129
|
};
|
|
119
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* The ops that keep `id`, reparented into `parentId`, where `moved` left it:
|
|
133
|
+
* its pose made local to the new frame, and through an envelope, the poses of
|
|
134
|
+
* what shares its frame.
|
|
135
|
+
*/
|
|
136
|
+
function keptInPlace(ctx, parentId, id, moved, label) {
|
|
137
|
+
const frames = ctx.frames;
|
|
138
|
+
if (frames === void 0) return [];
|
|
139
|
+
const translated = new Map(moved.filter((op) => op.name === "transform").map((op) => [op.args.id, op.args.to]));
|
|
140
|
+
const ops = [];
|
|
141
|
+
const keep = (at) => {
|
|
142
|
+
const from = translated.get(at) ?? ctx.adapter.getPose(at);
|
|
143
|
+
ops.push(createTransformOp({
|
|
144
|
+
id: at,
|
|
145
|
+
from,
|
|
146
|
+
to: frames.toLocalUnder(parentId, frames.toWorld(at, from)),
|
|
147
|
+
label
|
|
148
|
+
}));
|
|
149
|
+
const node = ctx.adapter.getNode(at);
|
|
150
|
+
if (node === void 0 || definesFrame(node)) return;
|
|
151
|
+
for (const child of ctx.adapter.getNodes()) if (child.parent === at) keep(child.id);
|
|
152
|
+
};
|
|
153
|
+
keep(id);
|
|
154
|
+
return ops;
|
|
155
|
+
}
|
|
120
156
|
|
|
121
157
|
//#endregion
|
|
122
158
|
export { snapToContainer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapToContainer.js","names":[],"sources":["../../../../../src/interactions/actions/move/behaviors/snapToContainer.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { createReparentOp } from 'core/ops/reparent';\nimport type { Op } from 'core/ops/types';\nimport type { SnapTarget } from 'core/adapters/types';\nimport type { BehaviorResult, MoveBehavior, GestureContext } from '../../../gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\n\ninterface SnapState<TPose> {\n pendingTargetId: string | null;\n pendingTimer: ReturnType<typeof setTimeout> | null;\n committedSnap: SnapTarget<TPose> | null;\n}\n\n// The slot is generic over TPose; we keep the unknown-pose key at module\n// scope and project it through `as` at the read site (each consumer call\n// of `snapToContainer<TPose>` is the only writer of its own SnapState\n// instance, so the cast is safe at runtime).\nconst STATE = scratchKey<SnapState<unknown>>('snapToContainer');\n\nfunction getState<TPose>(ctx: GestureContext<TPose>): SnapState<TPose> {\n let s = getScratch(ctx.scratch, STATE) as SnapState<TPose> | undefined;\n if (!s) {\n s = { pendingTargetId: null, pendingTimer: null, committedSnap: null };\n setScratch(ctx.scratch, STATE, s as SnapState<unknown>);\n }\n return s;\n}\n\nfunction clearTimer<TPose>(s: SnapState<TPose>) {\n if (s.pendingTimer !== null) {\n clearTimeout(s.pendingTimer);\n s.pendingTimer = null;\n }\n s.pendingTargetId = null;\n}\n\n/**\n * Move behavior that drops the dragged nodes into a container the pointer\n * hovers over for `dwellMs`, reparenting each and giving it the slot\n * `findTarget` answers for its id. A node `findTarget` has no slot for in\n * that container rides along with the first, at its offset from it.\n *\n * The dwell is what keeps a drag that merely passes over a container from\n * being captured by it.\n */\nexport function snapToContainer<TPose>(args: {\n dwellMs: number;\n findTarget: (\n draggedId: string,\n worldX: number,\n worldY: number,\n ) => SnapTarget<TPose> | null;\n isInstant?: (target: SnapTarget<TPose>) => boolean;\n moveLabel?: string;\n reparentLabel?: string;\n}): MoveBehavior<TPose> {\n const { dwellMs, findTarget, isInstant, moveLabel = 'Move', reparentLabel = 'Move and reparent' } = args;\n\n /** Each dragged node's slot in the snapped container: the snapped slot for\n * the first, and for each other node the one `findTarget` answers for it. */\n const slotsFor = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): Map<string, TPose> => {\n const [primary, ...rest] = ctx.draggedIds;\n const slots = new Map<string, TPose>([[primary, snap.slotPose]]);\n for (const id of rest) {\n const own = findTarget(id, ctx.pointer.worldX, ctx.pointer.worldY);\n if (own?.parentId === snap.parentId) slots.set(id, own.slotPose);\n }\n return slots;\n };\n const snapped = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): BehaviorResult<TPose> => {\n const start = ctx.origin.get(ctx.draggedIds[0]);\n const toSlot = start !== undefined ? ctx.offset?.(start, snap.slotPose) : undefined;\n return {\n ...(toSlot ? { transform: { kind: 'translate' as const, ...toSlot } } : {}),\n poses: slotsFor(ctx, snap),\n snap,\n };\n };\n\n return {\n onMove(ctx, _proposed) {\n const s = getState<TPose>(ctx);\n const target = findTarget(ctx.draggedIds[0], ctx.pointer.worldX, ctx.pointer.worldY);\n\n if (s.committedSnap) {\n if (target && target.parentId === s.committedSnap.parentId) {\n return snapped(ctx, s.committedSnap);\n }\n s.committedSnap = null;\n }\n\n if (!target) {\n clearTimer(s);\n return;\n }\n\n if (isInstant?.(target)) {\n clearTimer(s);\n s.committedSnap = target;\n return snapped(ctx, target);\n }\n\n if (s.pendingTargetId === target.parentId) {\n return;\n }\n clearTimer(s);\n s.pendingTargetId = target.parentId;\n s.pendingTimer = setTimeout(() => {\n s.committedSnap = target;\n s.pendingTimer = null;\n }, dwellMs);\n return;\n },\n\n onCancel(ctx) { clearTimer(getState<TPose>(ctx)); },\n\n onEnd(ctx, end) {\n const s = getState<TPose>(ctx);\n clearTimer(s);\n const snap = s.committedSnap ?? ctx.snap;\n if (!snap) return;\n const ops: Op[] = [];\n const reparent = (id: string): void => {\n const oldParent = ctx.adapter.getParent(id);\n if (oldParent !== snap.parentId) {\n ops.push(createReparentOp({\n id,\n fromParentId: oldParent,\n toParentId: snap.parentId,\n label: reparentLabel,\n }));\n }\n };\n const slots = slotsFor(ctx, snap);\n for (const [id, to] of slots) {\n ops.push(createTransformOp<TPose>({ id, from: ctx.origin.get(id)!, to, label: moveLabel }));\n reparent(id);\n }\n // A node with no slot of its own lands where the preview drew it.\n const rest = ctx.draggedIds.filter((id) => !slots.has(id));\n ops.push(...end.translateOps(rest));\n for (const id of rest) reparent(id);\n return ops;\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"snapToContainer.js","names":[],"sources":["../../../../../src/interactions/actions/move/behaviors/snapToContainer.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { definesFrame } from 'core/scene/effectivePose';\nimport { createReparentOp } from 'core/ops/reparent';\nimport type { Op } from 'core/ops/types';\nimport type { SnapTarget } from 'core/adapters/types';\nimport type { BehaviorResult, MoveBehavior, GestureContext } from '../../../gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\n\ninterface SnapState<TPose> {\n pendingTargetId: string | null;\n pendingTimer: ReturnType<typeof setTimeout> | null;\n committedSnap: SnapTarget<TPose> | null;\n}\n\n// The slot is generic over TPose; we keep the unknown-pose key at module\n// scope and project it through `as` at the read site (each consumer call\n// of `snapToContainer<TPose>` is the only writer of its own SnapState\n// instance, so the cast is safe at runtime).\nconst STATE = scratchKey<SnapState<unknown>>('snapToContainer');\n\nfunction getState<TPose>(ctx: GestureContext<TPose>): SnapState<TPose> {\n let s = getScratch(ctx.scratch, STATE) as SnapState<TPose> | undefined;\n if (!s) {\n s = { pendingTargetId: null, pendingTimer: null, committedSnap: null };\n setScratch(ctx.scratch, STATE, s as SnapState<unknown>);\n }\n return s;\n}\n\nfunction clearTimer<TPose>(s: SnapState<TPose>) {\n if (s.pendingTimer !== null) {\n clearTimeout(s.pendingTimer);\n s.pendingTimer = null;\n }\n s.pendingTargetId = null;\n}\n\n/**\n * Move behavior that drops the dragged nodes into a container the pointer\n * hovers over for `dwellMs`, reparenting each and giving it the slot\n * `findTarget` answers for its id. A node `findTarget` has no slot for in\n * that container rides along with the first, at its offset from it.\n *\n * The dwell is what keeps a drag that merely passes over a container from\n * being captured by it.\n */\nexport function snapToContainer<TPose>(args: {\n dwellMs: number;\n findTarget: (\n draggedId: string,\n worldX: number,\n worldY: number,\n ) => SnapTarget<TPose> | null;\n isInstant?: (target: SnapTarget<TPose>) => boolean;\n moveLabel?: string;\n reparentLabel?: string;\n}): MoveBehavior<TPose> {\n const { dwellMs, findTarget, isInstant, moveLabel = 'Move', reparentLabel = 'Move and reparent' } = args;\n\n /** Each dragged node's slot in the snapped container: the snapped slot for\n * the first, and for each other node the one `findTarget` answers for it. */\n const slotsFor = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): Map<string, TPose> => {\n const [primary, ...rest] = ctx.draggedIds;\n const slots = new Map<string, TPose>([[primary, snap.slotPose]]);\n for (const id of rest) {\n const own = findTarget(id, ctx.pointer.worldX, ctx.pointer.worldY);\n if (own?.parentId === snap.parentId) slots.set(id, own.slotPose);\n }\n return slots;\n };\n // A slot is a world pose; a preview shows it in the frame the node is stored in now.\n const snapped = (ctx: GestureContext<TPose>, snap: SnapTarget<TPose>): BehaviorResult<TPose> => {\n const id = ctx.draggedIds[0];\n const start = ctx.origin.get(id);\n const startWorld = start === undefined ? undefined : ctx.frames?.toWorld(id, start) ?? start;\n const toSlot = startWorld !== undefined ? ctx.offset?.(startWorld, snap.slotPose) : undefined;\n const poses = new Map<string, TPose>();\n for (const [at, slot] of slotsFor(ctx, snap)) poses.set(at, ctx.frames?.toLocal(at, slot) ?? slot);\n return {\n ...(toSlot ? { transform: { kind: 'translate' as const, ...toSlot } } : {}),\n poses,\n snap,\n };\n };\n\n return {\n onMove(ctx, _proposed) {\n const s = getState<TPose>(ctx);\n const target = findTarget(ctx.draggedIds[0], ctx.pointer.worldX, ctx.pointer.worldY);\n\n if (s.committedSnap) {\n if (target && target.parentId === s.committedSnap.parentId) {\n return snapped(ctx, s.committedSnap);\n }\n s.committedSnap = null;\n }\n\n if (!target) {\n clearTimer(s);\n return;\n }\n\n if (isInstant?.(target)) {\n clearTimer(s);\n s.committedSnap = target;\n return snapped(ctx, target);\n }\n\n if (s.pendingTargetId === target.parentId) {\n return;\n }\n clearTimer(s);\n s.pendingTargetId = target.parentId;\n s.pendingTimer = setTimeout(() => {\n s.committedSnap = target;\n s.pendingTimer = null;\n }, dwellMs);\n return;\n },\n\n onCancel(ctx) { clearTimer(getState<TPose>(ctx)); },\n\n onEnd(ctx, end) {\n const s = getState<TPose>(ctx);\n clearTimer(s);\n const snap = s.committedSnap ?? ctx.snap;\n if (!snap) return;\n const ops: Op[] = [];\n const reparent = (id: string): void => {\n const oldParent = ctx.adapter.getParent(id);\n if (oldParent !== snap.parentId) {\n ops.push(createReparentOp({\n id,\n fromParentId: oldParent,\n toParentId: snap.parentId,\n label: reparentLabel,\n }));\n }\n };\n const slots = slotsFor(ctx, snap);\n for (const [id, slot] of slots) {\n const to = ctx.frames?.toLocalUnder(snap.parentId, slot) ?? slot;\n ops.push(createTransformOp<TPose>({ id, from: ctx.origin.get(id)!, to, label: moveLabel }));\n reparent(id);\n }\n // A node with no slot of its own lands where the preview drew it.\n const rest = ctx.draggedIds.filter((id) => !slots.has(id));\n const moved = end.translateOps(rest);\n ops.push(...moved);\n for (const id of rest) {\n const was = ctx.adapter.getParent(id);\n reparent(id);\n if (was !== snap.parentId) ops.push(...keptInPlace(ctx, snap.parentId, id, moved, reparentLabel));\n }\n return ops;\n },\n };\n}\n\n/**\n * The ops that keep `id`, reparented into `parentId`, where `moved` left it:\n * its pose made local to the new frame, and through an envelope, the poses of\n * what shares its frame.\n */\nfunction keptInPlace<TPose>(\n ctx: GestureContext<TPose>,\n parentId: string,\n id: string,\n moved: readonly Op[],\n label: string,\n): Op[] {\n const frames = ctx.frames;\n if (frames === undefined) return [];\n const translated = new Map(moved.filter((op) => op.name === 'transform')\n .map((op) => [(op.args as { id: string }).id, (op.args as { to: TPose }).to]));\n const ops: Op[] = [];\n const keep = (at: string): void => {\n const from = translated.get(at) ?? ctx.adapter.getPose(at);\n ops.push(createTransformOp<TPose>({ id: at, from, to: frames.toLocalUnder(parentId, frames.toWorld(at, from)), label }));\n const node = ctx.adapter.getNode(at) as { dependsOn?: unknown; derivePose?: unknown } | undefined;\n if (node === undefined || definesFrame(node)) return;\n for (const child of ctx.adapter.getNodes()) {\n if ((child as { parent?: string | null }).parent === at) keep(child.id);\n }\n };\n keep(id);\n return ops;\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { toPlane } from "../../../core/viewport/parallax.js";
|
|
2
|
-
import {
|
|
2
|
+
import { composeChildFrame, composeWorldPose, frameAtOrAbove } from "../../../core/scene/composeFrame.js";
|
|
3
3
|
import { effectivePose } from "../../../core/scene/effectivePose.js";
|
|
4
|
-
import {
|
|
4
|
+
import { sceneViewPoseAdapter } from "../../../core/scene/scenePoseAdapter.js";
|
|
5
5
|
import { scenePoseFrame } from "../poseFrame.js";
|
|
6
6
|
import { poseDescriptorOf } from "../poseDescriptorDep.js";
|
|
7
7
|
import { invertPlane, planeOf } from "../planeInput.js";
|
|
@@ -55,12 +55,8 @@ function captureFrames(scene, ids, startPoses) {
|
|
|
55
55
|
const carried = /* @__PURE__ */ new Set();
|
|
56
56
|
const frames = /* @__PURE__ */ new Map();
|
|
57
57
|
const pc = scene.composition;
|
|
58
|
-
if (!composesFrames(pc)) return {
|
|
59
|
-
carried,
|
|
60
|
-
frames
|
|
61
|
-
};
|
|
62
58
|
const written = new Set(translateTargets(scene, scenePoseFrame(scene), ids));
|
|
63
|
-
const poseAdapter =
|
|
59
|
+
const poseAdapter = sceneViewPoseAdapter(scene);
|
|
64
60
|
for (const id of startPoses.keys()) {
|
|
65
61
|
if (!written.has(id)) {
|
|
66
62
|
carried.add(id);
|
|
@@ -70,7 +66,7 @@ function captureFrames(scene, ids, startPoses) {
|
|
|
70
66
|
if (frame === null) continue;
|
|
71
67
|
frames.set(id, {
|
|
72
68
|
world: composeWorldPose(poseAdapter, id, pc.compose),
|
|
73
|
-
frameWorld:
|
|
69
|
+
frameWorld: composeChildFrame(poseAdapter, frame, pc.compose)
|
|
74
70
|
});
|
|
75
71
|
}
|
|
76
72
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","names":[],"sources":["../../../../src/interactions/actions/move/capture.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport { effectivePose } from 'core/scene/effectivePose';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport {
|
|
1
|
+
{"version":3,"file":"capture.js","names":[],"sources":["../../../../src/interactions/actions/move/capture.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport { effectivePose } from 'core/scene/effectivePose';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeChildFrame, composeWorldPose, frameAtOrAbove } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { ReflowTransition } from '../../../layout/types';\nimport type { GestureContext } from '../../gestures/types';\nimport { invertPlane, planeOf } from '../planeInput';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { scenePoseFrame } from '../poseFrame';\nimport { translateTargets } from '../selectionSubtree';\nimport type { MoveGestureAdapter } from './gestureAdapter';\nimport { catchGliding } from './layout/glide';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\n\n/** Start pose of each root and descendant, the descendants in walk order, and\n * the offsets of any caught mid-glide. */\nexport function captureStartPoses(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n reflow: ReflowTransition | null,\n projection: PoseDescriptor<unknown>,\n): { startPoses: Map<NodeId, unknown>; cascadeIds: NodeId[]; caught: Map<NodeId, { dx: number; dy: number }> } {\n // Capture origin poses once at drag start. Walk descendants so\n // container drags can preview every displaced child — required by\n // `usePreviewGhostLayer.buildSubtree` which only recurses into ids\n // present in `previewIds()`.\n const startPoses = new Map<NodeId, unknown>();\n const cascadeIds: NodeId[] = [];\n const seen = new Set<NodeId>();\n const queue: NodeId[] = [];\n // A node still gliding from an earlier reflow is held where it is\n // shown, and the drag starts from there.\n const caught = new Map<NodeId, { dx: number; dy: number }>();\n const hold = (id: NodeId): void => {\n const held = catchGliding(scene, reflow, projection, id);\n if (held) caught.set(id, held);\n };\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n hold(id);\n startPoses.set(id, effectivePose(scene, node));\n seen.add(id);\n queue.push(id);\n }\n while (queue.length > 0) {\n const parent = queue.shift()!;\n for (const childId of scene.childrenOf(parent)) {\n if (seen.has(childId)) continue;\n seen.add(childId);\n const childNode = scene.get(childId);\n if (!childNode) continue;\n hold(childId);\n startPoses.set(childId, effectivePose(scene, childNode));\n cascadeIds.push(childId);\n queue.push(childId);\n }\n }\n return { startPoses, cascadeIds, caught };\n}\n\n/** Which ids ride a moving frame, and the world poses of the rest that sit under one. */\nexport function captureFrames(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n): { carried: Set<NodeId>; frames: Map<NodeId, { world: unknown; frameWorld: unknown }> } {\n const carried = new Set<NodeId>();\n const frames = new Map<NodeId, { world: unknown; frameWorld: unknown }>();\n const pc = scene.composition;\n const written = new Set(translateTargets(scene, scenePoseFrame(scene), ids));\n const poseAdapter = sceneViewPoseAdapter(scene);\n for (const id of startPoses.keys()) {\n if (!written.has(id)) {\n carried.add(id);\n continue;\n }\n const frame = frameAtOrAbove(poseAdapter, scene.get(id)?.parent ?? null);\n if (frame === null) continue;\n frames.set(id, {\n world: composeWorldPose(poseAdapter, id as string, pc.compose),\n frameWorld: composeChildFrame(poseAdapter, frame, pc.compose),\n });\n }\n return { carried, frames };\n}\n\n/** For each layer on another plane: a point of its first root, in its own world and the edited one. */\nexport function capturePlaneRefs(\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n view: unknown,\n frames: ReadonlyMap<NodeId, { world: unknown }>,\n startPoses: ReadonlyMap<NodeId, unknown>,\n projection: PoseDescriptor<unknown>,\n): Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }> {\n const planeRefs = new Map<string, { own: { x: number; y: number }; edited: { x: number; y: number } }>();\n for (const id of ids) {\n const layer = scene.get(id)?.layer;\n if (layer === undefined || planeRefs.has(layer)) continue;\n const m = planeOf(view, layer);\n if (m === null) continue;\n const world = frames.get(id)?.world ?? startPoses.get(id);\n if (world === undefined) continue;\n const b = projection.getBounds(world);\n const own = { x: b.x, y: b.y };\n planeRefs.set(layer, { own, edited: toPlane(invertPlane(m)!, own) });\n }\n return planeRefs;\n}\n\nexport function buildGestureContext(\n ctx: InvocationCtx,\n scene: Scene<unknown, string, unknown>,\n ids: readonly NodeId[],\n startPoses: ReadonlyMap<NodeId, unknown>,\n adapter: MoveGestureAdapter<unknown>,\n readers: GestureReaders,\n): GestureContext<unknown> {\n const origin = new Map<string, unknown>();\n for (const [id, pose] of startPoses) origin.set(id as string, pose);\n const projection = poseDescriptorOf(ctx.deps.poseDescriptor);\n const gestureCtx: GestureContext<unknown> = {\n draggedIds: ids as unknown as string[],\n origin,\n current: new Map(origin),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n kitSettings: readers.kitSettings,\n frames: sceneGestureFrames(scene, ctx.deps),\n offset: (from, to) => {\n const a = projection.getBounds(from);\n const b = projection.getBounds(to);\n return { dx: b.x - a.x, dy: b.y - a.y };\n },\n adapter: adapter as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n return gestureCtx;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/index.ts"],"sourcesContent":["import type { Op } from 'core/ops/types';\nimport { commitGestureOps, reduceBehaviorEnd } from '../../gestureLifecycle';\nimport { draggedStoredPose } from '../delta';\nimport { landedDescendantOps } from '../landedDescendants';\nimport type { MoveSession } from '../session';\nimport { rootTranslateOps, translateOps } from '../translate';\n\nexport interface CommitInput {\n session: MoveSession;\n delta: { dx: number; dy: number };\n /** Where the pointer was let go, or the last move's point when the end carried none. */\n at: { x: number; y: number };\n}\n\n/** What the behaviors answer for the commit: ops, `null` to abort, or\n * `undefined` when every one of them leaves it to the default translate. */\nfunction endBehaviors(\n session: MoveSession,\n delta: { dx: number; dy: number },\n at: { x: number; y: number },\n): Op[] | null | undefined {\n const { dx, dy } = delta;\n const gctx = session.gestureCtx;\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n return reduceBehaviorEnd(session.behaviors, gctx, {\n translateOps: (ids) => rootTranslateOps(session, ids, delta),\n pointer: at,\n });\n}\n\n/** Commit the drag. Returns whether anything reached the document: false\n * when there was nothing to write, or a container refused what it was sent. */\nexport function commitMove(input: CommitInput): boolean {\n const { session, at } = input;\n // Apply the final delta as a single batch → one undo entry.\n const { dx, dy } = input.delta;\n const commitOps = (ops: Op[]): boolean => {\n const followers = landedDescendantOps(\n {\n scene: session.scene,\n projection: session.projection,\n startPoses: session.startPoses,\n label: session.lifecycle.label,\n },\n ops,\n );\n return commitGestureOps(session, session.lifecycle, [...ops, ...followers]);\n };\n\n // Behavior pipeline owns the commit if any behavior returns non-undefined.\n const answer = endBehaviors(session, { dx, dy }, at);\n if (answer === null) return false; // abort (e.g. snap-back)\n if (answer !== undefined) return commitOps(answer);\n\n // No-op if no movement (sub-threshold drag or zero delta).\n if (dx === 0 && dy === 0) return false;\n\n // No behavior claimed it — translate-only commit, emitted as transform ops\n // so it routes through the consumer `applyOps` hook
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/index.ts"],"sourcesContent":["import type { Op } from 'core/ops/types';\nimport { commitGestureOps, reduceBehaviorEnd } from '../../gestureLifecycle';\nimport { draggedStoredPose } from '../delta';\nimport { landedDescendantOps } from '../landedDescendants';\nimport type { MoveSession } from '../session';\nimport { rootTranslateOps, translateOps } from '../translate';\n\nexport interface CommitInput {\n session: MoveSession;\n delta: { dx: number; dy: number };\n /** Where the pointer was let go, or the last move's point when the end carried none. */\n at: { x: number; y: number };\n}\n\n/** What the behaviors answer for the commit: ops, `null` to abort, or\n * `undefined` when every one of them leaves it to the default translate. */\nfunction endBehaviors(\n session: MoveSession,\n delta: { dx: number; dy: number },\n at: { x: number; y: number },\n): Op[] | null | undefined {\n const { dx, dy } = delta;\n const gctx = session.gestureCtx;\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n return reduceBehaviorEnd(session.behaviors, gctx, {\n translateOps: (ids) => rootTranslateOps(session, ids, delta),\n pointer: at,\n });\n}\n\n/** Commit the drag. Returns whether anything reached the document: false\n * when there was nothing to write, or a container refused what it was sent. */\nexport function commitMove(input: CommitInput): boolean {\n const { session, at } = input;\n // Apply the final delta as a single batch → one undo entry.\n const { dx, dy } = input.delta;\n const commitOps = (ops: Op[]): boolean => {\n const followers = landedDescendantOps(\n {\n scene: session.scene,\n projection: session.projection,\n startPoses: session.startPoses,\n label: session.lifecycle.label,\n },\n ops,\n );\n return commitGestureOps(session, session.lifecycle, [...ops, ...followers]);\n };\n\n // Behavior pipeline owns the commit if any behavior returns non-undefined.\n const answer = endBehaviors(session, { dx, dy }, at);\n if (answer === null) return false; // abort (e.g. snap-back)\n if (answer !== undefined) return commitOps(answer);\n\n // No-op if no movement (sub-threshold drag or zero delta).\n if (dx === 0 && dy === 0) return false;\n\n // No behavior claimed it — translate-only commit, emitted as transform ops\n // so it routes through the consumer `applyOps` hook when present. A\n // descendant a moving frame carries is left out; one under an envelope is\n // translated with it.\n const ops = translateOps(session, [...session.ids, ...session.cascadeIds], { dx, dy });\n return ops.length > 0 && commitOps(ops);\n}\n"],"mappings":";;;;;;;;AAgBA,SAAS,aACP,SACA,OACA,IACyB;CACzB,MAAM,EAAE,IAAI,OAAO;CACnB,MAAM,OAAO,QAAQ;CACrB,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAC9B,KAAK,QAAQ,IAAI,IAAc,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;CAE5E,OAAO,kBAAkB,QAAQ,WAAW,MAAM;EAChD,eAAe,QAAQ,iBAAiB,SAAS,KAAK,KAAK;EAC3D,SAAS;CACX,CAAC;AACH;;;AAIA,SAAgB,WAAW,OAA6B;CACtD,MAAM,EAAE,SAAS,OAAO;CAExB,MAAM,EAAE,IAAI,OAAO,MAAM;CACzB,MAAM,aAAa,QAAuB;EACxC,MAAM,YAAY,oBAChB;GACE,OAAO,QAAQ;GACf,YAAY,QAAQ;GACpB,YAAY,QAAQ;GACpB,OAAO,QAAQ,UAAU;EAC3B,GACA,GACF;EACA,OAAO,iBAAiB,SAAS,QAAQ,WAAW,CAAC,GAAG,KAAK,GAAG,SAAS,CAAC;CAC5E;CAGA,MAAM,SAAS,aAAa,SAAS;EAAE;EAAI;CAAG,GAAG,EAAE;CACnD,IAAI,WAAW,MAAM,OAAO;CAC5B,IAAI,WAAW,QAAW,OAAO,UAAU,MAAM;CAGjD,IAAI,OAAO,KAAK,OAAO,GAAG,OAAO;CAMjC,MAAM,MAAM,aAAa,SAAS,CAAC,GAAG,QAAQ,KAAK,GAAG,QAAQ,UAAU,GAAG;EAAE;EAAI;CAAG,CAAC;CACrF,OAAO,IAAI,SAAS,KAAK,UAAU,GAAG;AACxC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
|
|
2
|
-
import {
|
|
2
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
3
3
|
import { asNodeId } from "../../../../core/scene/types.js";
|
|
4
4
|
import { createTransformOp } from "../../../../core/ops/transform.js";
|
|
5
5
|
import { createReparentOp } from "../../../../core/ops/reparent.js";
|
|
6
6
|
import { rebaseTransformOp } from "./rebase.js";
|
|
7
|
+
import { opInWorld } from "../layout/view.js";
|
|
7
8
|
|
|
8
9
|
//#region src/interactions/actions/move/commit/layoutDrop.ts
|
|
9
10
|
/** The ops of a drop a layout container accepted: reparents, then each
|
|
@@ -11,7 +12,7 @@ import { rebaseTransformOp } from "./rebase.js";
|
|
|
11
12
|
function layoutDropOps(session, pass) {
|
|
12
13
|
const lp = pass;
|
|
13
14
|
const pc = session.pc;
|
|
14
|
-
const commitAdapter =
|
|
15
|
+
const commitAdapter = sceneViewPoseAdapter(session.scene);
|
|
15
16
|
const destId = lp.container.id;
|
|
16
17
|
const draggedIds = new Set(session.ids.map((id) => id));
|
|
17
18
|
const rebaseOpToLocal = (op) => {
|
|
@@ -19,7 +20,7 @@ function layoutDropOps(session, pass) {
|
|
|
19
20
|
if (id === void 0) return op;
|
|
20
21
|
const curParent = session.scene.get(asNodeId(id))?.parent ?? null;
|
|
21
22
|
const toParent = draggedIds.has(id) ? destId : curParent;
|
|
22
|
-
return rebaseTransformOp(op, commitAdapter, pc, curParent, toParent);
|
|
23
|
+
return rebaseTransformOp(opInWorld(lp.view, op), commitAdapter, pc, curParent, toParent);
|
|
23
24
|
};
|
|
24
25
|
const reparentOps = [];
|
|
25
26
|
const dropOps = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutDrop.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/layoutDrop.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { asNodeId } from 'core/scene/types';\nimport { rebaseLocalPose } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"layoutDrop.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/layoutDrop.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { asNodeId } from 'core/scene/types';\nimport { rebaseLocalPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutPass } from '../layout/types';\nimport type { MoveSession } from '../session';\nimport { rebaseTransformOp } from './rebase';\nimport { opInWorld } from '../layout/view';\n\n/** The ops of a drop a layout container accepted: reparents, then each\n * placement's `commitDrop`, then the source containers' reflow. */\nexport function layoutDropOps(session: MoveSession, pass: LayoutPass): Op[] {\n const lp = pass;\n const pc = session.pc;\n const commitAdapter = sceneViewPoseAdapter(session.scene);\n const destId = lp.container.id;\n const draggedIds = new Set<string>(session.ids.map((id) => id as string));\n // commitDrop answers in the strategy's space (`opInWorld` takes it to world).\n // Rebase each transform op to local: a dragged id lands under the\n // destination container; any other id keeps its current parent.\n // `from` rebases under the node's PRE-commit parent.\n const rebaseOpToLocal = (op: Op): Op => {\n const id = (op.args as { id?: string } | undefined)?.id;\n if (id === undefined) return op;\n const curParent = session.scene.get(asNodeId(id))?.parent ?? null;\n const toParent = draggedIds.has(id) ? destId : curParent;\n return rebaseTransformOp(opInWorld(lp.view, op), commitAdapter, pc, curParent, toParent);\n };\n // Cross-container drop: reparent each dragged node under the\n // destination container, then pose it in that container's frame.\n // Every reparent precedes every drop.\n const reparentOps: Op[] = [];\n const dropOps: Op[] = [];\n for (const placement of lp.placements) {\n if (placement.dragged.sourceContainerId !== destId) {\n reparentOps.push(createReparentOp({\n id: placement.dragged.id,\n fromParentId: placement.dragged.sourceContainerId,\n toParentId: destId,\n label: 'Reparent',\n }));\n }\n const ops = lp.layout.commitDrop(\n lp.container,\n placement.children,\n placement.dragged,\n placement.target,\n );\n for (const op of ops) dropOps.push(rebaseOpToLocal(op));\n }\n const reflowOps: Op[] = [];\n for (const [cid, worldPose] of lp.sourceReflow) {\n const parent = session.scene.get(asNodeId(cid))?.parent ?? null;\n // Source-reflow siblings keep their parent, so `from` is already\n // the live local pose (no rebase); only `to` (a world pose stored\n // in `lp.sourceReflow`) is rebased to local. This is the\n // intentional counterpart to the dropOps rebaser above, where\n // `from` comes from a world `commitDrop` op and so does rebase.\n reflowOps.push(createTransformOp<unknown>({\n id: cid,\n from: session.scene.get(asNodeId(cid))!.pose,\n to: rebaseLocalPose(commitAdapter, worldPose, parent, pc.compose, pc.decompose),\n label: 'Source reflow',\n }));\n }\n return [...reparentOps, ...dropOps, ...reflowOps];\n}\n"],"mappings":";;;;;;;;;;;AAaA,SAAgB,cAAc,SAAsB,MAAwB;CAC1E,MAAM,KAAK;CACX,MAAM,KAAK,QAAQ;CACnB,MAAM,gBAAgB,qBAAqB,QAAQ,KAAK;CACxD,MAAM,SAAS,GAAG,UAAU;CAC5B,MAAM,aAAa,IAAI,IAAY,QAAQ,IAAI,KAAK,OAAO,EAAY,CAAC;CAKxE,MAAM,mBAAmB,OAAe;EACtC,MAAM,KAAM,GAAG,MAAsC;EACrD,IAAI,OAAO,QAAW,OAAO;EAC7B,MAAM,YAAY,QAAQ,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,EAAE,UAAU;EAC7D,MAAM,WAAW,WAAW,IAAI,EAAE,IAAI,SAAS;EAC/C,OAAO,kBAAkB,UAAU,GAAG,MAAM,EAAE,GAAG,eAAe,IAAI,WAAW,QAAQ;CACzF;CAIA,MAAM,cAAoB,CAAC;CAC3B,MAAM,UAAgB,CAAC;CACvB,KAAK,MAAM,aAAa,GAAG,YAAY;EACrC,IAAI,UAAU,QAAQ,sBAAsB,QAC1C,YAAY,KAAK,iBAAiB;GAChC,IAAI,UAAU,QAAQ;GACtB,cAAc,UAAU,QAAQ;GAChC,YAAY;GACZ,OAAO;EACT,CAAC,CAAC;EAEJ,MAAM,MAAM,GAAG,OAAO,WACpB,GAAG,WACH,UAAU,UACV,UAAU,SACV,UAAU,MACZ;EACA,KAAK,MAAM,MAAM,KAAK,QAAQ,KAAK,gBAAgB,EAAE,CAAC;CACxD;CACA,MAAM,YAAkB,CAAC;CACzB,KAAK,MAAM,CAAC,KAAK,cAAc,GAAG,cAAc;EAC9C,MAAM,SAAS,QAAQ,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC,EAAE,UAAU;EAM3D,UAAU,KAAK,kBAA2B;GACxC,IAAI;GACJ,MAAM,QAAQ,MAAM,IAAI,SAAS,GAAG,CAAC,CAAC,CAAE;GACxC,IAAI,gBAAgB,eAAe,WAAW,QAAQ,GAAG,SAAS,GAAG,SAAS;GAC9E,OAAO;EACT,CAAC,CAAC;CACJ;CACA,OAAO;EAAC,GAAG;EAAa,GAAG;EAAS,GAAG;CAAS;AAClD"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { composeWorldPose, rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
|
|
2
|
-
import {
|
|
1
|
+
import { composeChildFrame, composeWorldPose, rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
|
|
2
|
+
import { poseDescriptorForNode } from "../../../../core/geometry/poseDescriptor.js";
|
|
3
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
3
4
|
import { asNodeId } from "../../../../core/scene/types.js";
|
|
4
5
|
import { createTransformOp } from "../../../../core/ops/transform.js";
|
|
5
6
|
import { createReparentOp } from "../../../../core/ops/reparent.js";
|
|
6
7
|
import { rebaseTransformOp } from "./rebase.js";
|
|
8
|
+
import { boxOf, containerView, draggedInView, opInWorld } from "../layout/view.js";
|
|
7
9
|
import { draggedWorldPose, grabbedPoseAdapter } from "../delta.js";
|
|
8
10
|
import { groupBySourceContainer } from "../layout/dropPass.js";
|
|
9
11
|
import { resolveLayoutExits } from "../layout/exits.js";
|
|
@@ -19,24 +21,27 @@ function releaseFrom(session, delta, srcId, leaving, commitAdapter) {
|
|
|
19
21
|
const id = op.args?.id;
|
|
20
22
|
if (id === void 0) return op;
|
|
21
23
|
const parent = session.scene.get(asNodeId(id))?.parent ?? null;
|
|
22
|
-
return rebaseTransformOp(op, commitAdapter, pc, parent, parent);
|
|
24
|
+
return rebaseTransformOp(opInWorld(view, op), commitAdapter, pc, parent, parent);
|
|
23
25
|
};
|
|
24
26
|
const srcLayout = session.layout?.getLayout(srcId);
|
|
25
|
-
|
|
27
|
+
const srcNode = session.scene.get(asNodeId(srcId));
|
|
28
|
+
if (!srcLayout?.releaseDrop || !srcNode) return {
|
|
26
29
|
ops: releasedOps,
|
|
27
30
|
released
|
|
28
31
|
};
|
|
32
|
+
const g = poseDescriptorForNode(session.projection, srcNode);
|
|
33
|
+
const view = containerView(pc, g, composeWorldPose(commitAdapter, srcId, pc.compose));
|
|
29
34
|
const srcContainer = {
|
|
30
35
|
id: srcId,
|
|
31
|
-
bounds:
|
|
36
|
+
bounds: boxOf(g, view.toStrategy(composeChildFrame(commitAdapter, srcId, pc.compose)))
|
|
32
37
|
};
|
|
33
38
|
let srcChildren = session.scene.childrenOf(asNodeId(srcId)).filter((cid) => !leaving.has(cid)).map((cid) => ({
|
|
34
39
|
id: cid,
|
|
35
|
-
pose: composeWorldPose(commitAdapter, cid, pc.compose)
|
|
40
|
+
pose: view.toStrategy(composeWorldPose(commitAdapter, cid, pc.compose))
|
|
36
41
|
}));
|
|
37
42
|
for (const id of leaving) {
|
|
38
43
|
const startWorld = composeWorldPose(grabbedPoseAdapter(session, commitAdapter), id, pc.compose);
|
|
39
|
-
const
|
|
44
|
+
const dragged = draggedInView(view, {
|
|
40
45
|
id,
|
|
41
46
|
originPose: startWorld,
|
|
42
47
|
pose: draggedWorldPose(session, grabbedPoseAdapter(session, commitAdapter), id, {
|
|
@@ -45,9 +50,10 @@ function releaseFrom(session, delta, srcId, leaving, commitAdapter) {
|
|
|
45
50
|
}),
|
|
46
51
|
sourceContainerId: srcId
|
|
47
52
|
});
|
|
53
|
+
const ops = srcLayout.releaseDrop(srcContainer, srcChildren, dragged);
|
|
48
54
|
if (ops === null) continue;
|
|
49
55
|
released.push(id);
|
|
50
|
-
let landed =
|
|
56
|
+
let landed = dragged.originPose;
|
|
51
57
|
for (const op of ops) {
|
|
52
58
|
const a = op.args;
|
|
53
59
|
if (op.name === "transform" && a.id === id) landed = a.to;
|
|
@@ -73,7 +79,7 @@ function layoutReleaseOps(session, delta, dropCenter) {
|
|
|
73
79
|
const exitOps = [];
|
|
74
80
|
if (session.layout) {
|
|
75
81
|
const pc = session.pc;
|
|
76
|
-
const commitAdapter =
|
|
82
|
+
const commitAdapter = sceneViewPoseAdapter(session.scene);
|
|
77
83
|
const sources = groupBySourceContainer(session.ids.map((id) => ({
|
|
78
84
|
id,
|
|
79
85
|
sourceContainerId: session.scene.get(id)?.parent ?? null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutRelease.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/layoutRelease.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { asNodeId, type NodeId } from 'core/scene/types';\nimport { composeWorldPose, rebaseLocalPose, type PoseAdapter } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"layoutRelease.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/layoutRelease.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { asNodeId, type NodeId } from 'core/scene/types';\nimport { composeChildFrame, composeWorldPose, rebaseLocalPose, type PoseAdapter } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutChild, LayoutContainer } from '../../../../layout/types';\nimport { draggedWorldPose, grabbedPoseAdapter } from '../delta';\nimport { groupBySourceContainer } from '../layout/dropPass';\nimport { resolveLayoutExits } from '../layout/exits';\nimport type { MoveSession } from '../session';\nimport { translateOps, unreleasedIds } from '../translate';\nimport { rebaseTransformOp } from './rebase';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { boxOf, containerView, draggedInView, opInWorld } from '../layout/view';\n\nfunction releaseFrom(\n session: MoveSession,\n delta: { dx: number; dy: number },\n srcId: string,\n leaving: Set<NodeId>,\n commitAdapter: PoseAdapter<unknown>,\n): { ops: Op[]; released: NodeId[] } {\n const { dx, dy } = delta;\n const pc = session.pc;\n const released: NodeId[] = [];\n const releasedOps: Op[] = [];\n // Released children keep their parent, so both ends of a transform\n // rebase under the same frame.\n const rebaseReleased = (op: Op): Op => {\n const id = (op.args as { id?: string } | undefined)?.id;\n if (id === undefined) return op;\n const parent = session.scene.get(asNodeId(id))?.parent ?? null;\n return rebaseTransformOp(opInWorld(view, op), commitAdapter, pc, parent, parent);\n };\n const srcLayout = session.layout?.getLayout(srcId);\n const srcNode = session.scene.get(asNodeId(srcId));\n if (!srcLayout?.releaseDrop || !srcNode) return { ops: releasedOps, released };\n const g = poseDescriptorForNode(session.projection, srcNode);\n const view = containerView(pc, g, composeWorldPose(commitAdapter, srcId, pc.compose));\n const srcContainer: LayoutContainer = {\n id: srcId,\n bounds: boxOf(g, view.toStrategy(composeChildFrame(commitAdapter, srcId, pc.compose))),\n };\n // What the container is left holding — grown back as each\n // release puts one of its own home again.\n let srcChildren: LayoutChild<unknown>[] =\n session.scene.childrenOf(asNodeId(srcId))\n .filter((cid) => !leaving.has(cid))\n .map((cid) => ({\n id: cid as string,\n pose: view.toStrategy(composeWorldPose(commitAdapter, cid as string, pc.compose)),\n }));\n for (const id of leaving) {\n const startWorld = composeWorldPose(\n grabbedPoseAdapter(session, commitAdapter), id as string, pc.compose,\n );\n const dragged = draggedInView(view, {\n id: id as string,\n originPose: startWorld,\n pose: draggedWorldPose(session, grabbedPoseAdapter(session, commitAdapter), id, { dx, dy }),\n sourceContainerId: srcId,\n });\n const ops = srcLayout.releaseDrop!(srcContainer, srcChildren, dragged);\n if (ops === null) continue;\n released.push(id);\n let landed: unknown = dragged.originPose;\n for (const op of ops) {\n const a = op.args as { id?: string; to?: unknown };\n if (op.name === 'transform' && a.id === (id as string)) landed = a.to;\n releasedOps.push(rebaseReleased(op));\n }\n srcChildren = [...srcChildren, { id: id as string, pose: landed }];\n }\n return { ops: releasedOps, released };\n}\n\n/** What the source layouts and the exits decide for a drop no container took.\n * `undefined` when none of them claims any dragged id. */\nexport function layoutReleaseOps(\n session: MoveSession,\n delta: { dx: number; dy: number },\n dropCenter: { x: number; y: number } | null,\n): Op[] | undefined {\n const { dx, dy } = delta;\n // No container accepted the drop. Each source layout gets a say\n // over its own children before they are left wherever the pointer\n // stopped; the rest of the selection falls through to the translate.\n const released = new Set<NodeId>();\n const releasedOps: Op[] = [];\n let exits = new Map<NodeId, NodeId | null>();\n const exitOps: Op[] = [];\n if (session.layout) {\n const pc = session.pc;\n const commitAdapter = sceneViewPoseAdapter(session.scene);\n const sources = groupBySourceContainer(\n session.ids.map((id) => ({\n id,\n sourceContainerId: (session.scene.get(id)?.parent ?? null) as string | null,\n })),\n null,\n );\n for (const [srcId, leaving] of sources) {\n const from = releaseFrom(session, delta, srcId, leaving, commitAdapter);\n for (const id of from.released) released.add(id);\n releasedOps.push(...from.ops);\n }\n // A child its container let go of outside that container leaves it,\n // keeping the world pose it was dropped at.\n exits = resolveLayoutExits(session, dropCenter, session.ids.filter((id) => !released.has(id)));\n for (const [id, toParent] of exits) {\n const node = session.scene.get(id)!;\n const world = draggedWorldPose(session, grabbedPoseAdapter(session, commitAdapter), id, { dx, dy });\n exitOps.push(createReparentOp({\n id: id as string,\n fromParentId: node.parent as string | null,\n toParentId: toParent as string | null,\n label: 'Reparent',\n }));\n exitOps.push(createTransformOp<unknown>({\n id: id as string,\n from: node.pose,\n to: rebaseLocalPose(commitAdapter, world, toParent as string | null, pc.compose, pc.decompose),\n label: session.lifecycle.label,\n }));\n }\n }\n if (released.size === 0 && exits.size === 0) return undefined;\n return [\n ...releasedOps,\n ...exitOps,\n ...translateOps(\n session,\n unreleasedIds(session, released).filter((id) => !exits.has(id)),\n { dx, dy },\n ),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
import { planeToPlane } from "../../../../core/viewport/parallax.js";
|
|
2
2
|
import { rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
|
|
3
|
-
import {
|
|
3
|
+
import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
|
|
4
4
|
import { carryPose, planeOf } from "../../planeInput.js";
|
|
5
5
|
import { createTransformOp } from "../../../../core/ops/transform.js";
|
|
6
6
|
import { createReparentOp } from "../../../../core/ops/reparent.js";
|
|
7
7
|
import { draggedWorldPose, grabbedPoseAdapter } from "../delta.js";
|
|
8
|
+
import { refusalOf } from "../../dropVerdict.js";
|
|
8
9
|
import { translateOps } from "../translate.js";
|
|
10
|
+
import { worldBoundsOf } from "../refusal.js";
|
|
9
11
|
import { createSetLayerOp } from "../../../../core/ops/setLayer.js";
|
|
10
12
|
|
|
11
13
|
//#region src/interactions/actions/move/commit/reparent.ts
|
|
12
14
|
/** Walk the hit chain to find the appropriate drop target. Returns
|
|
13
15
|
* `null` when no reparent should happen (drop on empty canvas, or the
|
|
14
|
-
* only hits are the moved subtree itself)
|
|
15
|
-
|
|
16
|
+
* only hits are the moved subtree itself), and a refusal when the first
|
|
17
|
+
* node of the chain to answer refuses with a reason. */
|
|
18
|
+
function resolveDrop(session, at) {
|
|
16
19
|
const dep = session.nodeAtPoint;
|
|
17
20
|
if (!dep) return null;
|
|
18
21
|
const hit = dep(at, /* @__PURE__ */ new Set([...session.ids, ...session.cascadeIds]));
|
|
19
22
|
if (!hit) return null;
|
|
20
23
|
const hitNode = session.scene.get(hit);
|
|
21
24
|
if (!hitNode) return null;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
let newParent = hit;
|
|
26
|
+
let hitSibling = null;
|
|
27
|
+
while (newParent !== null) {
|
|
28
|
+
const verdict = session.verdict(newParent);
|
|
29
|
+
if (verdict === true) break;
|
|
30
|
+
const reason = refusalOf(verdict);
|
|
31
|
+
if (reason !== null) return { refused: {
|
|
32
|
+
id: newParent,
|
|
33
|
+
bounds: worldBoundsOf(session, newParent),
|
|
34
|
+
reason
|
|
35
|
+
} };
|
|
30
36
|
hitSibling = newParent;
|
|
31
37
|
newParent = session.scene.get(newParent)?.parent ?? null;
|
|
32
38
|
}
|
|
@@ -40,7 +46,7 @@ function resolveDropTarget(session, at) {
|
|
|
40
46
|
* drag showed, then the ops that bring uncarried descendants along. */
|
|
41
47
|
function reparentOps(session, target, mode, delta) {
|
|
42
48
|
const { scene, pc, view } = session;
|
|
43
|
-
const adapter =
|
|
49
|
+
const adapter = sceneViewPoseAdapter(scene);
|
|
44
50
|
const label = session.lifecycle.label;
|
|
45
51
|
const ops = [];
|
|
46
52
|
const siblings = [...target.newParent === null ? scene.roots : scene.childrenOf(target.newParent)];
|
|
@@ -93,5 +99,5 @@ function reparentOps(session, target, mode, delta) {
|
|
|
93
99
|
}
|
|
94
100
|
|
|
95
101
|
//#endregion
|
|
96
|
-
export { reparentOps,
|
|
102
|
+
export { reparentOps, resolveDrop };
|
|
97
103
|
//# sourceMappingURL=reparent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reparent.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/reparent.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createSetLayerOp } from 'core/ops/setLayer';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId } from 'core/scene/types';\nimport { planeToPlane } from 'core/viewport/parallax';\nimport { rebaseLocalPose } from 'core/scene/composePose';\nimport {
|
|
1
|
+
{"version":3,"file":"reparent.js","names":[],"sources":["../../../../../src/interactions/actions/move/commit/reparent.ts"],"sourcesContent":["import { createReparentOp } from 'core/ops/reparent';\nimport { createSetLayerOp } from 'core/ops/setLayer';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId } from 'core/scene/types';\nimport { planeToPlane } from 'core/viewport/parallax';\nimport { rebaseLocalPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport { carryPose, planeOf } from '../../planeInput';\nimport { draggedWorldPose, grabbedPoseAdapter } from '../delta';\nimport type { MoveSession, ReparentOnDrop } from '../session';\nimport { translateOps } from '../translate';\nimport { refusalOf } from '../../dropVerdict';\nimport { worldBoundsOf, type MoveRefusal } from '../refusal';\n\n/** Resolved drop target — the new parent + layer + (for `'above'` mode)\n * the hit sibling whose z-order position the moved node should land\n * immediately above. `newParent === null` means \"land at the layer\n * root\" (top-level node of `newLayer`). */\nexport interface DropTarget {\n newParent: NodeId | null;\n newLayer: string;\n hitSibling: NodeId | null;\n}\n\n/** Walk the hit chain to find the appropriate drop target. Returns\n * `null` when no reparent should happen (drop on empty canvas, or the\n * only hits are the moved subtree itself), and a refusal when the first\n * node of the chain to answer refuses with a reason. */\nexport function resolveDrop(\n session: MoveSession,\n at: { x: number; y: number },\n): DropTarget | { refused: MoveRefusal } | null {\n const dep = session.nodeAtPoint;\n if (!dep) return null;\n\n // Exclude moved roots + their descendants. Otherwise we'd happily\n // reparent a node into itself (or under one of its own children).\n const exclude = new Set<NodeId>([...session.ids, ...session.cascadeIds]);\n const hit = dep(at, exclude);\n if (!hit) return null;\n\n const hitNode = session.scene.get(hit);\n if (!hitNode) return null;\n\n // A node that admits the drop is a drop-INTO target; one that refuses it\n // silently is a sibling to land beside, inside the nearest ancestor that\n // admits it. When there is none, `newParent === null` and the moved subtree\n // lands at the layer root.\n let newParent: NodeId | null = hit;\n let hitSibling: NodeId | null = null;\n while (newParent !== null) {\n const verdict = session.verdict(newParent);\n if (verdict === true) break;\n const reason = refusalOf(verdict);\n if (reason !== null) return { refused: { id: newParent, bounds: worldBoundsOf(session, newParent), reason } };\n hitSibling = newParent;\n newParent = session.scene.get(newParent)?.parent ?? null;\n }\n return { newParent, newLayer: hitNode.layer, hitSibling };\n}\n\n/** Reparent and reposition each moved root as ops, keeping the world pose the\n * drag showed, then the ops that bring uncarried descendants along. */\nexport function reparentOps(\n session: MoveSession,\n target: DropTarget,\n mode: ReparentOnDrop,\n delta: { dx: number; dy: number },\n): Op[] {\n const { scene, pc, view } = session;\n const adapter = sceneViewPoseAdapter(scene);\n const label = session.lifecycle.label;\n const ops: Op[] = [];\n // The destination's children as each op will find them: an earlier root's\n // landing shifts where a later one goes.\n const siblings = [...(target.newParent === null ? scene.roots : scene.childrenOf(target.newParent))];\n for (const id of session.ids) {\n if (!session.startPoses.has(id)) continue;\n const node = scene.get(id)!;\n const crossing = node.layer !== target.newLayer;\n const world = carryPose(\n session.descriptorOf(id),\n draggedWorldPose(session, grabbedPoseAdapter(session, adapter), id, delta),\n crossing ? planeToPlane(planeOf(view, node.layer), planeOf(view, target.newLayer)) : null,\n );\n const to = rebaseLocalPose(adapter, world, target.newParent as string | null, pc.compose, pc.decompose);\n\n let from = node.parent as string | null;\n if (crossing) {\n // The scene refuses a layer change on a node whose parent is on another layer.\n if (from !== null) {\n ops.push(createReparentOp({\n id: id as string, fromParentId: from, toParentId: null, label, coalesceKey: `reparent:${id}:orphan`,\n }));\n from = null;\n }\n ops.push(createSetLayerOp({ id: id as string, from: node.layer, to: target.newLayer, label }));\n }\n\n const was = siblings.indexOf(id);\n if (was >= 0) siblings.splice(was, 1);\n const hit = mode === 'above' && target.hitSibling\n ? siblings.indexOf(target.hitSibling)\n : -1;\n const toIndex = hit >= 0 ? hit + 1 : undefined;\n if (toIndex === undefined) siblings.push(id);\n else siblings.splice(toIndex, 0, id);\n\n ops.push(createReparentOp({\n id: id as string, fromParentId: from, toParentId: target.newParent as string | null, toIndex, label,\n }));\n ops.push(createTransformOp<unknown>({ id: id as string, from: node.pose, to, label }));\n }\n return [...ops, ...translateOps(session, session.cascadeIds, delta)];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AA6BA,SAAgB,YACd,SACA,IAC8C;CAC9C,MAAM,MAAM,QAAQ;CACpB,IAAI,CAAC,KAAK,OAAO;CAKjB,MAAM,MAAM,IAAI,oBAAI,IADA,IAAY,CAAC,GAAG,QAAQ,KAAK,GAAG,QAAQ,UAAU,CAClD,CAAO;CAC3B,IAAI,CAAC,KAAK,OAAO;CAEjB,MAAM,UAAU,QAAQ,MAAM,IAAI,GAAG;CACrC,IAAI,CAAC,SAAS,OAAO;CAMrB,IAAI,YAA2B;CAC/B,IAAI,aAA4B;CAChC,OAAO,cAAc,MAAM;EACzB,MAAM,UAAU,QAAQ,QAAQ,SAAS;EACzC,IAAI,YAAY,MAAM;EACtB,MAAM,SAAS,UAAU,OAAO;EAChC,IAAI,WAAW,MAAM,OAAO,EAAE,SAAS;GAAE,IAAI;GAAW,QAAQ,cAAc,SAAS,SAAS;GAAG;EAAO,EAAE;EAC5G,aAAa;EACb,YAAY,QAAQ,MAAM,IAAI,SAAS,CAAC,EAAE,UAAU;CACtD;CACA,OAAO;EAAE;EAAW,UAAU,QAAQ;EAAO;CAAW;AAC1D;;;AAIA,SAAgB,YACd,SACA,QACA,MACA,OACM;CACN,MAAM,EAAE,OAAO,IAAI,SAAS;CAC5B,MAAM,UAAU,qBAAqB,KAAK;CAC1C,MAAM,QAAQ,QAAQ,UAAU;CAChC,MAAM,MAAY,CAAC;CAGnB,MAAM,WAAW,CAAC,GAAI,OAAO,cAAc,OAAO,MAAM,QAAQ,MAAM,WAAW,OAAO,SAAS,CAAE;CACnG,KAAK,MAAM,MAAM,QAAQ,KAAK;EAC5B,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,GAAG;EACjC,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,WAAW,KAAK,UAAU,OAAO;EACvC,MAAM,QAAQ,UACZ,QAAQ,aAAa,EAAE,GACvB,iBAAiB,SAAS,mBAAmB,SAAS,OAAO,GAAG,IAAI,KAAK,GACzE,WAAW,aAAa,QAAQ,MAAM,KAAK,KAAK,GAAG,QAAQ,MAAM,OAAO,QAAQ,CAAC,IAAI,IACvF;EACA,MAAM,KAAK,gBAAgB,SAAS,OAAO,OAAO,WAA4B,GAAG,SAAS,GAAG,SAAS;EAEtG,IAAI,OAAO,KAAK;EAChB,IAAI,UAAU;GAEZ,IAAI,SAAS,MAAM;IACjB,IAAI,KAAK,iBAAiB;KACpB;KAAc,cAAc;KAAM,YAAY;KAAM;KAAO,aAAa,YAAY,GAAG;IAC7F,CAAC,CAAC;IACF,OAAO;GACT;GACA,IAAI,KAAK,iBAAiB;IAAM;IAAc,MAAM,KAAK;IAAO,IAAI,OAAO;IAAU;GAAM,CAAC,CAAC;EAC/F;EAEA,MAAM,MAAM,SAAS,QAAQ,EAAE;EAC/B,IAAI,OAAO,GAAG,SAAS,OAAO,KAAK,CAAC;EACpC,MAAM,MAAM,SAAS,WAAW,OAAO,aACnC,SAAS,QAAQ,OAAO,UAAU,IAClC;EACJ,MAAM,UAAU,OAAO,IAAI,MAAM,IAAI;EACrC,IAAI,YAAY,QAAW,SAAS,KAAK,EAAE;OACtC,SAAS,OAAO,SAAS,GAAG,EAAE;EAEnC,IAAI,KAAK,iBAAiB;GACpB;GAAc,cAAc;GAAM,YAAY,OAAO;GAA4B;GAAS;EAChG,CAAC,CAAC;EACF,IAAI,KAAK,kBAA2B;GAAM;GAAc,MAAM,KAAK;GAAM;GAAI;EAAM,CAAC,CAAC;CACvF;CACA,OAAO,CAAC,GAAG,KAAK,GAAG,aAAa,SAAS,QAAQ,YAAY,KAAK,CAAC;AACrE"}
|