@weasel-js/core 1.14.2 → 1.15.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 +251 -0
- package/dist/WeaselProvider.js +4 -5
- package/dist/affordances/composeAffordanceLayer.js +1 -2
- package/dist/affordances/cornerResize.js +4 -5
- package/dist/affordances/hitAffordanceRegions.js +1 -2
- package/dist/affordances/pathAnchors.js +1 -3
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotateCursor.js +1 -2
- package/dist/affordances/rotationHandle.js +2 -3
- package/dist/animation/behaviors/coast.js +1 -2
- package/dist/animation/behaviors/coastByWrite.js +2 -3
- package/dist/animation/behaviors/coastOnTargets.js +2 -3
- package/dist/animation/behaviors/momentum.js +1 -2
- package/dist/animation/clipTargets.js +1 -2
- package/dist/animation/departures.js +2 -3
- package/dist/animation/poseHelpers.js +2 -3
- package/dist/animation/poseTarget.js +2 -3
- package/dist/animation/poseTransition.js +1 -2
- package/dist/animation/reflow.js +2 -3
- package/dist/animation/rewind.js +1 -2
- package/dist/animation/rig/bindRig.js +2 -3
- package/dist/animation/rig/rigNode.js +1 -2
- package/dist/animation/rig/rigSeat.js +1 -2
- package/dist/animation/rig/skinBinding.js +1 -2
- package/dist/animation/rig/useRig.js +2 -3
- package/dist/animation/wrappers/animateLifecycle.js +1 -2
- package/dist/animation/wrappers/animateOnSetPose.js +1 -2
- package/dist/animation/wrappers/instantPose.js +1 -2
- package/dist/animation/writtenPoseTarget.js +1 -2
- package/dist/barrel/interactions.js +2 -1
- package/dist/barrel/paths.js +1 -1
- package/dist/barrel/renderer.js +2 -2
- package/dist/barrel/routing.js +6 -4
- package/dist/barrel/scene.js +2 -2
- package/dist/barrel/text.js +5 -3
- package/dist/canvas/Canvas.js +10 -7
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +6 -7
- package/dist/canvas/CursorCoordsHud.js +2 -3
- package/dist/canvas/DrawCanvas.js +8 -5
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/GestureReason.js +1 -2
- package/dist/canvas/GestureReason.module.js +1 -2
- package/dist/canvas/LeanSceneCanvas.js +2 -3
- package/dist/canvas/ModalityHud.js +2 -3
- package/dist/canvas/NodeShape.js +3 -4
- package/dist/canvas/PickHud.js +2 -3
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +1 -2
- package/dist/canvas/SceneCanvas/CanvasKitProviders.js +3 -4
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +1 -2
- package/dist/canvas/SceneCanvas/DevHuds.js +1 -2
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +1 -2
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js +8 -5
- package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
- package/dist/canvas/SceneCanvas/SurfaceDeclarations.js +1 -2
- package/dist/canvas/SceneCanvas/brushOverlay.js +1 -2
- package/dist/canvas/SceneCanvas/builtinToolSets.js +7 -5
- package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -1
- package/dist/canvas/SceneCanvas/canvasPassThrough.js +1 -2
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js +1 -2
- package/dist/canvas/SceneCanvas/coordTrace.js +1 -2
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +4 -5
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -2
- package/dist/canvas/SceneCanvas/defaultTextEditor.js +4 -5
- package/dist/canvas/SceneCanvas/describePresets.js +1 -2
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +1 -2
- package/dist/canvas/SceneCanvas/features.js +1 -2
- package/dist/canvas/SceneCanvas/insertPreviewCommands.js +1 -2
- package/dist/canvas/SceneCanvas/mergeLayers.js +1 -2
- package/dist/canvas/SceneCanvas/namedPresets.js +5 -6
- package/dist/canvas/SceneCanvas/poseGeometry.js +1 -2
- package/dist/canvas/SceneCanvas/poseRegistrars.js +1 -2
- package/dist/canvas/SceneCanvas/presets/arrange.js +2 -3
- package/dist/canvas/SceneCanvas/presets/baseline.js +1 -2
- package/dist/canvas/SceneCanvas/presets/chrome.js +1 -2
- package/dist/canvas/SceneCanvas/presets/composites.js +1 -2
- package/dist/canvas/SceneCanvas/presets/edit.js +4 -5
- package/dist/canvas/SceneCanvas/presets/ingest.js +1 -2
- package/dist/canvas/SceneCanvas/presets/paths.js +9 -10
- package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -1
- package/dist/canvas/SceneCanvas/presets/select.js +1 -2
- package/dist/canvas/SceneCanvas/presets/toolDriven.js +2 -3
- package/dist/canvas/SceneCanvas/presets/tools.js +1 -2
- package/dist/canvas/SceneCanvas/presets/transform.js +2 -3
- package/dist/canvas/SceneCanvas/presets/view.js +2 -3
- package/dist/canvas/SceneCanvas/props.js +1 -2
- package/dist/canvas/SceneCanvas/scenePointQuery.js +2 -3
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +2 -3
- package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/toolRegistry.js +2 -3
- package/dist/canvas/SceneCanvas/useActionTunings.js +1 -2
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -2
- package/dist/canvas/SceneCanvas/useBakedScene.js +2 -3
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +7 -8
- package/dist/canvas/SceneCanvas/useBuiltinTools.js +3 -2
- package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasCamera.js +2 -3
- package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +1 -2
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +1 -2
- package/dist/canvas/SceneCanvas/useCanvasSelection.js +8 -6
- package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
- package/dist/canvas/SceneCanvas/useCanvasTools.js +2 -3
- package/dist/canvas/SceneCanvas/useChromeAffordances.js +2 -3
- package/dist/canvas/SceneCanvas/useContributionRoles.js +3 -2
- package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
- package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +4 -5
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +2 -3
- package/dist/canvas/SceneCanvas/useHeldModifiers.js +1 -2
- package/dist/canvas/SceneCanvas/useMagnificationCheck.js +41 -0
- package/dist/canvas/SceneCanvas/useMagnificationCheck.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js +1 -2
- package/dist/canvas/SceneCanvas/useNodeKinds.js +2 -3
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +10 -11
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +1 -2
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +6 -7
- package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +1 -2
- package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +1 -2
- package/dist/canvas/SceneCanvas/useSceneChrome.js +22 -11
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +6 -7
- package/dist/canvas/SceneCanvas/useScenePicking.js +5 -6
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +1 -2
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +7 -8
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +2 -3
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js +28 -17
- package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +2 -3
- package/dist/canvas/SceneCanvas/useSurfaceRouting.js +1 -2
- package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js +1 -2
- package/dist/canvas/SceneCanvas/useToolKeybindings.js +1 -2
- package/dist/canvas/SceneCanvas/useViewportActions.js +3 -4
- package/dist/canvas/SceneCanvas/worldPointAt.js +1 -2
- package/dist/canvas/SceneCanvas.js +22 -20
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +7 -4
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/SurfaceCanvas.js +1 -2
- package/dist/canvas/ViewMarker.js +1 -2
- package/dist/canvas/accentColor.js +1 -2
- package/dist/canvas/adapterDerivedPath.js +2 -3
- package/dist/canvas/adapterPickSource.js +1 -2
- package/dist/canvas/affordanceAt.js +2 -4
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +4 -5
- package/dist/canvas/buildSceneTree.js +4 -5
- package/dist/canvas/canvasRenderer.js +1 -2
- package/dist/canvas/colorOverrides.js +1 -2
- package/dist/canvas/contextAttributes.js +1 -2
- package/dist/canvas/copiesAbove.js +1 -2
- package/dist/canvas/defaultDrawOne.js +1 -2
- package/dist/canvas/deps/areaSelect.js +5 -3
- package/dist/canvas/deps/areaSelect.js.map +1 -1
- package/dist/canvas/deps/booleans.js +5 -6
- package/dist/canvas/deps/changes.js +1 -2
- package/dist/canvas/deps/chromeRules.js +36 -0
- package/dist/canvas/deps/chromeRules.js.map +1 -0
- package/dist/canvas/deps/debug.js +1 -2
- package/dist/canvas/deps/dispatchSources.js +1 -2
- package/dist/canvas/deps/dispatcher.js +1 -2
- package/dist/canvas/deps/editAnchors.js +3 -10
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/enteredGroup.js +1 -2
- package/dist/canvas/deps/geometryProjection.js +1 -2
- package/dist/canvas/deps/hitTestArea.js +6 -5
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/ingestion.js +1 -2
- package/dist/canvas/deps/insert.js +3 -4
- package/dist/canvas/deps/insertSite.js +3 -4
- package/dist/canvas/deps/kitSettings.js +1 -2
- package/dist/canvas/deps/lassoSelect.js +5 -3
- package/dist/canvas/deps/lassoSelect.js.map +1 -1
- package/dist/canvas/deps/layout.js +1 -2
- package/dist/canvas/deps/modeDefaultTool.js +22 -0
- package/dist/canvas/deps/modeDefaultTool.js.map +1 -0
- package/dist/canvas/deps/nodeAtPoint.js +1 -2
- package/dist/canvas/deps/pathEditCommits.js +3 -4
- package/dist/canvas/deps/pathLeaf.js +1 -2
- package/dist/canvas/deps/pathLeafDeps.js +2 -3
- package/dist/canvas/deps/poseDescriptor.js +1 -2
- package/dist/canvas/deps/previewPaths.js +1 -2
- package/dist/canvas/deps/resizePolicy.js +1 -2
- package/dist/canvas/deps/selectionSnapshot.js +22 -0
- package/dist/canvas/deps/selectionSnapshot.js.map +1 -0
- package/dist/canvas/deps/slice.js +5 -6
- package/dist/canvas/deps/snap.js +4 -4
- package/dist/canvas/deps/snap.js.map +1 -1
- package/dist/canvas/deps/surface.js +1 -2
- package/dist/canvas/deps/textEdit.js +1 -2
- package/dist/canvas/deps/transformFollowers.js +1 -2
- package/dist/canvas/deps/view.js +1 -2
- package/dist/canvas/derivedPath.js +6 -7
- package/dist/canvas/doubleClickTarget.js +1 -2
- package/dist/canvas/drawEnvelope.js +1 -2
- package/dist/canvas/drawnBounds.js +4 -5
- package/dist/canvas/getNodeAtPoint.js +1 -2
- package/dist/canvas/hostAnchor.js +1 -2
- package/dist/canvas/hud.module.js +1 -2
- package/dist/canvas/inheritedPaints.js +1 -2
- package/dist/canvas/insertPreviewExtent.js +1 -2
- package/dist/canvas/kitRequirements.js +1 -2
- package/dist/canvas/layerHover.js +1 -2
- package/dist/canvas/layerOrder.js +1 -2
- package/dist/canvas/layerSlots.js +1 -2
- package/dist/canvas/mountedCanvases.js +1 -2
- package/dist/canvas/nodeShapes/derivedPainter.js +2 -3
- package/dist/canvas/nodeShapes/imagePainter.js +1 -2
- package/dist/canvas/nodeShapes/measurePainter.js +2 -3
- package/dist/canvas/nodeShapes/memo.js +1 -2
- package/dist/canvas/nodeShapes/nodePaint.js +1 -2
- package/dist/canvas/nodeShapes/pathPainter.js +3 -4
- package/dist/canvas/nodeShapes/poseBox.js +1 -2
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +1 -2
- package/dist/canvas/nodeShapes/shapePainter.js +2 -3
- package/dist/canvas/nodeShapes/strokedBounds.js +1 -2
- package/dist/canvas/nodeShapes/textPainter.js +1 -2
- package/dist/canvas/overChildren.js +1 -2
- package/dist/canvas/overlayRoleStrokes.js +1 -2
- package/dist/canvas/ownClip.js +1 -2
- package/dist/canvas/paintCull.js +1 -2
- package/dist/canvas/paintedCursorLayer.js +1 -2
- package/dist/canvas/pathOverlay.js +1 -2
- package/dist/canvas/pickIndex/nodeBroadBox.js +3 -4
- package/dist/canvas/pickIndex/scenePickIndex.js +3 -4
- package/dist/canvas/pickReach.js +13 -10
- package/dist/canvas/pickReach.js.map +1 -1
- package/dist/canvas/pickWalk.js +9 -8
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/planeClips.js +1 -2
- package/dist/canvas/poseRotation.js +1 -2
- package/dist/canvas/publishPreviews.js +1 -2
- package/dist/canvas/rasterReadback.js +1 -2
- package/dist/canvas/rasterToPng.js +1 -2
- package/dist/canvas/renderDebugSnapshot.js +1 -2
- package/dist/canvas/renderNeeds.js +1 -2
- package/dist/canvas/renderSceneToPixels.js +5 -6
- package/dist/canvas/sceneAdapter.js +37 -27
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +19 -7
- package/dist/canvas/sceneClipboard.js.map +1 -1
- package/dist/canvas/sceneLayerPaint.js +1 -2
- package/dist/canvas/scenePickReads.js +1 -2
- package/dist/canvas/scenePickSource.js +7 -8
- package/dist/canvas/scenePickSource.js.map +1 -1
- package/dist/canvas/sceneSlotWiring.js +2 -3
- package/dist/canvas/sceneViewRender.js +5 -6
- package/dist/canvas/shownNodes.js +1 -2
- package/dist/canvas/slopsDebugLayer.js +1 -2
- package/dist/canvas/surfaceContribution.js +1 -2
- package/dist/canvas/useCanvasElements.js +1 -2
- package/dist/canvas/useCanvasHandle.js +1 -2
- package/dist/canvas/useCanvasPaint.js +2 -3
- package/dist/canvas/useCanvasRenderer.js +1 -2
- package/dist/canvas/useCanvasSurface.js +22 -5
- package/dist/canvas/useCanvasSurface.js.map +1 -1
- package/dist/canvas/useCanvasView.js +2 -3
- package/dist/canvas/useClientToWorld.js +1 -2
- package/dist/canvas/useExtraLayers.js +1 -2
- package/dist/canvas/useFrameLoop.js +7 -9
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useHitObserver.js +1 -2
- package/dist/canvas/useHostAnchor.js +1 -2
- package/dist/canvas/useInFlightBounds.js +6 -6
- package/dist/canvas/useInFlightBounds.js.map +1 -1
- package/dist/canvas/useLateContentRedraw.js +1 -2
- package/dist/canvas/useLayerStack.js +2 -3
- package/dist/canvas/usePaintedCursor.js +1 -2
- package/dist/canvas/useRedrawOn.js +1 -2
- package/dist/canvas/useSceneAdapter.js +1 -2
- package/dist/canvas/useSceneLayerList.js +1 -2
- package/dist/canvas/useSurfaceInput.js +1 -2
- package/dist/canvas/useSurfaceSize.js +5 -5
- package/dist/canvas/useSurfaceSize.js.map +1 -1
- package/dist/canvas/useToolCursor.js +1 -2
- package/dist/canvas/useViewAim.js +2 -3
- package/dist/canvas/useViewHelpers.js +5 -4
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/canvas/useViewLayerGate.js +1 -2
- package/dist/canvas/useViewNesting.js +1 -2
- package/dist/canvas/useViewRegistrySurface.js +1 -2
- package/dist/canvas/viewInputs.js +1 -2
- package/dist/canvas/viewMarkers.js +1 -2
- package/dist/canvas/viewRegistry.js +1 -2
- package/dist/canvas/viewSnap.js +1 -2
- package/dist/canvas/watchElementMove.js +1 -2
- package/dist/canvas/wrapNodeOutput.js +1 -2
- package/dist/core/adapters/testing/rootsTree.js +1 -2
- package/dist/core/applyOps.js +1 -2
- package/dist/core/device/targets.js +1 -2
- package/dist/core/device/useDeviceProfile.js +1 -2
- package/dist/core/device/useTargetBasePx.js +1 -2
- package/dist/core/device/watchDevicePixelRatio.js +1 -2
- package/dist/core/geometry/autoPoseDescriptor.js +2 -3
- package/dist/core/geometry/booleanOfPaths.js +1 -2
- package/dist/core/geometry/inkExtents.js +1 -2
- package/dist/core/geometry/pathPoseDescriptor.js +1 -2
- package/dist/core/geometry/poseDescriptor.js +1 -2
- package/dist/core/geometry/regionHit.js +36 -18
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/targetFrame.js +1 -2
- package/dist/core/geometry/unionBounds.js +1 -2
- package/dist/core/layers/backgroundFill.js +1 -2
- package/dist/core/layers/children.js +1 -2
- package/dist/core/layers/gateLayer.js +1 -2
- package/dist/core/layers/layerGroup.js +1 -2
- package/dist/core/layers/redrawSource.js +1 -2
- package/dist/core/layers/render.js +1 -2
- package/dist/core/layers/retain.js +1 -2
- package/dist/core/ops/arrange.js +1 -2
- package/dist/core/ops/create.js +2 -3
- package/dist/core/ops/createHistory.js +2 -3
- package/dist/core/ops/delete.js +2 -3
- package/dist/core/ops/nodeFlags.js +1 -2
- package/dist/core/ops/registry.js +1 -2
- package/dist/core/ops/reorder/algorithms.js +1 -2
- package/dist/core/ops/reorder/index.js +1 -2
- package/dist/core/ops/reorder/setChildOrder.js +1 -2
- package/dist/core/ops/reparent.js +1 -2
- package/dist/core/ops/select.js +1 -2
- package/dist/core/ops/setData.js +1 -2
- package/dist/core/ops/setDependsOn.js +1 -2
- package/dist/core/ops/setLayer.js +1 -2
- package/dist/core/ops/setLayout.js +1 -2
- package/dist/core/ops/setPath.js +1 -2
- package/dist/core/ops/setText.js +1 -2
- package/dist/core/ops/slot.js +1 -2
- package/dist/core/ops/transform.js +1 -2
- package/dist/core/ops/writtenBy.js +1 -2
- package/dist/core/pages/fitViewToPage.js +1 -2
- package/dist/core/pages/pageEdits.js +3 -4
- package/dist/core/pages/pages.js +1 -2
- package/dist/core/pages/pages.js.map +1 -1
- package/dist/core/pages/pagesLayer.js +1 -2
- package/dist/core/paint/meshKind.js +1 -2
- package/dist/core/paint/meshKindLazy.js +9 -18
- package/dist/core/paint/meshKindLazy.js.map +1 -1
- package/dist/core/paint/paintKindEntry.js +1 -2
- package/dist/core/paint/paintKinds.js +1 -2
- package/dist/core/paint/registerMesh.js +1 -2
- package/dist/core/scene/NodeProperties.js +1 -2
- package/dist/core/scene/NodeRouting.js +1 -2
- package/dist/core/scene/annotation.js +1 -2
- package/dist/core/scene/appliedLog.js +1 -2
- package/dist/core/scene/arrivalWindow.js +2 -3
- package/dist/core/scene/arrivals.js +1 -2
- package/dist/core/scene/booleanGroup.js +1 -2
- package/dist/core/scene/booleanOfChildren.js +1 -2
- package/dist/core/scene/boundOps.js +1 -2
- package/dist/core/scene/carryDescendants.js +2 -3
- package/dist/core/scene/clipNothing.js +1 -2
- package/dist/core/scene/composeFrame.js +1 -2
- package/dist/core/scene/composePose.js +1 -2
- package/dist/core/scene/declaredFieldSetters.js +1 -2
- package/dist/core/scene/depFrame.js +1 -2
- package/dist/core/scene/depMemo.js +1 -2
- package/dist/core/scene/dependents.js +1 -2
- package/dist/core/scene/derivedParts.js +1 -2
- package/dist/core/scene/derivedPath.js +2 -3
- package/dist/core/scene/docValues.js +1 -2
- package/dist/core/scene/documentOf.js +1 -2
- package/dist/core/scene/editMode.js +5 -3
- package/dist/core/scene/editMode.js.map +1 -1
- package/dist/core/scene/editPass.js +1 -2
- package/dist/core/scene/effectivePose.js +3 -4
- package/dist/core/scene/fieldEdits.js +1 -2
- package/dist/core/scene/fontReads.js +1 -2
- package/dist/core/scene/historyFacade.js +8 -52
- package/dist/core/scene/historyFacade.js.map +1 -1
- package/dist/core/scene/historyForm.js +1 -2
- package/dist/core/scene/inheritedPaint.js +1 -2
- package/dist/core/scene/kitOps.js +16 -15
- package/dist/core/scene/kitOps.js.map +1 -1
- package/dist/core/scene/kitRegistry.js +2 -3
- package/dist/core/scene/layerOps.js +1 -2
- package/dist/core/scene/layerStack.js +1 -2
- package/dist/core/scene/layoutPass.js +4 -5
- package/dist/core/scene/lockGuard.js +1 -2
- package/dist/core/scene/minSize.js +1 -2
- package/dist/core/scene/nestedHit.js +1 -2
- package/dist/core/scene/nodeAsShown.js +1 -2
- package/dist/core/scene/nodeFlags.js +1 -2
- package/dist/core/scene/nodeFnFields.js +1 -2
- package/dist/core/scene/nodeGates.js +3 -4
- package/dist/core/scene/nodeGates.js.map +1 -1
- package/dist/core/scene/nodeMemo.js +1 -2
- package/dist/core/scene/nodeStore.js +2 -3
- package/dist/core/scene/notifier.js +1 -2
- package/dist/core/scene/opTable.js +9 -10
- package/dist/core/scene/opTable.js.map +1 -1
- package/dist/core/scene/outerOps.js +3 -4
- package/dist/core/scene/outerOps.js.map +1 -1
- package/dist/core/scene/pathEffects/blend.js +1 -2
- package/dist/core/scene/pathEffects/derive.js +2 -3
- package/dist/core/scene/pathEffects/effects.js +1 -2
- package/dist/core/scene/pathEffects/foundHidden.js +1 -2
- package/dist/core/scene/pathEffects/textAlong.js +1 -2
- package/dist/core/scene/pathEffects/textAlongBands.js +1 -2
- package/dist/core/scene/plyStacks.js +1 -2
- package/dist/core/scene/poseFeed.js +1 -2
- package/dist/core/scene/poseHold.js +1 -2
- package/dist/core/scene/poseOverrides.js +1 -2
- package/dist/core/scene/posePlies.js +1 -2
- package/dist/core/scene/poseRemovals.js +1 -2
- package/dist/core/scene/poseSnapshot.js +1 -2
- package/dist/core/scene/poseWrites.js +17 -17
- package/dist/core/scene/poseWrites.js.map +1 -1
- package/dist/core/scene/reconcileSpecs.js +26 -3
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/recorder.js +1 -2
- package/dist/core/scene/renderOrder.js +1 -2
- package/dist/core/scene/sameValue.js +1 -2
- package/dist/core/scene/scene.js +11 -12
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneChanges.js +1 -2
- package/dist/core/scene/sceneEdits.js +1 -2
- package/dist/core/scene/sceneJournals.js +77 -0
- package/dist/core/scene/sceneJournals.js.map +1 -0
- package/dist/core/scene/sceneMutators.js +2 -3
- package/dist/core/scene/scenePoseAdapter.js +1 -2
- package/dist/core/scene/sceneRecording.js +4 -4
- package/dist/core/scene/sceneRecording.js.map +1 -1
- package/dist/core/scene/sceneSelection.js +8 -5
- package/dist/core/scene/sceneSelection.js.map +1 -1
- package/dist/core/scene/sceneState.js +3 -4
- package/dist/core/scene/scrollOffsets.js +1 -2
- package/dist/core/scene/serialization.js +2 -3
- package/dist/core/scene/staleReplay.js +1 -2
- package/dist/core/scene/statedFields.js +1 -2
- package/dist/core/scene/strategyView.js +1 -2
- package/dist/core/scene/treeEdits.js +2 -3
- package/dist/core/scene/treeOrder.js +1 -2
- package/dist/core/scene/treeReads.js +1 -2
- package/dist/core/scene/treeShape.js +1 -2
- package/dist/core/scene/types.js +1 -2
- package/dist/core/scene/types.js.map +1 -1
- package/dist/core/scene/unionOfChildren.js +1 -2
- package/dist/core/scene/unitScopes.js +20 -4
- package/dist/core/scene/unitScopes.js.map +1 -1
- package/dist/core/scene/useScene.js +2 -3
- package/dist/core/scene/worldSave.js +2 -3
- package/dist/core/selection/chromeState.js +1 -2
- package/dist/core/selection/outermostSelection.js +56 -0
- package/dist/core/selection/outermostSelection.js.map +1 -0
- package/dist/core/selection/readOnlySelection.js +1 -2
- package/dist/core/selection/selectionTarget.js +1 -2
- package/dist/core/selection/usePublishSceneSelection.js +1 -2
- package/dist/core/selection/useSelection.js +1 -2
- package/dist/core/shapeKinds.js +1 -2
- package/dist/core/stableStringify.js +1 -2
- package/dist/core/stylus/stylus.js +1 -2
- package/dist/core/stylus/usePointerStylus.js +1 -2
- package/dist/core/usePaintKinds.js +1 -2
- package/dist/core/viewport/clampView.js +1 -2
- package/dist/core/viewport/clientToWorld.js +1 -2
- package/dist/core/viewport/createVelocityTracker.js +1 -2
- package/dist/core/viewport/fitToBounds.js +1 -2
- package/dist/core/viewport/fitViewToBounds.js +1 -2
- package/dist/core/viewport/interpolateView.js +1 -2
- package/dist/core/viewport/parallax.js +1 -2
- package/dist/core/viewport/sceneNodeClientRect.js +1 -2
- package/dist/core/viewport/screenSlop.js +1 -2
- package/dist/core/viewport/useAutoCenter.js +1 -2
- package/dist/core/viewport/useCanvasSize.js +48 -28
- package/dist/core/viewport/useCanvasSize.js.map +1 -1
- package/dist/core/viewport/useDecayLoop.js +1 -2
- package/dist/core/viewport/useNodeOverlayFrame.js +1 -2
- package/dist/core/viewport/useVelocityTracker.js +1 -2
- package/dist/core/viewport/useViewAnimation.js +3 -4
- package/dist/core/viewport/view.js +1 -2
- package/dist/core/viewport/viewTransform.js +1 -2
- package/dist/core/viewport/viewportWorldRect.js +1 -2
- package/dist/core/viewport/wheelHandler.js +1 -2
- package/dist/core/viewport/zoomAt.js +2 -3
- package/dist/core/viewport/zoomBounds.js +1 -2
- package/dist/debug/createDebugOverlayLayer.js +1 -2
- package/dist/debug/createDebugSink.js +1 -2
- package/dist/debug/defaultTheme.js +1 -2
- package/dist/debug/features.js +1 -2
- package/dist/debug/frameStats.js +1 -2
- package/dist/debug/overlayPanels.js +1 -2
- package/dist/debug/parseDebugFlags.js +1 -2
- package/dist/debug/useDebugSink.js +2 -3
- package/dist/{depSchema-DD9H89gX.d.ts → depSchema-C7a_OMt-.d.ts} +101 -65
- package/dist/devtools/handlers.js +1 -2
- package/dist/devtools/history.js +1 -2
- package/dist/devtools/hook.js +1 -2
- package/dist/devtools/label.js +1 -2
- package/dist/devtools/notices.js +1 -2
- package/dist/devtools/protocol.js +1 -2
- package/dist/devtools/registry.js +1 -2
- package/dist/devtools/root.js +1 -2
- package/dist/devtools/serialize.js +1 -2
- package/dist/devtools/session.js +2 -3
- package/dist/devtools/transport.js +1 -2
- package/dist/devtools/useDevtoolsRoot.js +1 -2
- package/dist/devtools-protocol.d.ts +1 -1
- package/dist/devtools-protocol.js +2 -2
- package/dist/devtools.d.ts +1 -1
- package/dist/devtools.js +1 -2
- package/dist/domains/chrome-caps/buildChromeCtx.js +1 -2
- package/dist/domains/chrome-caps/conditions.js +1 -2
- package/dist/domains/chrome-caps/defaults.js +1 -2
- package/dist/domains/chrome-caps/resolve.js +3 -3
- package/dist/domains/chrome-caps/resolve.js.map +1 -1
- package/dist/domains/chrome-caps/useChromeCaps.js +5 -4
- package/dist/domains/chrome-caps/useChromeCaps.js.map +1 -1
- package/dist/domains/chrome-caps/useHoverTracking.js +1 -2
- package/dist/domains/ingestion/contentHandlers.js +1 -2
- package/dist/domains/ingestion/ghost.js +2 -3
- package/dist/domains/ingestion/imageHandler.js +1 -2
- package/dist/domains/ingestion/kitHandlers.js +2 -3
- package/dist/domains/ingestion/openFilePicker.js +1 -2
- package/dist/domains/ingestion/placement.js +1 -2
- package/dist/domains/ingestion/svgHandler.js +1 -2
- package/dist/domains/ingestion/textHandler.js +1 -2
- package/dist/domains/ingestion/useCanvasIngestion.js +1 -2
- package/dist/domains/ingestion/weaselJsonHandler.js +2 -3
- package/dist/domains/longPress/longPressFeedback.js +1 -2
- package/dist/domains/measure/actionIds.js +1 -2
- package/dist/domains/measure/measureCommands.js +6 -7
- package/dist/domains/measure/measureContribution.js +3 -4
- package/dist/domains/measure/measureEdits.js +3 -4
- package/dist/domains/measure/measureGestures.js +2 -3
- package/dist/domains/measure/measureHit.js +3 -4
- package/dist/domains/measure/measureLayer.js +3 -4
- package/dist/domains/measure/measurement.js +1 -2
- package/dist/domains/measure/measurements.js +1 -2
- package/dist/domains/modes/modeLayers.js +1 -2
- package/dist/domains/modes/modeTriggers.js +1 -2
- package/dist/domains/pathEffects/effectSources.js +2 -3
- package/dist/domains/pathEffects/index.js +1 -2
- package/dist/domains/pathEffects/readSource.js +3 -4
- package/dist/domains/pathEffects/textItems.js +1 -2
- package/dist/domains/pathEffects/useEffectSourcesLayer.js +3 -4
- package/dist/domains/paths/anchorData.js +1 -2
- package/dist/domains/paths/anchorMarkers.js +1 -2
- package/dist/domains/paths/editablePath.js +3 -4
- package/dist/domains/paths/originProjection.js +1 -2
- package/dist/domains/paths/pathEditExtension.js +1 -2
- package/dist/domains/paths/pathEditState.js +1 -26
- package/dist/domains/paths/pathEditState.js.map +1 -1
- package/dist/domains/paths/pathEditingOverlayLayer.js +2 -3
- package/dist/domains/paths/pathLayer.js +1 -2
- package/dist/domains/paths/pathRepresentation.js +1 -2
- package/dist/domains/paths/pathSnap/glyphs.js +1 -2
- package/dist/domains/paths/pathSnap/pathSnapSource.js +1 -2
- package/dist/domains/paths/pathSnap/sceneIndex.js +1 -2
- package/dist/domains/paths/pathSnap/snapGeometry.js +2 -3
- package/dist/domains/paths/penPreviewLayer.js +1 -2
- package/dist/domains/paths/shapeGenerator.js +1 -2
- package/dist/domains/paths/strokeOutline.js +2 -3
- package/dist/domains/paths/useAnchorFields.js +1 -2
- package/dist/domains/paths/usePathEdit.js +2 -3
- package/dist/domains/poseRun/usePoseRun.js +1 -2
- package/dist/domains/selection/enteredGroupFrame.js +1 -2
- package/dist/domains/selection/enteredGroupScope.js +1 -2
- package/dist/domains/selection/enteredOperands.js +1 -2
- package/dist/domains/selection/handleCommands.js +2 -3
- package/dist/domains/selection/overlay.js +6 -7
- package/dist/domains/selection/selectionPose.js +2 -3
- package/dist/domains/snap/angle2d.js +1 -2
- package/dist/domains/snap/debugCandidates.js +1 -2
- package/dist/domains/snap/gather.js +1 -2
- package/dist/domains/snap/inputSubspace.js +2 -3
- package/dist/domains/snap/lazySession.js +1 -2
- package/dist/domains/snap/marks.js +1 -2
- package/dist/domains/snap/outcomeStore.js +1 -2
- package/dist/domains/snap/pointSnap.js +1 -2
- package/dist/domains/snap/probes2d.js +6 -2
- package/dist/domains/snap/probes2d.js.map +1 -1
- package/dist/domains/snap/readoutDraw.js +1 -2
- package/dist/domains/snap/readoutLayer.js +1 -2
- package/dist/domains/snap/registry.js +1 -2
- package/dist/domains/snap/resizeBox.js +1 -2
- package/dist/domains/snap/roles.js +1 -2
- package/dist/domains/snap/rotationSource.js +1 -2
- package/dist/domains/snap/sceneReads.js +13 -4
- package/dist/domains/snap/sceneReads.js.map +1 -1
- package/dist/domains/snap/sceneSession2d.js +6 -5
- package/dist/domains/snap/sceneSession2d.js.map +1 -1
- package/dist/domains/snap/screen.js +2 -3
- package/dist/domains/snap/session2d.js +4 -5
- package/dist/domains/snap/spanSnap.js +1 -2
- package/dist/domains/snap/stepAngles.js +1 -2
- package/dist/domains/text/editingDrawOne.js +1 -2
- package/dist/domains/text/hostTextEditors.js +1 -2
- package/dist/domains/text/index.js +2 -2
- package/dist/domains/text/sceneTextDrafts.js +1 -2
- package/dist/domains/text/textHitAt.js +4 -5
- package/dist/domains/text/textLayer.js +12 -2
- package/dist/domains/text/textLayer.js.map +1 -1
- package/dist/domains/text/useSceneTextEdit.js +4 -5
- package/dist/domains/viewports/aim.js +3 -4
- package/dist/domains/viewports/viewMarker.js +1 -2
- package/dist/domains/viewports/viewMarkerDrag.js +1 -2
- package/dist/domains/viewports/viewResolver.js +1 -2
- package/dist/domains/viewports/viewportLayer.js +1 -2
- package/dist/iconRegistry/IconRegistryProvider.js +1 -2
- package/dist/iconRegistry/useIconGlyph.js +1 -2
- package/dist/iconRegistry/useIconVariant.js +1 -2
- package/dist/icons.table.js +2 -3
- package/dist/icons.table.js.map +1 -1
- package/dist/icons.table.json +5 -0
- package/dist/icons2.table.js +1 -2
- package/dist/index.d.ts +160 -64
- package/dist/index.js +14 -9
- package/dist/input/keyState.js +1 -2
- package/dist/input/useKeyModifiers.js +1 -2
- package/dist/input/useKeyState.js +1 -2
- package/dist/interactions/actions/admitsChild.js +1 -2
- package/dist/interactions/actions/align/action.js +6 -7
- package/dist/interactions/actions/align/align.js +6 -7
- package/dist/interactions/actions/booleans/action.js +5 -4
- package/dist/interactions/actions/booleans/action.js.map +1 -1
- package/dist/interactions/actions/booleans/booleanGroupAction.js +2 -3
- package/dist/interactions/actions/booleans/booleans.js +1 -2
- package/dist/interactions/actions/booleans/commit.js +4 -5
- package/dist/interactions/actions/booleans/custom.js +2 -3
- package/dist/interactions/actions/booleans/keymap.js +1 -2
- package/dist/interactions/actions/booleans/operands.js +1 -2
- package/dist/interactions/actions/booleans/pieces.js +1 -2
- package/dist/interactions/actions/booleans/placement.js +1 -2
- package/dist/interactions/actions/booleans/useBooleans.js +1 -2
- package/dist/interactions/actions/booleans/useBooleansAdapter.js +1 -2
- package/dist/interactions/actions/clipboard/action.js +2 -3
- package/dist/interactions/actions/clipboard/clipboardOps.js +2 -3
- package/dist/interactions/actions/clipboard/materializePaste.js +1 -2
- package/dist/interactions/actions/clipboard/wireFormat.js +1 -2
- package/dist/interactions/actions/clone/action.js +7 -8
- package/dist/interactions/actions/clone/behaviors.js +4 -5
- package/dist/interactions/actions/defaultCommitAdapter.js +2 -3
- package/dist/interactions/actions/defaults/anchorEditing.js +6 -10
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorFields.js +1 -2
- package/dist/interactions/actions/defaults/anchorHandles.js +2 -3
- package/dist/interactions/actions/defaults/anchorJoin.js +2 -3
- package/dist/interactions/actions/defaults/areaSelect.js +6 -6
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/bendSegment.js +4 -6
- package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
- package/dist/interactions/actions/defaults/cancelGesture.js +1 -2
- package/dist/interactions/actions/defaults/clearSelection.js +1 -2
- package/dist/interactions/actions/defaults/containerScroll.js +4 -5
- package/dist/interactions/actions/defaults/contextMenu.js +6 -7
- package/dist/interactions/actions/defaults/copySubtree.js +2 -3
- package/dist/interactions/actions/defaults/createPaintAction.js +3 -4
- package/dist/interactions/actions/defaults/delete.js +2 -3
- package/dist/interactions/actions/defaults/duplicate.js +5 -6
- package/dist/interactions/actions/defaults/enterGroup.js +2 -3
- package/dist/interactions/actions/defaults/enterPathEdit.js +1 -2
- package/dist/interactions/actions/defaults/enterTextEdit.js +1 -2
- package/dist/interactions/actions/defaults/escape.js +1 -2
- package/dist/interactions/actions/defaults/exitPathEdit.js +18 -3
- package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +6 -7
- package/dist/interactions/actions/defaults/ingest.js +3 -4
- package/dist/interactions/actions/defaults/insertPathAnchor.js +2 -3
- package/dist/interactions/actions/defaults/nudge.js +3 -4
- package/dist/interactions/actions/defaults/nudgeSteps.js +2 -3
- package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
- package/dist/interactions/actions/defaults/pathEditMarks.js +1 -2
- package/dist/interactions/actions/defaults/pinchZoom.js +3 -4
- package/dist/interactions/actions/defaults/reorder.js +2 -3
- package/dist/interactions/actions/defaults/requiresSelection.js +1 -2
- package/dist/interactions/actions/defaults/segmentUnder.js +1 -2
- package/dist/interactions/actions/defaults/selectAll.js +1 -2
- package/dist/interactions/actions/defaults/selectDeep.js +1 -2
- package/dist/interactions/actions/defaults/setFill.js +1 -2
- package/dist/interactions/actions/defaults/setFillOpacity.js +1 -2
- package/dist/interactions/actions/defaults/setStroke.js +1 -2
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +1 -2
- package/dist/interactions/actions/defaults/slice.js +1 -2
- package/dist/interactions/actions/defaults/sliceOps.js +1 -2
- package/dist/interactions/actions/defaults/toolActivate.js +1 -2
- package/dist/interactions/actions/defaults/toolResetToDefault.js +1 -2
- package/dist/interactions/actions/defaults/undoRedo.js +1 -2
- package/dist/interactions/actions/defaults/viewportDragPan.js +1 -2
- package/dist/interactions/actions/defaults/viewportWheelPan.js +1 -2
- package/dist/interactions/actions/defaults/viewportZoom.js +3 -4
- package/dist/interactions/actions/distribute/action.js +4 -5
- package/dist/interactions/actions/distribute/distribute.js +5 -6
- package/dist/interactions/actions/distribute/plan.js +1 -2
- package/dist/interactions/actions/drawnBoxes.js +4 -5
- package/dist/interactions/actions/dropVerdict.js +1 -2
- package/dist/interactions/actions/edit-anchors/action.js +7 -9
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
- package/dist/interactions/actions/edit-anchors/extensionDrags.js +1 -2
- package/dist/interactions/actions/edit-anchors/geometry.js +1 -2
- package/dist/interactions/actions/edit-anchors/handleDrag.js +1 -2
- package/dist/interactions/actions/edit-anchors/handles.js +1 -2
- package/dist/interactions/actions/edit-anchors/params.js +1 -2
- package/dist/interactions/actions/edit-anchors/preview.js +1 -2
- package/dist/interactions/actions/edit-anchors/symmetry.js +1 -2
- package/dist/interactions/actions/flip/action.js +8 -9
- package/dist/interactions/actions/flip/helpers.js +1 -2
- package/dist/interactions/actions/geometryProjection.js +1 -2
- package/dist/interactions/actions/gestureFrames.js +3 -4
- package/dist/interactions/actions/gestureLifecycle.js +1 -2
- package/dist/interactions/actions/hitSelection.js +7 -3
- package/dist/interactions/actions/hitSelection.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +27 -9
- package/dist/interactions/actions/insert/action.js.map +1 -1
- package/dist/interactions/actions/insert/commit.js +2 -3
- package/dist/interactions/actions/insert/extras.js +1 -2
- package/dist/interactions/actions/insert/frame.js +1 -2
- package/dist/interactions/actions/insert/geometry.js +1 -2
- package/dist/interactions/actions/insert/params.js +42 -0
- package/dist/interactions/actions/insert/params.js.map +1 -0
- package/dist/interactions/actions/insert/parent.js +1 -2
- package/dist/interactions/actions/insert/placeAction.js +5 -6
- package/dist/interactions/actions/insert/repositionAction.js +1 -2
- package/dist/interactions/actions/insert/rotateAction.js +1 -2
- package/dist/interactions/actions/insert/session.js +5 -6
- package/dist/interactions/actions/insert/shape.js +2 -3
- package/dist/interactions/actions/lasso-select/action.js +9 -9
- package/dist/interactions/actions/lasso-select/action.js.map +1 -1
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +2 -3
- package/dist/interactions/actions/magnification.js +37 -0
- package/dist/interactions/actions/magnification.js.map +1 -0
- package/dist/interactions/actions/move/action.js +2 -3
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +2 -3
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +2 -3
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +1 -2
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +2 -3
- package/dist/interactions/actions/move/capture.js +6 -7
- package/dist/interactions/actions/move/commit/index.js +2 -3
- package/dist/interactions/actions/move/commit/layoutDrop.js +4 -5
- package/dist/interactions/actions/move/commit/layoutRelease.js +7 -8
- package/dist/interactions/actions/move/commit/rebase.js +2 -3
- package/dist/interactions/actions/move/commit/reparent.js +5 -6
- package/dist/interactions/actions/move/delta.js +2 -3
- package/dist/interactions/actions/move/frame.js +2 -3
- package/dist/interactions/actions/move/gestureAdapter.js +1 -2
- package/dist/interactions/actions/move/landedDescendants.js +2 -3
- package/dist/interactions/actions/move/layout/container.js +3 -4
- package/dist/interactions/actions/move/layout/dragged.js +2 -3
- package/dist/interactions/actions/move/layout/dropPass.js +5 -6
- package/dist/interactions/actions/move/layout/exits.js +2 -3
- package/dist/interactions/actions/move/layout/glide.js +2 -3
- package/dist/interactions/actions/move/layout/view.js +1 -2
- package/dist/interactions/actions/move/refusal.js +2 -3
- package/dist/interactions/actions/move/session.js +4 -5
- package/dist/interactions/actions/move/translate.js +2 -3
- package/dist/interactions/actions/moveNodes.js +5 -6
- package/dist/interactions/actions/notices.js +16 -0
- package/dist/interactions/actions/notices.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +9 -8
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
- package/dist/interactions/actions/outlines/createOutlinesAction.js +14 -10
- package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -1
- package/dist/interactions/actions/outlines/outlineStroke.js +2 -3
- package/dist/interactions/actions/outlines/outlineStrokeAction.js +5 -5
- package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -1
- package/dist/interactions/actions/outlines/replaceWithPaths.js +5 -6
- package/dist/interactions/actions/outlines/strokeRegion.js +1 -2
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +1 -2
- package/dist/interactions/actions/pathCommands/cutJoin.js +3 -4
- package/dist/interactions/actions/pathCommands/livePathEdit.js +3 -4
- package/dist/interactions/actions/pathCommands/pathNodes.js +2 -3
- package/dist/interactions/actions/pathCommands/simplifyOffset.js +2 -3
- package/dist/interactions/actions/pathGestureTags.js +1 -2
- package/dist/interactions/actions/planeInput.js +2 -3
- package/dist/interactions/actions/pointerState.js +1 -2
- package/dist/interactions/actions/poseDescriptorDep.js +1 -2
- package/dist/interactions/actions/poseFrame.js +3 -4
- package/dist/interactions/actions/resize/action.js +3 -4
- package/dist/interactions/actions/resize/aspect.js +1 -2
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js +1 -2
- package/dist/interactions/actions/resize/boxFrame.js +1 -2
- package/dist/interactions/actions/resize/capture.js +7 -8
- package/dist/interactions/actions/resize/commit.js +3 -4
- package/dist/interactions/actions/resize/cornerHandles.js +1 -2
- package/dist/interactions/actions/resize/frame.js +7 -8
- package/dist/interactions/actions/resize/held.js +2 -3
- package/dist/interactions/actions/resize/minimum.js +1 -2
- package/dist/interactions/actions/resize/replay.js +1 -2
- package/dist/interactions/actions/resize/ruleBounds.js +1 -2
- package/dist/interactions/actions/resize/session.js +9 -10
- package/dist/interactions/actions/resolveOverlays.js +1 -2
- package/dist/interactions/actions/resolvePreviews.js +3 -4
- package/dist/interactions/actions/rotate/action.js +5 -6
- package/dist/interactions/actions/rotate/commit.js +2 -3
- package/dist/interactions/actions/rotate/frame.js +3 -4
- package/dist/interactions/actions/rotate/geometry.js +1 -2
- package/dist/interactions/actions/rotate/handle.js +2 -3
- package/dist/interactions/actions/rotate/replay.js +2 -3
- package/dist/interactions/actions/rotate/session.js +10 -11
- package/dist/interactions/actions/selectionSubtree.js +7 -22
- package/dist/interactions/actions/selectionSubtree.js.map +1 -1
- package/dist/interactions/actions/spatialReference.js +1 -2
- package/dist/interactions/actions/testUtils.js +1 -9
- package/dist/interactions/actions/testUtils.js.map +1 -1
- package/dist/interactions/actions/transform-again/action.js +5 -6
- package/dist/interactions/actions/transform-again/memory.js +1 -2
- package/dist/interactions/actions/transformFinish.js +1 -2
- package/dist/interactions/actions/useActionSet.js +1 -2
- package/dist/interactions/actions/useNotices.js +12 -0
- package/dist/interactions/actions/useNotices.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +1 -2
- package/dist/interactions/gestures/dragGesture/dragGesture.js +1 -2
- package/dist/interactions/gestures/dragGesture/dragPointOf.js +1 -2
- package/dist/interactions/gestures/dragRadial/dragRadial.js +2 -3
- package/dist/interactions/gestures/dragRect/dragRect.js +2 -3
- package/dist/interactions/gestures/handleDrag/handleDrag.js +1 -2
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +1 -2
- package/dist/interactions/gestures/shared/originProjection.js +1 -2
- package/dist/interactions/gestures/shared/screenTolerance.js +1 -2
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +1 -2
- package/dist/kitSettingsSchema.js +4 -5
- package/dist/test-hook/createTestHook.js +1 -2
- package/dist/test-hook/install.js +1 -2
- package/dist/test-hook/useTestHook.js +1 -2
- package/dist/test-seams.d.ts +7 -14
- package/dist/test-seams.js +2 -2
- package/dist/tools/builtin/anchors/anchorsTool.js +30 -0
- package/dist/tools/builtin/anchors/anchorsTool.js.map +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js +2 -3
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js +1 -2
- package/dist/tools/builtin/hand/dragPanContribution.js +1 -2
- package/dist/tools/builtin/hand/useHandTool.js +1 -2
- package/dist/tools/builtin/image/useImageTool.js +1 -2
- package/dist/tools/builtin/lasso/useLassoTool.js +1 -2
- package/dist/tools/builtin/line/useLineTool.js +2 -3
- package/dist/tools/builtin/measure/useMeasureTool.js +2 -3
- package/dist/tools/builtin/pen/penHandle.js +1 -2
- package/dist/tools/builtin/pen/usePenTool.js +6 -7
- package/dist/tools/builtin/pencil/usePencilTool.js +1 -2
- package/dist/tools/builtin/pickTopMostHit.js +1 -2
- package/dist/tools/builtin/polygon/usePolygonTool.js +2 -3
- package/dist/tools/builtin/pressTarget.js +1 -2
- package/dist/tools/builtin/rect/useRectTool.js +2 -3
- package/dist/tools/builtin/select/adapterPointQuery.js +3 -4
- package/dist/tools/builtin/select/collapseDeferred.js +1 -2
- package/dist/tools/builtin/select/groupEntry.js +2 -3
- package/dist/tools/builtin/select/pressDecision.js +3 -4
- package/dist/tools/builtin/select/pressDecision.js.map +1 -1
- package/dist/tools/builtin/select/selectionContributions.js +1 -2
- package/dist/tools/builtin/select/useSelectTool.js +5 -6
- package/dist/tools/builtin/shared/insertToolOptions.js +1 -2
- package/dist/tools/builtin/shared/pointerFollower.js +1 -2
- package/dist/tools/builtin/slice/useSliceTool.js +5 -6
- package/dist/tools/builtin/star/useStarTool.js +2 -3
- package/dist/tools/builtin/sticky/stickyNode.js +1 -2
- package/dist/tools/builtin/sticky/useStickyTool.js +2 -3
- package/dist/tools/builtin/text/useTextTool.js +1 -2
- package/dist/tools/index.js +4 -2
- package/dist/tools/overlayBinding.js +1 -2
- package/dist/tools/toolOptions.js +60 -0
- package/dist/tools/toolOptions.js.map +1 -0
- package/dist/tools/useKeybindings.js +1 -2
- package/dist/{types-DW14eu9B.d.ts → types-BUvUXZe5.d.ts} +3 -3
- package/dist/util/color.js +1 -2
- package/dist/util/paint.js +1 -2
- package/dist/version.js +2 -3
- package/package.json +27 -27
- package/dist/interactions/actions/defaults/pathEditTools.js +0 -60
- package/dist/interactions/actions/defaults/pathEditTools.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/core/scene/poseHold.ts
|
|
2
2
|
/** Build the {@link PoseHold} a table hands out from `hold()`. `pliesOf`
|
|
3
3
|
* answers a node's plies, bottom first. */
|
|
4
4
|
function createPoseHold(table, pliesOf) {
|
|
@@ -61,6 +61,5 @@ function* mapped(poses) {
|
|
|
61
61
|
for (const [id, pose] of poses) yield [id, { pose }];
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
//#endregion
|
|
65
64
|
export { createPoseHold };
|
|
66
65
|
//# sourceMappingURL=poseHold.js.map
|
|
@@ -5,7 +5,7 @@ import { foldPlies } from "./posePlies.js";
|
|
|
5
5
|
import { createPlyStacks, plyPath } from "./plyStacks.js";
|
|
6
6
|
import { createEmitter } from "@weasel-js/registry";
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
// src/core/scene/poseOverrides.ts
|
|
9
9
|
/**
|
|
10
10
|
* Build a {@link PoseOverrides} map.
|
|
11
11
|
*
|
|
@@ -105,6 +105,5 @@ function createPoseOverrides(getNode, onInvalidate) {
|
|
|
105
105
|
return table;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
//#endregion
|
|
109
108
|
export { createPoseOverrides };
|
|
110
109
|
//# sourceMappingURL=poseOverrides.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { kit, last, mix, mul, patch } from "@msb235/blits";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/posePlies.ts
|
|
4
4
|
/** What a ply says about a node with fewer plies than its depth. */
|
|
5
5
|
var NOTHING = Object.freeze({});
|
|
6
6
|
/** Per lower function, per upper one, the two run in turn: kept, so a node
|
|
@@ -54,6 +54,5 @@ function foldPlies(plies) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
//#endregion
|
|
58
57
|
export { foldPlies };
|
|
59
58
|
//# sourceMappingURL=posePlies.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/core/scene/poseRemovals.ts
|
|
2
2
|
function createRemovalLog(shown) {
|
|
3
3
|
const removals = /* @__PURE__ */ new Map();
|
|
4
4
|
return {
|
|
@@ -54,6 +54,5 @@ function createRemovalLog(shown) {
|
|
|
54
54
|
};
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
//#endregion
|
|
58
57
|
export { createRemovalLog };
|
|
59
58
|
//# sourceMappingURL=poseRemovals.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isPlainObject, isPlainPrototype } from "../isPlainObject.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/poseSnapshot.ts
|
|
4
4
|
/**
|
|
5
5
|
* Comparing a pose against what it was, by value.
|
|
6
6
|
*
|
|
@@ -70,6 +70,5 @@ function samePoseValue(snapshot, value, depth = DEPTH) {
|
|
|
70
70
|
return false;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
//#endregion
|
|
74
73
|
export { samePoseValue, snapshotPose };
|
|
75
74
|
//# sourceMappingURL=poseSnapshot.js.map
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { createRemovalLog } from "./poseRemovals.js";
|
|
2
2
|
import { createEmitter, deepEqual } from "@weasel-js/registry";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
// src/core/scene/poseWrites.ts
|
|
5
5
|
/**
|
|
6
6
|
* What a scene reports about the poses it writes: each change's net pose per
|
|
7
7
|
* node, the nodes it removed as they were last shown, and where each came
|
|
8
8
|
* from, handed to `onPoseWrite` once the change reaches the scene's
|
|
9
9
|
* subscribers.
|
|
10
10
|
*/
|
|
11
|
+
var NOTHING = () => {};
|
|
11
12
|
function createPoseWriteLog(env) {
|
|
12
13
|
const listeners = createEmitter();
|
|
13
14
|
const pending = /* @__PURE__ */ new Map();
|
|
14
15
|
const removals = createRemovalLog(env.shown);
|
|
15
|
-
let
|
|
16
|
+
let editLabel = null;
|
|
17
|
+
let editVia = "call";
|
|
16
18
|
let replays = 0;
|
|
17
19
|
let layouts = 0;
|
|
18
20
|
let quiets = 0;
|
|
@@ -22,9 +24,9 @@ function createPoseWriteLog(env) {
|
|
|
22
24
|
if (replays > 0) return { origin: reverted ? "undo" : "redo" };
|
|
23
25
|
if (layouts > 0) return { origin: "layout" };
|
|
24
26
|
if (env.untracked()) return { origin: "untracked" };
|
|
25
|
-
return
|
|
26
|
-
origin:
|
|
27
|
-
label:
|
|
27
|
+
return editLabel !== null ? {
|
|
28
|
+
origin: editVia,
|
|
29
|
+
label: editLabel
|
|
28
30
|
} : { origin: "call" };
|
|
29
31
|
}
|
|
30
32
|
function noteSet(id, from, to, reverted) {
|
|
@@ -47,7 +49,7 @@ function createPoseWriteLog(env) {
|
|
|
47
49
|
...stamp(reverted)
|
|
48
50
|
});
|
|
49
51
|
}
|
|
50
|
-
const seeOff = (roots, nodes, reverted) => collecting() ? removals.seeOff(roots, nodes, stamp(reverted), pending) :
|
|
52
|
+
const seeOff = (roots, nodes, reverted) => collecting() ? removals.seeOff(roots, nodes, stamp(reverted), pending) : NOTHING;
|
|
51
53
|
function around(fn, enter, leave) {
|
|
52
54
|
enter();
|
|
53
55
|
try {
|
|
@@ -74,7 +76,7 @@ function createPoseWriteLog(env) {
|
|
|
74
76
|
...h,
|
|
75
77
|
apply: (p) => {
|
|
76
78
|
h.apply(p);
|
|
77
|
-
noteAdded([p], false);
|
|
79
|
+
if (collecting()) noteAdded([p], false);
|
|
78
80
|
},
|
|
79
81
|
revert: (p) => {
|
|
80
82
|
const done = seeOff([p], [p], true);
|
|
@@ -117,15 +119,14 @@ function createPoseWriteLog(env) {
|
|
|
117
119
|
};
|
|
118
120
|
},
|
|
119
121
|
labeled(label, via, fn) {
|
|
120
|
-
if (
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
122
|
+
if (editLabel !== null) return fn();
|
|
123
|
+
editLabel = label;
|
|
124
|
+
editVia = via;
|
|
125
|
+
try {
|
|
126
|
+
return fn();
|
|
127
|
+
} finally {
|
|
128
|
+
editLabel = null;
|
|
129
|
+
}
|
|
129
130
|
},
|
|
130
131
|
replaying: (fn) => around(fn, () => {
|
|
131
132
|
replays++;
|
|
@@ -146,6 +147,5 @@ function createPoseWriteLog(env) {
|
|
|
146
147
|
};
|
|
147
148
|
}
|
|
148
149
|
|
|
149
|
-
//#endregion
|
|
150
150
|
export { createPoseWriteLog };
|
|
151
151
|
//# sourceMappingURL=poseWrites.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poseWrites.js","names":[],"sources":["../../../src/core/scene/poseWrites.ts"],"sourcesContent":["/**\n * What a scene reports about the poses it writes: each change's net pose per\n * node, the nodes it removed as they were last shown, and where each came\n * from, handed to `onPoseWrite` once the change reaches the scene's\n * subscribers.\n */\nimport { createEmitter, deepEqual } from '@weasel-js/registry';\nimport { createRemovalLog } from './poseRemovals';\nimport type { RegisteredOp } from './types';\nimport type { LayoutMove } from './layoutTypes';\nimport type { NodeId } from '@weasel-js/routing';\n\n/**\n * Where a reported pose write came from.\n *\n * - `'call'` — a scene method called directly, alone or inside `scene.batch`:\n * a button's `scene.setPose`, a `scene.add`.\n * - `'ops'` — ops applied as one edit through `applyBatch` or `history.apply`,\n * which is how actions commit: a drag's release, a resize, a nudge, an align.\n * - `'undo'` / `'redo'` — a history step, a jump through the history included.\n * - `'layout'` — a container's layout arranging what a live edit changed; also\n * reported to `onReflow`.\n * - `'untracked'` — a write inside `scene.untracked`, such as a pose target\n * committing an animation's destination.\n */\nexport type PoseWriteOrigin = 'call' | 'ops' | 'undo' | 'redo' | 'layout' | 'untracked';\n\n/** One node's pose as a scene change left it, in the node's stored frame. */\nexport interface PoseWrite<TPose> {\n id: NodeId;\n /** The pose before the change; `undefined` for a node the change added. */\n from: TPose | undefined;\n to: TPose;\n origin: PoseWriteOrigin;\n /** The edit's label (`'setPose'`, a batch's, an action's `'Move'`) for\n * `'call'` and `'ops'`; `undefined` otherwise. */\n label?: string;\n}\n\n/** A removed node as it was last shown, with the descendants it took along. */\nexport interface RemovedNode<TPose, TNode = unknown> {\n /** The node as it stood before the change removed it. */\n node: TNode;\n /** Where it was shown, override included, in its stored frame. */\n pose: TPose;\n children: readonly RemovedNode<TPose, TNode>[];\n}\n\n/** One node a scene change removed, a removal's root: its descendants ride\n * beneath it rather than being reported apart. */\nexport interface PoseRemoval<TPose, TNode = unknown> extends RemovedNode<TPose, TNode> {\n id: NodeId;\n /** The parent it was removed from, which may still be in the scene. */\n parent: NodeId | null;\n origin: PoseWriteOrigin;\n label?: string;\n}\n\n/** What a scene reports about the poses its edits write. */\nexport interface ScenePoseReports<TPose, TNode = unknown> {\n /** Called with the poses each live edit's layout pass wrote, after the\n * edit lands — never for an undo or redo, which restore poses rather than\n * arrange them. What a reflow animation glides from. */\n onReflow(listener: (moves: readonly LayoutMove<TPose>[]) => void): () => void;\n /** Called once per change, before the scene's subscribers hear of it, with\n * every node whose pose the change wrote or that it added, and every node\n * it removed — an undone add among them. A node written back to the pose\n * it had, or both added and removed by the change, is left out of both.\n * Not called for `loadState` or the scene's initial nodes. */\n onPoseWrite(\n listener: (writes: readonly PoseWrite<TPose>[], removed: readonly PoseRemoval<TPose, TNode>[]) => void,\n ): () => void;\n}\n\n/** What the log reads of the scene it reports for. */\nexport interface PoseWriteEnv<TPose, TNode> {\n /** A node still in the scene, with the pose it is shown at. */\n shown(id: NodeId): { node: TNode; pose: TPose } | undefined;\n /** Whether the edit running now is inside `scene.untracked`. */\n untracked(): boolean;\n /** The scene's change notice. The log reports on it, subscribed before\n * anyone else so a change's writes arrive ahead of its re-reads. */\n changes: { subscribe(listener: () => void): () => void };\n}\n\nexport interface PoseWriteLog<TPose, TNode = unknown> {\n subscribe: ScenePoseReports<TPose, TNode>['onPoseWrite'];\n /** Run `fn` as an edit labeled `label`; an enclosing edit's label stands. */\n labeled<T>(label: string, via: 'call' | 'ops', fn: () => T): T;\n /** Run `fn` as a history step replaying recorded ops. */\n replaying<T>(fn: () => T): T;\n /** Run `fn` as a layout pass writing arranged poses. */\n layout<T>(fn: () => T): T;\n /** Run `fn` with nothing it writes reported. */\n quiet<T>(fn: () => T): T;\n /** `register` with the kit's pose-bearing ops reporting what they write. */\n reporting(register: (kind: string, handler: RegisteredOp<unknown>) => void):\n (kind: string, handler: RegisteredOp<unknown>) => void;\n}\n\ninterface Posed<TPose> { id: NodeId; pose: TPose }\ninterface Parented { id: NodeId; parent: NodeId | null }\n\nexport function createPoseWriteLog<TPose, TNode = unknown>(env: PoseWriteEnv<TPose, TNode>): PoseWriteLog<TPose, TNode> {\n const listeners = createEmitter<[writes: readonly PoseWrite<TPose>[], removed: readonly PoseRemoval<TPose, TNode>[]]>();\n const pending = new Map<NodeId, PoseWrite<TPose>>();\n const removals = createRemovalLog<TPose, TNode>(env.shown);\n let edit: { label: string; via: 'call' | 'ops' } | null = null;\n let replays = 0;\n let layouts = 0;\n let quiets = 0;\n let listening = 0;\n\n const collecting = (): boolean => listening > 0 && quiets === 0;\n\n function stamp(reverted: boolean): Pick<PoseWrite<TPose>, 'origin' | 'label'> {\n if (replays > 0) return { origin: reverted ? 'undo' : 'redo' };\n if (layouts > 0) return { origin: 'layout' };\n if (env.untracked()) return { origin: 'untracked' };\n return edit ? { origin: edit.via, label: edit.label } : { origin: 'call' };\n }\n\n function noteSet(id: NodeId, from: TPose, to: TPose, reverted: boolean): void {\n if (!collecting()) return;\n const held = pending.get(id);\n if (held) held.to = to;\n else pending.set(id, { id, from, to, ...stamp(reverted) });\n }\n\n function noteAdded(nodes: readonly Posed<TPose>[], reverted: boolean): void {\n if (!collecting()) return;\n for (const n of nodes) {\n // Removed and back within one change: it moved, if anything.\n pending.set(n.id, { id: n.id, from: removals.takeBack(n.id), to: n.pose, ...stamp(reverted) });\n }\n }\n\n const seeOff = (roots: readonly Parented[], nodes: readonly Parented[], reverted: boolean): () => void =>\n collecting() ? removals.seeOff(roots, nodes, stamp(reverted), pending) : () => {};\n\n function around<T>(fn: () => T, enter: () => void, leave: () => void): T {\n enter();\n try {\n return fn();\n } finally {\n leave();\n }\n }\n\n type SetPayload = { id: NodeId; from: TPose; to: TPose };\n type AddPayload = Posed<TPose> & Parented;\n type RemovePayload = { nodes: readonly (Posed<TPose> & Parented)[]; detached: readonly Parented[] };\n const wrap: Record<string, (h: RegisteredOp<unknown>) => RegisteredOp<unknown>> = {\n 'kit:setPose': (h) => ({\n ...h,\n apply: (p) => { h.apply(p); const s = p as SetPayload; noteSet(s.id, s.from, s.to, false); },\n revert: (p) => { h.revert(p); const s = p as SetPayload; noteSet(s.id, s.to, s.from, true); },\n }),\n 'kit:add': (h) => ({\n ...h,\n apply: (p) => { h.apply(p); noteAdded([p as AddPayload], false); },\n revert: (p) => { const done = seeOff([p as AddPayload], [p as AddPayload], true); h.revert(p); done(); },\n }),\n 'kit:remove': (h) => ({\n ...h,\n apply: (p) => {\n const r = p as RemovePayload;\n const done = seeOff(r.detached, r.nodes, false);\n h.apply(p);\n done();\n },\n revert: (p) => { h.revert(p); noteAdded((p as RemovePayload).nodes, true); },\n }),\n };\n\n function flush(): void {\n const removed = removals.drain();\n if (pending.size === 0 && removed.length === 0) return;\n const writes = [...pending.values()].filter((w) => !deepEqual(w.from, w.to));\n pending.clear();\n if (writes.length > 0 || removed.length > 0) listeners.emit(writes, removed);\n }\n env.changes.subscribe(flush);\n\n return {\n subscribe(listener) {\n const off = listeners.subscribe(listener);\n listening++;\n let on = true;\n return () => {\n if (!on) return;\n on = false;\n listening--;\n off();\n };\n },\n labeled(label, via, fn) {\n if (edit) return fn();\n return around(fn, () => { edit = { label, via }; }, () => { edit = null; });\n },\n replaying: (fn) => around(fn, () => { replays++; }, () => { replays--; }),\n layout: (fn) => around(fn, () => { layouts++; }, () => { layouts--; }),\n quiet: (fn) => around(fn, () => { quiets++; }, () => { quiets--; }),\n reporting: (register) => (kind, handler) => register(kind, wrap[kind]?.(handler) ?? handler),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poseWrites.js","names":[],"sources":["../../../src/core/scene/poseWrites.ts"],"sourcesContent":["/**\n * What a scene reports about the poses it writes: each change's net pose per\n * node, the nodes it removed as they were last shown, and where each came\n * from, handed to `onPoseWrite` once the change reaches the scene's\n * subscribers.\n */\nimport { createEmitter, deepEqual } from '@weasel-js/registry';\nimport { createRemovalLog } from './poseRemovals';\nimport type { RegisteredOp } from './types';\nimport type { LayoutMove } from './layoutTypes';\nimport type { NodeId } from '@weasel-js/routing';\n\n/**\n * Where a reported pose write came from.\n *\n * - `'call'` — a scene method called directly, alone or inside `scene.batch`:\n * a button's `scene.setPose`, a `scene.add`.\n * - `'ops'` — ops applied as one edit through `applyBatch` or `history.apply`,\n * which is how actions commit: a drag's release, a resize, a nudge, an align.\n * - `'undo'` / `'redo'` — a history step, a jump through the history included.\n * - `'layout'` — a container's layout arranging what a live edit changed; also\n * reported to `onReflow`.\n * - `'untracked'` — a write inside `scene.untracked`, such as a pose target\n * committing an animation's destination.\n */\nexport type PoseWriteOrigin = 'call' | 'ops' | 'undo' | 'redo' | 'layout' | 'untracked';\n\n/** One node's pose as a scene change left it, in the node's stored frame. */\nexport interface PoseWrite<TPose> {\n id: NodeId;\n /** The pose before the change; `undefined` for a node the change added. */\n from: TPose | undefined;\n to: TPose;\n origin: PoseWriteOrigin;\n /** The edit's label (`'setPose'`, a batch's, an action's `'Move'`) for\n * `'call'` and `'ops'`; `undefined` otherwise. */\n label?: string;\n}\n\n/** A removed node as it was last shown, with the descendants it took along. */\nexport interface RemovedNode<TPose, TNode = unknown> {\n /** The node as it stood before the change removed it. */\n node: TNode;\n /** Where it was shown, override included, in its stored frame. */\n pose: TPose;\n children: readonly RemovedNode<TPose, TNode>[];\n}\n\n/** One node a scene change removed, a removal's root: its descendants ride\n * beneath it rather than being reported apart. */\nexport interface PoseRemoval<TPose, TNode = unknown> extends RemovedNode<TPose, TNode> {\n id: NodeId;\n /** The parent it was removed from, which may still be in the scene. */\n parent: NodeId | null;\n origin: PoseWriteOrigin;\n label?: string;\n}\n\n/** What a scene reports about the poses its edits write. */\nexport interface ScenePoseReports<TPose, TNode = unknown> {\n /** Called with the poses each live edit's layout pass wrote, after the\n * edit lands — never for an undo or redo, which restore poses rather than\n * arrange them. What a reflow animation glides from. */\n onReflow(listener: (moves: readonly LayoutMove<TPose>[]) => void): () => void;\n /** Called once per change, before the scene's subscribers hear of it, with\n * every node whose pose the change wrote or that it added, and every node\n * it removed — an undone add among them. A node written back to the pose\n * it had, or both added and removed by the change, is left out of both.\n * Not called for `loadState` or the scene's initial nodes. */\n onPoseWrite(\n listener: (writes: readonly PoseWrite<TPose>[], removed: readonly PoseRemoval<TPose, TNode>[]) => void,\n ): () => void;\n}\n\n/** What the log reads of the scene it reports for. */\nexport interface PoseWriteEnv<TPose, TNode> {\n /** A node still in the scene, with the pose it is shown at. */\n shown(id: NodeId): { node: TNode; pose: TPose } | undefined;\n /** Whether the edit running now is inside `scene.untracked`. */\n untracked(): boolean;\n /** The scene's change notice. The log reports on it, subscribed before\n * anyone else so a change's writes arrive ahead of its re-reads. */\n changes: { subscribe(listener: () => void): () => void };\n}\n\nexport interface PoseWriteLog<TPose, TNode = unknown> {\n subscribe: ScenePoseReports<TPose, TNode>['onPoseWrite'];\n /** Run `fn` as an edit labeled `label`; an enclosing edit's label stands. */\n labeled<T>(label: string, via: 'call' | 'ops', fn: () => T): T;\n /** Run `fn` as a history step replaying recorded ops. */\n replaying<T>(fn: () => T): T;\n /** Run `fn` as a layout pass writing arranged poses. */\n layout<T>(fn: () => T): T;\n /** Run `fn` with nothing it writes reported. */\n quiet<T>(fn: () => T): T;\n /** `register` with the kit's pose-bearing ops reporting what they write. */\n reporting(register: (kind: string, handler: RegisteredOp<unknown>) => void):\n (kind: string, handler: RegisteredOp<unknown>) => void;\n}\n\nconst NOTHING = (): void => {};\n\ninterface Posed<TPose> { id: NodeId; pose: TPose }\ninterface Parented { id: NodeId; parent: NodeId | null }\n\nexport function createPoseWriteLog<TPose, TNode = unknown>(env: PoseWriteEnv<TPose, TNode>): PoseWriteLog<TPose, TNode> {\n const listeners = createEmitter<[writes: readonly PoseWrite<TPose>[], removed: readonly PoseRemoval<TPose, TNode>[]]>();\n const pending = new Map<NodeId, PoseWrite<TPose>>();\n const removals = createRemovalLog<TPose, TNode>(env.shown);\n // Two fields rather than one object: every bare scene call opens an edit.\n let editLabel: string | null = null;\n let editVia: 'call' | 'ops' = 'call';\n let replays = 0;\n let layouts = 0;\n let quiets = 0;\n let listening = 0;\n\n const collecting = (): boolean => listening > 0 && quiets === 0;\n\n function stamp(reverted: boolean): Pick<PoseWrite<TPose>, 'origin' | 'label'> {\n if (replays > 0) return { origin: reverted ? 'undo' : 'redo' };\n if (layouts > 0) return { origin: 'layout' };\n if (env.untracked()) return { origin: 'untracked' };\n return editLabel !== null ? { origin: editVia, label: editLabel } : { origin: 'call' };\n }\n\n function noteSet(id: NodeId, from: TPose, to: TPose, reverted: boolean): void {\n if (!collecting()) return;\n const held = pending.get(id);\n if (held) held.to = to;\n else pending.set(id, { id, from, to, ...stamp(reverted) });\n }\n\n function noteAdded(nodes: readonly Posed<TPose>[], reverted: boolean): void {\n if (!collecting()) return;\n for (const n of nodes) {\n // Removed and back within one change: it moved, if anything.\n pending.set(n.id, { id: n.id, from: removals.takeBack(n.id), to: n.pose, ...stamp(reverted) });\n }\n }\n\n const seeOff = (roots: readonly Parented[], nodes: readonly Parented[], reverted: boolean): () => void =>\n collecting() ? removals.seeOff(roots, nodes, stamp(reverted), pending) : NOTHING;\n\n function around<T>(fn: () => T, enter: () => void, leave: () => void): T {\n enter();\n try {\n return fn();\n } finally {\n leave();\n }\n }\n\n type SetPayload = { id: NodeId; from: TPose; to: TPose };\n type AddPayload = Posed<TPose> & Parented;\n type RemovePayload = { nodes: readonly (Posed<TPose> & Parented)[]; detached: readonly Parented[] };\n const wrap: Record<string, (h: RegisteredOp<unknown>) => RegisteredOp<unknown>> = {\n 'kit:setPose': (h) => ({\n ...h,\n apply: (p) => { h.apply(p); const s = p as SetPayload; noteSet(s.id, s.from, s.to, false); },\n revert: (p) => { h.revert(p); const s = p as SetPayload; noteSet(s.id, s.to, s.from, true); },\n }),\n 'kit:add': (h) => ({\n ...h,\n apply: (p) => { h.apply(p); if (collecting()) noteAdded([p as AddPayload], false); },\n revert: (p) => { const done = seeOff([p as AddPayload], [p as AddPayload], true); h.revert(p); done(); },\n }),\n 'kit:remove': (h) => ({\n ...h,\n apply: (p) => {\n const r = p as RemovePayload;\n const done = seeOff(r.detached, r.nodes, false);\n h.apply(p);\n done();\n },\n revert: (p) => { h.revert(p); noteAdded((p as RemovePayload).nodes, true); },\n }),\n };\n\n function flush(): void {\n const removed = removals.drain();\n if (pending.size === 0 && removed.length === 0) return;\n const writes = [...pending.values()].filter((w) => !deepEqual(w.from, w.to));\n pending.clear();\n if (writes.length > 0 || removed.length > 0) listeners.emit(writes, removed);\n }\n env.changes.subscribe(flush);\n\n return {\n subscribe(listener) {\n const off = listeners.subscribe(listener);\n listening++;\n let on = true;\n return () => {\n if (!on) return;\n on = false;\n listening--;\n off();\n };\n },\n labeled(label, via, fn) {\n if (editLabel !== null) return fn();\n editLabel = label;\n editVia = via;\n try {\n return fn();\n } finally {\n editLabel = null;\n }\n },\n replaying: (fn) => around(fn, () => { replays++; }, () => { replays--; }),\n layout: (fn) => around(fn, () => { layouts++; }, () => { layouts--; }),\n quiet: (fn) => around(fn, () => { quiets++; }, () => { quiets--; }),\n reporting: (register) => (kind, handler) => register(kind, wrap[kind]?.(handler) ?? handler),\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { sameValue } from "./sameValue.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/reconcileSpecs.ts
|
|
4
4
|
/**
|
|
5
5
|
* Bring `scene` from `prev` to `next`: add what `next` gained, remove what it
|
|
6
6
|
* lost, and write only the fields that changed between the two.
|
|
@@ -11,7 +11,9 @@ import { sameValue } from "./sameValue.js";
|
|
|
11
11
|
* outside data is not an undo step.
|
|
12
12
|
*
|
|
13
13
|
* Every spec needs an `id`, and `next` must be in an order `createScene` would
|
|
14
|
-
* accept — parents and dependencies before what names them.
|
|
14
|
+
* accept — parents and dependencies before what names them. Siblings stand in
|
|
15
|
+
* `next`'s order wherever a parent's children in it differ from `prev`'s, by an
|
|
16
|
+
* addition or a reorder; elsewhere a reorder made in the scene stays. A node whose
|
|
15
17
|
* `kind` or derive functions change is removed and added again, along with
|
|
16
18
|
* everything its removal takes with it, and stays selected if it was.
|
|
17
19
|
*/
|
|
@@ -47,9 +49,31 @@ function reconcileSpecs(scene, prev, next) {
|
|
|
47
49
|
if (spec.hidden === true !== (before.hidden === true)) scene.setHidden(id, spec.hidden === true);
|
|
48
50
|
if (spec.locked === true && before.locked !== true) scene.setLocked(id, true);
|
|
49
51
|
}
|
|
52
|
+
reorderToSpecs(scene, prev, next);
|
|
50
53
|
if (selected.some((id) => removed.has(id))) scene.setSelection(selected.filter((id) => scene.get(id) !== void 0));
|
|
51
54
|
});
|
|
52
55
|
}
|
|
56
|
+
/** Each parent whose spec children `next` lists differently from `prev` gets
|
|
57
|
+
* them in `next`'s order, in the slots they hold among its children now, so
|
|
58
|
+
* a child no spec names keeps its place. */
|
|
59
|
+
function reorderToSpecs(scene, prev, next) {
|
|
60
|
+
const before = childLists(prev);
|
|
61
|
+
for (const [parent, wanted] of childLists(next)) {
|
|
62
|
+
if (sameValue(wanted, before.get(parent))) continue;
|
|
63
|
+
const named = new Set(wanted);
|
|
64
|
+
const siblings = parent === null ? scene.roots : scene.childrenOf(parent);
|
|
65
|
+
const slots = siblings.flatMap((id, i) => named.has(id) ? [i] : []);
|
|
66
|
+
wanted.filter((id) => siblings.includes(id)).forEach((id, k) => scene.reorder(id, slots[k]));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function childLists(specs) {
|
|
70
|
+
const out = /* @__PURE__ */ new Map();
|
|
71
|
+
for (const spec of specs) {
|
|
72
|
+
const parent = spec.parent ?? null;
|
|
73
|
+
out.set(parent, [...out.get(parent) ?? [], spec.id]);
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
53
77
|
function byId(specs) {
|
|
54
78
|
const out = /* @__PURE__ */ new Map();
|
|
55
79
|
for (const spec of specs) {
|
|
@@ -63,6 +87,5 @@ function needsReplace(a, b) {
|
|
|
63
87
|
return a.kind !== b.kind || a.pickable !== b.pickable || a.consumesChildren !== b.consumesChildren || a.derivePath !== b.derivePath || a.derivePose !== b.derivePose || a.clipFromPose !== b.clipFromPose || a.copiesFromPose !== b.copiesFromPose || a.layout !== b.layout;
|
|
64
88
|
}
|
|
65
89
|
|
|
66
|
-
//#endregion
|
|
67
90
|
export { reconcileSpecs };
|
|
68
91
|
//# sourceMappingURL=reconcileSpecs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconcileSpecs.js","names":["same"],"sources":["../../../src/core/scene/reconcileSpecs.ts"],"sourcesContent":["import { sameValue as same } from './sameValue';\nimport type { AddNodeSpec, NodeId, Scene } from './types';\n\n/**\n * Bring `scene` from `prev` to `next`: add what `next` gained, remove what it\n * lost, and write only the fields that changed between the two.\n *\n * The diff is spec against spec, not spec against scene, so whatever the scene\n * did since `prev` — a node dragged, an edge authored by a gesture — survives\n * unless `next` changes that same field. The writes are untracked: syncing to\n * outside data is not an undo step.\n *\n * Every spec needs an `id`, and `next` must be in an order `createScene` would\n * accept — parents and dependencies before what names them. A node whose\n * `kind` or derive functions change is removed and added again, along with\n * everything its removal takes with it, and stays selected if it was.\n */\nexport function reconcileSpecs<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n prev: readonly AddNodeSpec<TData, TLayer, TPose>[],\n next: readonly AddNodeSpec<TData, TLayer, TPose>[],\n): void {\n const prevById = byId(prev);\n const nextById = byId(next);\n const gone: NodeId[] = [];\n for (const [id, before] of prevById) {\n const after = nextById.get(id);\n if (after === undefined || needsReplace(before, after)) gone.push(id);\n }\n const removing = scene.removalClosure(gone.filter((id) => scene.get(id) !== undefined));\n const removed = new Set(removing);\n\n // A replaced node is the same node to whoever selected it.\n const selected = scene.getSelection();\n\n scene.untracked(() => {\n scene.removeMany(removing);\n for (const spec of next) {\n const id = spec.id!;\n const before = prevById.get(id);\n if (scene.get(id) === undefined || before === undefined || removed.has(id)) {\n scene.add(spec);\n continue;\n }\n // An unlock goes first and a lock last, so the writes between can land.\n if (before.locked === true && spec.locked !== true) scene.setLocked(id, false);\n const parent = spec.parent ?? null;\n if (parent !== (before.parent ?? null)) scene.move(id, parent);\n if (spec.layer !== before.layer) scene.setLayer(id, spec.layer);\n if (!same(spec.data, before.data)) scene.update(id, { data: spec.data });\n if (!same(spec.dependsOn, before.dependsOn)) scene.setDependsOn(id, spec.dependsOn);\n if (!same(spec.units, before.units)) scene.setUnits(id, spec.units ?? null);\n if (spec.clip !== before.clip) scene.setClip(id, spec.clip ?? null);\n if (!same(spec.pose, before.pose)) scene.setPose(id, spec.pose);\n if ((spec.hidden === true) !== (before.hidden === true)) scene.setHidden(id, spec.hidden === true);\n if (spec.locked === true && before.locked !== true) scene.setLocked(id, true);\n }\n if (selected.some((id) => removed.has(id))) {\n scene.setSelection(selected.filter((id) => scene.get(id) !== undefined));\n }\n });\n}\n\nfunction byId<T extends { id?: NodeId }>(specs: readonly T[]): Map<NodeId, T> {\n const out = new Map<NodeId, T>();\n for (const spec of specs) {\n if (spec.id === undefined) throw new Error('reconcileSpecs: every spec needs an id');\n if (out.has(spec.id)) throw new Error(`reconcileSpecs: id \"${spec.id}\" appears more than once`);\n out.set(spec.id, spec);\n }\n return out;\n}\n\nfunction needsReplace<TData, TLayer extends string, TPose>(\n a: AddNodeSpec<TData, TLayer, TPose>,\n b: AddNodeSpec<TData, TLayer, TPose>,\n): boolean {\n return a.kind !== b.kind\n || a.pickable !== b.pickable\n || a.consumesChildren !== b.consumesChildren\n || a.derivePath !== b.derivePath\n || a.derivePose !== b.derivePose\n || a.clipFromPose !== b.clipFromPose\n || a.copiesFromPose !== b.copiesFromPose\n || a.layout !== b.layout;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"reconcileSpecs.js","names":["same"],"sources":["../../../src/core/scene/reconcileSpecs.ts"],"sourcesContent":["import { sameValue as same } from './sameValue';\nimport type { AddNodeSpec, NodeId, Scene } from './types';\n\n/**\n * Bring `scene` from `prev` to `next`: add what `next` gained, remove what it\n * lost, and write only the fields that changed between the two.\n *\n * The diff is spec against spec, not spec against scene, so whatever the scene\n * did since `prev` — a node dragged, an edge authored by a gesture — survives\n * unless `next` changes that same field. The writes are untracked: syncing to\n * outside data is not an undo step.\n *\n * Every spec needs an `id`, and `next` must be in an order `createScene` would\n * accept — parents and dependencies before what names them. Siblings stand in\n * `next`'s order wherever a parent's children in it differ from `prev`'s, by an\n * addition or a reorder; elsewhere a reorder made in the scene stays. A node whose\n * `kind` or derive functions change is removed and added again, along with\n * everything its removal takes with it, and stays selected if it was.\n */\nexport function reconcileSpecs<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n prev: readonly AddNodeSpec<TData, TLayer, TPose>[],\n next: readonly AddNodeSpec<TData, TLayer, TPose>[],\n): void {\n const prevById = byId(prev);\n const nextById = byId(next);\n const gone: NodeId[] = [];\n for (const [id, before] of prevById) {\n const after = nextById.get(id);\n if (after === undefined || needsReplace(before, after)) gone.push(id);\n }\n const removing = scene.removalClosure(gone.filter((id) => scene.get(id) !== undefined));\n const removed = new Set(removing);\n\n // A replaced node is the same node to whoever selected it.\n const selected = scene.getSelection();\n\n scene.untracked(() => {\n scene.removeMany(removing);\n for (const spec of next) {\n const id = spec.id!;\n const before = prevById.get(id);\n if (scene.get(id) === undefined || before === undefined || removed.has(id)) {\n scene.add(spec);\n continue;\n }\n // An unlock goes first and a lock last, so the writes between can land.\n if (before.locked === true && spec.locked !== true) scene.setLocked(id, false);\n const parent = spec.parent ?? null;\n if (parent !== (before.parent ?? null)) scene.move(id, parent);\n if (spec.layer !== before.layer) scene.setLayer(id, spec.layer);\n if (!same(spec.data, before.data)) scene.update(id, { data: spec.data });\n if (!same(spec.dependsOn, before.dependsOn)) scene.setDependsOn(id, spec.dependsOn);\n if (!same(spec.units, before.units)) scene.setUnits(id, spec.units ?? null);\n if (spec.clip !== before.clip) scene.setClip(id, spec.clip ?? null);\n if (!same(spec.pose, before.pose)) scene.setPose(id, spec.pose);\n if ((spec.hidden === true) !== (before.hidden === true)) scene.setHidden(id, spec.hidden === true);\n if (spec.locked === true && before.locked !== true) scene.setLocked(id, true);\n }\n reorderToSpecs(scene, prev, next);\n if (selected.some((id) => removed.has(id))) {\n scene.setSelection(selected.filter((id) => scene.get(id) !== undefined));\n }\n });\n}\n\n/** Each parent whose spec children `next` lists differently from `prev` gets\n * them in `next`'s order, in the slots they hold among its children now, so\n * a child no spec names keeps its place. */\nfunction reorderToSpecs<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n prev: readonly AddNodeSpec<TData, TLayer, TPose>[],\n next: readonly AddNodeSpec<TData, TLayer, TPose>[],\n): void {\n const before = childLists(prev);\n for (const [parent, wanted] of childLists(next)) {\n if (same(wanted, before.get(parent))) continue;\n const named = new Set(wanted);\n const siblings = parent === null ? scene.roots : scene.childrenOf(parent);\n const slots = siblings.flatMap((id, i) => (named.has(id) ? [i] : []));\n const order = wanted.filter((id) => siblings.includes(id));\n // Filling the slots left to right, each move leaves every earlier slot as it should end.\n order.forEach((id, k) => scene.reorder(id, slots[k]!));\n }\n}\n\nfunction childLists<T extends { id?: NodeId; parent?: NodeId | null }>(specs: readonly T[]): Map<NodeId | null, NodeId[]> {\n const out = new Map<NodeId | null, NodeId[]>();\n for (const spec of specs) {\n const parent = spec.parent ?? null;\n out.set(parent, [...(out.get(parent) ?? []), spec.id!]);\n }\n return out;\n}\n\nfunction byId<T extends { id?: NodeId }>(specs: readonly T[]): Map<NodeId, T> {\n const out = new Map<NodeId, T>();\n for (const spec of specs) {\n if (spec.id === undefined) throw new Error('reconcileSpecs: every spec needs an id');\n if (out.has(spec.id)) throw new Error(`reconcileSpecs: id \"${spec.id}\" appears more than once`);\n out.set(spec.id, spec);\n }\n return out;\n}\n\nfunction needsReplace<TData, TLayer extends string, TPose>(\n a: AddNodeSpec<TData, TLayer, TPose>,\n b: AddNodeSpec<TData, TLayer, TPose>,\n): boolean {\n return a.kind !== b.kind\n || a.pickable !== b.pickable\n || a.consumesChildren !== b.consumesChildren\n || a.derivePath !== b.derivePath\n || a.derivePose !== b.derivePose\n || a.clipFromPose !== b.clipFromPose\n || a.copiesFromPose !== b.copiesFromPose\n || a.layout !== b.layout;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { bindOpToAdapter } from "./boundOps.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/recorder.ts
|
|
4
4
|
/** Take back ops that wrote outside the scene, newest first. The scene's own
|
|
5
5
|
* writes are reverted by the applied log. */
|
|
6
6
|
function unwind(outer) {
|
|
@@ -123,6 +123,5 @@ function createRecorder(env) {
|
|
|
123
123
|
};
|
|
124
124
|
}
|
|
125
125
|
|
|
126
|
-
//#endregion
|
|
127
126
|
export { createRecorder };
|
|
128
127
|
//# sourceMappingURL=recorder.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { hasChildren } from "./treeShape.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/renderOrder.ts
|
|
4
4
|
/**
|
|
5
5
|
* A scene's render order: its nodes layer-major, each layer in tree preorder,
|
|
6
6
|
* cached until the structure changes.
|
|
@@ -131,6 +131,5 @@ function createRenderOrder(state) {
|
|
|
131
131
|
};
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
//#endregion
|
|
135
134
|
export { createRenderOrder };
|
|
136
135
|
//# sourceMappingURL=renderOrder.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isPlainObject } from "../isPlainObject.js";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
// src/core/scene/sameValue.ts
|
|
4
4
|
/** Structural equality over plain objects and arrays; anything else by identity. */
|
|
5
5
|
function sameValue(a, b) {
|
|
6
6
|
if (Object.is(a, b)) return true;
|
|
@@ -12,6 +12,5 @@ function sameValue(a, b) {
|
|
|
12
12
|
return false;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
//#endregion
|
|
16
15
|
export { sameValue };
|
|
17
16
|
//# sourceMappingURL=sameValue.js.map
|
package/dist/core/scene/scene.js
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { RIGID_POSE_COMPOSITION } from "./composePose.js";
|
|
2
|
-
import { effectivePose } from "./effectivePose.js";
|
|
3
|
-
import { createScrollOffsets } from "./scrollOffsets.js";
|
|
4
|
-
import { asNodeId } from "./types.js";
|
|
5
|
-
import { documentReads, sceneMutators } from "./sceneMutators.js";
|
|
6
1
|
import { withKitRegistry } from "./kitRegistry.js";
|
|
7
2
|
import { createPoseOverrides } from "./poseOverrides.js";
|
|
3
|
+
import { createScrollOffsets } from "./scrollOffsets.js";
|
|
8
4
|
import { createArrivalWindow } from "./arrivalWindow.js";
|
|
5
|
+
import { documentReads, sceneMutators } from "./sceneMutators.js";
|
|
9
6
|
import { createNotifier } from "./notifier.js";
|
|
10
7
|
import { sceneChanges } from "./sceneChanges.js";
|
|
11
8
|
import { createPoseWriteLog } from "./poseWrites.js";
|
|
9
|
+
import { effectivePose } from "./effectivePose.js";
|
|
12
10
|
import { createEditMode } from "./editMode.js";
|
|
13
|
-
import { resolveLayoutFrame, runLayoutPass } from "./layoutPass.js";
|
|
14
|
-
import { systemLayerRecord } from "./layerStack.js";
|
|
15
11
|
import { createSceneEdits } from "./sceneEdits.js";
|
|
16
12
|
import { createSceneRecording } from "./sceneRecording.js";
|
|
17
13
|
import { createSceneSelection } from "./sceneSelection.js";
|
|
18
|
-
import { layerFromSerialized, specsFromSerialized } from "./serialization.js";
|
|
19
14
|
import { createSceneState } from "./sceneState.js";
|
|
15
|
+
import { systemLayerRecord } from "./layerStack.js";
|
|
16
|
+
import { layerFromSerialized, specsFromSerialized } from "./serialization.js";
|
|
17
|
+
import { resolveLayoutFrame, runLayoutPass } from "./layoutPass.js";
|
|
18
|
+
import { RIGID_POSE_COMPOSITION } from "./composePose.js";
|
|
19
|
+
import { asNodeId } from "./types.js";
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
// src/core/scene/scene.ts
|
|
22
22
|
/** A node still in `scene`, with the pose it is shown at. */
|
|
23
23
|
function shownNode(scene, id) {
|
|
24
24
|
const node = scene.get(id);
|
|
@@ -59,7 +59,7 @@ function buildScene(options, layers, initialNodes, initialDoc) {
|
|
|
59
59
|
writePose
|
|
60
60
|
});
|
|
61
61
|
const generateId = options.generateId ?? defaultGenerateId;
|
|
62
|
-
const selection = createSceneSelection(locks.reachable);
|
|
62
|
+
const selection = createSceneSelection(locks.reachable, (id) => state.nodes.get(id)?.parent);
|
|
63
63
|
selection.subscribe(notifier.notify);
|
|
64
64
|
/** Ephemeral, deliberately not part of `state`: not document content, never in `toJSON` or history. */
|
|
65
65
|
const overrides = createPoseOverrides((id) => state.nodes.get(id), doc.store.invalidateDependents);
|
|
@@ -133,7 +133,7 @@ function buildScene(options, layers, initialNodes, initialDoc) {
|
|
|
133
133
|
doc.reset(json.systemLayers.map(layerFromSerialized), json.doc);
|
|
134
134
|
recording.clearHistory();
|
|
135
135
|
poseWrites.quiet(() => edits.construct(specs));
|
|
136
|
-
selection.replace(
|
|
136
|
+
selection.replace(selection.legal(selection.get().filter((id) => state.nodes.has(id))));
|
|
137
137
|
notifier.notify();
|
|
138
138
|
},
|
|
139
139
|
...sceneChanges(notifier, selection)
|
|
@@ -154,6 +154,5 @@ function sceneFromJSON(json, options = {}) {
|
|
|
154
154
|
return buildScene(options, json.systemLayers.map(layerFromSerialized), (registry) => specsFromSerialized(json, registry, options), json.doc);
|
|
155
155
|
}
|
|
156
156
|
|
|
157
|
-
//#endregion
|
|
158
157
|
export { createScene, sceneFromJSON };
|
|
159
158
|
//# sourceMappingURL=scene.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.js","names":[],"sources":["../../../src/core/scene/scene.ts"],"sourcesContent":["import { withKitRegistry } from './kitRegistry';\nimport { createPoseOverrides } from './poseOverrides';\nimport { createScrollOffsets } from './scrollOffsets';\nimport { createArrivalWindow } from './arrivalWindow';\nimport { documentReads, sceneMutators } from './sceneMutators';\nimport { createNotifier } from './notifier';\nimport type { SerializedDoc } from './docValues';\nimport { sceneChanges } from './sceneChanges';\nimport { createPoseWriteLog } from './poseWrites';\nimport { effectivePose } from './effectivePose';\nimport { createEditMode } from './editMode';\nimport { createSceneEdits } from './sceneEdits';\nimport { createSceneRecording } from './sceneRecording';\nimport { createSceneSelection } from './sceneSelection';\nimport { createSceneState } from './sceneState';\nimport { systemLayerRecord } from './layerStack';\nimport { layerFromSerialized, specsFromSerialized, type SpecsFromSerializedOptions } from './serialization';\nimport { resolveLayoutFrame, runLayoutPass } from './layoutPass';\nimport type { PoseComposition } from './composeFrame';\nimport { RIGID_POSE_COMPOSITION } from './composePose';\nimport type { SceneOptions } from './useSceneOptions';\nimport {\n asNodeId,\n type AddNodeSpec,\n type LayerRecord,\n type NodeId,\n type RegisteredOp,\n type Scene,\n type SceneRegistry,\n type SavedScene,\n type UseSceneOptions,\n} from './types';\n\n/** A node still in `scene`, with the pose it is shown at. */\nfunction shownNode<TData, TLayer extends string, TPose>(scene: Scene<TData, TLayer, TPose>, id: NodeId) {\n const node = scene.get(id);\n return node && { node, pose: effectivePose(scene, node) };\n}\n\nlet defaultIdCounter = 0;\nconst defaultGenerateId = (): NodeId =>\n asNodeId(`n${(defaultIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`);\n\n/** Build a scene outside React. `useScene` is the usual entry point; reach for\n * this in tests, in headless rendering, or wherever a scene must outlive a\n * component. Throws if no system layers are declared. */\nexport function createScene<TData, TLayer extends string, TPose = import('./composePose').RectPose>(\n options: UseSceneOptions<TData, TLayer, TPose>,\n): Scene<TData, TLayer, TPose> {\n return buildScene(options, (options.systemLayers ?? []).map(systemLayerRecord), () => options.initial, options.doc);\n}\n\ntype SceneConfig<TData, TLayer extends string, TPose> =\n Omit<SceneOptions<TData, TLayer, TPose>, 'systemLayers' | 'initial' | 'doc'>;\n\n/** A scene holding `layers`, the document values `initialDoc`, and the nodes\n * `initialNodes` answers with once it is handed the registry their functions\n * resolve against. */\nfunction buildScene<TData, TLayer extends string, TPose>(\n options: SceneConfig<TData, TLayer, TPose>,\n layers: readonly LayerRecord<TLayer>[],\n initialNodes: (registry: SceneRegistry<TPose, TData, TLayer>) => readonly AddNodeSpec<TData, TLayer, TPose>[] | undefined,\n initialDoc: SerializedDoc | undefined,\n): Scene<TData, TLayer, TPose> {\n if (layers.length === 0) throw new Error('Scene: systemLayers must declare at least one layer');\n\n // The kit's own registry entries sit under the consumer's, so a snapshot carrying a kit-attached\n // function (a grouped container's derived pose) reloads in any scene, not only one that registered it.\n const registry = withKitRegistry(options.registry ?? {});\n\n const doc = createSceneState<TData, TLayer, TPose>(registry, layers, () => arrivals.layoutDeclared(), initialDoc);\n const { state, locks, reads } = doc;\n const notifier = createNotifier();\n const mode = createEditMode();\n const poseWrites = createPoseWriteLog({ untracked: mode.untracked, changes: notifier, shown: (id) => shownNode(scene, id) });\n const writePose = (id: string, pose: unknown): void => poseWrites.layout(() => scene.setPose(asNodeId(id), pose as TPose));\n\n const layoutFrame = resolveLayoutFrame(options.layoutFrame);\n const arrivals = createArrivalWindow<TData, TLayer, TPose>({\n nodes: state.nodes,\n layoutPass: (arrived, touched, departed) =>\n runLayoutPass(scene, reads.layoutOf, arrived, touched, layoutFrame, departed),\n recordsBareEdits: () => !mode.open(),\n writePose,\n });\n\n const generateId = options.generateId ?? defaultGenerateId;\n const selection = createSceneSelection(locks.reachable);\n // A selection change is a scene change to every subscriber.\n selection.subscribe(notifier.notify);\n\n /** Ephemeral, deliberately not part of `state`: not document content, never in `toJSON` or history. */\n const overrides = createPoseOverrides<TPose, TData>((id) => state.nodes.get(id), doc.store.invalidateDependents);\n const scroll = createScrollOffsets();\n\n const recording = createSceneRecording({\n notifier,\n mode,\n passAdapter: () => ({ ...sceneMutators(scene), ...documentReads(scene) }),\n stale: doc.stale,\n lifted: locks.lifted,\n selection,\n arrivals,\n writePose,\n poseWrites,\n config: options,\n });\n\n const edits = createSceneEdits<TData, TLayer, TPose>({\n state,\n store: doc.store,\n locks,\n layers: doc.layers,\n invalidateOrder: doc.order.invalidate,\n fnFields: doc.fnFields,\n ops: { ...recording.ops, register: poseWrites.reporting(recording.ops.register) },\n recorder: recording.recorder,\n arrivals,\n layoutFrame,\n generateId,\n narrowSelection: selection.narrow,\n clearOverride: overrides.clear,\n });\n for (const [kind, handler] of Object.entries(options.ops ?? {})) recording.ops.register(kind, handler);\n\n const scene: Scene<TData, TLayer, TPose> = {\n get nodes() { return state.nodes; },\n get roots() { return state.roots; },\n get layers() { return state.layers; },\n registry,\n\n ...reads,\n\n mintId: generateId,\n composition: options.composition ?? (RIGID_POSE_COMPOSITION as PoseComposition<TPose>),\n\n ...edits.methods,\n ...recording.methods,\n\n unlocked: (fn) => locks.lifted(fn),\n\n setArrivalHandler: arrivals.setHandler,\n onReflow: arrivals.onReflow,\n onPoseWrite: poseWrites.subscribe,\n\n overrides,\n scroll,\n\n getSelection: selection.get,\n setSelection: (ids) => selection.set([...ids]),\n\n loadState(json, opts) {\n // Validate + map up front: throws on a bad version or registry key before live state is touched.\n const specs = specsFromSerialized(json, registry, { composition: scene.composition, ...opts });\n if (mode.open()) {\n throw new Error('Scene: cannot loadState inside another edit — it replaces the state that edit would revert to');\n }\n // Ephemeral, and every id is a new node after this.\n overrides.clearAll();\n scroll.clearAll();\n doc.reset(json.systemLayers.map(layerFromSerialized), json.doc);\n recording.clearHistory();\n poseWrites.quiet(() => edits.construct(specs));\n selection.replace(locks.reachable(selection.get().filter((id) => state.nodes.has(id))));\n notifier.notify();\n },\n\n ...sceneChanges(notifier, selection),\n };\n\n const initial = initialNodes(registry);\n if (initial) {\n poseWrites.quiet(() => edits.construct(initial));\n notifier.notify();\n }\n\n return scene;\n}\n\n/** Reconstruct a Scene from a JSON snapshot produced by `scene.toJSON()`.\n * Function fields (e.g., `clipFromPose`) are resolved by string key via the\n * registry passed in `options`. Throws on unknown version, unknown registry\n * keys, or invalid scene shape (cross-layer subtrees, unknown layer ids).\n * The scene starts with empty history. */\nexport function sceneFromJSON<TData, TLayer extends string, TPose>(\n json: SavedScene<TData, TLayer, TPose>,\n options: {\n registry?: SceneRegistry<TPose, TData, TLayer>;\n historyLimit?: number;\n coalesceWindowMs?: number;\n generateId?: () => NodeId;\n ops?: Readonly<Record<string, RegisteredOp<unknown>>>;\n composition?: SceneOptions<TData, TLayer, TPose>['composition'];\n layoutFrame?: SceneOptions<TData, TLayer, TPose>['layoutFrame'];\n } & SpecsFromSerializedOptions<TData, TLayer, TPose> = {},\n): Scene<TData, TLayer, TPose> {\n return buildScene(\n options,\n json.systemLayers.map(layerFromSerialized),\n (registry) => specsFromSerialized(json, registry, options),\n json.doc,\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAS,UAA+C,OAAoC,IAAY;CACtG,MAAM,OAAO,MAAM,IAAI,EAAE;CACzB,OAAO,QAAQ;EAAE;EAAM,MAAM,cAAc,OAAO,IAAI;CAAE;AAC1D;AAEA,IAAI,mBAAmB;AACvB,IAAM,0BACJ,SAAS,KAAK,mBAAA,CAAoB,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG;;;;AAK5F,SAAgB,YACd,SAC6B;CAC7B,OAAO,WAAW,UAAU,QAAQ,gBAAgB,CAAC,EAAA,CAAG,IAAI,iBAAiB,SAAS,QAAQ,SAAS,QAAQ,GAAG;AACpH;;;;AAQA,SAAS,WACP,SACA,QACA,cACA,YAC6B;CAC7B,IAAI,OAAO,WAAW,GAAG,MAAM,IAAI,MAAM,qDAAqD;CAI9F,MAAM,WAAW,gBAAgB,QAAQ,YAAY,CAAC,CAAC;CAEvD,MAAM,MAAM,iBAAuC,UAAU,cAAc,SAAS,eAAe,GAAG,UAAU;CAChH,MAAM,EAAE,OAAO,OAAO,UAAU;CAChC,MAAM,WAAW,eAAe;CAChC,MAAM,OAAO,eAAe;CAC5B,MAAM,aAAa,mBAAmB;EAAE,WAAW,KAAK;EAAW,SAAS;EAAU,QAAQ,OAAO,UAAU,OAAO,EAAE;CAAE,CAAC;CAC3H,MAAM,aAAa,IAAY,SAAwB,WAAW,aAAa,MAAM,QAAQ,SAAS,EAAE,GAAG,IAAa,CAAC;CAEzH,MAAM,cAAc,mBAAmB,QAAQ,WAAW;CAC1D,MAAM,WAAW,oBAA0C;EACzD,OAAO,MAAM;EACb,aAAa,SAAS,SAAS,aAC7B,cAAc,OAAO,MAAM,UAAU,SAAS,SAAS,aAAa,QAAQ;EAC9E,wBAAwB,CAAC,KAAK,KAAK;EACnC;CACF,CAAC;CAED,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,YAAY,qBAAqB,MAAM,SAAS;CAEtD,UAAU,UAAU,SAAS,MAAM;;CAGnC,MAAM,YAAY,qBAAmC,OAAO,MAAM,MAAM,IAAI,EAAE,GAAG,IAAI,MAAM,oBAAoB;CAC/G,MAAM,SAAS,oBAAoB;CAEnC,MAAM,YAAY,qBAAqB;EACrC;EACA;EACA,oBAAoB;GAAE,GAAG,cAAc,KAAK;GAAG,GAAG,cAAc,KAAK;EAAE;EACvE,OAAO,IAAI;EACX,QAAQ,MAAM;EACd;EACA;EACA;EACA;EACA,QAAQ;CACV,CAAC;CAED,MAAM,QAAQ,iBAAuC;EACnD;EACA,OAAO,IAAI;EACX;EACA,QAAQ,IAAI;EACZ,iBAAiB,IAAI,MAAM;EAC3B,UAAU,IAAI;EACd,KAAK;GAAE,GAAG,UAAU;GAAK,UAAU,WAAW,UAAU,UAAU,IAAI,QAAQ;EAAE;EAChF,UAAU,UAAU;EACpB;EACA;EACA;EACA,iBAAiB,UAAU;EAC3B,eAAe,UAAU;CAC3B,CAAC;CACD,KAAK,MAAM,CAAC,MAAM,YAAY,OAAO,QAAQ,QAAQ,OAAO,CAAC,CAAC,GAAG,UAAU,IAAI,SAAS,MAAM,OAAO;CAErG,MAAM,QAAqC;EACzC,IAAI,QAAQ;GAAE,OAAO,MAAM;EAAO;EAClC,IAAI,QAAQ;GAAE,OAAO,MAAM;EAAO;EAClC,IAAI,SAAS;GAAE,OAAO,MAAM;EAAQ;EACpC;EAEA,GAAG;EAEH,QAAQ;EACR,aAAa,QAAQ,eAAgB;EAErC,GAAG,MAAM;EACT,GAAG,UAAU;EAEb,WAAW,OAAO,MAAM,OAAO,EAAE;EAEjC,mBAAmB,SAAS;EAC5B,UAAU,SAAS;EACnB,aAAa,WAAW;EAExB;EACA;EAEA,cAAc,UAAU;EACxB,eAAe,QAAQ,UAAU,IAAI,CAAC,GAAG,GAAG,CAAC;EAE7C,UAAU,MAAM,MAAM;GAEpB,MAAM,QAAQ,oBAAoB,MAAM,UAAU;IAAE,aAAa,MAAM;IAAa,GAAG;GAAK,CAAC;GAC7F,IAAI,KAAK,KAAK,GACZ,MAAM,IAAI,MAAM,+FAA+F;GAGjH,UAAU,SAAS;GACnB,OAAO,SAAS;GAChB,IAAI,MAAM,KAAK,aAAa,IAAI,mBAAmB,GAAG,KAAK,GAAG;GAC9D,UAAU,aAAa;GACvB,WAAW,YAAY,MAAM,UAAU,KAAK,CAAC;GAC7C,UAAU,QAAQ,MAAM,UAAU,UAAU,IAAI,CAAC,CAAC,QAAQ,OAAO,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;GACtF,SAAS,OAAO;EAClB;EAEA,GAAG,aAAa,UAAU,SAAS;CACrC;CAEA,MAAM,UAAU,aAAa,QAAQ;CACrC,IAAI,SAAS;EACX,WAAW,YAAY,MAAM,UAAU,OAAO,CAAC;EAC/C,SAAS,OAAO;CAClB;CAEA,OAAO;AACT;;;;;;AAOA,SAAgB,cACd,MACA,UAQuD,CAAC,GAC3B;CAC7B,OAAO,WACL,SACA,KAAK,aAAa,IAAI,mBAAmB,IACxC,aAAa,oBAAoB,MAAM,UAAU,OAAO,GACzD,KAAK,GACP;AACF"}
|
|
1
|
+
{"version":3,"file":"scene.js","names":[],"sources":["../../../src/core/scene/scene.ts"],"sourcesContent":["import { withKitRegistry } from './kitRegistry';\nimport { createPoseOverrides } from './poseOverrides';\nimport { createScrollOffsets } from './scrollOffsets';\nimport { createArrivalWindow } from './arrivalWindow';\nimport { documentReads, sceneMutators } from './sceneMutators';\nimport { createNotifier } from './notifier';\nimport type { SerializedDoc } from './docValues';\nimport { sceneChanges } from './sceneChanges';\nimport { createPoseWriteLog } from './poseWrites';\nimport { effectivePose } from './effectivePose';\nimport { createEditMode } from './editMode';\nimport { createSceneEdits } from './sceneEdits';\nimport { createSceneRecording } from './sceneRecording';\nimport { createSceneSelection } from './sceneSelection';\nimport { createSceneState } from './sceneState';\nimport { systemLayerRecord } from './layerStack';\nimport { layerFromSerialized, specsFromSerialized, type SpecsFromSerializedOptions } from './serialization';\nimport { resolveLayoutFrame, runLayoutPass } from './layoutPass';\nimport type { PoseComposition } from './composeFrame';\nimport { RIGID_POSE_COMPOSITION } from './composePose';\nimport type { SceneOptions } from './useSceneOptions';\nimport {\n asNodeId,\n type AddNodeSpec,\n type LayerRecord,\n type NodeId,\n type RegisteredOp,\n type Scene,\n type SceneRegistry,\n type SavedScene,\n type UseSceneOptions,\n} from './types';\n\n/** A node still in `scene`, with the pose it is shown at. */\nfunction shownNode<TData, TLayer extends string, TPose>(scene: Scene<TData, TLayer, TPose>, id: NodeId) {\n const node = scene.get(id);\n return node && { node, pose: effectivePose(scene, node) };\n}\n\nlet defaultIdCounter = 0;\nconst defaultGenerateId = (): NodeId =>\n asNodeId(`n${(defaultIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`);\n\n/** Build a scene outside React. `useScene` is the usual entry point; reach for\n * this in tests, in headless rendering, or wherever a scene must outlive a\n * component. Throws if no system layers are declared. */\nexport function createScene<TData, TLayer extends string, TPose = import('./composePose').RectPose>(\n options: UseSceneOptions<TData, TLayer, TPose>,\n): Scene<TData, TLayer, TPose> {\n return buildScene(options, (options.systemLayers ?? []).map(systemLayerRecord), () => options.initial, options.doc);\n}\n\ntype SceneConfig<TData, TLayer extends string, TPose> =\n Omit<SceneOptions<TData, TLayer, TPose>, 'systemLayers' | 'initial' | 'doc'>;\n\n/** A scene holding `layers`, the document values `initialDoc`, and the nodes\n * `initialNodes` answers with once it is handed the registry their functions\n * resolve against. */\nfunction buildScene<TData, TLayer extends string, TPose>(\n options: SceneConfig<TData, TLayer, TPose>,\n layers: readonly LayerRecord<TLayer>[],\n initialNodes: (registry: SceneRegistry<TPose, TData, TLayer>) => readonly AddNodeSpec<TData, TLayer, TPose>[] | undefined,\n initialDoc: SerializedDoc | undefined,\n): Scene<TData, TLayer, TPose> {\n if (layers.length === 0) throw new Error('Scene: systemLayers must declare at least one layer');\n\n // The kit's own registry entries sit under the consumer's, so a snapshot carrying a kit-attached\n // function (a grouped container's derived pose) reloads in any scene, not only one that registered it.\n const registry = withKitRegistry(options.registry ?? {});\n\n const doc = createSceneState<TData, TLayer, TPose>(registry, layers, () => arrivals.layoutDeclared(), initialDoc);\n const { state, locks, reads } = doc;\n const notifier = createNotifier();\n const mode = createEditMode();\n const poseWrites = createPoseWriteLog({ untracked: mode.untracked, changes: notifier, shown: (id) => shownNode(scene, id) });\n const writePose = (id: string, pose: unknown): void => poseWrites.layout(() => scene.setPose(asNodeId(id), pose as TPose));\n\n const layoutFrame = resolveLayoutFrame(options.layoutFrame);\n const arrivals = createArrivalWindow<TData, TLayer, TPose>({\n nodes: state.nodes,\n layoutPass: (arrived, touched, departed) =>\n runLayoutPass(scene, reads.layoutOf, arrived, touched, layoutFrame, departed),\n recordsBareEdits: () => !mode.open(),\n writePose,\n });\n\n const generateId = options.generateId ?? defaultGenerateId;\n const selection = createSceneSelection(locks.reachable, (id) => state.nodes.get(id)?.parent);\n // A selection change is a scene change to every subscriber.\n selection.subscribe(notifier.notify);\n\n /** Ephemeral, deliberately not part of `state`: not document content, never in `toJSON` or history. */\n const overrides = createPoseOverrides<TPose, TData>((id) => state.nodes.get(id), doc.store.invalidateDependents);\n const scroll = createScrollOffsets();\n\n const recording = createSceneRecording({\n notifier,\n mode,\n passAdapter: () => ({ ...sceneMutators(scene), ...documentReads(scene) }),\n stale: doc.stale,\n lifted: locks.lifted,\n selection,\n arrivals,\n writePose,\n poseWrites,\n config: options,\n });\n\n const edits = createSceneEdits<TData, TLayer, TPose>({\n state,\n store: doc.store,\n locks,\n layers: doc.layers,\n invalidateOrder: doc.order.invalidate,\n fnFields: doc.fnFields,\n ops: { ...recording.ops, register: poseWrites.reporting(recording.ops.register) },\n recorder: recording.recorder,\n arrivals,\n layoutFrame,\n generateId,\n narrowSelection: selection.narrow,\n clearOverride: overrides.clear,\n });\n for (const [kind, handler] of Object.entries(options.ops ?? {})) recording.ops.register(kind, handler);\n\n const scene: Scene<TData, TLayer, TPose> = {\n get nodes() { return state.nodes; },\n get roots() { return state.roots; },\n get layers() { return state.layers; },\n registry,\n\n ...reads,\n\n mintId: generateId,\n composition: options.composition ?? (RIGID_POSE_COMPOSITION as PoseComposition<TPose>),\n\n ...edits.methods,\n ...recording.methods,\n\n unlocked: (fn) => locks.lifted(fn),\n\n setArrivalHandler: arrivals.setHandler,\n onReflow: arrivals.onReflow,\n onPoseWrite: poseWrites.subscribe,\n\n overrides,\n scroll,\n\n getSelection: selection.get,\n setSelection: (ids) => selection.set([...ids]),\n\n loadState(json, opts) {\n // Validate + map up front: throws on a bad version or registry key before live state is touched.\n const specs = specsFromSerialized(json, registry, { composition: scene.composition, ...opts });\n if (mode.open()) {\n throw new Error('Scene: cannot loadState inside another edit — it replaces the state that edit would revert to');\n }\n // Ephemeral, and every id is a new node after this.\n overrides.clearAll();\n scroll.clearAll();\n doc.reset(json.systemLayers.map(layerFromSerialized), json.doc);\n recording.clearHistory();\n poseWrites.quiet(() => edits.construct(specs));\n selection.replace(selection.legal(selection.get().filter((id) => state.nodes.has(id))));\n notifier.notify();\n },\n\n ...sceneChanges(notifier, selection),\n };\n\n const initial = initialNodes(registry);\n if (initial) {\n poseWrites.quiet(() => edits.construct(initial));\n notifier.notify();\n }\n\n return scene;\n}\n\n/** Reconstruct a Scene from a JSON snapshot produced by `scene.toJSON()`.\n * Function fields (e.g., `clipFromPose`) are resolved by string key via the\n * registry passed in `options`. Throws on unknown version, unknown registry\n * keys, or invalid scene shape (cross-layer subtrees, unknown layer ids).\n * The scene starts with empty history. */\nexport function sceneFromJSON<TData, TLayer extends string, TPose>(\n json: SavedScene<TData, TLayer, TPose>,\n options: {\n registry?: SceneRegistry<TPose, TData, TLayer>;\n historyLimit?: number;\n coalesceWindowMs?: number;\n generateId?: () => NodeId;\n ops?: Readonly<Record<string, RegisteredOp<unknown>>>;\n composition?: SceneOptions<TData, TLayer, TPose>['composition'];\n layoutFrame?: SceneOptions<TData, TLayer, TPose>['layoutFrame'];\n } & SpecsFromSerializedOptions<TData, TLayer, TPose> = {},\n): Scene<TData, TLayer, TPose> {\n return buildScene(\n options,\n json.systemLayers.map(layerFromSerialized),\n (registry) => specsFromSerialized(json, registry, options),\n json.doc,\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/core/scene/sceneChanges.ts
|
|
2
2
|
/** A scene's change members, over its notifier and its selection's own count of changes. */
|
|
3
3
|
function sceneChanges(notifier, selection) {
|
|
4
4
|
return {
|
|
@@ -8,6 +8,5 @@ function sceneChanges(notifier, selection) {
|
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
//#endregion
|
|
12
11
|
export { sceneChanges };
|
|
13
12
|
//# sourceMappingURL=sceneChanges.js.map
|
|
@@ -6,7 +6,7 @@ import { createNodeFlags } from "./nodeFlags.js";
|
|
|
6
6
|
import { createLayerEdits } from "./layerStack.js";
|
|
7
7
|
import { createTreeEdits } from "./treeEdits.js";
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
// src/core/scene/sceneEdits.ts
|
|
10
10
|
function createSceneEdits(env) {
|
|
11
11
|
const { state, store, locks, layers, fnFields, recorder, arrivals } = env;
|
|
12
12
|
const { layoutRefs } = registerKitOps({
|
|
@@ -84,6 +84,5 @@ function createSceneEdits(env) {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
//#endregion
|
|
88
87
|
export { createSceneEdits };
|
|
89
88
|
//# sourceMappingURL=sceneEdits.js.map
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// src/core/scene/sceneJournals.ts
|
|
2
|
+
/** A journal drives adapter mutation itself, so its applies and undos
|
|
3
|
+
* re-enter scene mutation methods the way the facade's do. */
|
|
4
|
+
function wrapJournal(raw, env, open) {
|
|
5
|
+
const { replay, notify } = env;
|
|
6
|
+
const wrapped = {
|
|
7
|
+
targetId: raw.targetId,
|
|
8
|
+
forkedAtEntryId: raw.forkedAtEntryId,
|
|
9
|
+
applyBatch(ops, label) {
|
|
10
|
+
env.labeled(label, () => env.runArrivalEdit(ops, (all) => {
|
|
11
|
+
env.applying(() => raw.applyBatch(all.map(env.causing), label));
|
|
12
|
+
notify();
|
|
13
|
+
}));
|
|
14
|
+
},
|
|
15
|
+
undo() {
|
|
16
|
+
replay(() => raw.undo());
|
|
17
|
+
notify();
|
|
18
|
+
},
|
|
19
|
+
redo() {
|
|
20
|
+
replay(() => raw.redo());
|
|
21
|
+
notify();
|
|
22
|
+
},
|
|
23
|
+
canUndo: () => raw.canUndo(),
|
|
24
|
+
canRedo: () => raw.canRedo(),
|
|
25
|
+
entries: () => raw.entries(),
|
|
26
|
+
seal: () => raw.seal(),
|
|
27
|
+
observe: (listener) => raw.observe(listener),
|
|
28
|
+
beginJournal: (opts) => open.wrap(raw.beginJournal(opts)),
|
|
29
|
+
getVersion: () => raw.getVersion(),
|
|
30
|
+
subscribe: (listener) => raw.subscribe(listener),
|
|
31
|
+
commit(label) {
|
|
32
|
+
raw.commit(label);
|
|
33
|
+
open.close(wrapped);
|
|
34
|
+
notify();
|
|
35
|
+
},
|
|
36
|
+
cancel() {
|
|
37
|
+
replay(() => raw.cancel());
|
|
38
|
+
open.close(wrapped);
|
|
39
|
+
notify();
|
|
40
|
+
},
|
|
41
|
+
suspend: () => raw.suspend(),
|
|
42
|
+
isActive: () => raw.isActive()
|
|
43
|
+
};
|
|
44
|
+
return wrapped;
|
|
45
|
+
}
|
|
46
|
+
function createSceneJournals(env) {
|
|
47
|
+
/** Wrapped journal → the engine's own: the engine keys resumability off
|
|
48
|
+
* journal identity, which a wrapper would not match. */
|
|
49
|
+
const raws = /* @__PURE__ */ new WeakMap();
|
|
50
|
+
const opened = [];
|
|
51
|
+
const open = {
|
|
52
|
+
wrap(raw) {
|
|
53
|
+
const wrapped = wrapJournal(raw, env, open);
|
|
54
|
+
raws.set(wrapped, raw);
|
|
55
|
+
opened.push(wrapped);
|
|
56
|
+
return wrapped;
|
|
57
|
+
},
|
|
58
|
+
close(wrapped) {
|
|
59
|
+
const i = opened.indexOf(wrapped);
|
|
60
|
+
if (i >= 0) opened.splice(i, 1);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
begin(opts) {
|
|
65
|
+
const parent = env.activeJournal();
|
|
66
|
+
return open.wrap(parent ? (raws.get(parent) ?? parent).beginJournal(opts) : env.engine.beginJournal(opts));
|
|
67
|
+
},
|
|
68
|
+
resume: (journal) => env.engine.resumeJournal(raws.get(journal) ?? journal),
|
|
69
|
+
innermost() {
|
|
70
|
+
for (let i = opened.length - 1; i >= 0; i--) if (opened[i].isActive()) return opened[i];
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { createSceneJournals };
|
|
77
|
+
//# sourceMappingURL=sceneJournals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sceneJournals.js","names":[],"sources":["../../../src/core/scene/sceneJournals.ts"],"sourcesContent":["/**\n * The journals opened on `scene.history`: each wrapped so its applies and\n * undos re-enter scene mutation the way the facade's do, and tracked while\n * open, so the scene's edits go to the innermost.\n */\nimport type { BeginJournalOptions, Journal } from '@weasel-js/history';\nimport type { SceneHistoryEnv } from './historyFacade';\n\ninterface OpenJournals {\n wrap(raw: Journal): Journal;\n close(wrapped: Journal): void;\n}\n\n/** A journal drives adapter mutation itself, so its applies and undos\n * re-enter scene mutation methods the way the facade's do. */\nfunction wrapJournal(raw: Journal, env: SceneHistoryEnv, open: OpenJournals): Journal {\n const { replay, notify } = env;\n const wrapped: Journal = {\n targetId: raw.targetId,\n forkedAtEntryId: raw.forkedAtEntryId,\n applyBatch(ops, label) {\n env.labeled(label, () => env.runArrivalEdit(ops, (all) => {\n env.applying(() => raw.applyBatch(all.map(env.causing), label));\n notify();\n }));\n },\n undo() {\n replay(() => raw.undo());\n notify();\n },\n redo() {\n replay(() => raw.redo());\n notify();\n },\n canUndo: () => raw.canUndo(),\n canRedo: () => raw.canRedo(),\n entries: () => raw.entries(),\n seal: () => raw.seal(),\n observe: (listener) => raw.observe(listener),\n beginJournal: (opts) => open.wrap(raw.beginJournal(opts)),\n getVersion: () => raw.getVersion(),\n subscribe: (listener) => raw.subscribe(listener),\n commit(label) {\n // Flushes the session's net ops to the parent stack — no apply, but\n // the parent's undo depth changes and listeners read that.\n raw.commit(label);\n open.close(wrapped);\n notify();\n },\n cancel() {\n replay(() => raw.cancel());\n open.close(wrapped);\n notify();\n },\n suspend: () => raw.suspend(),\n isActive: () => raw.isActive(),\n };\n return wrapped;\n}\n\nexport interface SceneJournals {\n /** Open a journal inside the one edits go to now, else on the engine: an\n * edit session started during a mode's lands in the mode's as one entry. */\n begin(opts: BeginJournalOptions): Journal;\n resume(journal: Journal): void;\n /** The innermost active journal opened here, or null. */\n innermost(): Journal | null;\n}\n\nexport function createSceneJournals(env: SceneHistoryEnv): SceneJournals {\n /** Wrapped journal → the engine's own: the engine keys resumability off\n * journal identity, which a wrapper would not match. */\n const raws = new WeakMap<Journal, Journal>();\n const opened: Journal[] = [];\n const open: OpenJournals = {\n wrap(raw) {\n const wrapped = wrapJournal(raw, env, open);\n raws.set(wrapped, raw);\n opened.push(wrapped);\n return wrapped;\n },\n close(wrapped) {\n const i = opened.indexOf(wrapped);\n if (i >= 0) opened.splice(i, 1);\n },\n };\n return {\n begin(opts) {\n const parent = env.activeJournal();\n return open.wrap(parent ? (raws.get(parent) ?? parent).beginJournal(opts) : env.engine.beginJournal(opts));\n },\n resume: (journal) => env.engine.resumeJournal(raws.get(journal) ?? journal),\n innermost() {\n for (let i = opened.length - 1; i >= 0; i--) if (opened[i]!.isActive()) return opened[i]!;\n return null;\n },\n };\n}\n"],"mappings":";;;AAeA,SAAS,YAAY,KAAc,KAAsB,MAA6B;CACpF,MAAM,EAAE,QAAQ,WAAW;CAC3B,MAAM,UAAmB;EACvB,UAAU,IAAI;EACd,iBAAiB,IAAI;EACrB,WAAW,KAAK,OAAO;GACrB,IAAI,QAAQ,aAAa,IAAI,eAAe,MAAM,QAAQ;IACxD,IAAI,eAAe,IAAI,WAAW,IAAI,IAAI,IAAI,OAAO,GAAG,KAAK,CAAC;IAC9D,OAAO;GACT,CAAC,CAAC;EACJ;EACA,OAAO;GACL,aAAa,IAAI,KAAK,CAAC;GACvB,OAAO;EACT;EACA,OAAO;GACL,aAAa,IAAI,KAAK,CAAC;GACvB,OAAO;EACT;EACA,eAAe,IAAI,QAAQ;EAC3B,eAAe,IAAI,QAAQ;EAC3B,eAAe,IAAI,QAAQ;EAC3B,YAAY,IAAI,KAAK;EACrB,UAAU,aAAa,IAAI,QAAQ,QAAQ;EAC3C,eAAe,SAAS,KAAK,KAAK,IAAI,aAAa,IAAI,CAAC;EACxD,kBAAkB,IAAI,WAAW;EACjC,YAAY,aAAa,IAAI,UAAU,QAAQ;EAC/C,OAAO,OAAO;GAGZ,IAAI,OAAO,KAAK;GAChB,KAAK,MAAM,OAAO;GAClB,OAAO;EACT;EACA,SAAS;GACP,aAAa,IAAI,OAAO,CAAC;GACzB,KAAK,MAAM,OAAO;GAClB,OAAO;EACT;EACA,eAAe,IAAI,QAAQ;EAC3B,gBAAgB,IAAI,SAAS;CAC/B;CACA,OAAO;AACT;AAWA,SAAgB,oBAAoB,KAAqC;;;CAGvE,MAAM,uBAAO,IAAI,QAA0B;CAC3C,MAAM,SAAoB,CAAC;CAC3B,MAAM,OAAqB;EACzB,KAAK,KAAK;GACR,MAAM,UAAU,YAAY,KAAK,KAAK,IAAI;GAC1C,KAAK,IAAI,SAAS,GAAG;GACrB,OAAO,KAAK,OAAO;GACnB,OAAO;EACT;EACA,MAAM,SAAS;GACb,MAAM,IAAI,OAAO,QAAQ,OAAO;GAChC,IAAI,KAAK,GAAG,OAAO,OAAO,GAAG,CAAC;EAChC;CACF;CACA,OAAO;EACL,MAAM,MAAM;GACV,MAAM,SAAS,IAAI,cAAc;GACjC,OAAO,KAAK,KAAK,UAAU,KAAK,IAAI,MAAM,KAAK,OAAA,CAAQ,aAAa,IAAI,IAAI,IAAI,OAAO,aAAa,IAAI,CAAC;EAC3G;EACA,SAAS,YAAY,IAAI,OAAO,cAAc,KAAK,IAAI,OAAO,KAAK,OAAO;EAC1E,YAAY;GACV,KAAK,IAAI,IAAI,OAAO,SAAS,GAAG,KAAK,GAAG,KAAK,IAAI,OAAO,EAAE,CAAE,SAAS,GAAG,OAAO,OAAO;GACtF,OAAO;EACT;CACF;AACF"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { documentPose } from "./effectivePose.js";
|
|
2
|
-
import { asNodeId } from "./types.js";
|
|
3
2
|
import { fnFieldsOfNode } from "./nodeFnFields.js";
|
|
4
3
|
import { statedFields } from "./statedFields.js";
|
|
4
|
+
import { asNodeId } from "./types.js";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
// src/core/scene/sceneMutators.ts
|
|
7
7
|
function sceneMutators(scene) {
|
|
8
8
|
const getChildren = (parentId) => parentId === null ? [...scene.roots] : [...scene.childrenOf(asNodeId(parentId))];
|
|
9
9
|
return {
|
|
@@ -53,6 +53,5 @@ function documentReads(scene) {
|
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
//#endregion
|
|
57
56
|
export { documentReads, sceneMutators };
|
|
58
57
|
//# sourceMappingURL=sceneMutators.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { definesFrame, documentPose } from "./effectivePose.js";
|
|
2
2
|
import { viewPoseAdapter } from "./scrollOffsets.js";
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
// src/core/scene/scenePoseAdapter.ts
|
|
5
5
|
/** Build a `PoseAdapter` over a `Scene` for `composePose` helpers.
|
|
6
6
|
* `getParent` returns the live parent at call time so mid-batch
|
|
7
7
|
* parent updates compose correctly. */
|
|
@@ -24,6 +24,5 @@ function sceneViewPoseAdapter(scene) {
|
|
|
24
24
|
return viewPoseAdapter(scene, scenePoseAdapter(scene));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
//#endregion
|
|
28
27
|
export { scenePoseAdapter, sceneViewPoseAdapter };
|
|
29
28
|
//# sourceMappingURL=scenePoseAdapter.js.map
|