@weasel-js/core 1.9.4 → 1.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +750 -0
- package/README.md +5 -3
- package/dist/WeaselProvider.js +5 -7
- package/dist/WeaselProvider.js.map +1 -1
- package/dist/affordances/composeAffordanceLayer.js +91 -83
- package/dist/affordances/composeAffordanceLayer.js.map +1 -1
- package/dist/affordances/cornerResize.js +3 -2
- package/dist/affordances/cornerResize.js.map +1 -1
- package/dist/affordances/hitAffordanceRegions.js +54 -100
- package/dist/affordances/hitAffordanceRegions.js.map +1 -1
- package/dist/affordances/pathAnchors.js.map +1 -1
- package/dist/affordances/rotationHandle.js +5 -4
- package/dist/affordances/rotationHandle.js.map +1 -1
- package/dist/animation/behaviors/coast.js +21 -0
- package/dist/animation/behaviors/coast.js.map +1 -0
- package/dist/animation/behaviors/coastByWrite.js +107 -0
- package/dist/animation/behaviors/coastByWrite.js.map +1 -0
- package/dist/animation/behaviors/coastOnTargets.js +94 -0
- package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +48 -136
- package/dist/animation/behaviors/momentum.js.map +1 -1
- package/dist/animation/clipTargets.js +12 -0
- package/dist/animation/clipTargets.js.map +1 -0
- package/dist/animation/index.js +15 -20
- package/dist/animation/poseHelpers.js +112 -33
- package/dist/animation/poseHelpers.js.map +1 -1
- package/dist/animation/poseTarget.js +115 -0
- package/dist/animation/poseTarget.js.map +1 -0
- package/dist/animation/reflow.js +113 -83
- package/dist/animation/reflow.js.map +1 -1
- package/dist/animation/rewind.js +66 -0
- package/dist/animation/rewind.js.map +1 -0
- package/dist/animation/rig/bindRig.js +85 -53
- package/dist/animation/rig/bindRig.js.map +1 -1
- package/dist/animation/rig/rigNode.js +93 -0
- package/dist/animation/rig/rigNode.js.map +1 -0
- package/dist/animation/rig/rigSeat.js +26 -0
- package/dist/animation/rig/rigSeat.js.map +1 -0
- package/dist/animation/rig/skinBinding.js +56 -0
- package/dist/animation/rig/skinBinding.js.map +1 -0
- package/dist/animation/rig/useRig.js +31 -16
- package/dist/animation/rig/useRig.js.map +1 -1
- package/dist/animation/wrappers/animateLifecycle.js +8 -7
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
- package/dist/animation/wrappers/animateOnSetPose.js +31 -31
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
- package/dist/animation/wrappers/instantPose.js.map +1 -1
- package/dist/animation/writtenPoseTarget.js +33 -0
- package/dist/animation/writtenPoseTarget.js.map +1 -0
- package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
- package/dist/barrel/canvas.js +31 -0
- package/dist/barrel/chrome.js +10 -10
- package/dist/barrel/input.js +16 -17
- package/dist/barrel/interactions.js +35 -39
- package/dist/barrel/paint.js +11 -18
- package/dist/barrel/paths.js +12 -19
- package/dist/barrel/renderer.js +14 -20
- package/dist/barrel/routing.js +42 -36
- package/dist/barrel/scene.js +37 -0
- package/dist/barrel/text.js +9 -18
- package/dist/barrel/viewport.js +41 -51
- package/dist/canvas/Canvas.js +281 -475
- package/dist/canvas/Canvas.js.map +1 -1
- package/dist/canvas/CanvasView.js +169 -188
- package/dist/canvas/CanvasView.js.map +1 -1
- package/dist/canvas/CursorCoordsHud.js +22 -23
- package/dist/canvas/CursorCoordsHud.js.map +1 -1
- package/dist/canvas/DrawCanvas.js +39 -56
- package/dist/canvas/DrawCanvas.js.map +1 -1
- package/dist/canvas/ModalityHud.js.map +1 -1
- package/dist/canvas/NodeShape.js +28 -29
- package/dist/canvas/NodeShape.js.map +1 -1
- package/dist/canvas/PickHud.js.map +1 -1
- package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
- package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
- package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +51 -54
- package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
- package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
- package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
- package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +40 -29
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
- package/dist/canvas/SceneCanvas/features.js +73 -43
- package/dist/canvas/SceneCanvas/features.js.map +1 -1
- package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
- package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
- package/dist/canvas/SceneCanvas/props.js +15 -14
- package/dist/canvas/SceneCanvas/props.js.map +1 -1
- package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
- package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
- package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
- package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
- package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
- package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
- package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
- package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
- package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
- package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +39 -37
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
- package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
- package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
- package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +76 -80
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
- package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
- package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
- package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
- package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
- package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +303 -707
- package/dist/canvas/SceneCanvas.js.map +1 -1
- package/dist/canvas/SceneViewCanvas.js +41 -47
- package/dist/canvas/SceneViewCanvas.js.map +1 -1
- package/dist/canvas/adapterDerivedPath.js +26 -0
- package/dist/canvas/adapterDerivedPath.js.map +1 -0
- package/dist/canvas/affordanceAt.js +11 -1
- package/dist/canvas/affordanceAt.js.map +1 -1
- package/dist/canvas/buildSceneLayer.js +81 -61
- package/dist/canvas/buildSceneLayer.js.map +1 -1
- package/dist/canvas/buildSceneTree.js.map +1 -1
- package/dist/canvas/canvasRenderer.js +40 -44
- package/dist/canvas/canvasRenderer.js.map +1 -1
- package/dist/canvas/colorOverrides.js.map +1 -1
- package/dist/canvas/defaultDrawOne.js +12 -12
- package/dist/canvas/defaultDrawOne.js.map +1 -1
- package/dist/canvas/deps/areaSelect.js +4 -4
- package/dist/canvas/deps/areaSelect.js.map +1 -1
- package/dist/canvas/deps/debug.js.map +1 -1
- package/dist/canvas/deps/editAnchors.js +49 -68
- package/dist/canvas/deps/editAnchors.js.map +1 -1
- package/dist/canvas/deps/geometryProjection.js.map +1 -1
- package/dist/canvas/deps/hitTestArea.js +31 -26
- package/dist/canvas/deps/hitTestArea.js.map +1 -1
- package/dist/canvas/deps/insert.js +65 -54
- package/dist/canvas/deps/insert.js.map +1 -1
- package/dist/canvas/deps/lassoSelect.js +5 -5
- package/dist/canvas/deps/lassoSelect.js.map +1 -1
- package/dist/canvas/deps/poseDescriptor.js +1 -1
- package/dist/canvas/deps/poseDescriptor.js.map +1 -1
- package/dist/canvas/deps/resizePolicy.js.map +1 -1
- package/dist/canvas/deps/slice.js +44 -45
- package/dist/canvas/deps/slice.js.map +1 -1
- package/dist/canvas/deps/textEdit.js +8 -8
- package/dist/canvas/deps/textEdit.js.map +1 -1
- package/dist/canvas/deps/view.js.map +1 -1
- package/dist/canvas/derivedPath.js +43 -41
- package/dist/canvas/derivedPath.js.map +1 -1
- package/dist/canvas/drawEnvelope.js +8 -4
- package/dist/canvas/drawEnvelope.js.map +1 -1
- package/dist/canvas/getNodeAtPoint.js +2 -6
- package/dist/canvas/getNodeAtPoint.js.map +1 -1
- package/dist/canvas/hud.module.js.map +1 -1
- package/dist/canvas/insertPreviewExtent.js.map +1 -1
- package/dist/canvas/layerOrder.js.map +1 -1
- package/dist/canvas/layerSlots.js +6 -1
- package/dist/canvas/layerSlots.js.map +1 -1
- package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
- package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/imagePainter.js +10 -10
- package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
- package/dist/canvas/nodeShapes/memo.js.map +1 -1
- package/dist/canvas/nodeShapes/nodePaint.js +34 -23
- package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
- package/dist/canvas/nodeShapes/pathPainter.js +23 -22
- package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/poseBox.js +6 -6
- package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
- package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
- package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
- package/dist/canvas/nodeShapes/shapePainter.js +16 -16
- package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
- package/dist/canvas/nodeShapes/textPainter.js +1 -1
- package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
- package/dist/canvas/overlayRoleStrokes.js.map +1 -1
- package/dist/canvas/paintCull.js +6 -8
- package/dist/canvas/paintCull.js.map +1 -1
- package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
- package/dist/canvas/paintedCursorLayer.js.map +1 -0
- package/dist/canvas/pickWalk.js +52 -50
- package/dist/canvas/pickWalk.js.map +1 -1
- package/dist/canvas/planeClips.js +18 -19
- package/dist/canvas/planeClips.js.map +1 -1
- package/dist/canvas/poseCascade.js +41 -0
- package/dist/canvas/poseCascade.js.map +1 -0
- package/dist/canvas/poseRotation.js +1 -3
- package/dist/canvas/poseRotation.js.map +1 -1
- package/dist/canvas/rasterReadback.js +22 -0
- package/dist/canvas/rasterReadback.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +12 -12
- package/dist/canvas/renderDebugSnapshot.js.map +1 -1
- package/dist/canvas/renderNeeds.js +3 -3
- package/dist/canvas/renderNeeds.js.map +1 -1
- package/dist/canvas/renderSceneToPixels.js +64 -83
- package/dist/canvas/renderSceneToPixels.js.map +1 -1
- package/dist/canvas/sceneAdapter.js +68 -132
- package/dist/canvas/sceneAdapter.js.map +1 -1
- package/dist/canvas/sceneClipboard.js +1 -1
- package/dist/canvas/sceneClipboard.js.map +1 -1
- package/dist/canvas/sceneLayerPaint.js +4 -4
- package/dist/canvas/sceneLayerPaint.js.map +1 -1
- package/dist/canvas/sceneSlotWiring.js +4 -4
- package/dist/canvas/sceneSlotWiring.js.map +1 -1
- package/dist/canvas/sceneViewRender.js +36 -35
- package/dist/canvas/sceneViewRender.js.map +1 -1
- package/dist/canvas/slopsDebugLayer.js +4 -4
- package/dist/canvas/slopsDebugLayer.js.map +1 -1
- package/dist/canvas/surface.module.js +6 -0
- package/dist/canvas/surface.module.js.map +1 -0
- package/dist/canvas/surfaceBox.js +16 -0
- package/dist/canvas/surfaceBox.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +23 -11
- package/dist/canvas/useCanvasRenderer.js.map +1 -1
- package/dist/canvas/useCanvasSurface.js +31 -0
- package/dist/canvas/useCanvasSurface.js.map +1 -0
- package/dist/canvas/useCanvasView.js +46 -37
- package/dist/canvas/useCanvasView.js.map +1 -1
- package/dist/canvas/useFrameLoop.js +11 -12
- package/dist/canvas/useFrameLoop.js.map +1 -1
- package/dist/canvas/useHostAnchor.js +35 -33
- package/dist/canvas/useHostAnchor.js.map +1 -1
- package/dist/canvas/useLateContentRedraw.js +8 -8
- package/dist/canvas/useLateContentRedraw.js.map +1 -1
- package/dist/canvas/useSceneLayerList.js +4 -14
- package/dist/canvas/useSceneLayerList.js.map +1 -1
- package/dist/canvas/useSurfaceInput.js +42 -0
- package/dist/canvas/useSurfaceInput.js.map +1 -0
- package/dist/canvas/useToolCursor.js +29 -0
- package/dist/canvas/useToolCursor.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +46 -85
- package/dist/canvas/useViewHelpers.js.map +1 -1
- package/dist/canvas/viewInputs.js.map +1 -1
- package/dist/canvas/viewRegistry.js +25 -27
- package/dist/canvas/viewRegistry.js.map +1 -1
- package/dist/canvas/watchElementMove.js +43 -0
- package/dist/canvas/watchElementMove.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -1
- package/dist/clipboard.d.ts +7 -14
- package/dist/{types-B4iJRHC3.d.ts → clone-2a5hVbBd.d.ts} +122 -77
- package/dist/clone.d.ts +4 -8
- package/dist/clone.js +0 -2
- package/dist/core/device/targets.js.map +1 -1
- package/dist/core/device/useDeviceProfile.js +13 -13
- package/dist/core/device/useDeviceProfile.js.map +1 -1
- package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
- package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/pathPoseDescriptor.js +88 -0
- package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +61 -14
- package/dist/core/geometry/poseDescriptor.js.map +1 -1
- package/dist/core/geometry/regionHit.js +35 -37
- package/dist/core/geometry/regionHit.js.map +1 -1
- package/dist/core/geometry/targetFrame.js +94 -0
- package/dist/core/geometry/targetFrame.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +4 -5
- package/dist/core/geometry/unionBounds.js.map +1 -1
- package/dist/core/layers/backgroundFill.js +31 -0
- package/dist/core/layers/backgroundFill.js.map +1 -0
- package/dist/{features/groups → core/layers}/children.js +1 -1
- package/dist/core/layers/children.js.map +1 -0
- package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
- package/dist/core/layers/gateLayer.js.map +1 -0
- package/dist/core/layers/layerGroup.js +40 -0
- package/dist/core/layers/layerGroup.js.map +1 -0
- package/dist/core/layers/render.js +50 -76
- package/dist/core/layers/render.js.map +1 -1
- package/dist/core/ops/createHistory.js +9 -9
- package/dist/core/ops/createHistory.js.map +1 -1
- package/dist/core/ops/delete.js.map +1 -1
- package/dist/core/paint/meshKind.js +16 -0
- package/dist/core/paint/meshKind.js.map +1 -0
- package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +103 -92
- package/dist/core/paint/meshKindLazy.js.map +1 -0
- package/dist/core/paint/paintKindEntry.js +8 -0
- package/dist/core/paint/paintKindEntry.js.map +1 -0
- package/dist/core/paint/paintKinds.js +144 -0
- package/dist/core/paint/paintKinds.js.map +1 -0
- package/dist/core/paint/registerMesh.js +7 -0
- package/dist/core/paint/registerMesh.js.map +1 -0
- package/dist/core/scene/NodeProperties.js.map +1 -1
- package/dist/core/scene/NodeRouting.js.map +1 -1
- package/dist/core/scene/arrivalWindow.js +65 -64
- package/dist/core/scene/arrivalWindow.js.map +1 -1
- package/dist/core/scene/boundOps.js +40 -0
- package/dist/core/scene/boundOps.js.map +1 -0
- package/dist/core/scene/composeFrame.js +9 -6
- package/dist/core/scene/composeFrame.js.map +1 -1
- package/dist/{features/groups → core/scene}/composePose.js +18 -18
- package/dist/core/scene/composePose.js.map +1 -0
- package/dist/core/scene/depMemo.js +31 -6
- package/dist/core/scene/depMemo.js.map +1 -1
- package/dist/core/scene/derivedPath.js +19 -20
- package/dist/core/scene/derivedPath.js.map +1 -1
- package/dist/core/scene/editMode.js +26 -0
- package/dist/core/scene/editMode.js.map +1 -0
- package/dist/core/scene/effectivePose.js +38 -39
- package/dist/core/scene/effectivePose.js.map +1 -1
- package/dist/core/scene/fieldEdits.js +98 -0
- package/dist/core/scene/fieldEdits.js.map +1 -0
- package/dist/core/scene/historyFacade.js +116 -70
- package/dist/core/scene/historyFacade.js.map +1 -1
- package/dist/core/scene/historyForm.js +6 -0
- package/dist/core/scene/historyForm.js.map +1 -0
- package/dist/core/scene/kitOps.js +83 -71
- package/dist/core/scene/kitOps.js.map +1 -1
- package/dist/core/scene/kitRegistry.js.map +1 -1
- package/dist/core/scene/layerStack.js +105 -12
- package/dist/core/scene/layerStack.js.map +1 -1
- package/dist/core/scene/layoutPass.js +58 -59
- package/dist/core/scene/layoutPass.js.map +1 -1
- package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
- package/dist/core/scene/nestedHit.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +9 -9
- package/dist/core/scene/nodeFnFields.js.map +1 -1
- package/dist/core/scene/nodeMemo.js.map +1 -1
- package/dist/core/scene/nodeStore.js +72 -71
- package/dist/core/scene/nodeStore.js.map +1 -1
- package/dist/core/scene/notifier.js +37 -0
- package/dist/core/scene/notifier.js.map +1 -0
- package/dist/core/scene/opTable.js +50 -0
- package/dist/core/scene/opTable.js.map +1 -0
- package/dist/core/scene/outerOps.js +66 -0
- package/dist/core/scene/outerOps.js.map +1 -0
- package/dist/core/scene/poseHold.js +39 -0
- package/dist/core/scene/poseHold.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +44 -36
- package/dist/core/scene/poseOverrides.js.map +1 -1
- package/dist/core/scene/poseSnapshot.js.map +1 -1
- package/dist/core/scene/reconcileSpecs.js +3 -2
- package/dist/core/scene/reconcileSpecs.js.map +1 -1
- package/dist/core/scene/recorder.js +86 -0
- package/dist/core/scene/recorder.js.map +1 -0
- package/dist/core/scene/renderOrder.js.map +1 -1
- package/dist/core/scene/scene.js +81 -690
- package/dist/core/scene/scene.js.map +1 -1
- package/dist/core/scene/sceneEdits.js +58 -0
- package/dist/core/scene/sceneEdits.js.map +1 -0
- package/dist/core/scene/sceneMutators.js +49 -0
- package/dist/core/scene/sceneMutators.js.map +1 -0
- package/dist/core/scene/scenePoseAdapter.js +16 -0
- package/dist/core/scene/scenePoseAdapter.js.map +1 -0
- package/dist/core/scene/sceneRecording.js +90 -0
- package/dist/core/scene/sceneRecording.js.map +1 -0
- package/dist/core/scene/sceneSelection.js +28 -0
- package/dist/core/scene/sceneSelection.js.map +1 -0
- package/dist/core/scene/sceneState.js +49 -0
- package/dist/core/scene/sceneState.js.map +1 -0
- package/dist/core/scene/serialization.js +8 -5
- package/dist/core/scene/serialization.js.map +1 -1
- package/dist/core/scene/staleReplay.js +51 -0
- package/dist/core/scene/staleReplay.js.map +1 -0
- package/dist/core/scene/statedFields.js +9 -0
- package/dist/core/scene/statedFields.js.map +1 -0
- package/dist/core/scene/treeEdits.js +127 -0
- package/dist/core/scene/treeEdits.js.map +1 -0
- package/dist/core/scene/treeReads.js +26 -0
- package/dist/core/scene/treeReads.js.map +1 -0
- package/dist/core/scene/types.js.map +1 -1
- package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
- package/dist/core/scene/unionOfChildren.js.map +1 -0
- package/dist/core/scene/unitScopes.js +13 -0
- package/dist/core/scene/unitScopes.js.map +1 -0
- package/dist/core/scene/useScene.js.map +1 -1
- package/dist/core/selection/readOnlySelection.js +32 -0
- package/dist/core/selection/readOnlySelection.js.map +1 -0
- package/dist/core/selection/usePublishSceneSelection.js +26 -0
- package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
- package/dist/core/selection/useSelection.js +34 -25
- package/dist/core/selection/useSelection.js.map +1 -1
- package/dist/core/shapeKinds.js.map +1 -1
- package/dist/core/stylus/stylus.js.map +1 -1
- package/dist/core/stylus/usePointerStylus.js.map +1 -1
- package/dist/core/usePaintKinds.js +1 -1
- package/dist/core/usePaintKinds.js.map +1 -1
- package/dist/core/viewport/clientToWorld.js.map +1 -1
- package/dist/core/viewport/fitViewToBounds.js.map +1 -1
- package/dist/core/viewport/parallax.js.map +1 -1
- package/dist/core/viewport/screenSlop.js +11 -11
- package/dist/core/viewport/screenSlop.js.map +1 -1
- package/dist/core/viewport/useCanvasSize.js.map +1 -1
- package/dist/core/viewport/useDecayLoop.js +8 -8
- package/dist/core/viewport/useDecayLoop.js.map +1 -1
- package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
- package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +102 -43
- package/dist/core/viewport/useViewAnimation.js.map +1 -1
- package/dist/core/viewport/view.js +7 -7
- package/dist/core/viewport/view.js.map +1 -1
- package/dist/core/viewport/wheelHandler.js.map +1 -1
- package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
- package/dist/debug/createDebugOverlayLayer.js +100 -100
- package/dist/debug/createDebugOverlayLayer.js.map +1 -1
- package/dist/debug/createDebugSink.js.map +1 -1
- package/dist/debug/frameStats.js.map +1 -1
- package/dist/debug/useDebugSink.js +52 -0
- package/dist/debug/useDebugSink.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
- package/dist/features/chrome-caps/conditions.js.map +1 -1
- package/dist/features/chrome-caps/defaults.js.map +1 -1
- package/dist/features/chrome-caps/resolve.js.map +1 -1
- package/dist/features/chrome-caps/useChromeCaps.js +54 -0
- package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
- package/dist/features/ingestion/contentHandlers.js +25 -19
- package/dist/features/ingestion/contentHandlers.js.map +1 -1
- package/dist/features/ingestion/imageHandler.js +21 -24
- package/dist/features/ingestion/imageHandler.js.map +1 -1
- package/dist/features/ingestion/openFilePicker.js.map +1 -1
- package/dist/features/ingestion/placement.js +16 -0
- package/dist/features/ingestion/placement.js.map +1 -0
- package/dist/features/ingestion/svgHandler.js +5 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -1
- package/dist/features/ingestion/textHandler.js +28 -0
- package/dist/features/ingestion/textHandler.js.map +1 -0
- package/dist/features/ingestion/useCanvasIngestion.js +48 -0
- package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +5 -0
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
- package/dist/features/longPress/longPressFeedback.js.map +1 -1
- package/dist/features/modes/modeLayers.js +7 -7
- package/dist/features/modes/modeLayers.js.map +1 -1
- package/dist/features/paths/editablePath.js +47 -0
- package/dist/features/paths/editablePath.js.map +1 -0
- package/dist/features/paths/index.js +9 -16
- package/dist/features/paths/pathEditState.js +41 -0
- package/dist/features/paths/pathEditState.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
- package/dist/features/paths/pathLayer.js +3 -2
- package/dist/features/paths/pathLayer.js.map +1 -1
- package/dist/features/paths/penPreviewLayer.js +86 -88
- package/dist/features/paths/penPreviewLayer.js.map +1 -1
- package/dist/features/paths/usePathEdit.js +34 -0
- package/dist/features/paths/usePathEdit.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +42 -55
- package/dist/features/poseRun/usePoseRun.js.map +1 -1
- package/dist/features/selection/overlay.js +170 -178
- package/dist/features/selection/overlay.js.map +1 -1
- package/dist/features/text/index.js +6 -0
- package/dist/features/text/textLayer.js +1 -1
- package/dist/features/text/textLayer.js.map +1 -1
- package/dist/features/text/useSceneTextEdit.js +95 -82
- package/dist/features/text/useSceneTextEdit.js.map +1 -1
- package/dist/features/viewports/viewportLayer.js +25 -36
- package/dist/features/viewports/viewportLayer.js.map +1 -1
- package/dist/index.d.ts +4507 -8459
- package/dist/index.js +275 -320
- package/dist/input/keyState.js +14 -14
- package/dist/interactions/actions/actionShortcuts.js.map +1 -1
- package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
- package/dist/interactions/actions/align/action.js.map +1 -0
- package/dist/interactions/actions/align/align.js +23 -23
- package/dist/interactions/actions/align/align.js.map +1 -1
- package/dist/interactions/actions/booleans/action.js +65 -0
- package/dist/interactions/actions/booleans/action.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +69 -78
- package/dist/interactions/actions/booleans/booleans.js.map +1 -1
- package/dist/interactions/actions/booleans/operands.js +40 -0
- package/dist/interactions/actions/booleans/operands.js.map +1 -0
- package/dist/interactions/actions/booleans/pieces.js +45 -0
- package/dist/interactions/actions/booleans/pieces.js.map +1 -0
- package/dist/interactions/actions/booleans/placement.js +24 -0
- package/dist/interactions/actions/booleans/placement.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +11 -9
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
- package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
- package/dist/interactions/actions/clipboard/action.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
- package/dist/interactions/actions/clone/action.js +98 -0
- package/dist/interactions/actions/clone/action.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors.js +52 -0
- package/dist/interactions/actions/clone/behaviors.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
- package/dist/interactions/actions/defaults/anchorEditing.js +41 -43
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
- package/dist/interactions/actions/defaults/delete.js.map +1 -1
- package/dist/interactions/actions/defaults/duplicate.js +19 -19
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
- package/dist/interactions/actions/defaults/group.js +35 -40
- package/dist/interactions/actions/defaults/group.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
- package/dist/interactions/actions/defaults/ingest.js +19 -15
- package/dist/interactions/actions/defaults/ingest.js.map +1 -1
- package/dist/interactions/actions/defaults/insertPathAnchor.js +14 -15
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
- package/dist/interactions/actions/defaults/nudge.js +30 -31
- package/dist/interactions/actions/defaults/nudge.js.map +1 -1
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
- package/dist/interactions/actions/defaults/setFill.js +9 -3
- package/dist/interactions/actions/defaults/setFill.js.map +1 -1
- package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
- package/dist/interactions/actions/defaults/sliceOps.js +20 -22
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
- package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
- package/dist/interactions/actions/distribute/action.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +11 -11
- package/dist/interactions/actions/distribute/distribute.js.map +1 -1
- package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +19 -21
- package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
- package/dist/interactions/actions/flip/action.js +124 -0
- package/dist/interactions/actions/flip/action.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +1 -1
- package/dist/interactions/actions/flip/helpers.js.map +1 -1
- package/dist/interactions/actions/gestureFrames.js +18 -0
- package/dist/interactions/actions/gestureFrames.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +47 -20
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
- package/dist/interactions/actions/insert/action.js +72 -0
- package/dist/interactions/actions/insert/action.js.map +1 -0
- package/dist/interactions/actions/insert/commit.js +28 -0
- package/dist/interactions/actions/insert/commit.js.map +1 -0
- package/dist/interactions/actions/insert/extras.js +65 -0
- package/dist/interactions/actions/insert/extras.js.map +1 -0
- package/dist/interactions/actions/insert/frame.js +48 -0
- package/dist/interactions/actions/insert/frame.js.map +1 -0
- package/dist/interactions/actions/insert/geometry.js +35 -0
- package/dist/interactions/actions/insert/geometry.js.map +1 -0
- package/dist/interactions/actions/insert/rotateAction.js +21 -0
- package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
- package/dist/interactions/actions/insert/session.js +59 -0
- package/dist/interactions/actions/insert/session.js.map +1 -0
- package/dist/interactions/actions/insert/shape.js +34 -0
- package/dist/interactions/actions/insert/shape.js.map +1 -0
- package/dist/interactions/actions/lasso-select/action.js +143 -0
- package/dist/interactions/actions/lasso-select/action.js.map +1 -0
- package/dist/interactions/actions/move/action.js +87 -0
- package/dist/interactions/actions/move/action.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
- package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
- package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +24 -23
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
- package/dist/interactions/actions/move/capture.js +99 -0
- package/dist/interactions/actions/move/capture.js.map +1 -0
- package/dist/interactions/actions/move/commit/index.js +41 -0
- package/dist/interactions/actions/move/commit/index.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
- package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
- package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
- package/dist/interactions/actions/move/commit/rebase.js +18 -0
- package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
- package/dist/interactions/actions/move/commit/reparent.js +65 -0
- package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
- package/dist/interactions/actions/move/delta.js +51 -0
- package/dist/interactions/actions/move/delta.js.map +1 -0
- package/dist/interactions/actions/move/frame.js +59 -0
- package/dist/interactions/actions/move/frame.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +15 -40
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
- package/dist/interactions/actions/move/landedDescendants.js +8 -8
- package/dist/interactions/actions/move/layout/container.js +94 -0
- package/dist/interactions/actions/move/layout/container.js.map +1 -0
- package/dist/interactions/actions/move/layout/dragged.js +58 -0
- package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
- package/dist/interactions/actions/move/layout/dropPass.js +122 -0
- package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
- package/dist/interactions/actions/move/layout/exits.js +38 -0
- package/dist/interactions/actions/move/layout/exits.js.map +1 -0
- package/dist/interactions/actions/move/layout/glide.js +48 -0
- package/dist/interactions/actions/move/layout/glide.js.map +1 -0
- package/dist/interactions/actions/move/session.js +63 -0
- package/dist/interactions/actions/move/session.js.map +1 -0
- package/dist/interactions/actions/move/translate.js +61 -0
- package/dist/interactions/actions/move/translate.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +17 -64
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
- package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
- package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
- package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
- package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
- package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
- package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
- package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
- package/dist/interactions/actions/planeInput.js.map +1 -1
- package/dist/interactions/actions/pointerState.js +12 -0
- package/dist/interactions/actions/pointerState.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +1 -1
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
- package/dist/interactions/actions/poseFrame.js +26 -26
- package/dist/interactions/actions/poseFrame.js.map +1 -1
- package/dist/interactions/actions/resize/action.js +55 -0
- package/dist/interactions/actions/resize/action.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
- package/dist/interactions/actions/resize/boxFrame.js +16 -0
- package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
- package/dist/interactions/actions/resize/capture.js +85 -0
- package/dist/interactions/actions/resize/capture.js.map +1 -0
- package/dist/interactions/actions/resize/commit.js +69 -0
- package/dist/interactions/actions/resize/commit.js.map +1 -0
- package/dist/interactions/actions/resize/frame.js +74 -0
- package/dist/interactions/actions/resize/frame.js.map +1 -0
- package/dist/interactions/actions/resize/pointSnap.js +111 -0
- package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
- package/dist/interactions/actions/resize/ruleBounds.js +9 -0
- package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
- package/dist/interactions/actions/resize/session.js +49 -0
- package/dist/interactions/actions/resize/session.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -1
- package/dist/interactions/actions/resolvePreviews.js.map +1 -1
- package/dist/interactions/actions/rotate/action.js +56 -0
- package/dist/interactions/actions/rotate/action.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
- package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
- package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
- package/dist/interactions/actions/rotate/commit.js +40 -0
- package/dist/interactions/actions/rotate/commit.js.map +1 -0
- package/dist/interactions/actions/rotate/frame.js +65 -0
- package/dist/interactions/actions/rotate/frame.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +12 -12
- package/dist/interactions/actions/rotate/handle.js.map +1 -1
- package/dist/interactions/actions/rotate/session.js +92 -0
- package/dist/interactions/actions/rotate/session.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -1
- package/dist/interactions/actions/useStandardActions.js +77 -72
- package/dist/interactions/actions/useStandardActions.js.map +1 -1
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
- package/dist/interactions/gestures/shared/originProjection.js +1 -1
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
- package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
- package/dist/interactions/gestures/shared/snap.js.map +1 -1
- package/dist/layout/arrivals.js +20 -23
- package/dist/layout/arrivals.js.map +1 -1
- package/dist/math-CYUjoyyU.d.ts +33 -0
- package/dist/math.d.ts +5 -2
- package/dist/math.js +6 -6
- package/dist/mesh.d.ts +4 -268
- package/dist/mesh.js +3 -7
- package/dist/move.d.ts +6 -4
- package/dist/{originProjection-gHnOup4e.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
- package/dist/patterns-builtin.d.ts +1 -118
- package/dist/patterns-builtin.js +2 -3
- package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
- package/dist/renderer.d.ts +1 -92
- package/dist/renderer.js +2 -19
- package/dist/resize.d.ts +11 -22
- package/dist/resize.js +1 -1
- package/dist/style.css +1 -1
- package/dist/test-hook/install.js.map +1 -1
- package/dist/test-hook/useTestHook.js +22 -0
- package/dist/test-hook/useTestHook.js.map +1 -0
- package/dist/test-seams-D0pyV3pR.d.ts +149 -0
- package/dist/test-seams.d.ts +4 -4
- package/dist/test-seams.js +2 -2
- package/dist/tools/builtin/bone/boneActions.js +130 -0
- package/dist/tools/builtin/bone/boneActions.js.map +1 -0
- package/dist/tools/builtin/bone/boneOverlay.js +58 -0
- package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
- package/dist/tools/builtin/bone/placedRig.js +24 -0
- package/dist/tools/builtin/bone/placedRig.js.map +1 -0
- package/dist/tools/builtin/bone/rigEditState.js +21 -0
- package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
- package/dist/tools/builtin/bone/useBoneTool.js +98 -0
- package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
- package/dist/tools/builtin/image/useImageTool.js.map +1 -1
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
- package/dist/tools/builtin/line/useLineTool.js.map +1 -1
- package/dist/tools/builtin/pen/usePenTool.js +161 -163
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
- package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
- package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +4 -4
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
- package/dist/tools/builtin/select/useSelectTool.js +43 -71
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
- package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
- package/dist/tools/builtin/slice/useSliceTool.js +67 -72
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
- package/dist/tools/builtin/star/useStarTool.js.map +1 -1
- package/dist/tools/builtin/text/useTextTool.js +8 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -1
- package/dist/tools/builtin/weight/useWeightTool.js +77 -0
- package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
- package/dist/tools/builtin/weight/weightActions.js +112 -0
- package/dist/tools/builtin/weight/weightActions.js.map +1 -0
- package/dist/tools/builtin/weight/weightOverlay.js +61 -0
- package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
- package/dist/tools/overlayBinding.js.map +1 -1
- package/dist/tools/useKeybindings.js +20 -14
- package/dist/tools/useKeybindings.js.map +1 -1
- package/dist/{types-k-5Oqh-U.d.ts → types-CIKDwlsP.d.ts} +84 -164
- package/dist/util/paint.js +1 -1
- package/dist/util/paint.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +26 -21
- package/dist/animation/colorHelpers.js +0 -135
- package/dist/animation/colorHelpers.js.map +0 -1
- package/dist/animation/colorRegistry.js +0 -37
- package/dist/animation/colorRegistry.js.map +0 -1
- package/dist/animation/engine/axes.js +0 -36
- package/dist/animation/engine/axes.js.map +0 -1
- package/dist/animation/engine/codec.js +0 -170
- package/dist/animation/engine/codec.js.map +0 -1
- package/dist/animation/engine/integrator.js +0 -12
- package/dist/animation/engine/integrator.js.map +0 -1
- package/dist/animation/loop.js +0 -60
- package/dist/animation/loop.js.map +0 -1
- package/dist/animation/observe.js +0 -23
- package/dist/animation/observe.js.map +0 -1
- package/dist/animation/rig/blendPoses.js +0 -43
- package/dist/animation/rig/blendPoses.js.map +0 -1
- package/dist/animation/rig/mirrorPose.js +0 -19
- package/dist/animation/rig/mirrorPose.js.map +0 -1
- package/dist/animation/rig/resolveSkeleton.js +0 -33
- package/dist/animation/rig/resolveSkeleton.js.map +0 -1
- package/dist/animation/rig/solveIk.js +0 -103
- package/dist/animation/rig/solveIk.js.map +0 -1
- package/dist/animation/rig/types.js +0 -12
- package/dist/animation/rig/types.js.map +0 -1
- package/dist/animation/slew.js +0 -27
- package/dist/animation/slew.js.map +0 -1
- package/dist/animation/stagger.js +0 -146
- package/dist/animation/stagger.js.map +0 -1
- package/dist/animation/timeline/booking.js +0 -114
- package/dist/animation/timeline/booking.js.map +0 -1
- package/dist/animation/timeline/createTimeline.js +0 -125
- package/dist/animation/timeline/createTimeline.js.map +0 -1
- package/dist/animation/timeline/sampleTrack.js +0 -79
- package/dist/animation/timeline/sampleTrack.js.map +0 -1
- package/dist/animation/useAnimator.js +0 -388
- package/dist/animation/useAnimator.js.map +0 -1
- package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
- package/dist/builtins-DPcdghtB.d.ts +0 -1223
- package/dist/canvas/MinimapCanvas.js +0 -140
- package/dist/canvas/MinimapCanvas.js.map +0 -1
- package/dist/canvas/deps/poseComposition.js +0 -11
- package/dist/canvas/deps/poseComposition.js.map +0 -1
- package/dist/canvas/minimapMath.js +0 -82
- package/dist/canvas/minimapMath.js.map +0 -1
- package/dist/canvas/toolPreview.js +0 -39
- package/dist/canvas/toolPreview.js.map +0 -1
- package/dist/core/adapters/arrayAdapter.js +0 -94
- package/dist/core/adapters/arrayAdapter.js.map +0 -1
- package/dist/core/adapters/useArrayAdapter.js +0 -13
- package/dist/core/adapters/useArrayAdapter.js.map +0 -1
- package/dist/core/fillInPoseFrame.js +0 -102
- package/dist/core/fillInPoseFrame.js.map +0 -1
- package/dist/core/geometry/poseFrame.js +0 -44
- package/dist/core/geometry/poseFrame.js.map +0 -1
- package/dist/core/geometry/poseRotation.js +0 -58
- package/dist/core/geometry/poseRotation.js.map +0 -1
- package/dist/core/gradient.js +0 -136
- package/dist/core/gradient.js.map +0 -1
- package/dist/core/markerInset.js +0 -24
- package/dist/core/markerInset.js.map +0 -1
- package/dist/core/mixed.js +0 -6
- package/dist/core/mixed.js.map +0 -1
- package/dist/core/paintKinds.js +0 -156
- package/dist/core/paintKinds.js.map +0 -1
- package/dist/core/scene/pickability.js +0 -6
- package/dist/core/scene/pickability.js.map +0 -1
- package/dist/core/strokeMarkerShapes.js +0 -139
- package/dist/core/strokeMarkerShapes.js.map +0 -1
- package/dist/core/strokeMarkers.js +0 -28
- package/dist/core/strokeMarkers.js.map +0 -1
- package/dist/core/viewport/meanScale.js +0 -8
- package/dist/core/viewport/meanScale.js.map +0 -1
- package/dist/core/viewport/pxExtent.js +0 -42
- package/dist/core/viewport/pxExtent.js.map +0 -1
- package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
- package/dist/features/focus/gateLayer.js.map +0 -1
- package/dist/features/focus/useCanvasFocus.js +0 -29
- package/dist/features/focus/useCanvasFocus.js.map +0 -1
- package/dist/features/groups/children.js.map +0 -1
- package/dist/features/groups/composePose.js.map +0 -1
- package/dist/features/groups/nestedHit.js.map +0 -1
- package/dist/features/groups/unionOfChildren.js.map +0 -1
- package/dist/features/images/imageCache.js +0 -104
- package/dist/features/images/imageCache.js.map +0 -1
- package/dist/features/ingestion/index.js +0 -8
- package/dist/features/meshPaint/bake.js +0 -79
- package/dist/features/meshPaint/bake.js.map +0 -1
- package/dist/features/meshPaint/bakeCache.js +0 -59
- package/dist/features/meshPaint/bakeCache.js.map +0 -1
- package/dist/features/meshPaint/handles.js +0 -86
- package/dist/features/meshPaint/handles.js.map +0 -1
- package/dist/features/meshPaint/lazyKind.js.map +0 -1
- package/dist/features/meshPaint/meshPaint.js +0 -239
- package/dist/features/meshPaint/meshPaint.js.map +0 -1
- package/dist/features/meshPaint/meshShader.js +0 -6
- package/dist/features/meshPaint/meshShader.js.map +0 -1
- package/dist/features/meshPaint/register.js +0 -7
- package/dist/features/meshPaint/register.js.map +0 -1
- package/dist/features/meshPaint/surface.js +0 -110
- package/dist/features/meshPaint/surface.js.map +0 -1
- package/dist/features/minimap/actions.js +0 -53
- package/dist/features/minimap/actions.js.map +0 -1
- package/dist/features/minimap/createMinimapContribution.js +0 -96
- package/dist/features/minimap/createMinimapContribution.js.map +0 -1
- package/dist/features/minimap/layers.js +0 -85
- package/dist/features/minimap/layers.js.map +0 -1
- package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
- package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
- package/dist/features/parallax/createParallaxLayer.js +0 -26
- package/dist/features/parallax/createParallaxLayer.js.map +0 -1
- package/dist/features/parallax/createParallaxPlane.js +0 -22
- package/dist/features/parallax/createParallaxPlane.js.map +0 -1
- package/dist/features/paths/anchorEdits.js +0 -167
- package/dist/features/paths/anchorEdits.js.map +0 -1
- package/dist/features/paths/anchors.js +0 -159
- package/dist/features/paths/anchors.js.map +0 -1
- package/dist/features/paths/booleans.js +0 -2
- package/dist/features/paths/markerCommands.js +0 -149
- package/dist/features/paths/markerCommands.js.map +0 -1
- package/dist/features/paths/markerSites.js +0 -59
- package/dist/features/paths/markerSites.js.map +0 -1
- package/dist/features/paths/markers.js +0 -95
- package/dist/features/paths/markers.js.map +0 -1
- package/dist/features/paths/nearestAnchor.js +0 -36
- package/dist/features/paths/nearestAnchor.js.map +0 -1
- package/dist/features/paths/pathInWorld.js +0 -41
- package/dist/features/paths/pathInWorld.js.map +0 -1
- package/dist/features/paths/poseDescriptor.js +0 -39
- package/dist/features/paths/poseDescriptor.js.map +0 -1
- package/dist/features/paths/strokeToPath.js +0 -40
- package/dist/features/paths/strokeToPath.js.map +0 -1
- package/dist/features/paths/tessellate/dash.js +0 -52
- package/dist/features/paths/tessellate/dash.js.map +0 -1
- package/dist/features/paths/tessellate/insets.js +0 -32
- package/dist/features/paths/tessellate/insets.js.map +0 -1
- package/dist/features/paths/tessellate/metric.js +0 -72
- package/dist/features/paths/tessellate/metric.js.map +0 -1
- package/dist/features/paths/tessellate/stroke.js +0 -170
- package/dist/features/paths/tessellate/stroke.js.map +0 -1
- package/dist/features/paths/tessellate/vertexWidths.js +0 -32
- package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
- package/dist/features/patterns/commandPaint.js +0 -18
- package/dist/features/patterns/commandPaint.js.map +0 -1
- package/dist/features/patterns/index.js +0 -11
- package/dist/features/patterns/index.js.map +0 -1
- package/dist/features/patterns/patterns-builtin.js +0 -38
- package/dist/features/patterns/patterns-builtin.js.map +0 -1
- package/dist/features/patterns/rasterizeTile.js +0 -17
- package/dist/features/patterns/rasterizeTile.js.map +0 -1
- package/dist/features/patterns/resolveSpec.js +0 -65
- package/dist/features/patterns/resolveSpec.js.map +0 -1
- package/dist/features/patterns/tileGeometry.js +0 -158
- package/dist/features/patterns/tileGeometry.js.map +0 -1
- package/dist/features/pointer/PointerContext.js +0 -45
- package/dist/features/pointer/PointerContext.js.map +0 -1
- package/dist/features/selection/SelectionContext.js +0 -51
- package/dist/features/selection/SelectionContext.js.map +0 -1
- package/dist/features/simulation/createSimulation.js +0 -61
- package/dist/features/simulation/createSimulation.js.map +0 -1
- package/dist/features/simulation/types.js +0 -6
- package/dist/features/simulation/types.js.map +0 -1
- package/dist/features/simulation/useSimulation.js +0 -74
- package/dist/features/simulation/useSimulation.js.map +0 -1
- package/dist/features/text/domOffsets.js +0 -82
- package/dist/features/text/domOffsets.js.map +0 -1
- package/dist/features/text/domRuns.js +0 -230
- package/dist/features/text/domRuns.js.map +0 -1
- package/dist/features/text/fitTextPose.js +0 -38
- package/dist/features/text/fitTextPose.js.map +0 -1
- package/dist/features/text/hitTest.js +0 -48
- package/dist/features/text/hitTest.js.map +0 -1
- package/dist/features/text/isTextData.js +0 -8
- package/dist/features/text/isTextData.js.map +0 -1
- package/dist/features/text/overlayDirection.js +0 -15
- package/dist/features/text/overlayDirection.js.map +0 -1
- package/dist/features/text/renderLabel.js +0 -14
- package/dist/features/text/renderLabel.js.map +0 -1
- package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
- package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
- package/dist/features/text/runs/flagRange.js +0 -53
- package/dist/features/text/runs/flagRange.js.map +0 -1
- package/dist/features/text/runs/rangeStyle.js +0 -133
- package/dist/features/text/runs/rangeStyle.js.map +0 -1
- package/dist/features/text/textCommand.js +0 -60
- package/dist/features/text/textCommand.js.map +0 -1
- package/dist/features/text/textToPath.js +0 -181
- package/dist/features/text/textToPath.js.map +0 -1
- package/dist/features/text/useTextEdit.js +0 -491
- package/dist/features/text/useTextEdit.js.map +0 -1
- package/dist/features/tiling/createTiledLayer.js +0 -65
- package/dist/features/tiling/createTiledLayer.js.map +0 -1
- package/dist/features/tiling/tiledProject.js +0 -14
- package/dist/features/tiling/tiledProject.js.map +0 -1
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
- package/dist/interactions/actions/defaults/align.js.map +0 -1
- package/dist/interactions/actions/defaults/booleans.js +0 -52
- package/dist/interactions/actions/defaults/booleans.js.map +0 -1
- package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
- package/dist/interactions/actions/defaults/clone.js +0 -91
- package/dist/interactions/actions/defaults/clone.js.map +0 -1
- package/dist/interactions/actions/defaults/createOutlines.js +0 -47
- package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
- package/dist/interactions/actions/defaults/distribute.js.map +0 -1
- package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
- package/dist/interactions/actions/defaults/flip.js +0 -125
- package/dist/interactions/actions/defaults/flip.js.map +0 -1
- package/dist/interactions/actions/defaults/insert.js +0 -287
- package/dist/interactions/actions/defaults/insert.js.map +0 -1
- package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
- package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
- package/dist/interactions/actions/defaults/move.js +0 -778
- package/dist/interactions/actions/defaults/move.js.map +0 -1
- package/dist/interactions/actions/defaults/resize.js +0 -341
- package/dist/interactions/actions/defaults/resize.js.map +0 -1
- package/dist/interactions/actions/defaults/rotate.js +0 -185
- package/dist/interactions/actions/defaults/rotate.js.map +0 -1
- package/dist/interactions/actions/previewOverrides.js +0 -25
- package/dist/interactions/actions/previewOverrides.js.map +0 -1
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
- package/dist/math-J-ACHyEg.d.ts +0 -159
- package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
- package/dist/renderer/DrawCommand.js +0 -6
- package/dist/renderer/DrawCommand.js.map +0 -1
- package/dist/renderer/WeaselRenderer.js +0 -333
- package/dist/renderer/WeaselRenderer.js.map +0 -1
- package/dist/renderer/batchClip.js +0 -46
- package/dist/renderer/batchClip.js.map +0 -1
- package/dist/renderer/cache/GLImageCache.js +0 -74
- package/dist/renderer/cache/GLImageCache.js.map +0 -1
- package/dist/renderer/cache/GLMeshCache.js +0 -102
- package/dist/renderer/cache/GLMeshCache.js.map +0 -1
- package/dist/renderer/cache/GLTextureCache.js +0 -68
- package/dist/renderer/cache/GLTextureCache.js.map +0 -1
- package/dist/renderer/cache/GradientRampAtlas.js +0 -82
- package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
- package/dist/renderer/cache/cache.js +0 -13
- package/dist/renderer/cache/cache.js.map +0 -1
- package/dist/renderer/cache/markerCommandCache.js +0 -63
- package/dist/renderer/cache/markerCommandCache.js.map +0 -1
- package/dist/renderer/cache/outlineMeshCache.js +0 -15
- package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
- package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
- package/dist/renderer/cache/strokeMeshCache.js +0 -55
- package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
- package/dist/renderer/cullDrawCommands.js +0 -90
- package/dist/renderer/cullDrawCommands.js.map +0 -1
- package/dist/renderer/draw/batch.js +0 -133
- package/dist/renderer/draw/batch.js.map +0 -1
- package/dist/renderer/draw/clip.js +0 -89
- package/dist/renderer/draw/clip.js.map +0 -1
- package/dist/renderer/draw/customShader.js +0 -230
- package/dist/renderer/draw/customShader.js.map +0 -1
- package/dist/renderer/draw/drawTriangles.js +0 -8
- package/dist/renderer/draw/drawTriangles.js.map +0 -1
- package/dist/renderer/draw/effects.js +0 -28
- package/dist/renderer/draw/effects.js.map +0 -1
- package/dist/renderer/draw/flushBatch.js +0 -35
- package/dist/renderer/draw/flushBatch.js.map +0 -1
- package/dist/renderer/draw/gradient.js +0 -90
- package/dist/renderer/draw/gradient.js.map +0 -1
- package/dist/renderer/draw/image.js +0 -38
- package/dist/renderer/draw/image.js.map +0 -1
- package/dist/renderer/draw/mesh.js +0 -16
- package/dist/renderer/draw/mesh.js.map +0 -1
- package/dist/renderer/draw/paintBind.js +0 -70
- package/dist/renderer/draw/paintBind.js.map +0 -1
- package/dist/renderer/draw/pathPaint.js +0 -142
- package/dist/renderer/draw/pathPaint.js.map +0 -1
- package/dist/renderer/draw/scratchPass.js +0 -83
- package/dist/renderer/draw/scratchPass.js.map +0 -1
- package/dist/renderer/draw/stencil.js +0 -28
- package/dist/renderer/draw/stencil.js.map +0 -1
- package/dist/renderer/draw/text.js +0 -167
- package/dist/renderer/draw/text.js.map +0 -1
- package/dist/renderer/draw/uniforms.js +0 -77
- package/dist/renderer/draw/uniforms.js.map +0 -1
- package/dist/renderer/draw.js +0 -79
- package/dist/renderer/draw.js.map +0 -1
- package/dist/renderer/drawBatch.js +0 -198
- package/dist/renderer/drawBatch.js.map +0 -1
- package/dist/renderer/effects/EffectTargets.js +0 -48
- package/dist/renderer/effects/EffectTargets.js.map +0 -1
- package/dist/renderer/effects/builtins.js +0 -31
- package/dist/renderer/effects/builtins.js.map +0 -1
- package/dist/renderer/effects/composite.js +0 -11
- package/dist/renderer/effects/composite.js.map +0 -1
- package/dist/renderer/effects/effectPrelude.js +0 -10
- package/dist/renderer/effects/effectPrelude.js.map +0 -1
- package/dist/renderer/effects/types.js +0 -10
- package/dist/renderer/effects/types.js.map +0 -1
- package/dist/renderer/glyphOutlineMesh.js +0 -67
- package/dist/renderer/glyphOutlineMesh.js.map +0 -1
- package/dist/renderer/index.js +0 -20
- package/dist/renderer/math/color.js +0 -321
- package/dist/renderer/math/color.js.map +0 -1
- package/dist/renderer/math/mat3.js +0 -80
- package/dist/renderer/math/mat3.js.map +0 -1
- package/dist/renderer/math/patternSpace.js +0 -22
- package/dist/renderer/math/patternSpace.js.map +0 -1
- package/dist/renderer/math/viewToMat3.js +0 -19
- package/dist/renderer/math/viewToMat3.js.map +0 -1
- package/dist/renderer/paintResources.js +0 -18
- package/dist/renderer/paintResources.js.map +0 -1
- package/dist/renderer/paintScratch.js +0 -37
- package/dist/renderer/paintScratch.js.map +0 -1
- package/dist/renderer/shaders/ShaderProgram.js +0 -74
- package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
- package/dist/renderer/shaders/batchFill.js +0 -119
- package/dist/renderer/shaders/batchFill.js.map +0 -1
- package/dist/renderer/shaders/customPrelude.js +0 -34
- package/dist/renderer/shaders/customPrelude.js.map +0 -1
- package/dist/renderer/shaders/extractUniformNames.js +0 -184
- package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
- package/dist/renderer/shaders/glyphPaint.js +0 -61
- package/dist/renderer/shaders/glyphPaint.js.map +0 -1
- package/dist/renderer/shaders/gradFill.js +0 -31
- package/dist/renderer/shaders/gradFill.js.map +0 -1
- package/dist/renderer/shaders/pathFill.js +0 -14
- package/dist/renderer/shaders/pathFill.js.map +0 -1
- package/dist/renderer/shaders/patternFill.js +0 -25
- package/dist/renderer/shaders/patternFill.js.map +0 -1
- package/dist/renderer/shaders/registerProgram.js +0 -18
- package/dist/renderer/shaders/registerProgram.js.map +0 -1
- package/dist/renderer/spriteSheet.js +0 -14
- package/dist/renderer/spriteSheet.js.map +0 -1
- package/dist/renderer/state/GroupState.js +0 -77
- package/dist/renderer/state/GroupState.js.map +0 -1
- package/dist/renderer/strokeLengths.js +0 -50
- package/dist/renderer/strokeLengths.js.map +0 -1
- package/dist/renderer/syntheticItalic.js +0 -6
- package/dist/renderer/syntheticItalic.js.map +0 -1
- package/dist/renderer/textures/registerTexture.js +0 -34
- package/dist/renderer/textures/registerTexture.js.map +0 -1
- package/dist/scheduling/useVisibleRaf.js +0 -69
- package/dist/scheduling/useVisibleRaf.js.map +0 -1
- package/dist/test-seams-DM2B87-g.d.ts +0 -356
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poseHelpers.js","names":["cancelKeyFor","id","recordTransformOp","adapter","op","createTransformOp","label","tweenPose","geometry","opts","RECT_POSE_DESCRIPTOR","lerp","from","recordOp","animator","a","b","t","value","springPose","progress"],"sources":["../../src/animation/poseHelpers.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { SceneAdapter } from 'core/adapters/types';\nimport type { AnimationHandle, Animator, EasingSpec, SpringPresetName } from './types';\n\n/** Options for `tweenPose`. */\nexport interface TweenPoseOptions<TPose> {\n id: string;\n to: TPose;\n ms: number;\n easing?: EasingSpec;\n /** Pose descriptor with a `lerp(from, to, t)` method. Defaults to\n * `RECT_POSE_DESCRIPTOR`, which interpolates x/y/width/height linearly. */\n geometry?: PoseDescriptor<TPose>;\n /** When true (default), emit a transform op before the tween so undo\n * restores the pre-animation pose. */\n recordOp?: boolean;\n /** Label for the recorded op. Default: `'animate'`. */\n opLabel?: string;\n onDone?: () => void;\n}\n\n/** Options for `springPose`. */\nexport interface SpringPoseOptions<TPose> {\n id: string;\n to: TPose;\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n geometry?: PoseDescriptor<TPose>;\n recordOp?: boolean;\n opLabel?: string;\n onDone?: () => void;\n}\n\nconst cancelKeyFor = (id: string): string => `pose:${id}`;\n\nfunction recordTransformOp<TPose>(\n adapter: SceneAdapter<{ id: string }, TPose>,\n id: string,\n from: TPose,\n to: TPose,\n label: string,\n): void {\n if (!adapter.applyOps) return;\n const op = createTransformOp<TPose>({ id, from, to, label });\n adapter.applyOps([op], label);\n}\n\n/**\n * Animate one node's pose to `to` over `ms`, writing each frame through the\n * adapter.\n *\n * Unlike the color helpers this really does move the node. Undo therefore has\n * to be considered: by default a single transform op covering the whole\n * animation is recorded up front, so one undo returns the node to where it\n * started rather than replaying frames.\n */\nexport function tweenPose<TNode extends { id: string }, TPose>(\n animator: Animator,\n adapter: SceneAdapter<TNode, TPose>,\n opts: TweenPoseOptions<TPose>,\n): AnimationHandle {\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('tweenPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n if (recordOp) recordTransformOp(adapter as never, opts.id, from, opts.to, label);\n return animator.tween<TPose>({\n from,\n to: opts.to,\n ms: opts.ms,\n easing: opts.easing,\n cancelKey: cancelKeyFor(opts.id),\n interpolate: (a, b, t) => lerp(a, b, t),\n onTick: (value) => adapter.setPose(opts.id, value),\n onDone: opts.onDone,\n });\n}\n\n/** `tweenPose` driven by a spring instead of a duration. Same op-recording\n * behavior. */\nexport function springPose<TNode extends { id: string }, TPose>(\n animator: Animator,\n adapter: SceneAdapter<TNode, TPose>,\n opts: SpringPoseOptions<TPose>,\n): AnimationHandle {\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('springPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n if (recordOp) recordTransformOp(adapter as never, opts.id, from, opts.to, label);\n // For pose springs: integrate progress (0..1) as the spring's value, then\n // use lerp(from, to, progress) for the actual visual write. This avoids\n // requiring full add/subtract/scale/magnitude on TPose.\n const progressLerp = (a: number, b: number, t: number) => a + (b - a) * t;\n return animator.spring<number>({\n from: 0,\n to: 1,\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n cancelKey: cancelKeyFor(opts.id),\n interpolate: progressLerp,\n onTick: (progress) => adapter.setPose(opts.id, lerp(from, opts.to, progress)),\n onDone: opts.onDone,\n });\n}\n"],"mappings":";;;AAoCA,IAAMA,KAAgB,MAAuB,QAAQC;AAErD,SAASC,EACP,GACA,GACA,GACA,GACA,GACM;CACN,IAAI,CAACC,EAAQ,UAAU;CACvB,IAAMC,IAAKC,EAAyB;EAAE;EAAI;EAAM;EAAI;CAAM,CAAC;CAC3D,EAAQ,SAAS,CAACD,CAAE,GAAGE,CAAK;AAC9B;AAWA,SAAgBC,EACd,GACA,GACA,GACiB;CACjB,IAAMC,IAAYC,EAAK,YAAaC;CACpC,IAAI,CAACF,EAAS,MACZ,MAAU,MAAM,iEAAiE;CAEnF,IAAMG,IAAOH,EAAS,MAChBI,IAAOT,EAAQ,QAAQM,EAAK,EAAE,GAC9BI,IAAWJ,EAAK,YAAY,IAC5BH,IAAQG,EAAK,WAAW;CAE9B,OADII,KAAUX,EAAkBC,GAAkBM,EAAK,IAAIG,GAAMH,EAAK,IAAIH,CAAK,GACxEQ,EAAS,MAAa;EAC3B;EACA,IAAIL,EAAK;EACT,IAAIA,EAAK;EACT,QAAQA,EAAK;EACb,WAAWT,EAAaS,EAAK,EAAE;EAC/B,cAAc,GAAG,GAAG,MAAME,EAAKI,GAAGC,GAAGC,CAAC;EACtC,SAAS,MAAUd,EAAQ,QAAQM,EAAK,IAAIS,CAAK;EACjD,QAAQT,EAAK;CACf,CAAC;AACH;AAIA,SAAgBU,EACd,GACA,GACA,GACiB;CACjB,IAAMX,IAAYC,EAAK,YAAaC;CACpC,IAAI,CAACF,EAAS,MACZ,MAAU,MAAM,kEAAkE;CAEpF,IAAMG,IAAOH,EAAS,MAChBI,IAAOT,EAAQ,QAAQM,EAAK,EAAE,GAC9BI,IAAWJ,EAAK,YAAY,IAC5BH,IAAQG,EAAK,WAAW;CAM9B,OALII,KAAUX,EAAkBC,GAAkBM,EAAK,IAAIG,GAAMH,EAAK,IAAIH,CAAK,GAKxEQ,EAAS,OAAe;EAC7B,MAAM;EACN,IAAI;EACJ,QAAQL,EAAK;EACb,WAAWA,EAAK;EAChB,SAASA,EAAK;EACd,MAAMA,EAAK;EACX,WAAWT,EAAaS,EAAK,EAAE;EAC/B,cAToB,GAAW,GAAW,MAAcM,KAAKC,IAAID,KAAKE;EAUtE,SAAS,MAAad,EAAQ,QAAQM,EAAK,IAAIE,EAAKC,GAAMH,EAAK,IAAIW,CAAQ,CAAC;EAC5E,QAAQX,EAAK;CACf,CAAC;AACH"}
|
|
1
|
+
{"version":3,"file":"poseHelpers.js","names":["poseKey","id","recordTransformOp","adapter","op","createTransformOp","label","tweenPose","recordOp","opts","cancelKey","target","committed","lerp","rewindingTween","animator","a","b","t","geometry","RECT_POSE_DESCRIPTOR","from","value","springPose","shown","rewindingSpring","progress","itemId","item","staggerSpringPose"],"sources":["../../src/animation/poseHelpers.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { Op } from 'core/ops/types';\nimport type {\n AnimationHandle, Animator, EasingSpec, SpringPresetName, StaggerDelay, StaggerOptions,\n} from '@weasel-js/animator';\nimport type { Target } from '@weasel-js/animator';\nimport { rewindingSpring, rewindingTween } from './rewind';\n\n/** The part of an adapter `tweenPose` and `springPose` use. The adapter `sceneToAdapter` and\n * `useSceneAdapter` build is one. */\nexport interface PoseAnimationAdapter<TPose> {\n getPose(id: string): TPose;\n setPose(id: string, pose: TPose): void;\n applyOps?(ops: Op[], label: string): void;\n /** See `MoveAdapter.poseTarget`. */\n poseTarget?(id: string, descriptor?: PoseDescriptor<TPose>): Target<TPose> | undefined;\n}\n\n/** Options for `tweenPose`. */\nexport interface TweenPoseOptions<TPose> {\n id: string;\n to: TPose;\n /** Where the move appears to start. Default: where the node is. Nothing is written there. */\n from?: TPose;\n ms: number;\n easing?: EasingSpec;\n /** Supplies the pose's axes, and its `lerp` is the path the move follows. Without one the\n * adapter's own descriptor maps the pose and each axis travels in a straight line. */\n geometry?: PoseDescriptor<TPose>;\n /** When true (default), emit a transform op before the tween so undo\n * restores the pre-animation pose. */\n recordOp?: boolean;\n /** Label for the recorded op. Default: `'animate'`. */\n opLabel?: string;\n /**\n * When true, a move undone mid-flight travels back to where it began, and one redone\n * mid-way back turns forward again, where by default the node comes to rest on the written\n * pose at once. `onDone` is called only when the move arrives at `to`. Needs an adapter with\n * `poseTarget`. Default false.\n */\n rewind?: boolean;\n onDone?: () => void;\n}\n\n/** Options for `springPose`. */\nexport interface SpringPoseOptions<TPose> {\n id: string;\n to: TPose;\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n geometry?: PoseDescriptor<TPose>;\n recordOp?: boolean;\n opLabel?: string;\n /** As `TweenPoseOptions.rewind`: undone mid-flight, it springs back to where it began from\n * where it is, at the speed it has. */\n rewind?: boolean;\n onDone?: () => void;\n}\n\n/** The cancel key every move of node `id`'s pose shares. */\nexport const poseKey = (id: string): string => `pose:${id}`;\n\nfunction recordTransformOp<TPose>(\n adapter: PoseAnimationAdapter<TPose>,\n id: string,\n from: TPose,\n to: TPose,\n label: string,\n): void {\n if (!adapter.applyOps) return;\n const op = createTransformOp<TPose>({ id, from, to, label });\n adapter.applyOps([op], label);\n}\n\n/**\n * Animate one node's pose to `to` over `ms`.\n *\n * On an adapter with `poseTarget`, the destination is committed as the move starts. A\n * scene-backed adapter shows the travel through the scene's pose overrides, so the document\n * holds `to` throughout and nothing is written per frame; a store with no overrides, behind\n * `createWrittenPoseTarget`, is written the pose on screen each frame and `to` as the move ends. Moves on one node add: a\n * second `tweenPose` bends the first toward its own destination and cancels nothing. They share\n * the key `pose:<id>` for `cancelKey`, `pauseKey`, and `isActive`.\n *\n * By default one transform op covering the whole move is recorded up front, so one undo\n * returns the node to where it started. Undone mid-flight, the node comes to rest on the\n * undone pose, or with `rewind` travels back to it.\n *\n * An adapter without `poseTarget`, and a pose its descriptor gives no axes for, keep the older\n * behavior: `setPose` is written each frame, and a new move on the node cancels the one running.\n */\nexport function tweenPose<TPose>(\n animator: Animator,\n adapter: PoseAnimationAdapter<TPose>,\n opts: TweenPoseOptions<TPose>,\n): AnimationHandle {\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n const cancelKey = poseKey(opts.id);\n const target = adapter.poseTarget?.(opts.id, opts.geometry);\n if (target) {\n const committed = target.committed();\n if (recordOp) recordTransformOp(adapter, opts.id, committed, opts.to, label);\n const lerp = opts.geometry?.lerp;\n if (opts.rewind) {\n return rewindingTween(animator, target, {\n start: committed, from: opts.from ?? committed, to: opts.to, ms: opts.ms, easing: opts.easing,\n cancelKey, interpolate: lerp && ((a, b, t) => lerp(a, b, t)), onDone: opts.onDone,\n });\n }\n return animator.tween<TPose>({\n target,\n from: opts.from ?? committed,\n to: opts.to,\n ms: opts.ms,\n easing: opts.easing,\n cancelKey,\n interrupt: false,\n interpolate: lerp && ((a, b, t) => lerp(a, b, t)),\n onDone: opts.onDone,\n });\n }\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('tweenPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n if (recordOp) recordTransformOp(adapter, opts.id, from, opts.to, label);\n return animator.tween<TPose>({\n from: opts.from ?? from,\n to: opts.to,\n ms: opts.ms,\n easing: opts.easing,\n cancelKey,\n interpolate: (a, b, t) => lerp(a, b, t),\n onTick: (value) => adapter.setPose(opts.id, value),\n onDone: opts.onDone,\n });\n}\n\n/**\n * `tweenPose` driven by a spring instead of a duration, with the same op recording.\n *\n * On an adapter with `poseTarget` it interrupts every move under `pose:<id>` and starts at\n * their velocity, from the pose on screen. Otherwise it falls back as `tweenPose` does.\n */\nexport function springPose<TPose>(\n animator: Animator,\n adapter: PoseAnimationAdapter<TPose>,\n opts: SpringPoseOptions<TPose>,\n): AnimationHandle {\n const recordOp = opts.recordOp ?? true;\n const label = opts.opLabel ?? 'animate';\n const cancelKey = poseKey(opts.id);\n const target = adapter.poseTarget?.(opts.id, opts.geometry);\n if (target) {\n // Read ahead of the op: the spring starts from the pose on screen, wherever that commit\n // and the interrupted moves leave the committed one.\n const shown = target.read();\n const committed = target.committed();\n if (recordOp) recordTransformOp(adapter, opts.id, committed, opts.to, label);\n if (opts.rewind) {\n return rewindingSpring(animator, target, {\n start: committed, from: shown, to: opts.to, cancelKey, onDone: opts.onDone,\n tuning: { preset: opts.preset, stiffness: opts.stiffness, damping: opts.damping, mass: opts.mass },\n });\n }\n return animator.spring<TPose>({\n target,\n from: shown,\n to: opts.to,\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n cancelKey,\n onDone: opts.onDone,\n });\n }\n const geometry = (opts.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>));\n if (!geometry.lerp) {\n throw new Error('springPose: geometry has no lerp; supply geometry: { ..., lerp }');\n }\n const lerp = geometry.lerp;\n const from = adapter.getPose(opts.id);\n if (recordOp) recordTransformOp(adapter, opts.id, from, opts.to, label);\n // The spring integrates progress from 0 to 1, and lerp makes the pose from it.\n return animator.spring<number>({\n from: 0,\n to: 1,\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n cancelKey,\n interpolate: (a, b, t) => a + (b - a) * t,\n onTick: (progress) => adapter.setPose(opts.id, lerp(from, opts.to, progress)),\n onDone: opts.onDone,\n });\n}\n\n/** Options for `staggerSpringPose`: the items and their delays, each item's destination, and\n * the spring tuning. `cancelKey` and `label` belong to the stagger as a whole; each item's\n * spring keeps its own `pose:<id>` key. */\nexport interface StaggerSpringPoseOptions<TItem, TPose> extends StaggerOptions {\n /** Each is a node id, or carries one in a string `id` field. */\n items: readonly TItem[];\n delay: StaggerDelay;\n to: (item: TItem, index: number) => TPose;\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n geometry?: PoseDescriptor<TPose>;\n recordOp?: boolean;\n opLabel?: string;\n /** As `SpringPoseOptions.rewind`, for each item's spring. */\n rewind?: boolean;\n}\n\nfunction itemId(item: unknown): string {\n if (item != null && typeof item === 'object' && 'id' in item) {\n const id = (item as { id: unknown }).id;\n if (typeof id === 'string') return id;\n }\n if (typeof item === 'string' || typeof item === 'number') return String(item);\n throw new Error(\n 'staggerSpringPose: each item must either be a primitive (string/number) ' +\n 'or have a string `id` field. Otherwise pose ids would collide.',\n );\n}\n\n/** `springPose` for each of `items`, started `delay` apart as `animator.stagger` counts it. */\nexport function staggerSpringPose<TItem, TPose>(\n animator: Animator,\n adapter: PoseAnimationAdapter<TPose>,\n opts: StaggerSpringPoseOptions<TItem, TPose>,\n): AnimationHandle {\n return animator.stagger(opts.items, opts.delay).each(\n (item, i) =>\n springPose(animator, adapter, {\n id: itemId(item),\n to: opts.to(item, i),\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n geometry: opts.geometry,\n recordOp: opts.recordOp,\n opLabel: opts.opLabel,\n rewind: opts.rewind,\n }),\n { cancelKey: opts.cancelKey, label: opts.label },\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { documentPose as e } from "../core/scene/effectivePose.js";
|
|
2
|
+
import { RECT_POSE_DESCRIPTOR as t } from "../core/geometry/poseDescriptor.js";
|
|
3
|
+
import { axesOf as n, createTarget as r } from "@weasel-js/animator";
|
|
4
|
+
//#region src/animation/poseTarget.ts
|
|
5
|
+
function i(e, t) {
|
|
6
|
+
return e?.axes?.(t) ?? n(t);
|
|
7
|
+
}
|
|
8
|
+
var a = /* @__PURE__ */ new WeakMap();
|
|
9
|
+
function o(e) {
|
|
10
|
+
let t = a.get(e);
|
|
11
|
+
return t || (t = () => e.commit(), a.set(e, t)), t;
|
|
12
|
+
}
|
|
13
|
+
function s(e, t) {
|
|
14
|
+
let n = t(), r = i(e, n);
|
|
15
|
+
if (!r) return null;
|
|
16
|
+
let { count: a, angles: o } = r, s = () => {
|
|
17
|
+
let o = t();
|
|
18
|
+
if (o !== n) {
|
|
19
|
+
let t = i(e, o);
|
|
20
|
+
t && t.count === a && (r = t), n = o;
|
|
21
|
+
}
|
|
22
|
+
return r;
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
count: a,
|
|
26
|
+
angles: o,
|
|
27
|
+
to: (e) => s().to(e),
|
|
28
|
+
from: (e) => s().from(e),
|
|
29
|
+
add: r.add && ((e, t) => {
|
|
30
|
+
let n = s();
|
|
31
|
+
return n.add ? n.add(e, t) : n.from(n.to(e).map((e, n) => e + t[n]));
|
|
32
|
+
}),
|
|
33
|
+
write: r.write && ((e, t, n) => {
|
|
34
|
+
let r = s();
|
|
35
|
+
r.write ? r.write(e, t, n) : r.to(e).forEach((e, r) => {
|
|
36
|
+
t[n + r] = e;
|
|
37
|
+
});
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function c(e, t) {
|
|
42
|
+
let n = /* @__PURE__ */ new Map();
|
|
43
|
+
return (r) => {
|
|
44
|
+
let i = /* @__PURE__ */ new Set();
|
|
45
|
+
for (let [a, o] of r === null ? [] : t.beside(r)) {
|
|
46
|
+
let t = n.get(a);
|
|
47
|
+
if (!t) {
|
|
48
|
+
if (e.has(a)) continue;
|
|
49
|
+
n.set(a, t = {}), e.set(a, t);
|
|
50
|
+
}
|
|
51
|
+
t.pose = o, i.add(a);
|
|
52
|
+
}
|
|
53
|
+
for (let [t, r] of n) i.has(t) || (e.get(t) === r && e.clear(t), n.delete(t));
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function l(e, t, n, i) {
|
|
57
|
+
let { overrides: a } = e, c = e.id, l = s(e.descriptor, e.get);
|
|
58
|
+
if (!l) return null;
|
|
59
|
+
let u = {}, d = !1, f = r({
|
|
60
|
+
get: e.get,
|
|
61
|
+
set: e.set,
|
|
62
|
+
axes: l,
|
|
63
|
+
show(e) {
|
|
64
|
+
if (f.active && n?.() && f.stop({ commit: !1 }), f.active) {
|
|
65
|
+
u.pose = e, d || a.set(c, u), d = !0, i?.(e);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
d = !1, a.get(c) === u && a.clear(c), i?.(null), t?.();
|
|
69
|
+
},
|
|
70
|
+
publish: o(a)
|
|
71
|
+
});
|
|
72
|
+
return f;
|
|
73
|
+
}
|
|
74
|
+
function u(e) {
|
|
75
|
+
let t = l(e);
|
|
76
|
+
if (!t) throw Error("createPoseTarget: this pose has no axes; give a descriptor whose `axes` maps it");
|
|
77
|
+
return t;
|
|
78
|
+
}
|
|
79
|
+
var d = /* @__PURE__ */ new WeakMap();
|
|
80
|
+
function f(e, t) {
|
|
81
|
+
if (e === t) return !0;
|
|
82
|
+
if (typeof e != "object" || typeof t != "object" || e === null || t === null) return !1;
|
|
83
|
+
let n = Object.keys(e);
|
|
84
|
+
return n.length === Object.keys(t).length && n.every((n) => e[n] === t[n]);
|
|
85
|
+
}
|
|
86
|
+
function p(n, r, a, o) {
|
|
87
|
+
let s = d.get(n.overrides);
|
|
88
|
+
s || (s = /* @__PURE__ */ new Map(), d.set(n.overrides, s));
|
|
89
|
+
let u = r, p = n.get(u), m = a ?? t, h = s.get(r), g = !h || h.active || !p || i(m, e(n, p))?.count === h.axisCount;
|
|
90
|
+
if (h && g) return h;
|
|
91
|
+
if (!p) return;
|
|
92
|
+
let _ = e(n, p), v, y = s, b = null;
|
|
93
|
+
if (b = l({
|
|
94
|
+
id: r,
|
|
95
|
+
descriptor: m,
|
|
96
|
+
overrides: n.overrides,
|
|
97
|
+
get() {
|
|
98
|
+
let t = n.get(u);
|
|
99
|
+
return t && (_ = e(n, t)), t && !b?.active && (v = t.pose), _;
|
|
100
|
+
},
|
|
101
|
+
set(e) {
|
|
102
|
+
let t = n.get(u);
|
|
103
|
+
t && (f(t.pose, e) || n.untracked(() => o ? o.write(e) : n.setPose(u, e)), v = n.get(u)?.pose);
|
|
104
|
+
}
|
|
105
|
+
}, () => {
|
|
106
|
+
n.get(u) || y.delete(r);
|
|
107
|
+
}, () => {
|
|
108
|
+
let e = n.get(u);
|
|
109
|
+
return !!e && v !== void 0 && !f(e.pose, v);
|
|
110
|
+
}, o && c(n.overrides, o)), b) return s.set(r, b), b;
|
|
111
|
+
}
|
|
112
|
+
//#endregion
|
|
113
|
+
export { u as createPoseTarget, s as liveAxes, i as poseAxes, p as scenePoseTarget };
|
|
114
|
+
|
|
115
|
+
//# sourceMappingURL=poseTarget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poseTarget.js","names":["poseAxes","descriptor","like","axesOf","publishers","publisherOf","publish","overrides","liveAxes","get","axes","current","now","next","count","p","a","d","n","i","out","at","riders","riding","seen","id","beside","pose","cascade","entry","build","opts","installed","target","createTarget","overwritten","ride","onRest","createPoseTarget","sceneTargets","samePose","b","ka","k","scenePoseTarget","made","scene","nid","node","by","RECT_POSE_DESCRIPTOR","held","fits","documentPose","last","mine","cache"],"sources":["../../src/animation/poseTarget.ts"],"sourcesContent":["import { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../core/geometry/poseDescriptor';\nimport { documentPose, type PoseSource } from '../core/scene/effectivePose';\nimport type { NodeId, PoseOverride, PoseOverrides } from '../core/scene/types';\nimport { axesOf } from '@weasel-js/animator';\nimport { createTarget, type Target, type TargetAxes } from '@weasel-js/animator';\n\n/** What {@link createPoseTarget} takes. */\nexport interface PoseTargetOptions<TPose> {\n /** The node whose pose it is. */\n id: string;\n /** The node's committed pose: where the document says it is. */\n get(): TPose;\n /** Commits a pose: an animation's destination as it starts, and where a canceled one stopped. */\n set(pose: TPose): void;\n /** Where the pose on screen is published while the node moves. */\n overrides: PoseOverrides<TPose>;\n /** Supplies the pose's axes through `PoseDescriptor.axes`. Without one, or where it answers\n * null, the pose has to be a number, an array of numbers, or an object of numeric fields. */\n descriptor?: PoseDescriptor<TPose>;\n}\n\n/** The part of a scene {@link scenePoseTarget} reads and writes. A `Scene` satisfies it. */\nexport interface PoseTargetScene<TPose> extends PoseSource<TPose> {\n readonly overrides: PoseOverrides<TPose>;\n setPose(id: NodeId, pose: TPose): void;\n untracked<T>(fn: () => T): T;\n}\n\n/** How `like`'s kind of pose maps to axes: the descriptor's own mapping, else its flat numeric\n * fields. Null for a pose with neither. */\nexport function poseAxes<TPose>(\n descriptor: PoseDescriptor<TPose> | undefined,\n like: TPose,\n): TargetAxes<TPose> | null {\n return descriptor?.axes?.(like) ?? (axesOf(like) as TargetAxes<TPose> | null);\n}\n\nconst publishers = new WeakMap<object, () => void>();\n\n/** One function per overrides table, so every target publishing into it shares one commit a frame. */\nfunction publisherOf<TPose>(overrides: PoseOverrides<TPose>): () => void {\n let publish = publishers.get(overrides);\n if (!publish) {\n publish = () => overrides.commit();\n publishers.set(overrides, publish);\n }\n return publish;\n}\n\n/**\n * `poseAxes` for the pose `get` answers, with `from` keeping the fields that are not axes as\n * that pose has them now. Reading them once would leave them stale in every pose a canceled\n * animation commits. Null where the pose has no axes.\n */\nexport function liveAxes<TPose>(\n descriptor: PoseDescriptor<TPose> | undefined,\n get: () => TPose,\n): TargetAxes<TPose> | null {\n let like = get();\n let axes = poseAxes(descriptor, like);\n if (!axes) return null;\n const { count, angles } = axes;\n const current = (): TargetAxes<TPose> => {\n const now = get();\n if (now !== like) {\n const next = poseAxes(descriptor, now);\n if (next && next.count === count) axes = next;\n like = now;\n }\n return axes!;\n };\n return {\n count,\n angles,\n to: (p) => current().to(p),\n from: (a) => current().from(a),\n add: axes.add && ((p, d) => {\n const now = current();\n if (now.add) return now.add(p, d);\n return now.from(now.to(p).map((n, i) => n + d[i]!));\n }),\n write: axes.write && ((p, out, at) => {\n const now = current();\n if (now.write) now.write(p, out, at);\n else now.to(p).forEach((n, i) => { out[at + i] = n; });\n }),\n };\n}\n\n/** How a container's pose target carries its descendants, for {@link scenePoseTarget}. */\nexport interface PoseCascade<TPose> {\n /** Commits `pose` to the container, moving its descendants' poses with it. */\n write(pose: TPose): void;\n /** The descendants, each at the pose to show it at while the container shows at `pose`. */\n beside(pose: TPose): Iterable<readonly [NodeId, TPose]>;\n}\n\n/** Shows a moving container's descendants through overrides of their own, and takes them back\n * as it rests. A descendant something else already overrides is left to it. */\nfunction riders<TPose>(overrides: PoseOverrides<TPose>, cascade: PoseCascade<TPose>): (pose: TPose | null) => void {\n const riding = new Map<NodeId, PoseOverride<TPose>>();\n return (pose) => {\n const seen = new Set<NodeId>();\n for (const [id, beside] of pose === null ? [] : cascade.beside(pose)) {\n let entry = riding.get(id);\n if (!entry) {\n if (overrides.has(id)) continue;\n riding.set(id, entry = {});\n overrides.set(id, entry);\n }\n entry.pose = beside;\n seen.add(id);\n }\n for (const [id, entry] of riding) {\n if (seen.has(id)) continue;\n if (overrides.get(id) === entry) overrides.clear(id);\n riding.delete(id);\n }\n };\n}\n\nfunction build<TPose>(\n opts: PoseTargetOptions<TPose>,\n onRest?: () => void,\n /** Whether something else has written the committed pose since an animation last did. */\n overwritten?: () => boolean,\n /** Told the pose on screen each time it is shown, and null as the node comes to rest. */\n ride?: (pose: TPose | null) => void,\n): Target<TPose> | null {\n const { overrides } = opts;\n const id = opts.id as NodeId;\n const axes = liveAxes(opts.descriptor, opts.get);\n if (!axes) return null;\n const entry: PoseOverride<TPose> = {};\n let installed = false;\n const target = createTarget<TPose>({\n get: opts.get,\n set: opts.set,\n axes,\n show(pose) {\n // The writer wins: what was left to travel belonged to a pose that is no longer committed.\n if (target.active && overwritten?.()) target.stop({ commit: false });\n if (target.active) {\n entry.pose = pose;\n // Installed once per run: an override laid over it since, a drag's, is not taken back.\n if (!installed) overrides.set(id, entry);\n installed = true;\n ride?.(pose);\n return;\n }\n installed = false;\n if (overrides.get(id) === entry) overrides.clear(id);\n ride?.(null);\n onRest?.();\n },\n publish: publisherOf(overrides),\n });\n return target;\n}\n\n/**\n * A {@link Target} over one node's pose. Animations on it commit their destination through\n * `set` as they start, and the pose on screen reaches the paint and pick walks as a pose\n * override: installed while the node moves and cleared when it comes to rest.\n *\n * Throws for a pose with no axes. Make one per node: two targets over one node do not add.\n * {@link scenePoseTarget} keeps that one for a scene's nodes.\n */\nexport function createPoseTarget<TPose>(opts: PoseTargetOptions<TPose>): Target<TPose> {\n const target = build(opts);\n if (!target) {\n throw new Error('createPoseTarget: this pose has no axes; give a descriptor whose `axes` maps it');\n }\n return target;\n}\n\nconst sceneTargets = new WeakMap<object, Map<string, Target<unknown>>>();\n\nfunction samePose(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n const ka = Object.keys(a);\n return ka.length === Object.keys(b).length\n && ka.every((k) => (a as Record<string, unknown>)[k] === (b as Record<string, unknown>)[k]);\n}\n\n/**\n * The pose target of node `id` in `scene`: the same one on every call, so everything animating\n * the node adds. Its committed value is the node's document pose, written without recording;\n * a caller that wants the move in history records its own op first.\n *\n * Undefined for a node that is not in the scene, or whose pose has no axes. `descriptor`\n * defaults to `RECT_POSE_DESCRIPTOR`. With `cascade`, for a container whose descendants hold\n * poses of their own, a commit goes through `cascade.write` and the descendants are shown\n * traveling beside the container. Both are read the first time a node's target is made.\n */\nexport function scenePoseTarget<TPose>(\n scene: PoseTargetScene<TPose>,\n id: string,\n descriptor?: PoseDescriptor<TPose>,\n cascade?: PoseCascade<TPose>,\n): Target<TPose> | undefined {\n let made = sceneTargets.get(scene.overrides);\n if (!made) {\n made = new Map();\n sceneTargets.set(scene.overrides, made);\n }\n const nid = id as NodeId;\n const node = scene.get(nid);\n const by = descriptor ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>);\n const held = made.get(id) as Target<TPose> | undefined;\n // A pose that has changed shape at rest, a polygon given more points, needs axes made for it.\n const fits = !held || held.active || !node\n || poseAxes(by, documentPose(scene, node))?.count === held.axisCount;\n if (held && fits) return held;\n if (!node) return undefined;\n // A node removed mid-flight keeps answering with the last pose it had.\n let last = documentPose(scene, node);\n /** The node's pose as an animation last left it, or as it was when the first one started. */\n let mine: TPose | undefined;\n const cache = made;\n let target: Target<TPose> | null = null;\n target = build<TPose>({\n id,\n descriptor: by,\n overrides: scene.overrides,\n get() {\n const n = scene.get(nid);\n if (n) last = documentPose(scene, n);\n if (n && !target?.active) mine = n.pose;\n return last;\n },\n set(pose) {\n const n = scene.get(nid);\n if (!n) return;\n if (!samePose(n.pose, pose)) scene.untracked(() => (cascade ? cascade.write(pose) : scene.setPose(nid, pose)));\n mine = scene.get(nid)?.pose;\n },\n }, () => {\n if (!scene.get(nid)) cache.delete(id);\n }, () => {\n const n = scene.get(nid);\n return !!n && mine !== undefined && !samePose(n.pose, mine);\n }, cascade && riders(scene.overrides, cascade));\n if (!target) return undefined;\n made.set(id, target as Target<unknown>);\n return target;\n}\n"],"mappings":"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"}
|
package/dist/animation/reflow.js
CHANGED
|
@@ -1,121 +1,151 @@
|
|
|
1
1
|
import { documentPose as e, effectivePose as t } from "../core/scene/effectivePose.js";
|
|
2
2
|
import { RECT_POSE_DESCRIPTOR as n } from "../core/geometry/poseDescriptor.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { liveAxes as r } from "./poseTarget.js";
|
|
4
|
+
import { useEffect as i, useMemo as a } from "react";
|
|
5
|
+
import { useLatest as o } from "@weasel-js/react";
|
|
6
|
+
import { createTarget as s } from "@weasel-js/animator";
|
|
5
7
|
//#region src/animation/reflow.ts
|
|
6
|
-
var
|
|
7
|
-
function
|
|
8
|
+
var c = (e) => `reflow:${e}`;
|
|
9
|
+
function l(e, t) {
|
|
8
10
|
if (Object.is(e, t)) return !0;
|
|
9
11
|
if (typeof e != "object" || typeof t != "object" || e === null || t === null || Array.isArray(e) !== Array.isArray(t)) return !1;
|
|
10
12
|
let n = Object.keys(e);
|
|
11
13
|
if (n.length !== Object.keys(t).length) return !1;
|
|
12
|
-
for (let r of n) if (!
|
|
14
|
+
for (let r of n) if (!l(e[r], t[r])) return !1;
|
|
13
15
|
return !0;
|
|
14
16
|
}
|
|
15
|
-
function
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
function u(i, a, o) {
|
|
18
|
+
let u = /* @__PURE__ */ new Map(), d = !1, f = null, p = () => {
|
|
19
|
+
f ||= a.onTick(() => {
|
|
20
|
+
d && (d = !1, i.overrides.commit());
|
|
19
21
|
});
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
},
|
|
23
|
-
|
|
22
|
+
}, m = () => {
|
|
23
|
+
u.size > 0 || !f || (f(), f = null);
|
|
24
|
+
}, h = (e, t) => {
|
|
25
|
+
u.get(e) === t && u.delete(e);
|
|
24
26
|
let n = e;
|
|
25
|
-
|
|
26
|
-
},
|
|
27
|
-
let
|
|
28
|
-
if (t.
|
|
29
|
-
|
|
27
|
+
i.overrides.get(n) === t.entry && i.overrides.clear(n), d = !0;
|
|
28
|
+
}, g = (e, t, n, r) => {
|
|
29
|
+
let s = t.entry.pose;
|
|
30
|
+
if (t.settling = r, l(s, n)) {
|
|
31
|
+
a.cancelKey(c(e)), t.slot = n, t.entry.pose = n, r && h(e, t), i.overrides.commit(), m();
|
|
30
32
|
return;
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
onTick: _,
|
|
55
|
-
onDone: v
|
|
56
|
-
}), r.overrides.commit();
|
|
57
|
-
}, h = (e, t) => i.isActive(o(e)) || s(t.entry.pose, t.target), g = (e) => {
|
|
58
|
-
let t = c.get(e);
|
|
59
|
-
if (!t) return;
|
|
60
|
-
c.delete(e), t.handle?.cancel();
|
|
61
|
-
let n = e;
|
|
62
|
-
r.overrides.get(n) === t.entry && (r.overrides.clear(n), r.overrides.commit()), f();
|
|
63
|
-
}, _ = (e, n, i, a) => {
|
|
64
|
-
if (i) a !== void 0 && (i.entry.pose = a);
|
|
34
|
+
if (t.target?.active && l(t.slot, n)) return;
|
|
35
|
+
let u = o(), f = u.geometry?.lerp, g = () => {
|
|
36
|
+
!t.target?.active && t.settling && (h(e, t), m());
|
|
37
|
+
}, _ = c(e), v = u.label ?? "reflow";
|
|
38
|
+
if (p(), t.target) u.spring ? a.spring({
|
|
39
|
+
target: t.target,
|
|
40
|
+
to: n,
|
|
41
|
+
...u.spring,
|
|
42
|
+
cancelKey: _,
|
|
43
|
+
label: v,
|
|
44
|
+
onDone: g
|
|
45
|
+
}) : a.tween({
|
|
46
|
+
target: t.target,
|
|
47
|
+
to: n,
|
|
48
|
+
ms: u.ms ?? 200,
|
|
49
|
+
easing: u.easing,
|
|
50
|
+
cancelKey: _,
|
|
51
|
+
interrupt: !1,
|
|
52
|
+
label: v,
|
|
53
|
+
onDone: g,
|
|
54
|
+
interpolate: f && ((e, t, n) => f(e, t, n))
|
|
55
|
+
});
|
|
65
56
|
else {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
57
|
+
if (!f) throw Error("useAnimatedReflow: this pose has no axes; supply geometry: { ..., lerp }");
|
|
58
|
+
t.slot = n;
|
|
59
|
+
let e = (e) => {
|
|
60
|
+
t.entry.pose = f(s, n, e), d = !0;
|
|
61
|
+
};
|
|
62
|
+
u.spring ? a.spring({
|
|
63
|
+
from: 0,
|
|
64
|
+
to: 1,
|
|
65
|
+
...u.spring,
|
|
66
|
+
cancelKey: _,
|
|
67
|
+
label: v,
|
|
68
|
+
onTick: e,
|
|
69
|
+
onDone: g
|
|
70
|
+
}) : a.tween({
|
|
71
|
+
from: 0,
|
|
72
|
+
to: 1,
|
|
73
|
+
ms: u.ms ?? 200,
|
|
74
|
+
easing: u.easing,
|
|
75
|
+
cancelKey: _,
|
|
76
|
+
label: v,
|
|
77
|
+
onTick: e,
|
|
78
|
+
onDone: g
|
|
79
|
+
});
|
|
73
80
|
}
|
|
74
|
-
|
|
75
|
-
}
|
|
81
|
+
i.overrides.commit();
|
|
82
|
+
}, _ = (e, t) => a.isActive(c(e)) || l(t.entry.pose, t.slot), v = (e) => {
|
|
83
|
+
let t = u.get(e);
|
|
84
|
+
if (!t) return;
|
|
85
|
+
u.delete(e), a.cancelKey(c(e));
|
|
86
|
+
let n = e;
|
|
87
|
+
i.overrides.get(n) === t.entry && (i.overrides.clear(n), i.overrides.commit()), m();
|
|
88
|
+
}, y = (e, t) => {
|
|
89
|
+
let i = {
|
|
90
|
+
entry: { pose: t },
|
|
91
|
+
slot: t,
|
|
92
|
+
settling: !1,
|
|
93
|
+
target: null
|
|
94
|
+
}, a = o().geometry ?? n, c = r(a, () => i.slot);
|
|
95
|
+
return c && (i.target = s({
|
|
96
|
+
axes: c,
|
|
97
|
+
get: () => i.slot,
|
|
98
|
+
set: (e) => {
|
|
99
|
+
i.slot = e;
|
|
100
|
+
},
|
|
101
|
+
show: (e) => {
|
|
102
|
+
i.entry.pose = e, d = !0;
|
|
103
|
+
}
|
|
104
|
+
})), u.set(e, i), i;
|
|
105
|
+
}, b = (e, n, r, o) => (r ? o !== void 0 && (a.cancelKey(c(e)), r.slot = o, r.entry.pose = o) : r = y(e, o ?? t(i, n)), i.overrides.get(e) !== r.entry && i.overrides.set(e, r.entry), r);
|
|
76
106
|
return {
|
|
77
107
|
glide(e, t, n) {
|
|
78
|
-
let
|
|
79
|
-
if (!
|
|
80
|
-
let a = n?.from, o =
|
|
81
|
-
o && a === void 0 && !o.settling &&
|
|
108
|
+
let r = i.get(e);
|
|
109
|
+
if (!r) return;
|
|
110
|
+
let a = n?.from, o = u.get(e);
|
|
111
|
+
o && a === void 0 && !o.settling && l(o.slot, t) && _(e, o) || g(e, b(e, r, o, a), t, !1);
|
|
82
112
|
},
|
|
83
113
|
settle(t, n) {
|
|
84
|
-
let
|
|
85
|
-
if (!a &&
|
|
86
|
-
let o =
|
|
114
|
+
let r = n?.from, a = u.get(t);
|
|
115
|
+
if (!a && r === void 0) return;
|
|
116
|
+
let o = i.get(t);
|
|
87
117
|
if (!o) {
|
|
88
|
-
|
|
118
|
+
v(t);
|
|
89
119
|
return;
|
|
90
120
|
}
|
|
91
|
-
let
|
|
92
|
-
if (a &&
|
|
93
|
-
if (a.settling &&
|
|
94
|
-
|
|
121
|
+
let s = e(i, o);
|
|
122
|
+
if (a && r === void 0) {
|
|
123
|
+
if (a.settling && l(a.slot, s) && _(t, a)) return;
|
|
124
|
+
g(t, a, s, !0);
|
|
95
125
|
return;
|
|
96
126
|
}
|
|
97
|
-
|
|
127
|
+
g(t, b(t, o, a, r), s, !0);
|
|
98
128
|
},
|
|
99
|
-
stop:
|
|
100
|
-
poseOf: (e) =>
|
|
129
|
+
stop: v,
|
|
130
|
+
poseOf: (e) => u.get(e)?.entry.pose,
|
|
101
131
|
dispose() {
|
|
102
|
-
for (let e of [...
|
|
132
|
+
for (let e of [...u.keys()]) v(e);
|
|
103
133
|
}
|
|
104
134
|
};
|
|
105
135
|
}
|
|
106
|
-
function
|
|
107
|
-
return
|
|
136
|
+
function d(e, t, n = {}) {
|
|
137
|
+
return u(e, t, () => n);
|
|
108
138
|
}
|
|
109
|
-
function
|
|
110
|
-
let
|
|
139
|
+
function f(e, t, n) {
|
|
140
|
+
let r = o(n || {}), s = !!n, c = a(() => s ? u(e, t, () => r.current) : null, [
|
|
111
141
|
s,
|
|
112
142
|
e,
|
|
113
143
|
t,
|
|
114
|
-
|
|
144
|
+
r
|
|
115
145
|
]);
|
|
116
|
-
return
|
|
146
|
+
return i(() => () => c?.dispose(), [c]), c;
|
|
117
147
|
}
|
|
118
148
|
//#endregion
|
|
119
|
-
export {
|
|
149
|
+
export { d as createReflowTransition, f as useAnimatedReflow };
|
|
120
150
|
|
|
121
151
|
//# sourceMappingURL=reflow.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reflow.js","names":["keyFor","id","samePose","a","b","ka","k","makeReflow","glides","dirty","unsubscribe","subscribe","animator","scene","unsubscribeIfIdle","release","g","nid","run","from","to","settling","o","read","lerp","RECT_POSE_DESCRIPTOR","onTick","p","onDone","cancelKey","label","onCourse","stop","claim","start","effectivePose","node","opts","pose","home","documentPose","createReflowTransition","useAnimatedReflow","latest","useLatest","enabled","reflow","useMemo","useEffect"],"sources":["../../src/animation/reflow.ts"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../core/geometry/poseDescriptor';\nimport { documentPose, effectivePose, type PosedNode, type PoseSource } from '../core/scene/effectivePose';\nimport type { NodeId, PoseOverride, PoseOverrides } from '../core/scene/types';\nimport type { ReflowTransition } from '../layout/types';\nimport type { AnimationHandle, Animator, EasingSpec, SpringPresetName } from './types';\n\n/** How a reflowed sibling travels: a duration and easing, or a spring. */\nexport interface ReflowTransitionOptions<TPose> {\n /** Default 200. Ignored under `spring`. */\n ms?: number;\n easing?: EasingSpec;\n /** Travel on a spring instead of a duration. A retarget restarts it from\n * the pose on screen, so position stays continuous and velocity does not\n * carry over. */\n spring?: {\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n };\n /** Supplies the `lerp` between two poses. Default `RECT_POSE_DESCRIPTOR`. */\n geometry?: PoseDescriptor<TPose>;\n /** Names each glide in `animator.watch` and `live()`. Default `'reflow'`. */\n label?: string;\n}\n\n/** A {@link ReflowTransition} the animator drives. `dispose` drops every\n * override it holds; the transition stays usable afterward. */\nexport interface AnimatedReflow<TPose = unknown> extends ReflowTransition<TPose> {\n dispose(): void;\n}\n\n/** The part of a scene a reflow transition reads and overrides. */\nexport interface ReflowScene<TPose> extends PoseSource<TPose> {\n readonly overrides: PoseOverrides<TPose>;\n}\n\ninterface Glide<TPose> {\n entry: PoseOverride<TPose>;\n target: TPose;\n settling: boolean;\n handle: AnimationHandle | null;\n}\n\n/** The animator's cancel-key for one node's glide. */\nconst keyFor = (id: string): string => `reflow:${id}`;\n\nfunction samePose(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n if (ka.length !== Object.keys(b).length) return false;\n for (const k of ka) {\n if (!samePose((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\nfunction makeReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n read: () => ReflowTransitionOptions<TPose>,\n): AnimatedReflow<TPose> {\n const glides = new Map<string, Glide<TPose>>();\n let dirty = false;\n let unsubscribe: (() => void) | null = null;\n\n // Ticks only mark the frame dirty; one commit per animator frame publishes\n // every glide at once.\n const subscribe = (): void => {\n if (unsubscribe) return;\n unsubscribe = animator.onTick(() => {\n if (!dirty) return;\n dirty = false;\n scene.overrides.commit();\n });\n };\n const unsubscribeIfIdle = (): void => {\n if (glides.size > 0 || !unsubscribe) return;\n unsubscribe();\n unsubscribe = null;\n };\n\n const release = (id: string, g: Glide<TPose>): void => {\n if (glides.get(id) === g) glides.delete(id);\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) scene.overrides.clear(nid);\n dirty = true;\n };\n\n const run = (id: string, g: Glide<TPose>, to: TPose, settling: boolean): void => {\n const from = g.entry.pose as TPose;\n g.target = to;\n g.settling = settling;\n if (samePose(from, to)) {\n g.handle?.cancel();\n g.handle = null;\n g.entry.pose = to;\n if (settling) release(id, g);\n scene.overrides.commit();\n unsubscribeIfIdle();\n return;\n }\n const o = read();\n const lerp = (o.geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>)).lerp;\n if (!lerp) throw new Error('useAnimatedReflow: geometry has no lerp; supply geometry: { ..., lerp }');\n const onTick = (p: number): void => {\n g.entry.pose = lerp(from, to, p);\n dirty = true;\n };\n const onDone = (): void => {\n g.handle = null;\n if (!g.settling) return;\n release(id, g);\n unsubscribeIfIdle();\n };\n const cancelKey = keyFor(id);\n const label = o.label ?? 'reflow';\n subscribe();\n // The shared key is what retargets: the new animation interrupts the old.\n g.handle = o.spring\n ? animator.spring<number>({ from: 0, to: 1, ...o.spring, cancelKey, label, onTick, onDone })\n : animator.tween<number>({ from: 0, to: 1, ms: o.ms ?? 200, easing: o.easing, cancelKey, label, onTick, onDone });\n scene.overrides.commit();\n };\n\n // False for a glide canceled through the animator: it stopped short of its\n // target and nothing is carrying it there.\n const onCourse = (id: string, g: Glide<TPose>): boolean =>\n animator.isActive(keyFor(id)) || samePose(g.entry.pose, g.target);\n\n const stop = (id: string): void => {\n const g = glides.get(id);\n if (!g) return;\n glides.delete(id);\n g.handle?.cancel();\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) {\n scene.overrides.clear(nid);\n scene.overrides.commit();\n }\n unsubscribeIfIdle();\n };\n\n // The glide for `id`, created if absent, starting from `from` when given,\n // and published over whatever override is showing the node.\n const claim = (\n id: string,\n node: PosedNode<TPose>,\n g: Glide<TPose> | undefined,\n from: TPose | undefined,\n ): Glide<TPose> => {\n if (!g) {\n const start = from ?? effectivePose(scene, node);\n g = { entry: { pose: start }, target: start, settling: false, handle: null };\n glides.set(id, g);\n } else if (from !== undefined) {\n g.entry.pose = from;\n }\n if (scene.overrides.get(id as NodeId) !== g.entry) scene.overrides.set(id as NodeId, g.entry);\n return g;\n };\n\n return {\n glide(id, pose, opts) {\n const node = scene.get(id as NodeId);\n if (!node) return;\n const from = opts?.from;\n const g = glides.get(id);\n if (g && from === undefined && !g.settling && samePose(g.target, pose) && onCourse(id, g)) return;\n run(id, claim(id, node, g, from), pose, false);\n },\n settle(id, opts) {\n const from = opts?.from;\n const g = glides.get(id);\n if (!g && from === undefined) return;\n const node = scene.get(id as NodeId);\n if (!node) { stop(id); return; }\n const home = documentPose(scene, node);\n if (g && from === undefined) {\n if (g.settling && samePose(g.target, home) && onCourse(id, g)) return;\n run(id, g, home, true);\n return;\n }\n run(id, claim(id, node, g, from), home, true);\n },\n stop,\n poseOf: (id) => glides.get(id)?.entry.pose,\n dispose() {\n for (const id of [...glides.keys()]) stop(id);\n },\n };\n}\n\n/**\n * A reflow transition over `animator`: each glide is a tween (or spring) of\n * its own, keyed `reflow:<id>`, so a new target for a node interrupts the\n * glide it is on and `animator.cancelKey` reaches one node's. See\n * {@link useAnimatedReflow} for the hook form.\n */\nexport function createReflowTransition<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> = {},\n): AnimatedReflow<TPose> {\n return makeReflow(scene, animator, () => opts);\n}\n\n/**\n * Opt a canvas's layout reflow into animation: pass the result to\n * `<SceneCanvas reflowTransition>` and siblings a drag displaces glide to\n * their slots instead of snapping. `null` (or `false`) turns it off, and\n * whatever it was holding snaps home. Option changes apply from the next\n * glide on, without rebuilding.\n */\nexport function useAnimatedReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> | null | false | undefined,\n): AnimatedReflow<TPose> | null {\n const latest = useLatest(opts || {});\n const enabled = !!opts;\n const reflow = useMemo(\n () => (enabled ? makeReflow(scene, animator, () => latest.current) : null),\n [enabled, scene, animator, latest],\n );\n useEffect(() => () => reflow?.dispose(), [reflow]);\n return reflow;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reflow.js","names":["keyFor","id","samePose","a","b","ka","k","makeReflow","glides","dirty","unsubscribe","subscribe","animator","scene","unsubscribeIfIdle","release","g","nid","run","from","settling","to","o","read","lerp","onDone","cancelKey","label","t","onTick","p","onCourse","stop","start","pose","descriptor","RECT_POSE_DESCRIPTOR","axes","liveAxes","createTarget","slot","shown","claim","effectivePose","node","opts","home","documentPose","createReflowTransition","useAnimatedReflow","latest","useLatest","enabled","reflow","useMemo","useEffect"],"sources":["../../src/animation/reflow.ts"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../core/geometry/poseDescriptor';\nimport { documentPose, effectivePose, type PosedNode, type PoseSource } from '../core/scene/effectivePose';\nimport type { NodeId, PoseOverride, PoseOverrides } from '../core/scene/types';\nimport type { ReflowTransition } from '../layout/types';\nimport { liveAxes } from './poseTarget';\nimport { createTarget, type Target } from '@weasel-js/animator';\nimport type { Animator, EasingSpec, SpringPresetName } from '@weasel-js/animator';\n\n/** How a reflowed sibling travels: a duration and easing, or a spring. */\nexport interface ReflowTransitionOptions<TPose> {\n /** Default 200. Ignored under `spring`. */\n ms?: number;\n easing?: EasingSpec;\n /** Travel on a spring instead of a duration. A retarget starts a new spring\n * from the pose on screen at the speed the node was moving. */\n spring?: {\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n };\n /** Supplies the pose's axes, and its `lerp` is the path a timed glide\n * follows. Default `RECT_POSE_DESCRIPTOR`, each axis in a straight line.\n * A pose with no axes glides by `lerp` alone, and a retarget restarts it. */\n geometry?: PoseDescriptor<TPose>;\n /** Names each glide in `animator.watch` and `live()`. Default `'reflow'`. */\n label?: string;\n}\n\n/** A {@link ReflowTransition} the animator drives. `dispose` drops every\n * override it holds; the transition stays usable afterward. */\nexport interface AnimatedReflow<TPose = unknown> extends ReflowTransition<TPose> {\n dispose(): void;\n}\n\n/** The part of a scene a reflow transition reads and overrides. */\nexport interface ReflowScene<TPose> extends PoseSource<TPose> {\n readonly overrides: PoseOverrides<TPose>;\n}\n\ninterface Glide<TPose> {\n entry: PoseOverride<TPose>;\n /** Where the layout wants the node shown: what its target commits. */\n slot: TPose;\n settling: boolean;\n /** Null for a pose with no axes, which glides by `lerp`. */\n target: Target<TPose> | null;\n}\n\n/** The animator's cancel-key for one node's glide. */\nconst keyFor = (id: string): string => `reflow:${id}`;\n\nfunction samePose(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n const ka = Object.keys(a);\n if (ka.length !== Object.keys(b).length) return false;\n for (const k of ka) {\n if (!samePose((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k])) return false;\n }\n return true;\n}\n\nfunction makeReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n read: () => ReflowTransitionOptions<TPose>,\n): AnimatedReflow<TPose> {\n const glides = new Map<string, Glide<TPose>>();\n let dirty = false;\n let unsubscribe: (() => void) | null = null;\n\n // Ticks only mark the frame dirty; one commit per animator frame publishes\n // every glide at once.\n const subscribe = (): void => {\n if (unsubscribe) return;\n unsubscribe = animator.onTick(() => {\n if (!dirty) return;\n dirty = false;\n scene.overrides.commit();\n });\n };\n const unsubscribeIfIdle = (): void => {\n if (glides.size > 0 || !unsubscribe) return;\n unsubscribe();\n unsubscribe = null;\n };\n\n const release = (id: string, g: Glide<TPose>): void => {\n if (glides.get(id) === g) glides.delete(id);\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) scene.overrides.clear(nid);\n dirty = true;\n };\n\n const run = (id: string, g: Glide<TPose>, to: TPose, settling: boolean): void => {\n const from = g.entry.pose as TPose;\n g.settling = settling;\n if (samePose(from, to)) {\n animator.cancelKey(keyFor(id));\n g.slot = to;\n g.entry.pose = to;\n if (settling) release(id, g);\n scene.overrides.commit();\n unsubscribeIfIdle();\n return;\n }\n // Already on its way there: whatever is moving it finishes the job.\n if (g.target?.active && samePose(g.slot, to)) return;\n const o = read();\n const lerp = o.geometry?.lerp;\n const onDone = (): void => {\n if (g.target?.active || !g.settling) return;\n release(id, g);\n unsubscribeIfIdle();\n };\n const cancelKey = keyFor(id);\n const label = o.label ?? 'reflow';\n subscribe();\n if (g.target) {\n // A spring interrupts what is moving the node and takes its velocity; a timed glide adds to it.\n if (o.spring) animator.spring<TPose>({ target: g.target, to, ...o.spring, cancelKey, label, onDone });\n else {\n animator.tween<TPose>({\n target: g.target, to, ms: o.ms ?? 200, easing: o.easing, cancelKey, interrupt: false, label, onDone,\n interpolate: lerp && ((a, b, t) => lerp(a, b, t)),\n });\n }\n } else {\n if (!lerp) throw new Error('useAnimatedReflow: this pose has no axes; supply geometry: { ..., lerp }');\n g.slot = to;\n const onTick = (p: number): void => {\n g.entry.pose = lerp(from, to, p);\n dirty = true;\n };\n // The shared key is what retargets: the new animation interrupts the old.\n if (o.spring) animator.spring<number>({ from: 0, to: 1, ...o.spring, cancelKey, label, onTick, onDone });\n else animator.tween<number>({ from: 0, to: 1, ms: o.ms ?? 200, easing: o.easing, cancelKey, label, onTick, onDone });\n }\n scene.overrides.commit();\n };\n\n // False for a glide canceled through the animator: it stopped short of its\n // slot and nothing is carrying it there.\n const onCourse = (id: string, g: Glide<TPose>): boolean =>\n animator.isActive(keyFor(id)) || samePose(g.entry.pose, g.slot);\n\n const stop = (id: string): void => {\n const g = glides.get(id);\n if (!g) return;\n glides.delete(id);\n animator.cancelKey(keyFor(id));\n const nid = id as NodeId;\n if (scene.overrides.get(nid) === g.entry) {\n scene.overrides.clear(nid);\n scene.overrides.commit();\n }\n unsubscribeIfIdle();\n };\n\n const start = (id: string, pose: TPose): Glide<TPose> => {\n const g: Glide<TPose> = { entry: { pose }, slot: pose, settling: false, target: null };\n const descriptor = read().geometry ?? (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>);\n const axes = liveAxes(descriptor, () => g.slot);\n if (axes) {\n g.target = createTarget<TPose>({\n axes,\n get: () => g.slot,\n set: (slot) => { g.slot = slot; },\n show: (shown) => {\n g.entry.pose = shown;\n dirty = true;\n },\n });\n }\n glides.set(id, g);\n return g;\n };\n\n // The glide for `id`, created if absent, starting from `from` when given,\n // and published over whatever override is showing the node.\n const claim = (\n id: string,\n node: PosedNode<TPose>,\n g: Glide<TPose> | undefined,\n from: TPose | undefined,\n ): Glide<TPose> => {\n if (!g) {\n g = start(id, from ?? effectivePose(scene, node));\n } else if (from !== undefined) {\n animator.cancelKey(keyFor(id));\n g.slot = from;\n g.entry.pose = from;\n }\n if (scene.overrides.get(id as NodeId) !== g.entry) scene.overrides.set(id as NodeId, g.entry);\n return g;\n };\n\n return {\n glide(id, pose, opts) {\n const node = scene.get(id as NodeId);\n if (!node) return;\n const from = opts?.from;\n const g = glides.get(id);\n if (g && from === undefined && !g.settling && samePose(g.slot, pose) && onCourse(id, g)) return;\n run(id, claim(id, node, g, from), pose, false);\n },\n settle(id, opts) {\n const from = opts?.from;\n const g = glides.get(id);\n if (!g && from === undefined) return;\n const node = scene.get(id as NodeId);\n if (!node) { stop(id); return; }\n const home = documentPose(scene, node);\n if (g && from === undefined) {\n if (g.settling && samePose(g.slot, home) && onCourse(id, g)) return;\n run(id, g, home, true);\n return;\n }\n run(id, claim(id, node, g, from), home, true);\n },\n stop,\n poseOf: (id) => glides.get(id)?.entry.pose,\n dispose() {\n for (const id of [...glides.keys()]) stop(id);\n },\n };\n}\n\n/**\n * A reflow transition over `animator`. Each node it moves has an animation\n * target whose committed value is the slot the layout wants it shown at, and\n * a new slot is a new animation on that target under the key `reflow:<id>`:\n * a timed glide adds to the ones still running, a spring interrupts them at\n * their velocity, and `animator.cancelKey` reaches one node's. See\n * {@link useAnimatedReflow} for the hook form.\n */\nexport function createReflowTransition<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> = {},\n): AnimatedReflow<TPose> {\n return makeReflow(scene, animator, () => opts);\n}\n\n/**\n * Opt a canvas's layout reflow into animation: pass the result to\n * `<SceneCanvas reflowTransition>` and siblings a drag displaces glide to\n * their slots instead of snapping. `null` (or `false`) turns it off, and\n * whatever it was holding snaps home. Option changes apply from the next\n * glide on, without rebuilding.\n */\nexport function useAnimatedReflow<TPose>(\n scene: ReflowScene<TPose>,\n animator: Animator,\n opts: ReflowTransitionOptions<TPose> | null | false | undefined,\n): AnimatedReflow<TPose> | null {\n const latest = useLatest(opts || {});\n const enabled = !!opts;\n const reflow = useMemo(\n () => (enabled ? makeReflow(scene, animator, () => latest.current) : null),\n [enabled, scene, animator, latest],\n );\n useEffect(() => () => reflow?.dispose(), [reflow]);\n return reflow;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { easeOut as e, resolveEasing as t } from "@weasel-js/geom";
|
|
2
|
+
//#region src/animation/rewind.ts
|
|
3
|
+
function n(e) {
|
|
4
|
+
return {
|
|
5
|
+
get id() {
|
|
6
|
+
return e().id;
|
|
7
|
+
},
|
|
8
|
+
cancel: () => e().cancel(),
|
|
9
|
+
pause: () => e().pause(),
|
|
10
|
+
resume: () => e().resume(),
|
|
11
|
+
setTimeScale: (t) => e().setTimeScale(t),
|
|
12
|
+
timeScale: () => e().timeScale(),
|
|
13
|
+
isPaused: () => e().isPaused()
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function r(e, t) {
|
|
17
|
+
let n = e.axes.to(e.committed()), r = e.axes.to(t);
|
|
18
|
+
return n.every((e, t) => e === r[t]);
|
|
19
|
+
}
|
|
20
|
+
function i(i, a, o) {
|
|
21
|
+
let s = t(o.easing ?? e), { ms: c } = o, l, u = (e, t, n) => {
|
|
22
|
+
let d = e === 0 && t, f = c > 0 ? s(e / c) : 1, p = t ? c - e : e, m = t ? o.to : o.start;
|
|
23
|
+
if (!d && (p < 1 || (t ? f >= 1 : f <= 0))) {
|
|
24
|
+
a.stop({ commit: !1 }), t && o.onDone?.();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
let h = t ? (t) => (s((e + p * t) / c) - f) / (1 - f) : (t) => 1 - s(e * (1 - t) / c) / f, g = l = i.tween({
|
|
28
|
+
target: a,
|
|
29
|
+
from: n,
|
|
30
|
+
to: m,
|
|
31
|
+
ms: p,
|
|
32
|
+
easing: d ? s : h,
|
|
33
|
+
cancelKey: o.cancelKey,
|
|
34
|
+
interrupt: !1,
|
|
35
|
+
interpolate: o.interpolate,
|
|
36
|
+
onDone: t ? o.onDone : void 0,
|
|
37
|
+
onTick(n) {
|
|
38
|
+
if (r(a, m) || !r(a, t ? o.start : o.to)) return;
|
|
39
|
+
let s = i.live().find((e) => e.id === g.id)?.elapsed ?? 0, c = e + (t ? 1 : -1) * Math.min(p, s);
|
|
40
|
+
a.stop({ commit: !1 }), u(c, !t, n);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
return u(0, !0, o.from), n(() => l);
|
|
45
|
+
}
|
|
46
|
+
function a(e, t, i) {
|
|
47
|
+
let a, o = (n, s) => {
|
|
48
|
+
let c = n ? i.to : i.start;
|
|
49
|
+
a = e.spring({
|
|
50
|
+
target: t,
|
|
51
|
+
from: s,
|
|
52
|
+
to: c,
|
|
53
|
+
...i.tuning,
|
|
54
|
+
cancelKey: i.cancelKey,
|
|
55
|
+
onDone: n ? i.onDone : void 0,
|
|
56
|
+
onTick(e) {
|
|
57
|
+
!r(t, c) && r(t, n ? i.start : i.to) && o(!n, e);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
return o(!0, i.from), n(() => a);
|
|
62
|
+
}
|
|
63
|
+
//#endregion
|
|
64
|
+
export { a as rewindingSpring, i as rewindingTween };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=rewind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rewind.js","names":["following","current","s","holds","doc","target","want","pose","x","i","rewindingTween","ease","resolveEasing","easeOut","leg","first","at","forward","done","ms","span","dest","easing","v","mine","animator","elapsed","row","now","value","rewindingSpring","o"],"sources":["../../src/animation/rewind.ts"],"sourcesContent":["import { easeOut, resolveEasing, type EasingSpec } from '@weasel-js/geom';\nimport type { AnimationHandle, Animator, Target, TargetSpringOptions } from '@weasel-js/animator';\n\n/** A move of a pose between the document pose it began at and the one it commits. */\ninterface Ends<TPose> {\n /** The document pose before the move: what an undo of it writes back. */\n start: TPose;\n /** The pose the move commits. */\n to: TPose;\n cancelKey: string;\n /** Called when the move arrives at `to`, never when it arrives back at `start`. */\n onDone?: () => void;\n}\n\n/** What {@link rewindingTween} takes. */\nexport interface RewindingTween<TPose> extends Ends<TPose> {\n /** Where the move appears to start. */\n from: TPose;\n ms: number;\n easing?: EasingSpec;\n interpolate?: (a: TPose, b: TPose, t: number) => TPose;\n}\n\n/** What {@link rewindingSpring} takes. */\nexport interface RewindingSpring<TPose> extends Ends<TPose> {\n from: TPose;\n tuning: Pick<TargetSpringOptions<TPose>, 'preset' | 'stiffness' | 'damping' | 'mass'>;\n}\n\n/** A handle that answers for whichever leg of a move is running. */\nfunction following(current: () => AnimationHandle): AnimationHandle {\n return {\n get id() { return current().id; },\n cancel: () => current().cancel(),\n pause: () => current().pause(),\n resume: () => current().resume(),\n setTimeScale: (s) => current().setTimeScale(s),\n timeScale: () => current().timeScale(),\n isPaused: () => current().isPaused(),\n };\n}\n\n/** Whether the document holds `pose`, as the target's axes read both. */\nfunction holds<TPose>(target: Target<TPose>, pose: TPose): boolean {\n const doc = target.axes.to(target.committed());\n const want = target.axes.to(pose);\n return doc.every((x, i) => x === want[i]);\n}\n\n/**\n * A tween of `target` from `start` to `to` that follows the document when the move is undone\n * and redone mid-flight: once the document holds the pose at its other end, it turns around\n * and travels there along the positions it passed, at the pace it passed them. Any other\n * write still wins at once, as it does for a plain move.\n */\nexport function rewindingTween<TPose>(\n animator: Animator, target: Target<TPose>, o: RewindingTween<TPose>,\n): AnimationHandle {\n const ease = resolveEasing(o.easing ?? easeOut);\n const { ms } = o;\n let current: AnimationHandle;\n\n /** Travels from `from`, the pose on screen with the move `at` ms along, toward `to` when\n * `forward` and back toward `start` when not. */\n const leg = (at: number, forward: boolean, from: TPose): void => {\n const first = at === 0 && forward;\n const done = ms > 0 ? ease(at / ms) : 1;\n const span = forward ? ms - at : at;\n const dest = forward ? o.to : o.start;\n // Nothing of the move lies that way: the pose is at that end already.\n if (!first && (span < 1 || (forward ? done >= 1 : done <= 0))) {\n target.stop({ commit: false });\n if (forward) o.onDone?.();\n return;\n }\n // The share of this leg's travel covered `v` of the way through its time.\n const easing = forward\n ? (v: number) => (ease((at + span * v) / ms) - done) / (1 - done)\n : (v: number) => 1 - ease((at * (1 - v)) / ms) / done;\n const mine: AnimationHandle = current = animator.tween<TPose>({\n target,\n from,\n to: dest,\n ms: span,\n easing: first ? ease : easing,\n cancelKey: o.cancelKey,\n interrupt: false,\n interpolate: o.interpolate,\n onDone: forward ? o.onDone : undefined,\n onTick(value) {\n if (holds(target, dest) || !holds(target, forward ? o.start : o.to)) return;\n const elapsed = animator.live().find((row) => row.id === mine.id)?.elapsed ?? 0;\n const now = at + (forward ? 1 : -1) * Math.min(span, elapsed);\n target.stop({ commit: false });\n leg(now, !forward, value);\n },\n });\n };\n leg(0, true, o.from);\n return following(() => current);\n}\n\n/**\n * A spring of `target` from `start` to `to` that follows the document as\n * {@link rewindingTween} does: it springs toward the pose at its other end from where it is,\n * at the speed it has.\n */\nexport function rewindingSpring<TPose>(\n animator: Animator, target: Target<TPose>, o: RewindingSpring<TPose>,\n): AnimationHandle {\n let current: AnimationHandle;\n const leg = (forward: boolean, from: TPose): void => {\n const dest = forward ? o.to : o.start;\n current = animator.spring<TPose>({\n target,\n from,\n to: dest,\n ...o.tuning,\n // Under the key it interrupts the leg before it, and starts at that one's velocity.\n cancelKey: o.cancelKey,\n onDone: forward ? o.onDone : undefined,\n onTick(value) {\n if (holds(target, dest) || !holds(target, forward ? o.start : o.to)) return;\n leg(!forward, value);\n },\n });\n };\n leg(true, o.from);\n return following(() => current);\n}\n"],"mappings":";;AA8BA,SAASA,EAAU,GAAiD;CAClE,OAAO;EACL,IAAI,KAAK;GAAE,OAAOC,EAAQ,CAAC,CAAC;EAAI;EAChC,cAAcA,EAAQ,CAAC,CAAC,OAAO;EAC/B,aAAaA,EAAQ,CAAC,CAAC,MAAM;EAC7B,cAAcA,EAAQ,CAAC,CAAC,OAAO;EAC/B,eAAe,MAAMA,EAAQ,CAAC,CAAC,aAAaC,CAAC;EAC7C,iBAAiBD,EAAQ,CAAC,CAAC,UAAU;EACrC,gBAAgBA,EAAQ,CAAC,CAAC,SAAS;CACrC;AACF;AAGA,SAASE,EAAa,GAAuB,GAAsB;CACjE,IAAMC,IAAMC,EAAO,KAAK,GAAGA,EAAO,UAAU,CAAC,GACvCC,IAAOD,EAAO,KAAK,GAAGE,CAAI;CAChC,OAAOH,EAAI,OAAO,GAAG,MAAMI,MAAMF,EAAKG,EAAE;AAC1C;AAQA,SAAgBC,EACd,GAAoB,GAAuB,GAC1B;CACjB,IAAMC,IAAOC,EAAc,EAAE,UAAUC,CAAO,GACxC,EAAE,UAAO,GACXZ,GAIEa,KAAO,GAAY,GAAkB,MAAsB;EAC/D,IAAMC,IAAQC,MAAO,KAAKC,GACpBC,IAAOC,IAAK,IAAIR,EAAKK,IAAKG,CAAE,IAAI,GAChCC,IAAOH,IAAUE,IAAKH,IAAKA,GAC3BK,IAAOJ,IAAU,EAAE,KAAK,EAAE;EAEhC,IAAI,CAACF,MAAUK,IAAO,MAAMH,IAAUC,KAAQ,IAAIA,KAAQ,KAAK;GAE7D,AADAb,EAAO,KAAK,EAAE,QAAQ,GAAM,CAAC,GACzBY,KAAS,EAAE,SAAS;GACxB;EACF;EAEA,IAAMK,IAASL,KACV,OAAeN,GAAMK,IAAKI,IAAOG,KAAKJ,CAAE,IAAID,MAAS,IAAIA,MACzD,MAAc,IAAIP,EAAMK,KAAM,IAAIO,KAAMJ,CAAE,IAAID,GAC7CM,IAAwB,IAAUC,EAAS,MAAa;GAC5D;GACA;GACA,IAAIJ;GACJ,IAAID;GACJ,QAAQL,IAAQJ,IAAOW;GACvB,WAAW,EAAE;GACb,WAAW;GACX,aAAa,EAAE;GACf,QAAQL,IAAU,EAAE,SAAS,KAAA;GAC7B,OAAO,GAAO;IACZ,IAAId,EAAME,GAAQgB,CAAI,KAAK,CAAClB,EAAME,GAAQY,IAAU,EAAE,QAAQ,EAAE,EAAE,GAAG;IACrE,IAAMS,IAAUD,EAAS,KAAK,CAAC,CAAC,MAAM,MAAQE,EAAI,OAAOH,EAAK,EAAE,CAAC,EAAE,WAAW,GACxEI,IAAMZ,KAAMC,IAAU,IAAI,MAAM,KAAK,IAAIG,GAAMM,CAAO;IAE5D,AADArB,EAAO,KAAK,EAAE,QAAQ,GAAM,CAAC,GAC7BS,EAAIc,GAAK,CAACX,GAASY,CAAK;GAC1B;EACF,CAAC;CACH;CAEA,OADAf,EAAI,GAAG,IAAM,EAAE,IAAI,GACZd,QAAgBC,CAAO;AAChC;AAOA,SAAgB6B,EACd,GAAoB,GAAuB,GAC1B;CACjB,IAAI7B,GACEa,KAAO,GAAkB,MAAsB;EACnD,IAAMO,IAAOJ,IAAUc,EAAE,KAAKA,EAAE;EAChC,IAAUN,EAAS,OAAc;GAC/B;GACA;GACA,IAAIJ;GACJ,GAAGU,EAAE;GAEL,WAAWA,EAAE;GACb,QAAQd,IAAUc,EAAE,SAAS,KAAA;GAC7B,OAAO,GAAO;IACZ,AAAI,GAAM1B,GAAQgB,CAAI,KAAMlB,EAAME,GAAQY,IAAUc,EAAE,QAAQA,EAAE,EAAE,KAClEjB,EAAI,CAACG,GAASY,CAAK;GACrB;EACF,CAAC;CACH;CAEA,OADAf,EAAI,IAAMiB,EAAE,IAAI,GACT/B,QAAgBC,CAAO;AAChC"}
|