@weasel-js/core 1.6.1 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1006 -0
- package/README.md +28 -9
- package/dist/WeaselProvider.js +15 -0
- package/dist/WeaselProvider.js.map +1 -0
- package/dist/affordances/composeAffordanceLayer.js +224 -0
- package/dist/affordances/composeAffordanceLayer.js.map +1 -0
- package/dist/affordances/cornerResize.js +69 -0
- package/dist/affordances/cornerResize.js.map +1 -0
- package/dist/affordances/hitAffordanceRegions.js +138 -0
- package/dist/affordances/hitAffordanceRegions.js.map +1 -0
- package/dist/affordances/pathAnchors.js +66 -0
- package/dist/affordances/pathAnchors.js.map +1 -0
- package/dist/affordances/rotationHandle.js +103 -0
- package/dist/affordances/rotationHandle.js.map +1 -0
- package/dist/animation/behaviors/momentum.js +118 -0
- package/dist/animation/behaviors/momentum.js.map +1 -0
- package/dist/animation/colorHelpers.js +135 -0
- package/dist/animation/colorHelpers.js.map +1 -0
- package/dist/animation/colorRegistry.js +37 -0
- package/dist/animation/colorRegistry.js.map +1 -0
- package/dist/animation/index.js +20 -0
- package/dist/animation/loop.js +62 -0
- package/dist/animation/loop.js.map +1 -0
- package/dist/animation/observe.js +23 -0
- package/dist/animation/observe.js.map +1 -0
- package/dist/animation/poseHelpers.js +50 -0
- package/dist/animation/poseHelpers.js.map +1 -0
- package/dist/animation/reflow.js +121 -0
- package/dist/animation/reflow.js.map +1 -0
- package/dist/animation/rig/bindRig.js +74 -0
- package/dist/animation/rig/bindRig.js.map +1 -0
- package/dist/animation/rig/blendPoses.js +43 -0
- package/dist/animation/rig/blendPoses.js.map +1 -0
- package/dist/animation/rig/mirrorPose.js +19 -0
- package/dist/animation/rig/mirrorPose.js.map +1 -0
- package/dist/animation/rig/resolveSkeleton.js +33 -0
- package/dist/animation/rig/resolveSkeleton.js.map +1 -0
- package/dist/animation/rig/solveIk.js +103 -0
- package/dist/animation/rig/solveIk.js.map +1 -0
- package/dist/animation/rig/types.js +12 -0
- package/dist/animation/rig/types.js.map +1 -0
- package/dist/animation/rig/useRig.js +23 -0
- package/dist/animation/rig/useRig.js.map +1 -0
- package/dist/animation/slew.js +27 -0
- package/dist/animation/slew.js.map +1 -0
- package/dist/animation/stagger.js +138 -0
- package/dist/animation/stagger.js.map +1 -0
- package/dist/animation/timeline/booking.js +106 -0
- package/dist/animation/timeline/booking.js.map +1 -0
- package/dist/animation/timeline/createTimeline.js +116 -0
- package/dist/animation/timeline/createTimeline.js.map +1 -0
- package/dist/animation/timeline/sampleTrack.js +29 -0
- package/dist/animation/timeline/sampleTrack.js.map +1 -0
- package/dist/animation/useAnimator.js +329 -0
- package/dist/animation/useAnimator.js.map +1 -0
- package/dist/animation/wrappers/animateLifecycle.js +40 -0
- package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
- package/dist/animation/wrappers/animateOnSetPose.js +44 -0
- package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
- package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
- package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
- package/dist/canvas/Canvas.js +608 -0
- package/dist/canvas/Canvas.js.map +1 -0
- package/dist/canvas/CanvasView.js +255 -0
- package/dist/canvas/CanvasView.js.map +1 -0
- package/dist/canvas/CursorCoordsHud.js +75 -0
- package/dist/canvas/CursorCoordsHud.js.map +1 -0
- package/dist/canvas/DrawCanvas.js +67 -0
- package/dist/canvas/DrawCanvas.js.map +1 -0
- package/dist/canvas/MinimapCanvas.js +139 -0
- package/dist/canvas/MinimapCanvas.js.map +1 -0
- package/dist/canvas/ModalityHud.js +66 -0
- package/dist/canvas/ModalityHud.js.map +1 -0
- package/dist/canvas/NodeShape.js +391 -0
- package/dist/canvas/NodeShape.js.map +1 -0
- package/dist/canvas/PickHud.js +93 -0
- package/dist/canvas/PickHud.js.map +1 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
- package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
- package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
- package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
- package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
- package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
- package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
- package/dist/canvas/SceneCanvas/features.js +97 -0
- package/dist/canvas/SceneCanvas/features.js.map +1 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
- package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
- package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
- package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
- package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
- package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
- package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
- package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
- package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
- package/dist/canvas/SceneCanvas.js +992 -0
- package/dist/canvas/SceneCanvas.js.map +1 -0
- package/dist/canvas/SceneViewCanvas.js +54 -0
- package/dist/canvas/SceneViewCanvas.js.map +1 -0
- package/dist/canvas/accentColor.js +9 -0
- package/dist/canvas/accentColor.js.map +1 -0
- package/dist/canvas/affordanceAt.js +63 -0
- package/dist/canvas/affordanceAt.js.map +1 -0
- package/dist/canvas/buildSceneTree.js +65 -0
- package/dist/canvas/buildSceneTree.js.map +1 -0
- package/dist/canvas/canvasRenderer.js +89 -0
- package/dist/canvas/canvasRenderer.js.map +1 -0
- package/dist/canvas/colorOverrides.js +16 -0
- package/dist/canvas/colorOverrides.js.map +1 -0
- package/dist/canvas/defaultDrawOne.js +43 -0
- package/dist/canvas/defaultDrawOne.js.map +1 -0
- package/dist/canvas/deps/areaSelect.js +19 -0
- package/dist/canvas/deps/areaSelect.js.map +1 -0
- package/dist/canvas/deps/debug.js +9 -0
- package/dist/canvas/deps/debug.js.map +1 -0
- package/dist/canvas/deps/dispatcher.js +11 -0
- package/dist/canvas/deps/dispatcher.js.map +1 -0
- package/dist/canvas/deps/editAnchors.js +101 -0
- package/dist/canvas/deps/editAnchors.js.map +1 -0
- package/dist/canvas/deps/geometryProjection.js +11 -0
- package/dist/canvas/deps/geometryProjection.js.map +1 -0
- package/dist/canvas/deps/hitTestArea.js +51 -0
- package/dist/canvas/deps/hitTestArea.js.map +1 -0
- package/dist/canvas/deps/ingestion.js +31 -0
- package/dist/canvas/deps/ingestion.js.map +1 -0
- package/dist/canvas/deps/insert.js +116 -0
- package/dist/canvas/deps/insert.js.map +1 -0
- package/dist/canvas/deps/lassoSelect.js +20 -0
- package/dist/canvas/deps/lassoSelect.js.map +1 -0
- package/dist/canvas/deps/layout.js +34 -0
- package/dist/canvas/deps/layout.js.map +1 -0
- package/dist/canvas/deps/nodeAtPoint.js +19 -0
- package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
- package/dist/canvas/deps/poseComposition.js +11 -0
- package/dist/canvas/deps/poseComposition.js.map +1 -0
- package/dist/canvas/deps/poseDescriptor.js +12 -0
- package/dist/canvas/deps/poseDescriptor.js.map +1 -0
- package/dist/canvas/deps/resizePolicy.js +35 -0
- package/dist/canvas/deps/resizePolicy.js.map +1 -0
- package/dist/canvas/deps/slice.js +99 -0
- package/dist/canvas/deps/slice.js.map +1 -0
- package/dist/canvas/deps/snap.js +11 -0
- package/dist/canvas/deps/snap.js.map +1 -0
- package/dist/canvas/deps/textEdit.js +21 -0
- package/dist/canvas/deps/textEdit.js.map +1 -0
- package/dist/canvas/deps/view.js +43 -0
- package/dist/canvas/deps/view.js.map +1 -0
- package/dist/canvas/derivedPath.js +47 -0
- package/dist/canvas/derivedPath.js.map +1 -0
- package/dist/canvas/drawEnvelope.js +22 -0
- package/dist/canvas/drawEnvelope.js.map +1 -0
- package/dist/canvas/getNodeAtPoint.js +18 -0
- package/dist/canvas/getNodeAtPoint.js.map +1 -0
- package/dist/canvas/hostAnchor.js +29 -0
- package/dist/canvas/hostAnchor.js.map +1 -0
- package/dist/canvas/hud.module.js +18 -0
- package/dist/canvas/hud.module.js.map +1 -0
- package/dist/canvas/insertPreviewExtent.js +103 -0
- package/dist/canvas/insertPreviewExtent.js.map +1 -0
- package/dist/canvas/kitRequirements.js +177 -0
- package/dist/canvas/kitRequirements.js.map +1 -0
- package/dist/canvas/layerOrder.js +66 -0
- package/dist/canvas/layerOrder.js.map +1 -0
- package/dist/canvas/layerSlots.js +14 -0
- package/dist/canvas/layerSlots.js.map +1 -0
- package/dist/canvas/minimapMath.js +80 -0
- package/dist/canvas/minimapMath.js.map +1 -0
- package/dist/canvas/mountedCanvases.js +20 -0
- package/dist/canvas/mountedCanvases.js.map +1 -0
- package/dist/canvas/overlayRoleStrokes.js +17 -0
- package/dist/canvas/overlayRoleStrokes.js.map +1 -0
- package/dist/canvas/paintCull.js +20 -0
- package/dist/canvas/paintCull.js.map +1 -0
- package/dist/canvas/pickWalk.js +158 -0
- package/dist/canvas/pickWalk.js.map +1 -0
- package/dist/canvas/planeClips.js +30 -0
- package/dist/canvas/planeClips.js.map +1 -0
- package/dist/canvas/poseRotation.js +35 -0
- package/dist/canvas/poseRotation.js.map +1 -0
- package/dist/canvas/rasterToPng.js +21 -0
- package/dist/canvas/rasterToPng.js.map +1 -0
- package/dist/canvas/renderDebugSnapshot.js +32 -0
- package/dist/canvas/renderDebugSnapshot.js.map +1 -0
- package/dist/canvas/renderNeeds.js +25 -0
- package/dist/canvas/renderNeeds.js.map +1 -0
- package/dist/canvas/renderSceneToPixels.js +143 -0
- package/dist/canvas/renderSceneToPixels.js.map +1 -0
- package/dist/canvas/sceneAdapter.js +270 -0
- package/dist/canvas/sceneAdapter.js.map +1 -0
- package/dist/canvas/sceneLayerPaint.js +37 -0
- package/dist/canvas/sceneLayerPaint.js.map +1 -0
- package/dist/canvas/sceneSlotWiring.js +20 -0
- package/dist/canvas/sceneSlotWiring.js.map +1 -0
- package/dist/canvas/sceneViewRender.js +72 -0
- package/dist/canvas/sceneViewRender.js.map +1 -0
- package/dist/canvas/slopsDebugLayer.js +61 -0
- package/dist/canvas/slopsDebugLayer.js.map +1 -0
- package/dist/canvas/surfaceContribution.js +15 -0
- package/dist/canvas/surfaceContribution.js.map +1 -0
- package/dist/canvas/toolPreview.js +39 -0
- package/dist/canvas/toolPreview.js.map +1 -0
- package/dist/canvas/useCanvasRenderer.js +11 -0
- package/dist/canvas/useCanvasRenderer.js.map +1 -0
- package/dist/canvas/useFrameLoop.js +60 -0
- package/dist/canvas/useFrameLoop.js.map +1 -0
- package/dist/canvas/useHostAnchor.js +71 -0
- package/dist/canvas/useHostAnchor.js.map +1 -0
- package/dist/canvas/useLateContentRedraw.js +21 -0
- package/dist/canvas/useLateContentRedraw.js.map +1 -0
- package/dist/canvas/useRedrawOn.js +21 -0
- package/dist/canvas/useRedrawOn.js.map +1 -0
- package/dist/canvas/useViewHelpers.js +120 -0
- package/dist/canvas/useViewHelpers.js.map +1 -0
- package/dist/canvas/viewInputs.js +17 -0
- package/dist/canvas/viewInputs.js.map +1 -0
- package/dist/canvas/viewRegistry.js +61 -0
- package/dist/canvas/viewRegistry.js.map +1 -0
- package/dist/canvas/wrapNodeOutput.js +14 -0
- package/dist/canvas/wrapNodeOutput.js.map +1 -0
- package/dist/clipboard.d.ts +10 -5
- package/dist/clipboard.js +3 -5
- package/dist/clone.d.ts +3 -3
- package/dist/clone.js +2 -5
- package/dist/core/adapters/arrayAdapter.js +85 -0
- package/dist/core/adapters/arrayAdapter.js.map +1 -0
- package/dist/core/adapters/useArrayAdapter.js +13 -0
- package/dist/core/adapters/useArrayAdapter.js.map +1 -0
- package/dist/core/applyOps.js +12 -0
- package/dist/core/applyOps.js.map +1 -0
- package/dist/core/device/index.js +4 -0
- package/dist/core/device/targets.js +17 -0
- package/dist/core/device/targets.js.map +1 -0
- package/dist/core/device/useDeviceProfile.js +75 -0
- package/dist/core/device/useDeviceProfile.js.map +1 -0
- package/dist/core/fillInPoseFrame.js +102 -0
- package/dist/core/fillInPoseFrame.js.map +1 -0
- package/dist/core/geometry/poseDescriptor.js +98 -0
- package/dist/core/geometry/poseDescriptor.js.map +1 -0
- package/dist/core/geometry/poseRotation.js +58 -0
- package/dist/core/geometry/poseRotation.js.map +1 -0
- package/dist/core/geometry/regionHit.js +102 -0
- package/dist/core/geometry/regionHit.js.map +1 -0
- package/dist/core/geometry/unionBounds.js +60 -0
- package/dist/core/geometry/unionBounds.js.map +1 -0
- package/dist/core/gradient.js +136 -0
- package/dist/core/gradient.js.map +1 -0
- package/dist/core/isPlainObject.js +11 -0
- package/dist/core/isPlainObject.js.map +1 -0
- package/dist/core/layers/render.js +150 -0
- package/dist/core/layers/render.js.map +1 -0
- package/dist/core/markerInset.js +24 -0
- package/dist/core/markerInset.js.map +1 -0
- package/dist/core/mixed.js +6 -0
- package/dist/core/mixed.js.map +1 -0
- package/dist/core/ops/arrange.js +31 -0
- package/dist/core/ops/arrange.js.map +1 -0
- package/dist/core/ops/create.js +32 -0
- package/dist/core/ops/create.js.map +1 -0
- package/dist/core/ops/createHistory.js +20 -0
- package/dist/core/ops/createHistory.js.map +1 -0
- package/dist/core/ops/delete.js +89 -0
- package/dist/core/ops/delete.js.map +1 -0
- package/dist/core/ops/registry.js +17 -0
- package/dist/core/ops/registry.js.map +1 -0
- package/dist/core/ops/reorder/algorithms.js +55 -0
- package/dist/core/ops/reorder/algorithms.js.map +1 -0
- package/dist/core/ops/reorder/index.js +140 -0
- package/dist/core/ops/reorder/index.js.map +1 -0
- package/dist/core/ops/reparent.js +52 -0
- package/dist/core/ops/reparent.js.map +1 -0
- package/dist/core/ops/select.js +34 -0
- package/dist/core/ops/select.js.map +1 -0
- package/dist/core/ops/setData.js +34 -0
- package/dist/core/ops/setData.js.map +1 -0
- package/dist/core/ops/setLayer.js +34 -0
- package/dist/core/ops/setLayer.js.map +1 -0
- package/dist/core/ops/setLayout.js +31 -0
- package/dist/core/ops/setLayout.js.map +1 -0
- package/dist/core/ops/setPath.js +57 -0
- package/dist/core/ops/setPath.js.map +1 -0
- package/dist/core/ops/setText.js +34 -0
- package/dist/core/ops/setText.js.map +1 -0
- package/dist/core/ops/slot.js +37 -0
- package/dist/core/ops/slot.js.map +1 -0
- package/dist/core/ops/transform.js +42 -0
- package/dist/core/ops/transform.js.map +1 -0
- package/dist/core/paintKinds.js +156 -0
- package/dist/core/paintKinds.js.map +1 -0
- package/dist/core/scene/NodeProperties.js +20 -0
- package/dist/core/scene/NodeProperties.js.map +1 -0
- package/dist/core/scene/NodeRouting.js +24 -0
- package/dist/core/scene/NodeRouting.js.map +1 -0
- package/dist/core/scene/arrivals.js +12 -0
- package/dist/core/scene/arrivals.js.map +1 -0
- package/dist/core/scene/composeFrame.js +29 -0
- package/dist/core/scene/composeFrame.js.map +1 -0
- package/dist/core/scene/depMemo.js +18 -0
- package/dist/core/scene/depMemo.js.map +1 -0
- package/dist/core/scene/dependents.js +66 -0
- package/dist/core/scene/dependents.js.map +1 -0
- package/dist/core/scene/derivedPath.js +31 -0
- package/dist/core/scene/derivedPath.js.map +1 -0
- package/dist/core/scene/effectivePose.js +78 -0
- package/dist/core/scene/effectivePose.js.map +1 -0
- package/dist/core/scene/kitRegistry.js +33 -0
- package/dist/core/scene/kitRegistry.js.map +1 -0
- package/dist/core/scene/layoutPass.js +96 -0
- package/dist/core/scene/layoutPass.js.map +1 -0
- package/dist/core/scene/nodeFnFields.js +83 -0
- package/dist/core/scene/nodeFnFields.js.map +1 -0
- package/dist/core/scene/nodeMemo.js +28 -0
- package/dist/core/scene/nodeMemo.js.map +1 -0
- package/dist/core/scene/poseFeed.js +87 -0
- package/dist/core/scene/poseFeed.js.map +1 -0
- package/dist/core/scene/poseOverrides.js +52 -0
- package/dist/core/scene/poseOverrides.js.map +1 -0
- package/dist/core/scene/poseSnapshot.js +54 -0
- package/dist/core/scene/poseSnapshot.js.map +1 -0
- package/dist/core/scene/scene.js +1271 -0
- package/dist/core/scene/scene.js.map +1 -0
- package/dist/core/scene/types.js +6 -0
- package/dist/core/scene/types.js.map +1 -0
- package/dist/core/scene/useScene.js +32 -0
- package/dist/core/scene/useScene.js.map +1 -0
- package/dist/core/selection/chromeState.js +31 -0
- package/dist/core/selection/chromeState.js.map +1 -0
- package/dist/core/selection/selectionTarget.js +6 -0
- package/dist/core/selection/selectionTarget.js.map +1 -0
- package/dist/core/selection/useSelection.js +71 -0
- package/dist/core/selection/useSelection.js.map +1 -0
- package/dist/core/shapeKinds.js +54 -0
- package/dist/core/shapeKinds.js.map +1 -0
- package/dist/core/strokeMarkerShapes.js +139 -0
- package/dist/core/strokeMarkerShapes.js.map +1 -0
- package/dist/core/strokeMarkers.js +28 -0
- package/dist/core/strokeMarkers.js.map +1 -0
- package/dist/core/stylus/stylus.js +39 -0
- package/dist/core/stylus/stylus.js.map +1 -0
- package/dist/core/stylus/usePointerStylus.js +51 -0
- package/dist/core/stylus/usePointerStylus.js.map +1 -0
- package/dist/core/usePaintKinds.js +17 -0
- package/dist/core/usePaintKinds.js.map +1 -0
- package/dist/core/viewport/clampView.js +24 -0
- package/dist/core/viewport/clampView.js.map +1 -0
- package/dist/core/viewport/clientToWorld.js +8 -0
- package/dist/core/viewport/clientToWorld.js.map +1 -0
- package/dist/core/viewport/createVelocityTracker.js +39 -0
- package/dist/core/viewport/createVelocityTracker.js.map +1 -0
- package/dist/core/viewport/fitToBounds.js +18 -0
- package/dist/core/viewport/fitToBounds.js.map +1 -0
- package/dist/core/viewport/fitViewToBounds.js +36 -0
- package/dist/core/viewport/fitViewToBounds.js.map +1 -0
- package/dist/core/viewport/interpolateView.js +34 -0
- package/dist/core/viewport/interpolateView.js.map +1 -0
- package/dist/core/viewport/meanScale.js +8 -0
- package/dist/core/viewport/meanScale.js.map +1 -0
- package/dist/core/viewport/parallax.js +111 -0
- package/dist/core/viewport/parallax.js.map +1 -0
- package/dist/core/viewport/pxExtent.js +42 -0
- package/dist/core/viewport/pxExtent.js.map +1 -0
- package/dist/core/viewport/sceneNodeClientRect.js +18 -0
- package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
- package/dist/core/viewport/screenSlop.js +27 -0
- package/dist/core/viewport/screenSlop.js.map +1 -0
- package/dist/core/viewport/useAutoCenter.js +32 -0
- package/dist/core/viewport/useAutoCenter.js.map +1 -0
- package/dist/core/viewport/useCanvasSize.js +29 -0
- package/dist/core/viewport/useCanvasSize.js.map +1 -0
- package/dist/core/viewport/useDecayLoop.js +63 -0
- package/dist/core/viewport/useDecayLoop.js.map +1 -0
- package/dist/core/viewport/useVelocityTracker.js +10 -0
- package/dist/core/viewport/useVelocityTracker.js.map +1 -0
- package/dist/core/viewport/useViewAnimation.js +63 -0
- package/dist/core/viewport/useViewAnimation.js.map +1 -0
- package/dist/core/viewport/view.js +37 -0
- package/dist/core/viewport/view.js.map +1 -0
- package/dist/core/viewport/viewTransform.js +11 -0
- package/dist/core/viewport/viewTransform.js.map +1 -0
- package/dist/core/viewport/viewportWorldRect.js +13 -0
- package/dist/core/viewport/viewportWorldRect.js.map +1 -0
- package/dist/core/viewport/wheelHandler.js +30 -0
- package/dist/core/viewport/wheelHandler.js.map +1 -0
- package/dist/core/viewport/zoomAt.js +22 -0
- package/dist/core/viewport/zoomAt.js.map +1 -0
- package/dist/core/viewport/zoomBounds.js +20 -0
- package/dist/core/viewport/zoomBounds.js.map +1 -0
- package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
- package/dist/debug/createDebugOverlayLayer.js +358 -0
- package/dist/debug/createDebugOverlayLayer.js.map +1 -0
- package/dist/debug/createDebugSink.js +83 -0
- package/dist/debug/createDebugSink.js.map +1 -0
- package/dist/debug/defaultTheme.js +31 -0
- package/dist/debug/defaultTheme.js.map +1 -0
- package/dist/debug/flag.js +41 -0
- package/dist/debug/flag.js.map +1 -0
- package/dist/debug/frameStats.js +16 -0
- package/dist/debug/frameStats.js.map +1 -0
- package/dist/debug/parseDebugFlags.js +32 -0
- package/dist/debug/parseDebugFlags.js.map +1 -0
- package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
- package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
- package/dist/features/chrome-caps/conditions.js +36 -0
- package/dist/features/chrome-caps/conditions.js.map +1 -0
- package/dist/features/chrome-caps/defaults.js +26 -0
- package/dist/features/chrome-caps/defaults.js.map +1 -0
- package/dist/features/chrome-caps/index.js +7 -0
- package/dist/features/chrome-caps/resolve.js +23 -0
- package/dist/features/chrome-caps/resolve.js.map +1 -0
- package/dist/features/chrome-caps/useHoverTracking.js +27 -0
- package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
- package/dist/features/cursor/paintedCursorLayer.js +60 -0
- package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
- package/dist/features/focus/gateLayer.js +14 -0
- package/dist/features/focus/gateLayer.js.map +1 -0
- package/dist/features/focus/useCanvasFocus.js +29 -0
- package/dist/features/focus/useCanvasFocus.js.map +1 -0
- package/dist/features/groups/children.js +23 -0
- package/dist/features/groups/children.js.map +1 -0
- package/dist/features/groups/composePose.js +67 -0
- package/dist/features/groups/composePose.js.map +1 -0
- package/dist/features/groups/nestedHit.js +40 -0
- package/dist/features/groups/nestedHit.js.map +1 -0
- package/dist/features/groups/unionOfChildren.js +15 -0
- package/dist/features/groups/unionOfChildren.js.map +1 -0
- package/dist/features/images/imageCache.js +94 -0
- package/dist/features/images/imageCache.js.map +1 -0
- package/dist/features/ingestion/contentHandlers.js +37 -0
- package/dist/features/ingestion/contentHandlers.js.map +1 -0
- package/dist/features/ingestion/imageHandler.js +45 -0
- package/dist/features/ingestion/imageHandler.js.map +1 -0
- package/dist/features/ingestion/index.js +8 -0
- package/dist/features/ingestion/openFilePicker.js +15 -0
- package/dist/features/ingestion/openFilePicker.js.map +1 -0
- package/dist/features/ingestion/registerKitHandlers.js +26 -0
- package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
- package/dist/features/ingestion/svgHandler.js +58 -0
- package/dist/features/ingestion/svgHandler.js.map +1 -0
- package/dist/features/ingestion/weaselJsonHandler.js +39 -0
- package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
- package/dist/features/longPress/longPressFeedback.js +96 -0
- package/dist/features/longPress/longPressFeedback.js.map +1 -0
- package/dist/features/meshPaint/bake.js +79 -0
- package/dist/features/meshPaint/bake.js.map +1 -0
- package/dist/features/meshPaint/bakeCache.js +59 -0
- package/dist/features/meshPaint/bakeCache.js.map +1 -0
- package/dist/features/meshPaint/handles.js +86 -0
- package/dist/features/meshPaint/handles.js.map +1 -0
- package/dist/features/meshPaint/lazyKind.js +1298 -0
- package/dist/features/meshPaint/lazyKind.js.map +1 -0
- package/dist/features/meshPaint/meshPaint.js +236 -0
- package/dist/features/meshPaint/meshPaint.js.map +1 -0
- package/dist/features/meshPaint/meshShader.js +6 -0
- package/dist/features/meshPaint/meshShader.js.map +1 -0
- package/dist/features/meshPaint/register.js +7 -0
- package/dist/features/meshPaint/register.js.map +1 -0
- package/dist/features/meshPaint/surface.js +110 -0
- package/dist/features/meshPaint/surface.js.map +1 -0
- package/dist/features/minimap/actions.js +53 -0
- package/dist/features/minimap/actions.js.map +1 -0
- package/dist/features/minimap/createMinimapContribution.js +96 -0
- package/dist/features/minimap/createMinimapContribution.js.map +1 -0
- package/dist/features/minimap/layers.js +103 -0
- package/dist/features/minimap/layers.js.map +1 -0
- package/dist/features/modes/modeLayers.js +113 -0
- package/dist/features/modes/modeLayers.js.map +1 -0
- package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
- package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
- package/dist/features/parallax/createParallaxLayer.js +26 -0
- package/dist/features/parallax/createParallaxLayer.js.map +1 -0
- package/dist/features/parallax/createParallaxPlane.js +26 -0
- package/dist/features/parallax/createParallaxPlane.js.map +1 -0
- package/dist/features/paths/anchorEdits.js +156 -0
- package/dist/features/paths/anchorEdits.js.map +1 -0
- package/dist/features/paths/anchors.js +154 -0
- package/dist/features/paths/anchors.js.map +1 -0
- package/dist/features/paths/booleans.js +2 -0
- package/dist/features/paths/index.js +15 -0
- package/dist/features/paths/markerCommands.js +116 -0
- package/dist/features/paths/markerCommands.js.map +1 -0
- package/dist/features/paths/markerSites.js +59 -0
- package/dist/features/paths/markerSites.js.map +1 -0
- package/dist/features/paths/markers.js +95 -0
- package/dist/features/paths/markers.js.map +1 -0
- package/dist/features/paths/nearestAnchor.js +36 -0
- package/dist/features/paths/nearestAnchor.js.map +1 -0
- package/dist/features/paths/originProjection.js +16 -0
- package/dist/features/paths/originProjection.js.map +1 -0
- package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
- package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
- package/dist/features/paths/pathInWorld.js +41 -0
- package/dist/features/paths/pathInWorld.js.map +1 -0
- package/dist/features/paths/pathLayer.js +44 -0
- package/dist/features/paths/pathLayer.js.map +1 -0
- package/dist/features/paths/penPreviewLayer.js +220 -0
- package/dist/features/paths/penPreviewLayer.js.map +1 -0
- package/dist/features/paths/poseDescriptor.js +44 -0
- package/dist/features/paths/poseDescriptor.js.map +1 -0
- package/dist/features/paths/tessellate/stroke.js +230 -0
- package/dist/features/paths/tessellate/stroke.js.map +1 -0
- package/dist/features/patterns/index.js +23 -0
- package/dist/features/patterns/index.js.map +1 -0
- package/dist/features/patterns/patterns-builtin.js +38 -0
- package/dist/features/patterns/patterns-builtin.js.map +1 -0
- package/dist/features/patterns/resolveSpec.js +57 -0
- package/dist/features/patterns/resolveSpec.js.map +1 -0
- package/dist/features/patterns/tileGeometry.js +158 -0
- package/dist/features/patterns/tileGeometry.js.map +1 -0
- package/dist/features/pointer/PointerContext.js +45 -0
- package/dist/features/pointer/PointerContext.js.map +1 -0
- package/dist/features/poseRun/usePoseRun.js +70 -0
- package/dist/features/poseRun/usePoseRun.js.map +1 -0
- package/dist/features/selection/SelectionContext.js +46 -0
- package/dist/features/selection/SelectionContext.js.map +1 -0
- package/dist/features/selection/overlay.js +442 -0
- package/dist/features/selection/overlay.js.map +1 -0
- package/dist/features/simulation/createSimulation.js +61 -0
- package/dist/features/simulation/createSimulation.js.map +1 -0
- package/dist/features/simulation/types.js +6 -0
- package/dist/features/simulation/types.js.map +1 -0
- package/dist/features/simulation/useSimulation.js +74 -0
- package/dist/features/simulation/useSimulation.js.map +1 -0
- package/dist/features/text/domRuns.js +258 -0
- package/dist/features/text/domRuns.js.map +1 -0
- package/dist/features/text/fitTextPose.js +38 -0
- package/dist/features/text/fitTextPose.js.map +1 -0
- package/dist/features/text/hitTest.js +45 -0
- package/dist/features/text/hitTest.js.map +1 -0
- package/dist/features/text/renderLabel.js +14 -0
- package/dist/features/text/renderLabel.js.map +1 -0
- package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
- package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
- package/dist/features/text/runs/flagRange.js +53 -0
- package/dist/features/text/runs/flagRange.js.map +1 -0
- package/dist/features/text/runs/rangeStyle.js +135 -0
- package/dist/features/text/runs/rangeStyle.js.map +1 -0
- package/dist/features/text/textCommand.js +59 -0
- package/dist/features/text/textCommand.js.map +1 -0
- package/dist/features/text/textLayer.js +35 -0
- package/dist/features/text/textLayer.js.map +1 -0
- package/dist/features/text/textToPath.js +181 -0
- package/dist/features/text/textToPath.js.map +1 -0
- package/dist/features/text/useSceneTextEdit.js +138 -0
- package/dist/features/text/useSceneTextEdit.js.map +1 -0
- package/dist/features/text/useTextEdit.js +465 -0
- package/dist/features/text/useTextEdit.js.map +1 -0
- package/dist/features/tiling/createTiledLayer.js +63 -0
- package/dist/features/tiling/createTiledLayer.js.map +1 -0
- package/dist/features/tiling/tiledProject.js +14 -0
- package/dist/features/tiling/tiledProject.js.map +1 -0
- package/dist/features/viewports/viewResolver.js +59 -0
- package/dist/features/viewports/viewResolver.js.map +1 -0
- package/dist/features/viewports/viewportLayer.js +58 -0
- package/dist/features/viewports/viewportLayer.js.map +1 -0
- package/dist/icons/ArrowIcon.js +23 -0
- package/dist/icons/ArrowIcon.js.map +1 -0
- package/dist/icons/EllipseIcon.js +21 -0
- package/dist/icons/EllipseIcon.js.map +1 -0
- package/dist/icons/EyedropperIcon.js +49 -0
- package/dist/icons/EyedropperIcon.js.map +1 -0
- package/dist/icons/HandIcon.js +59 -0
- package/dist/icons/HandIcon.js.map +1 -0
- package/dist/icons/ImageIcon.js +34 -0
- package/dist/icons/ImageIcon.js.map +1 -0
- package/dist/icons/LassoIcon.js +22 -0
- package/dist/icons/LassoIcon.js.map +1 -0
- package/dist/icons/LineIcon.js +22 -0
- package/dist/icons/LineIcon.js.map +1 -0
- package/dist/icons/PenIcon.js +36 -0
- package/dist/icons/PenIcon.js.map +1 -0
- package/dist/icons/PencilIcon.js +25 -0
- package/dist/icons/PencilIcon.js.map +1 -0
- package/dist/icons/PolygonIcon.js +19 -0
- package/dist/icons/PolygonIcon.js.map +1 -0
- package/dist/icons/RectIcon.js +37 -0
- package/dist/icons/RectIcon.js.map +1 -0
- package/dist/icons/SelectIcon.js +20 -0
- package/dist/icons/SelectIcon.js.map +1 -0
- package/dist/icons/StarIcon.js +19 -0
- package/dist/icons/StarIcon.js.map +1 -0
- package/dist/icons/TextIcon.js +19 -0
- package/dist/icons/TextIcon.js.map +1 -0
- package/dist/icons/UnknownIcon.js +33 -0
- package/dist/icons/UnknownIcon.js.map +1 -0
- package/dist/icons/_base.js +12 -0
- package/dist/icons/_base.js.map +1 -0
- package/dist/index.css +2 -86
- package/dist/index.d.ts +2349 -2609
- package/dist/index.js +312 -13
- package/dist/input/keyState.js +76 -0
- package/dist/input/keyState.js.map +1 -0
- package/dist/input/useKeyState.js +22 -0
- package/dist/input/useKeyState.js.map +1 -0
- package/dist/interactions/actions/actionShortcuts.js +32 -0
- package/dist/interactions/actions/actionShortcuts.js.map +1 -0
- package/dist/interactions/actions/align/align.js +81 -0
- package/dist/interactions/actions/align/align.js.map +1 -0
- package/dist/interactions/actions/booleans/booleans.js +120 -0
- package/dist/interactions/actions/booleans/booleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleans.js +20 -0
- package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
- package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
- package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
- package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
- package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
- package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
- package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
- package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
- package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
- package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
- package/dist/interactions/actions/defaults/align.js +71 -0
- package/dist/interactions/actions/defaults/align.js.map +1 -0
- package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
- package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
- package/dist/interactions/actions/defaults/areaSelect.js +75 -0
- package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/booleans.js +52 -0
- package/dist/interactions/actions/defaults/booleans.js.map +1 -0
- package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
- package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
- package/dist/interactions/actions/defaults/clearSelection.js +19 -0
- package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/clipboard.js +78 -0
- package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
- package/dist/interactions/actions/defaults/clone.js +96 -0
- package/dist/interactions/actions/defaults/clone.js.map +1 -0
- package/dist/interactions/actions/defaults/createOutlines.js +47 -0
- package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
- package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
- package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
- package/dist/interactions/actions/defaults/delete.js +61 -0
- package/dist/interactions/actions/defaults/delete.js.map +1 -0
- package/dist/interactions/actions/defaults/distribute.js +66 -0
- package/dist/interactions/actions/defaults/distribute.js.map +1 -0
- package/dist/interactions/actions/defaults/duplicate.js +83 -0
- package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
- package/dist/interactions/actions/defaults/editAnchors.js +100 -0
- package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
- package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
- package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/escape.js +26 -0
- package/dist/interactions/actions/defaults/escape.js.map +1 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
- package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
- package/dist/interactions/actions/defaults/flip.js +119 -0
- package/dist/interactions/actions/defaults/flip.js.map +1 -0
- package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
- package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
- package/dist/interactions/actions/defaults/group.js +131 -0
- package/dist/interactions/actions/defaults/group.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
- package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
- package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
- package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
- package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
- package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
- package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
- package/dist/interactions/actions/defaults/ingest.js +58 -0
- package/dist/interactions/actions/defaults/ingest.js.map +1 -0
- package/dist/interactions/actions/defaults/insert.js +288 -0
- package/dist/interactions/actions/defaults/insert.js.map +1 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
- package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
- package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
- package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
- package/dist/interactions/actions/defaults/move.js +656 -0
- package/dist/interactions/actions/defaults/move.js.map +1 -0
- package/dist/interactions/actions/defaults/nudge.js +110 -0
- package/dist/interactions/actions/defaults/nudge.js.map +1 -0
- package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
- package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
- package/dist/interactions/actions/defaults/reorder.js +143 -0
- package/dist/interactions/actions/defaults/reorder.js.map +1 -0
- package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
- package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
- package/dist/interactions/actions/defaults/resize.js +332 -0
- package/dist/interactions/actions/defaults/resize.js.map +1 -0
- package/dist/interactions/actions/defaults/rotate.js +181 -0
- package/dist/interactions/actions/defaults/rotate.js.map +1 -0
- package/dist/interactions/actions/defaults/selectAll.js +27 -0
- package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
- package/dist/interactions/actions/defaults/setFill.js +27 -0
- package/dist/interactions/actions/defaults/setFill.js.map +1 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
- package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/setStroke.js +36 -0
- package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
- package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
- package/dist/interactions/actions/defaults/slice.js +39 -0
- package/dist/interactions/actions/defaults/slice.js.map +1 -0
- package/dist/interactions/actions/defaults/sliceOps.js +60 -0
- package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
- package/dist/interactions/actions/defaults/toolActivate.js +35 -0
- package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
- package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
- package/dist/interactions/actions/defaults/undoRedo.js +51 -0
- package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
- package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
- package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
- package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
- package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
- package/dist/interactions/actions/distribute/distribute.js +42 -0
- package/dist/interactions/actions/distribute/distribute.js.map +1 -0
- package/dist/interactions/actions/distribute/plan.js +29 -0
- package/dist/interactions/actions/distribute/plan.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
- package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
- package/dist/interactions/actions/edit-anchors/handles.js +43 -0
- package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
- package/dist/interactions/actions/flip/helpers.js +35 -0
- package/dist/interactions/actions/flip/helpers.js.map +1 -0
- package/dist/interactions/actions/geometryProjection.js +18 -0
- package/dist/interactions/actions/geometryProjection.js.map +1 -0
- package/dist/interactions/actions/gestureLifecycle.js +44 -0
- package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
- package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
- package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
- package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
- package/dist/interactions/actions/move/gestureAdapter.js +37 -0
- package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
- package/dist/interactions/actions/outlines/createOutlines.js +84 -0
- package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
- package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
- package/dist/interactions/actions/planeInput.js +168 -0
- package/dist/interactions/actions/planeInput.js.map +1 -0
- package/dist/interactions/actions/poseDescriptorDep.js +9 -0
- package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
- package/dist/interactions/actions/poseFrame.js +38 -0
- package/dist/interactions/actions/poseFrame.js.map +1 -0
- package/dist/interactions/actions/previewOverrides.js +25 -0
- package/dist/interactions/actions/previewOverrides.js.map +1 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
- package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
- package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/index.js +8 -0
- package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
- package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
- package/dist/interactions/actions/resize/cornerHandles.js +72 -0
- package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
- package/dist/interactions/actions/resolveOverlays.js +60 -0
- package/dist/interactions/actions/resolveOverlays.js.map +1 -0
- package/dist/interactions/actions/resolvePreviews.js +61 -0
- package/dist/interactions/actions/resolvePreviews.js.map +1 -0
- package/dist/interactions/actions/rotate/geometry.js +46 -0
- package/dist/interactions/actions/rotate/geometry.js.map +1 -0
- package/dist/interactions/actions/rotate/handle.js +27 -0
- package/dist/interactions/actions/rotate/handle.js.map +1 -0
- package/dist/interactions/actions/spatialReference.js +42 -0
- package/dist/interactions/actions/spatialReference.js.map +1 -0
- package/dist/interactions/actions/useStandardActions.js +142 -0
- package/dist/interactions/actions/useStandardActions.js.map +1 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
- package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
- package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
- package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
- package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
- package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
- package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
- package/dist/interactions/gestures/shared/originProjection.js +42 -0
- package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
- package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
- package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
- package/dist/interactions/gestures/shared/snap.js +24 -0
- package/dist/interactions/gestures/shared/snap.js.map +1 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
- package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
- package/dist/layout/arrivals.js +36 -0
- package/dist/layout/arrivals.js.map +1 -0
- package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
- package/dist/math.d.ts +4 -5
- package/dist/math.js +6 -4
- package/dist/mesh.d.ts +268 -0
- package/dist/mesh.js +7 -0
- package/dist/move.d.ts +7 -48
- package/dist/move.js +3 -142
- package/dist/originProjection-BSn4xiEy.d.ts +57 -0
- package/dist/patterns-builtin.js +3 -3
- package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
- package/dist/registerProgram-ateHDGjw.d.ts +193 -0
- package/dist/renderer/DrawCommand.js +6 -0
- package/dist/renderer/DrawCommand.js.map +1 -0
- package/dist/renderer/WeaselRenderer.js +328 -0
- package/dist/renderer/WeaselRenderer.js.map +1 -0
- package/dist/renderer/cache/GLImageCache.js +64 -0
- package/dist/renderer/cache/GLImageCache.js.map +1 -0
- package/dist/renderer/cache/GLMeshCache.js +102 -0
- package/dist/renderer/cache/GLMeshCache.js.map +1 -0
- package/dist/renderer/cache/GLTextureCache.js +51 -0
- package/dist/renderer/cache/GLTextureCache.js.map +1 -0
- package/dist/renderer/cache/GradientRampAtlas.js +82 -0
- package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
- package/dist/renderer/cache/cache.js +13 -0
- package/dist/renderer/cache/cache.js.map +1 -0
- package/dist/renderer/cache/markerCommandCache.js +59 -0
- package/dist/renderer/cache/markerCommandCache.js.map +1 -0
- package/dist/renderer/cache/outlineMeshCache.js +15 -0
- package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
- package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
- package/dist/renderer/cache/strokeMeshCache.js +44 -0
- package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
- package/dist/renderer/cullDrawCommands.js +89 -0
- package/dist/renderer/cullDrawCommands.js.map +1 -0
- package/dist/renderer/draw.js +1109 -0
- package/dist/renderer/draw.js.map +1 -0
- package/dist/renderer/drawBatch.js +168 -0
- package/dist/renderer/drawBatch.js.map +1 -0
- package/dist/renderer/effects/EffectTargets.js +45 -0
- package/dist/renderer/effects/EffectTargets.js.map +1 -0
- package/dist/renderer/effects/builtins.js +31 -0
- package/dist/renderer/effects/builtins.js.map +1 -0
- package/dist/renderer/effects/composite.js +9 -0
- package/dist/renderer/effects/composite.js.map +1 -0
- package/dist/renderer/effects/effectPrelude.js +10 -0
- package/dist/renderer/effects/effectPrelude.js.map +1 -0
- package/dist/renderer/effects/types.js +10 -0
- package/dist/renderer/effects/types.js.map +1 -0
- package/dist/renderer/index.js +19 -0
- package/dist/renderer/math/color.js +341 -0
- package/dist/renderer/math/color.js.map +1 -0
- package/dist/renderer/math/mat3.js +71 -0
- package/dist/renderer/math/mat3.js.map +1 -0
- package/dist/renderer/math/patternSpace.js +22 -0
- package/dist/renderer/math/patternSpace.js.map +1 -0
- package/dist/renderer/math/viewToMat3.js +19 -0
- package/dist/renderer/math/viewToMat3.js.map +1 -0
- package/dist/renderer/paintResources.js +18 -0
- package/dist/renderer/paintResources.js.map +1 -0
- package/dist/renderer/paintScratch.js +37 -0
- package/dist/renderer/paintScratch.js.map +1 -0
- package/dist/renderer/shaders/ShaderProgram.js +74 -0
- package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
- package/dist/renderer/shaders/batchFill.js +118 -0
- package/dist/renderer/shaders/batchFill.js.map +1 -0
- package/dist/renderer/shaders/customPrelude.js +34 -0
- package/dist/renderer/shaders/customPrelude.js.map +1 -0
- package/dist/renderer/shaders/extractUniformNames.js +184 -0
- package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
- package/dist/renderer/shaders/glyphPaint.js +61 -0
- package/dist/renderer/shaders/glyphPaint.js.map +1 -0
- package/dist/renderer/shaders/gradFill.js +30 -0
- package/dist/renderer/shaders/gradFill.js.map +1 -0
- package/dist/renderer/shaders/imageFill.js +14 -0
- package/dist/renderer/shaders/imageFill.js.map +1 -0
- package/dist/renderer/shaders/pathFill.js +13 -0
- package/dist/renderer/shaders/pathFill.js.map +1 -0
- package/dist/renderer/shaders/patternFill.js +24 -0
- package/dist/renderer/shaders/patternFill.js.map +1 -0
- package/dist/renderer/shaders/registerProgram.js +18 -0
- package/dist/renderer/shaders/registerProgram.js.map +1 -0
- package/dist/renderer/spriteSheet.js +14 -0
- package/dist/renderer/spriteSheet.js.map +1 -0
- package/dist/renderer/state/GroupState.js +77 -0
- package/dist/renderer/state/GroupState.js.map +1 -0
- package/dist/renderer/syntheticItalic.js +6 -0
- package/dist/renderer/syntheticItalic.js.map +1 -0
- package/dist/renderer/textures/registerTexture.js +14 -0
- package/dist/renderer/textures/registerTexture.js.map +1 -0
- package/dist/renderer.d.ts +18 -20
- package/dist/renderer.js +18 -13
- package/dist/resize.d.ts +10 -46
- package/dist/resize.js +7 -5
- package/dist/routing.d.ts +1 -1
- package/dist/routing.js +2 -3
- package/dist/scheduling/useVisibleRaf.js +69 -0
- package/dist/scheduling/useVisibleRaf.js.map +1 -0
- package/dist/test-hook/createTestHook.js +39 -0
- package/dist/test-hook/createTestHook.js.map +1 -0
- package/dist/test-hook/install.js +12 -0
- package/dist/test-hook/install.js.map +1 -0
- package/dist/test-seams-fYf6m5pu.d.ts +356 -0
- package/dist/test-seams.d.ts +6 -0
- package/dist/test-seams.js +3 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
- package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
- package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
- package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
- package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
- package/dist/tools/builtin/hand/useHandTool.js +31 -0
- package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
- package/dist/tools/builtin/image/useImageTool.js +41 -0
- package/dist/tools/builtin/image/useImageTool.js.map +1 -0
- package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
- package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
- package/dist/tools/builtin/line/useLineTool.js +33 -0
- package/dist/tools/builtin/line/useLineTool.js.map +1 -0
- package/dist/tools/builtin/pen/usePenTool.js +414 -0
- package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
- package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
- package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
- package/dist/tools/builtin/pickTopMostHit.js +45 -0
- package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
- package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
- package/dist/tools/builtin/rect/useRectTool.js +32 -0
- package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
- package/dist/tools/builtin/select/selectionContributions.js +109 -0
- package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
- package/dist/tools/builtin/select/useSelectTool.js +162 -0
- package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
- package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
- package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
- package/dist/tools/builtin/slice/useSliceTool.js +263 -0
- package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
- package/dist/tools/builtin/star/useStarTool.js +82 -0
- package/dist/tools/builtin/star/useStarTool.js.map +1 -0
- package/dist/tools/builtin/text/useTextTool.js +177 -0
- package/dist/tools/builtin/text/useTextTool.js.map +1 -0
- package/dist/tools/overlayBinding.js +8 -0
- package/dist/tools/overlayBinding.js.map +1 -0
- package/dist/tools/prefs.js +47 -0
- package/dist/tools/prefs.js.map +1 -0
- package/dist/tools/useKeybindings.js +66 -0
- package/dist/tools/useKeybindings.js.map +1 -0
- package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
- package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
- package/dist/util/color.js +26 -0
- package/dist/util/color.js.map +1 -0
- package/dist/util/constrainTo45.js +17 -0
- package/dist/util/constrainTo45.js.map +1 -0
- package/dist/util/paint.js +72 -0
- package/dist/util/paint.js.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +31 -18
- package/dist/chunk-44EWMJV2.js +0 -128
- package/dist/chunk-44EWMJV2.js.map +0 -1
- package/dist/chunk-4RJP2N2L.js +0 -143
- package/dist/chunk-4RJP2N2L.js.map +0 -1
- package/dist/chunk-BJN5ZRIJ.js +0 -167
- package/dist/chunk-BJN5ZRIJ.js.map +0 -1
- package/dist/chunk-D4AAWR64.js +0 -28
- package/dist/chunk-D4AAWR64.js.map +0 -1
- package/dist/chunk-DOBSZOPR.js +0 -29
- package/dist/chunk-DOBSZOPR.js.map +0 -1
- package/dist/chunk-H6N2JSZ3.js +0 -248
- package/dist/chunk-H6N2JSZ3.js.map +0 -1
- package/dist/chunk-HPFJUUTF.js +0 -167
- package/dist/chunk-HPFJUUTF.js.map +0 -1
- package/dist/chunk-L5YNZYEG.js +0 -648
- package/dist/chunk-L5YNZYEG.js.map +0 -1
- package/dist/chunk-MZAIDI6D.js +0 -32492
- package/dist/chunk-MZAIDI6D.js.map +0 -1
- package/dist/chunk-PNNZSYRD.js +0 -318
- package/dist/chunk-PNNZSYRD.js.map +0 -1
- package/dist/chunk-RMR4QMM6.js +0 -250
- package/dist/chunk-RMR4QMM6.js.map +0 -1
- package/dist/clipboard.js.map +0 -1
- package/dist/clone.js.map +0 -1
- package/dist/grid-BXdz8GF2.d.ts +0 -158
- package/dist/index.css.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/insert.d.ts +0 -37
- package/dist/insert.js +0 -81
- package/dist/insert.js.map +0 -1
- package/dist/math.js.map +0 -1
- package/dist/move.js.map +0 -1
- package/dist/options-CzjxFoYZ.d.ts +0 -67
- package/dist/path-JEV2c5If.d.ts +0 -48
- package/dist/patterns-builtin.js.map +0 -1
- package/dist/renderer.css +0 -86
- package/dist/renderer.css.map +0 -1
- package/dist/renderer.js.map +0 -1
- package/dist/resize.js.map +0 -1
- package/dist/routing.js.map +0 -1
- package/dist/types-D2tTKEU0.d.ts +0 -18
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weaselJsonHandler.js","names":["isMetadataBearingSvg","text","sniffSvgText","extractWeaselClipboardFromSvg","kitWeaselJsonHandler","item","WEASEL_CLIPBOARD_MIME","WEASEL_CLIPBOARD_MIME_WEB","sniffWeaselClipboardText","clipboard","ctx","items","it","nodes","parseWeaselClipboardText","snapshot","result","materializePaste"],"sources":["../../../src/features/ingestion/weaselJsonHandler.ts"],"sourcesContent":["/**\n * The kit's weasel-JSON clipboard content handler.\n *\n * Consumes `application/x-weasel-clipboard+json` payloads (either MIME\n * spelling — Chromium's async-clipboard API round-trips custom formats with\n * a `web ` prefix — plus `text/plain` that sniffs as the wire format, plus\n * `text/plain` SVG carrying the wire format embedded in a `<metadata>`\n * element: Chromium's DOM paste event exposes ONLY `text/plain`, and draw\n * puts metadata-bearing SVG there so draw→draw paste keeps full JSON\n * fidelity) and replays them as a paste through the hosting canvas's\n * adapter: parse →\n * `commitPaste` (fresh ids, cascade offset) → one undoable batch of\n * `InsertOp`s + a selection op. Mirrors `useClipboardOps.paste`'s op\n * construction exactly so OS-arriving pastes and in-memory pastes are\n * indistinguishable in history.\n *\n * Declines (leaving the event un-acted-on) when `ctx.clipboard` is absent\n * (consumer disabled it, or the adapter lacks `commitPaste`) or the payload\n * fails to parse. Note `runIngest` consumes items at *match* time, so\n * \"leave it for other handlers\" is the sniff's job: non-weasel `text/plain`\n * never matches and flows on to lower-priority handlers untouched.\n */\nimport type { NodeId } from 'core/scene/types';\nimport type { ClipboardSnapshot } from 'core/adapters/types';\nimport { materializePaste } from 'interactions/actions/clipboard/materializePaste';\nimport {\n WEASEL_CLIPBOARD_MIME,\n WEASEL_CLIPBOARD_MIME_WEB,\n sniffWeaselClipboardText,\n parseWeaselClipboardText,\n extractWeaselClipboardFromSvg,\n} from 'interactions/actions/clipboard/wireFormat';\nimport { dwarn } from '../../debug';\nimport type { ContentHandlerEntry, IngestCtx } from './contentHandlers';\n// Direct module import (not the ./index barrel) to avoid a cycle — the\n// barrel re-exports this handler.\nimport { sniffSvgText } from './svgHandler';\n\n/** text/plain SVG whose `<metadata>` carries a verified weasel payload —\n * the draw→draw DOM-paste flavor (Chromium exposes only text/plain there).\n * The `\"weaselClipboard\"` substring guard keeps match cheap on arbitrary\n * external SVG pastes before the extraction regex runs. */\nconst isMetadataBearingSvg = (text: string): boolean =>\n text.includes('\"weaselClipboard\"')\n && sniffSvgText(text)\n && extractWeaselClipboardFromSvg(text) !== null;\n\nexport const kitWeaselJsonHandler: ContentHandlerEntry = {\n id: 'kit:weasel-json',\n // Above the other kit handlers (-100/-90) so weasel payloads never fall\n // through to the SVG/text paths; still below consumer handlers (default 0).\n priority: -50,\n match: (item) =>\n item.kind === 'string'\n && (item.mime === WEASEL_CLIPBOARD_MIME\n || item.mime === WEASEL_CLIPBOARD_MIME_WEB\n || (item.mime === 'text/plain'\n && (sniffWeaselClipboardText(item.text) || isMetadataBearingSvg(item.text)))),\n handle(items, ctx: IngestCtx) {\n const clipboard = ctx.clipboard;\n if (!clipboard) {\n dwarn('clipboard', 'weasel payload arrived but ctx.clipboard is not wired (ingestion.clipboard disabled or absent) — declining');\n return;\n }\n if (!clipboard.adapter.commitPaste) {\n dwarn('clipboard', 'weasel payload arrived but the clipboard adapter lacks commitPaste — declining');\n return;\n }\n const item = items.find((it) => it.kind === 'string');\n if (!item || item.kind !== 'string') return;\n // The metadata-bearing-SVG flavor: unwrap the embedded payload before\n // parsing. Extraction was already verified at match time, so a null here\n // is the same inert-decline class as a corrupt custom-MIME payload.\n const text = sniffSvgText(item.text)\n ? extractWeaselClipboardFromSvg(item.text)\n : item.text;\n if (text === null) {\n dwarn('clipboard', 'weasel payload vanished from the SVG metadata between match and handle — declining');\n return;\n }\n const nodes = parseWeaselClipboardText(text, clipboard.reviver);\n if (nodes === null) {\n dwarn('clipboard', 'weasel payload unusable — declining (see prior warning if the parse threw)');\n return;\n }\n // Shared paste recipe (offset → commitPaste → InsertOps + selection op)\n // so OS-arriving pastes match useClipboardOps.paste exactly. `ctx.point`\n // is null for paste, so no dropPoint is threaded — the cascade offset is\n // the placement.\n const snapshot: ClipboardSnapshot = { items: nodes };\n const result = materializePaste(clipboard.adapter, snapshot, {\n currentSelection: ctx.selection.get(),\n });\n if (!result) return;\n ctx.applyOps(result.ops, 'Paste');\n ctx.selection.set(result.newIds as NodeId[]);\n // Flag the shared event ctx so kit:svg's text/plain fallback declines the\n // SVG flavor of this same copy (draw writes weasel-JSON + SVG together).\n // WARNING: do not add an `await` earlier in this handle — the flag must\n // be written before lower-priority handlers' microtasks run.\n ctx.consumedWeaselPayload = true;\n },\n};\n"],"mappings":";;;;;AA0CA,IAAMA,KAAwB,MAC5BC,EAAK,SAAS,qBAAmB,KAC9BC,EAAaD,CAAI,KACjBE,EAA8BF,CAAI,MAAM,MAEhCG,IAA4C;CACvD,IAAI;CAGJ,UAAU;CACV,QAAQ,MACNC,EAAK,SAAS,aACVA,EAAK,SAASC,KACbD,EAAK,SAASE,KACbF,EAAK,SAAS,iBACZG,EAAyBH,EAAK,IAAI,KAAKL,EAAqBK,EAAK,IAAI;CAC/E,OAAO,GAAO,GAAgB;EAC5B,IAAMI,IAAYC,EAAI;EACtB,IAAI,CAACD,GAAW;GACd,EAAM,aAAa,4GAA4G;GAC/H;EACF;EACA,IAAI,CAACA,EAAU,QAAQ,aAAa;GAClC,EAAM,aAAa,gFAAgF;GACnG;EACF;EACA,IAAMJ,IAAOM,EAAM,MAAM,MAAOC,EAAG,SAAS,QAAQ;EACpD,IAAI,CAACP,KAAQA,EAAK,SAAS,UAAU;EAIrC,IAAMJ,IAAOC,EAAaG,EAAK,IAAI,IAC/BF,EAA8BE,EAAK,IAAI,IACvCA,EAAK;EACT,IAAIJ,MAAS,MAAM;GACjB,EAAM,aAAa,oFAAoF;GACvG;EACF;EACA,IAAMY,IAAQC,EAAyBb,GAAMQ,EAAU,OAAO;EAC9D,IAAII,MAAU,MAAM;GAClB,EAAM,aAAa,4EAA4E;GAC/F;EACF;EAKA,IAAME,IAA8B,EAAE,OAAOF,EAAM,GAC7CG,IAASC,EAAiBR,EAAU,SAASM,GAAU,EAC3D,kBAAkBL,EAAI,UAAU,IAAI,EACtC,CAAC;EACD,AAAKM,MACLN,EAAI,SAASM,EAAO,KAAK,OAAO,GAChCN,EAAI,UAAU,IAAIM,EAAO,MAAkB,GAK3C,EAAI,wBAAwB;CAC9B;AACF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { accentColorOf as e } from "../../canvas/accentColor.js";
|
|
2
|
+
import { ellipsePath as t, polylineFromPoints as n } from "@weasel-js/geom";
|
|
3
|
+
//#region src/features/longPress/longPressFeedback.ts
|
|
4
|
+
var r = "long-press-feedback", i = 64, a = .3, o = () => performance.now();
|
|
5
|
+
function s() {
|
|
6
|
+
return typeof matchMedia == "function" && matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
7
|
+
}
|
|
8
|
+
function c(e, t, r, a) {
|
|
9
|
+
let o = Math.max(1, Math.ceil(i * a)), s = [];
|
|
10
|
+
for (let n = 0; n <= o; n++) {
|
|
11
|
+
let i = n / o * a * Math.PI * 2;
|
|
12
|
+
s.push({
|
|
13
|
+
x: e + r * Math.sin(i),
|
|
14
|
+
y: t - r * Math.cos(i)
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return n(s);
|
|
18
|
+
}
|
|
19
|
+
function l(e, n, r) {
|
|
20
|
+
return t({
|
|
21
|
+
x: e - r,
|
|
22
|
+
y: n - r,
|
|
23
|
+
width: 2 * r,
|
|
24
|
+
height: 2 * r
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
var u = (e) => e?.viewId ?? null;
|
|
28
|
+
function d(t = {}) {
|
|
29
|
+
let n = t.id ?? r, i = t.radius ?? 22, d = t.width ?? 3, f = t.delay ?? 120, p, m = "", h = !1, g = () => {
|
|
30
|
+
let e = p?.get();
|
|
31
|
+
return !!e && e.armed;
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
id: n,
|
|
35
|
+
eligibility: { always: !0 },
|
|
36
|
+
overlay: {
|
|
37
|
+
id: n,
|
|
38
|
+
label: "Long-press feedback",
|
|
39
|
+
space: "screen",
|
|
40
|
+
draw: (e) => {
|
|
41
|
+
let t = p?.get();
|
|
42
|
+
if (!p || !t || !t.armed || u(e) !== null) return [];
|
|
43
|
+
let n = o();
|
|
44
|
+
if (n - t.startedAt < f) return [];
|
|
45
|
+
let { x: r, y: s } = t.local, g = (e) => ({
|
|
46
|
+
paint: {
|
|
47
|
+
color: m,
|
|
48
|
+
...e === void 0 ? {} : { opacity: e }
|
|
49
|
+
},
|
|
50
|
+
width: { px: d },
|
|
51
|
+
cap: "round"
|
|
52
|
+
});
|
|
53
|
+
return h ? [{
|
|
54
|
+
kind: "path",
|
|
55
|
+
path: l(r, s, i),
|
|
56
|
+
stroke: g()
|
|
57
|
+
}] : [{
|
|
58
|
+
kind: "path",
|
|
59
|
+
path: l(r, s, i),
|
|
60
|
+
stroke: g(a)
|
|
61
|
+
}, {
|
|
62
|
+
kind: "path",
|
|
63
|
+
path: c(r, s, i, p.progress(n)),
|
|
64
|
+
stroke: g()
|
|
65
|
+
}];
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
attach: (n, r) => {
|
|
69
|
+
let i = r.get("longPress");
|
|
70
|
+
if (!i) return () => {};
|
|
71
|
+
p = i;
|
|
72
|
+
let a, c = () => {
|
|
73
|
+
clearTimeout(a), a = void 0;
|
|
74
|
+
let r = i.get();
|
|
75
|
+
if (r?.armed) {
|
|
76
|
+
m = typeof t.color == "function" ? t.color() : t.color ?? e(n.element), h = t.reducedMotion === "auto" || t.reducedMotion === void 0 ? s() : t.reducedMotion;
|
|
77
|
+
let i = f - (o() - r.startedAt);
|
|
78
|
+
h && i > 0 && (a = setTimeout(() => {
|
|
79
|
+
n.requestRedraw();
|
|
80
|
+
}, i));
|
|
81
|
+
}
|
|
82
|
+
n.requestRedraw();
|
|
83
|
+
}, l = i.subscribe(c);
|
|
84
|
+
return c(), () => {
|
|
85
|
+
l(), clearTimeout(a), p = void 0, n.requestRedraw();
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
afterPaint: (e) => {
|
|
89
|
+
!h && g() && e.requestFrame();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//#endregion
|
|
94
|
+
export { r as LONG_PRESS_FEEDBACK_ID, d as createLongPressFeedbackContribution };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=longPressFeedback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"longPressFeedback.js","names":["LONG_PRESS_FEEDBACK_ID","RING_SEGMENTS","TRACK_OPACITY","nowMs","prefersReducedMotion","arcPath","n","t","pts","i","a","cx","cy","polylineFromPoints","circlePath","ellipsePath","viewIdOf","data","createLongPressFeedbackContribution","id","opts","radius","width","delay","state","color","reduced","showing","p","now","stroke","opacity","x","y","store","deps","appear","onChange","accentColorOf","api","wait","offStore","ctx"],"sources":["../../../src/features/longPress/longPressFeedback.ts"],"sourcesContent":["/**\n * The default \"press is registering\" feedback for a touch or pen long-press: a\n * ring around the press point that fills over the hold. It reads the `longPress`\n * dep the gesture dispatcher publishes, so it shows only for a press some\n * binding would fire on, and disappears when the press fires, moves past the\n * drag threshold, lifts, or is canceled.\n */\nimport type { LongPressState } from '@weasel-js/routing';\nimport type { RenderLayer } from 'core/layers/render';\nimport { ellipsePath, polylineFromPoints, type Path } from '@weasel-js/geom';\nimport type { DrawCommand } from '../../renderer';\nimport type { CanvasExtensionApi } from '../../canvas/canvasExtension';\nimport type { ContributionDepReader, SurfaceContribution } from '../../canvas/surfaceContribution';\nimport { accentColorOf } from '../../canvas/accentColor';\n\n/** Entry and layer id of the default feedback, so a host can find or order it. */\nexport const LONG_PRESS_FEEDBACK_ID = 'long-press-feedback';\n\n/** Options for {@link createLongPressFeedbackContribution}. */\nexport interface LongPressFeedbackOptions {\n /** Entry and layer id. Default {@link LONG_PRESS_FEEDBACK_ID}. */\n id?: string;\n /** Ring radius in CSS pixels. Default 22 — clear of a fingertip. */\n radius?: number;\n /** Ring stroke width in CSS pixels. Default 3. */\n width?: number;\n /** Ring color. Default the theme's `--wzl-accent`, read off the canvas\n * element when each press starts. */\n color?: string | (() => string);\n /** How long a press is held before the ring appears, in ms, so an ordinary\n * tap shows nothing. Default 120. */\n delay?: number;\n /** `true` shows a static full ring instead of one that fills, and runs no\n * frame loop. Default `'auto'`: follow `prefers-reduced-motion`, read when\n * each press starts. */\n reducedMotion?: boolean | 'auto';\n}\n\nconst RING_SEGMENTS = 64;\nconst TRACK_OPACITY = 0.3;\n\nconst nowMs = (): number => performance.now();\n\nfunction prefersReducedMotion(): boolean {\n return typeof matchMedia === 'function'\n && matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/** An open arc from 12 o'clock, clockwise on a y-down screen, through `t` of a turn. */\nfunction arcPath(cx: number, cy: number, r: number, t: number): Path {\n const n = Math.max(1, Math.ceil(RING_SEGMENTS * t));\n const pts: { x: number; y: number }[] = [];\n for (let i = 0; i <= n; i++) {\n const a = (i / n) * t * Math.PI * 2;\n pts.push({ x: cx + r * Math.sin(a), y: cy - r * Math.cos(a) });\n }\n return polylineFromPoints(pts);\n}\n\nfunction circlePath(cx: number, cy: number, r: number): Path {\n return ellipsePath({ x: cx - r, y: cy - r, width: 2 * r, height: 2 * r });\n}\n\nconst viewIdOf = (data: unknown): string | null =>\n (data as { viewId?: string | null } | null)?.viewId ?? null;\n\n/**\n * The default long-press feedback, as one entry. `<SceneCanvas>` installs it\n * unless `longPress={{ feedback: false }}`; pass a contribution of your own there to\n * replace it — it reads the same `longPress` dep this one does.\n */\nexport function createLongPressFeedbackContribution(\n opts: LongPressFeedbackOptions = {},\n): SurfaceContribution {\n const id = opts.id ?? LONG_PRESS_FEEDBACK_ID;\n const radius = opts.radius ?? 22;\n const width = opts.width ?? 3;\n const delay = opts.delay ?? 120;\n\n let state: LongPressState | undefined;\n let color = '';\n let reduced = false;\n\n const showing = (): boolean => {\n const p = state?.get();\n return !!p && p.armed;\n };\n\n const layer: RenderLayer<unknown> = {\n id,\n label: 'Long-press feedback',\n space: 'screen',\n draw: (data): DrawCommand[] => {\n const p = state?.get();\n // Screen space is the whole canvas, so the root pass draws the ring\n // wherever the press routed; a view pass drawing it too would double it.\n if (!state || !p || !p.armed || viewIdOf(data) !== null) return [];\n const now = nowMs();\n if (now - p.startedAt < delay) return [];\n const { x, y } = p.local;\n const stroke = (opacity?: number) => ({\n paint: { color, ...(opacity !== undefined ? { opacity } : {}) },\n width: { px: width },\n cap: 'round' as const,\n });\n if (reduced) return [{ kind: 'path', path: circlePath(x, y, radius), stroke: stroke() }];\n return [\n { kind: 'path', path: circlePath(x, y, radius), stroke: stroke(TRACK_OPACITY) },\n { kind: 'path', path: arcPath(x, y, radius, state.progress(now)), stroke: stroke() },\n ];\n },\n };\n\n const attach = (api: CanvasExtensionApi, deps: ContributionDepReader): (() => void) => {\n const store = deps.get('longPress');\n if (!store) return () => {};\n state = store;\n let appear: ReturnType<typeof setTimeout> | undefined;\n\n const onChange = (): void => {\n clearTimeout(appear);\n appear = undefined;\n const p = store.get();\n if (p?.armed) {\n color = typeof opts.color === 'function' ? opts.color() : (opts.color ?? accentColorOf(api.element));\n reduced = opts.reducedMotion === 'auto' || opts.reducedMotion === undefined\n ? prefersReducedMotion()\n : opts.reducedMotion;\n // A static ring changes once, when it appears; nothing needs frames.\n const wait = delay - (nowMs() - p.startedAt);\n if (reduced && wait > 0) appear = setTimeout(() => { api.requestRedraw(); }, wait);\n }\n api.requestRedraw();\n };\n\n const offStore = store.subscribe(onChange);\n onChange();\n return () => {\n offStore();\n clearTimeout(appear);\n state = undefined;\n api.requestRedraw();\n };\n };\n\n return {\n id,\n eligibility: { always: true },\n overlay: layer,\n attach,\n // The filling ring asks for the next frame from each painted one while it shows.\n afterPaint: (ctx) => {\n if (!reduced && showing()) ctx.requestFrame();\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { resolveColor as e } from "../../renderer/math/color.js";
|
|
2
|
+
import { evalPatch as t, isValidPatch as n, patchBounds as r } from "./surface.js";
|
|
3
|
+
import { lerpColorArray as i } from "@weasel-js/paint";
|
|
4
|
+
//#region src/features/meshPaint/bake.ts
|
|
5
|
+
var a = 256, o = 10;
|
|
6
|
+
function s(e) {
|
|
7
|
+
return Math.max(24, Math.ceil(e / o));
|
|
8
|
+
}
|
|
9
|
+
function c(e) {
|
|
10
|
+
let t = Infinity, i = Infinity, a = -Infinity, o = -Infinity;
|
|
11
|
+
for (let s of e) {
|
|
12
|
+
if (!n(s)) continue;
|
|
13
|
+
let e = r(s);
|
|
14
|
+
t = Math.min(t, e.x), i = Math.min(i, e.y), a = Math.max(a, e.x + e.width), o = Math.max(o, e.y + e.height);
|
|
15
|
+
}
|
|
16
|
+
return !Number.isFinite(t) || a <= t || o <= i ? null : {
|
|
17
|
+
x: t,
|
|
18
|
+
y: i,
|
|
19
|
+
width: a - t,
|
|
20
|
+
height: o - i
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function l(e, t, n, r) {
|
|
24
|
+
let a = i(e[0], e[1], t, r), o = i(e[3], e[2], t, r);
|
|
25
|
+
return i(a, o, n, r);
|
|
26
|
+
}
|
|
27
|
+
function u(r, i = "rgb", o = a) {
|
|
28
|
+
let u = c(r);
|
|
29
|
+
if (!u) return null;
|
|
30
|
+
let f = new Uint8ClampedArray(o * o * 4), p = s(o), m = (e) => ({
|
|
31
|
+
x: (e.x - u.x) / u.width * (o - 1) + .5,
|
|
32
|
+
y: (e.y - u.y) / u.height * (o - 1) + .5
|
|
33
|
+
});
|
|
34
|
+
for (let a of r) {
|
|
35
|
+
if (!n(a)) continue;
|
|
36
|
+
let r = a.colors.map((t) => e(t));
|
|
37
|
+
for (let e = 0; e < p; e++) for (let n = 0; n < p; n++) {
|
|
38
|
+
let s = e / p, c = (e + 1) / p, u = n / p, h = (n + 1) / p, g = [
|
|
39
|
+
{
|
|
40
|
+
at: m(t(a, s, u)),
|
|
41
|
+
color: l(r, s, u, i)
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
at: m(t(a, c, u)),
|
|
45
|
+
color: l(r, c, u, i)
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
at: m(t(a, c, h)),
|
|
49
|
+
color: l(r, c, h, i)
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
at: m(t(a, s, h)),
|
|
53
|
+
color: l(r, s, h, i)
|
|
54
|
+
}
|
|
55
|
+
];
|
|
56
|
+
d(f, o, g[0], g[1], g[2]), d(f, o, g[0], g[2], g[3]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
pixels: f,
|
|
61
|
+
size: o,
|
|
62
|
+
box: u
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function d(e, t, n, r, i) {
|
|
66
|
+
let a = Math.max(0, Math.floor(Math.min(n.at.x, r.at.x, i.at.x))), o = Math.min(t - 1, Math.ceil(Math.max(n.at.x, r.at.x, i.at.x))), s = Math.max(0, Math.floor(Math.min(n.at.y, r.at.y, i.at.y))), c = Math.min(t - 1, Math.ceil(Math.max(n.at.y, r.at.y, i.at.y)));
|
|
67
|
+
if (o < a || c < s) return;
|
|
68
|
+
let l = (r.at.x - n.at.x) * (i.at.y - n.at.y) - (i.at.x - n.at.x) * (r.at.y - n.at.y);
|
|
69
|
+
if (!(Math.abs(l) < 1e-9)) for (let u = s; u <= c; u++) for (let s = a; s <= o; s++) {
|
|
70
|
+
let a = s + .5, o = u + .5, c = ((r.at.x - a) * (i.at.y - o) - (i.at.x - a) * (r.at.y - o)) / l, d = ((i.at.x - a) * (n.at.y - o) - (n.at.x - a) * (i.at.y - o)) / l, f = 1 - c - d;
|
|
71
|
+
if (c < -1e-6 || d < -1e-6 || f < -1e-6) continue;
|
|
72
|
+
let p = (u * t + s) * 4;
|
|
73
|
+
for (let t = 0; t < 4; t++) e[p + t] = (c * n.color[t] + d * r.color[t] + f * i.color[t]) * 255;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//#endregion
|
|
77
|
+
export { a as MESH_BAKE_SIZE, u as bakeMesh, c as meshBounds };
|
|
78
|
+
|
|
79
|
+
//# sourceMappingURL=bake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bake.js","names":["MESH_BAKE_SIZE","TEXELS_PER_CELL","gridFor","size","meshBounds","minX","minY","maxX","maxY","patch","patches","isValidPatch","b","patchBounds","colorAt","bottom","lerpColorArray","corners","u","space","top","v","bakeMesh","box","pixels","grid","toTexel","p","resolveColor","c","i","j","u0","u1","v0","v1","quad","evalPatch","fillTriangle","a","area","y","x","px","py","w0","w1","w2","k","ch"],"sources":["../../../src/features/meshPaint/bake.ts"],"sourcesContent":["/**\n * A mesh paint baked into one RGBA bitmap.\n *\n * A patch is a surface over `(u, v)`, but a paint has to answer \"what color is\n * this fragment\", which is the inverse question — and inverting a bicubic is\n * Newton iteration per fragment. Every renderer that draws these instead\n * subdivides the patch into small quads and rasterizes them forward, which is\n * what this does, once per paint, into a texture the shader then samples. The\n * cost is a texture and a resolution; the gain is that the paint composes with\n * every fill the renderer already knows how to draw, clipping included.\n *\n * The bitmap is straight (non-premultiplied) RGBA, matching the ramp atlas;\n * the fragment shader premultiplies.\n */\n\nimport { resolveColor } from '../../renderer/math/color';\nimport { lerpColorArray, type ColorSpace } from '@weasel-js/paint';\nimport { evalPatch, isValidPatch, patchBounds, type MeshPatch } from './surface';\n\n/** Texels on a side of a bake when the caller names no size. The renderer\n * sizes each bake from how large the paint draws — see `meshBakeSize`. */\nexport const MESH_BAKE_SIZE = 256;\n\n/** Texels a rasterized cell spans at most. The rasterizer interpolates color\n * linearly inside a cell and draws a curved edge as its chord, so this is\n * what keeps a perceptual blend perceptual and an edge curved at any size. */\nconst TEXELS_PER_CELL = 10;\n\n/** Quads per patch on a side, never fewer than 24. */\nfunction gridFor(size: number): number {\n return Math.max(24, Math.ceil(size / TEXELS_PER_CELL));\n}\n\n/** The box a bake covers, in the paint's own space. */\nexport interface MeshBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** The bitmap `bakeMesh` produces, and the paint-space box it covers. */\nexport interface BakedMesh {\n /** `size` × `size` texels, straight RGBA. */\n pixels: Uint8ClampedArray;\n /** Texels on a side; `MESH_BAKE_SIZE` unless the caller asked otherwise. */\n size: number;\n /** Where the bitmap sits in paint space, which is what the shader maps a\n * fragment through. */\n box: MeshBox;\n}\n\n/** The union of every patch's bounds, or `null` when nothing is drawable. */\nexport function meshBounds(patches: readonly MeshPatch[]): MeshBox | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const patch of patches) {\n if (!isValidPatch(patch)) continue;\n const b = patchBounds(patch);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n if (!Number.isFinite(minX) || maxX <= minX || maxY <= minY) return null;\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\ntype Rgba = readonly [number, number, number, number];\n\n/**\n * Corner colors blended at `(u, v)` in `space`.\n *\n * Bilinear as three lerps rather than four weights, because a perceptual space\n * has a midpoint between two colors and no meaningful four-way mix — OKLCh's\n * hue in particular is an arc, which only two endpoints define.\n */\nfunction colorAt(corners: Rgba[], u: number, v: number, space: ColorSpace): number[] {\n const bottom = lerpColorArray(corners[0], corners[1], u, space);\n const top = lerpColorArray(corners[3], corners[2], u, space);\n return lerpColorArray(bottom, top, v, space);\n}\n\n/**\n * Rasterize `patches` into a square bitmap covering their union.\n *\n * Returns `null` when no patch is drawable, which is the caller's cue to paint\n * nothing rather than a blank square.\n */\nexport function bakeMesh(\n patches: readonly MeshPatch[],\n space: ColorSpace = 'rgb',\n size: number = MESH_BAKE_SIZE,\n): BakedMesh | null {\n const box = meshBounds(patches);\n if (!box) return null;\n\n const pixels = new Uint8ClampedArray(size * size * 4);\n const grid = gridFor(size);\n // The box maps onto texel *centers*, not texel edges: a corner of the mesh\n // lands at the center of the corner texel, so the outermost row and column\n // are covered rather than half-missed by a rasterizer testing centers.\n const toTexel = (p: { x: number; y: number }): { x: number; y: number } => ({\n x: ((p.x - box.x) / box.width) * (size - 1) + 0.5,\n y: ((p.y - box.y) / box.height) * (size - 1) + 0.5,\n });\n\n for (const patch of patches) {\n if (!isValidPatch(patch)) continue;\n const corners = patch.colors.map((c) => resolveColor(c)) as Rgba[];\n\n for (let i = 0; i < grid; i++) {\n for (let j = 0; j < grid; j++) {\n const u0 = i / grid;\n const u1 = (i + 1) / grid;\n const v0 = j / grid;\n const v1 = (j + 1) / grid;\n const quad = [\n { at: toTexel(evalPatch(patch, u0, v0)), color: colorAt(corners, u0, v0, space) },\n { at: toTexel(evalPatch(patch, u1, v0)), color: colorAt(corners, u1, v0, space) },\n { at: toTexel(evalPatch(patch, u1, v1)), color: colorAt(corners, u1, v1, space) },\n { at: toTexel(evalPatch(patch, u0, v1)), color: colorAt(corners, u0, v1, space) },\n ];\n fillTriangle(pixels, size, quad[0], quad[1], quad[2]);\n fillTriangle(pixels, size, quad[0], quad[2], quad[3]);\n }\n }\n }\n\n return { pixels, size, box };\n}\n\ninterface Vertex {\n at: { x: number; y: number };\n color: number[];\n}\n\nconst EDGE_EPS = 1e-6;\n\n/**\n * One triangle, barycentric, colors interpolated across it.\n *\n * Neighboring cells share an edge, so a pixel exactly on one is claimed by\n * both — harmless here because both carry the same color there, and cheaper\n * than a fill rule.\n */\nfunction fillTriangle(\n pixels: Uint8ClampedArray, size: number, a: Vertex, b: Vertex, c: Vertex,\n): void {\n const minX = Math.max(0, Math.floor(Math.min(a.at.x, b.at.x, c.at.x)));\n const maxX = Math.min(size - 1, Math.ceil(Math.max(a.at.x, b.at.x, c.at.x)));\n const minY = Math.max(0, Math.floor(Math.min(a.at.y, b.at.y, c.at.y)));\n const maxY = Math.min(size - 1, Math.ceil(Math.max(a.at.y, b.at.y, c.at.y)));\n if (maxX < minX || maxY < minY) return;\n\n const area = (b.at.x - a.at.x) * (c.at.y - a.at.y) - (c.at.x - a.at.x) * (b.at.y - a.at.y);\n // A degenerate cell — a patch collapsed to a line — covers nothing.\n if (Math.abs(area) < 1e-9) return;\n\n for (let y = minY; y <= maxY; y++) {\n for (let x = minX; x <= maxX; x++) {\n const px = x + 0.5;\n const py = y + 0.5;\n const w0 = ((b.at.x - px) * (c.at.y - py) - (c.at.x - px) * (b.at.y - py)) / area;\n const w1 = ((c.at.x - px) * (a.at.y - py) - (a.at.x - px) * (c.at.y - py)) / area;\n const w2 = 1 - w0 - w1;\n // An edge texel's center sits exactly on the boundary, where rounding\n // can put it a hair outside; the epsilon is what keeps the border row\n // from dropping out.\n if (w0 < -EDGE_EPS || w1 < -EDGE_EPS || w2 < -EDGE_EPS) continue;\n const k = (y * size + x) * 4;\n for (let ch = 0; ch < 4; ch++) {\n pixels[k + ch] = (w0 * a.color[ch] + w1 * b.color[ch] + w2 * c.color[ch]) * 255;\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { MESH_BAKE_SIZE as e } from "./bake.js";
|
|
2
|
+
//#region src/features/meshPaint/bakeCache.ts
|
|
3
|
+
var t = 32, n = 2048, r = 67108864, i = 256;
|
|
4
|
+
function a(r, i) {
|
|
5
|
+
let a = Math.min(n, o(i));
|
|
6
|
+
return Number.isNaN(r) ? Math.min(e, a) : r <= t ? Math.min(t, a) : r >= a ? a : Math.min(a, 2 ** Math.ceil(Math.log2(r)));
|
|
7
|
+
}
|
|
8
|
+
function o(e) {
|
|
9
|
+
return e >= 1 ? Number.isFinite(e) ? 2 ** Math.floor(Math.log2(e)) : n : t;
|
|
10
|
+
}
|
|
11
|
+
var s = class {
|
|
12
|
+
free;
|
|
13
|
+
budgetBytes;
|
|
14
|
+
maxEntries;
|
|
15
|
+
byPaint = /* @__PURE__ */ new WeakMap();
|
|
16
|
+
order = /* @__PURE__ */ new Set();
|
|
17
|
+
held = 0;
|
|
18
|
+
constructor(e, t = r, n = i) {
|
|
19
|
+
this.free = e, this.budgetBytes = t, this.maxEntries = n;
|
|
20
|
+
}
|
|
21
|
+
get bytes() {
|
|
22
|
+
return this.held;
|
|
23
|
+
}
|
|
24
|
+
get size() {
|
|
25
|
+
return this.order.size;
|
|
26
|
+
}
|
|
27
|
+
get(e, t) {
|
|
28
|
+
let n = this.byPaint.get(e)?.get(t);
|
|
29
|
+
if (n) return this.order.delete(n), this.order.add(n), n.value;
|
|
30
|
+
}
|
|
31
|
+
set(e, t, n) {
|
|
32
|
+
let r = this.byPaint.get(e);
|
|
33
|
+
r || (r = /* @__PURE__ */ new Map(), this.byPaint.set(e, r));
|
|
34
|
+
let i = r.get(t);
|
|
35
|
+
i && this.drop(i);
|
|
36
|
+
let a = {
|
|
37
|
+
value: n,
|
|
38
|
+
size: t,
|
|
39
|
+
bySize: r
|
|
40
|
+
};
|
|
41
|
+
r.set(t, a), this.order.add(a), this.held += t * t * 4, this.evict(a);
|
|
42
|
+
}
|
|
43
|
+
clear() {
|
|
44
|
+
for (let e of [...this.order]) this.drop(e);
|
|
45
|
+
}
|
|
46
|
+
evict(e) {
|
|
47
|
+
for (let t of this.order) {
|
|
48
|
+
if (this.held <= this.budgetBytes && this.order.size <= this.maxEntries) return;
|
|
49
|
+
t !== e && this.drop(t);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
drop(e) {
|
|
53
|
+
this.order.delete(e) && (e.bySize.delete(e.size), this.held -= e.size * e.size * 4, this.free(e.value));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { r as MESH_BAKE_CACHE_BYTES, i as MESH_BAKE_CACHE_ENTRIES, n as MESH_BAKE_MAX, t as MESH_BAKE_MIN, s as MeshBakeCache, a as meshBakeSize };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=bakeCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bakeCache.js","names":["MESH_BAKE_MIN","MESH_BAKE_MAX","MESH_BAKE_CACHE_BYTES","MESH_BAKE_CACHE_ENTRIES","meshBakeSize","ceiling","floorPow2","maxTextureSize","devicePx","MESH_BAKE_SIZE","n","MeshBakeCache","free","budgetBytes","maxEntries","entry","paint","size","bySize","old","keep"],"sources":["../../../src/features/meshPaint/bakeCache.ts"],"sourcesContent":["/**\n * How large a mesh bake is, and the bounded cache the bakes live in.\n *\n * A gradient's ramp is one-dimensional, so 256 texels cover it at any size. A\n * mesh's bake is two-dimensional and is stretched over whatever the paint\n * covers, so a fixed size shows its texels once the paint draws large. The\n * bake is sized from the device pixels it covers instead, in power-of-two\n * buckets so a zoom inside one bucket reuses the bake it already has.\n */\n\nimport { MESH_BAKE_SIZE } from './bake';\n\n/** The smallest bake: below this a texture costs more in bookkeeping than in\n * bytes. */\nexport const MESH_BAKE_MIN = 32;\n\n/** The largest bake, whatever the context allows: 16 MiB of RGBA, and a bake\n * that already takes a noticeable moment on the CPU. */\nexport const MESH_BAKE_MAX = 2048;\n\n/** Bytes of baked texture one renderer keeps before evicting the least\n * recently drawn. */\nexport const MESH_BAKE_CACHE_BYTES = 64 * 1024 * 1024;\n\n/** Bakes one renderer keeps, however small, so a scene of many tiny meshes\n * cannot hold thousands of GL textures. */\nexport const MESH_BAKE_CACHE_ENTRIES = 256;\n\n/**\n * The bake side for a paint drawn `devicePx` device pixels across, on a\n * context accepting `maxTextureSize`: the next power of two at or above it,\n * clamped to `[MESH_BAKE_MIN, MESH_BAKE_MAX]` and to the context. A size that\n * cannot be measured gets `MESH_BAKE_SIZE`.\n */\nexport function meshBakeSize(devicePx: number, maxTextureSize: number): number {\n const ceiling = Math.min(MESH_BAKE_MAX, floorPow2(maxTextureSize));\n if (Number.isNaN(devicePx)) return Math.min(MESH_BAKE_SIZE, ceiling);\n if (devicePx <= MESH_BAKE_MIN) return Math.min(MESH_BAKE_MIN, ceiling);\n if (devicePx >= ceiling) return ceiling;\n return Math.min(ceiling, 2 ** Math.ceil(Math.log2(devicePx)));\n}\n\nfunction floorPow2(n: number): number {\n if (!(n >= 1)) return MESH_BAKE_MIN;\n if (!Number.isFinite(n)) return MESH_BAKE_MAX;\n return 2 ** Math.floor(Math.log2(n));\n}\n\ninterface Entry<T> {\n value: T;\n size: number;\n /** The paint's own bucket map, which is what eviction removes it from. */\n bySize: Map<number, Entry<T>>;\n}\n\n/**\n * Bakes keyed by paint and bake size, least recently used first out.\n *\n * The paint is held weakly, so a paint nobody draws any more does not pin its\n * key; its texture stays until eviction reaches it, which the bounds keep\n * finite. `free` runs for every value that leaves, by eviction, replacement or\n * `clear`.\n */\nexport class MeshBakeCache<T> {\n private readonly byPaint = new WeakMap<object, Map<number, Entry<T>>>();\n /** Insertion order is recency: a hit is deleted and re-added. */\n private readonly order = new Set<Entry<T>>();\n private held = 0;\n\n constructor(\n private readonly free: (value: T) => void,\n private readonly budgetBytes: number = MESH_BAKE_CACHE_BYTES,\n private readonly maxEntries: number = MESH_BAKE_CACHE_ENTRIES,\n ) {}\n\n /** Bytes the held bakes occupy, as RGBA8. */\n get bytes(): number { return this.held; }\n\n /** Bakes held. */\n get size(): number { return this.order.size; }\n\n get(paint: object, size: number): T | undefined {\n const entry = this.byPaint.get(paint)?.get(size);\n if (!entry) return undefined;\n this.order.delete(entry);\n this.order.add(entry);\n return entry.value;\n }\n\n set(paint: object, size: number, value: T): void {\n let bySize = this.byPaint.get(paint);\n if (!bySize) {\n bySize = new Map();\n this.byPaint.set(paint, bySize);\n }\n const old = bySize.get(size);\n if (old) this.drop(old);\n const entry: Entry<T> = { value, size, bySize };\n bySize.set(size, entry);\n this.order.add(entry);\n this.held += size * size * 4;\n this.evict(entry);\n }\n\n /** Free every bake. The cache stays usable. */\n clear(): void {\n for (const entry of [...this.order]) this.drop(entry);\n }\n\n /** Oldest first until both bounds hold, never evicting `keep` — the bake\n * the caller is about to draw. */\n private evict(keep: Entry<T>): void {\n for (const entry of this.order) {\n if (this.held <= this.budgetBytes && this.order.size <= this.maxEntries) return;\n if (entry !== keep) this.drop(entry);\n }\n }\n\n private drop(entry: Entry<T>): void {\n if (!this.order.delete(entry)) return;\n entry.bySize.delete(entry.size);\n this.held -= entry.size * entry.size * 4;\n this.free(entry.value);\n }\n}\n"],"mappings":";;AAcA,IAAaA,IAAgB,IAIhBC,IAAgB,MAIhBC,IAAwB,UAIxBC,IAA0B;AAQvC,SAAgBC,EAAa,GAAkB,GAAgC;CAC7E,IAAMC,IAAU,KAAK,IAAIJ,GAAeK,EAAUC,CAAc,CAAC;CAIjE,OAHI,OAAO,MAAMC,CAAQ,IAAU,KAAK,IAAIC,GAAgBJ,CAAO,IAC/DG,KAAYR,IAAsB,KAAK,IAAIA,GAAeK,CAAO,IACjEG,KAAYH,IAAgBA,IACzB,KAAK,IAAIA,GAAS,KAAK,KAAK,KAAK,KAAK,KAAKG,CAAQ,CAAC,CAAC;AAC9D;AAEA,SAASF,EAAU,GAAmB;CAGpC,OAFMI,KAAK,IACN,OAAO,SAASA,CAAC,IACf,KAAK,KAAK,MAAM,KAAK,KAAKA,CAAC,CAAC,IADHT,IADVD;AAGxB;AAiBA,IAAaW,IAAb,MAA8B;CAOT;CACA;CACA;CARnB,0BAA2B,IAAI,QAAuC;CAEtE,wBAAyB,IAAI,IAAc;CAC3C,OAAe;CAEf,YACE,GACA,IAAuCT,GACvC,IAAsCC,GACtC;EADiB,AAFA,KAAA,OAAAS,GACA,KAAA,cAAAC,GACA,KAAA,aAAAC;CAChB;CAGH,IAAI,QAAgB;EAAE,OAAO,KAAK;CAAM;CAGxC,IAAI,OAAe;EAAE,OAAO,KAAK,MAAM;CAAM;CAE7C,IAAI,GAAe,GAA6B;EAC9C,IAAMC,IAAQ,KAAK,QAAQ,IAAIC,CAAK,CAAC,EAAE,IAAIC,CAAI;EAC/C,IAAKF,GAGL,OAFA,KAAK,MAAM,OAAOA,CAAK,GACvB,KAAK,MAAM,IAAIA,CAAK,GACbA,EAAM;CACf;CAEA,IAAI,GAAe,GAAc,GAAgB;EAC/C,IAAIG,IAAS,KAAK,QAAQ,IAAIF,CAAK;EACnC,AAAKE,MACH,oBAAS,IAAI,IAAI,GACjB,KAAK,QAAQ,IAAIF,GAAOE,CAAM;EAEhC,IAAMC,IAAMD,EAAO,IAAID,CAAI;EAC3B,AAAIE,KAAK,KAAK,KAAKA,CAAG;EACtB,IAAMJ,IAAkB;GAAE;GAAO;GAAM;EAAO;EAI9C,AAHAG,EAAO,IAAID,GAAMF,CAAK,GACtB,KAAK,MAAM,IAAIA,CAAK,GACpB,KAAK,QAAQE,IAAOA,IAAO,GAC3B,KAAK,MAAMF,CAAK;CAClB;CAGA,QAAc;EACZ,KAAK,IAAMA,KAAS,CAAC,GAAG,KAAK,KAAK,GAAG,KAAK,KAAKA,CAAK;CACtD;CAIA,MAAc,GAAsB;EAClC,KAAK,IAAMA,KAAS,KAAK,OAAO;GAC9B,IAAI,KAAK,QAAQ,KAAK,eAAe,KAAK,MAAM,QAAQ,KAAK,YAAY;GACzE,AAAIA,MAAUK,KAAM,KAAK,KAAKL,CAAK;EACrC;CACF;CAEA,KAAa,GAAuB;EAClC,AAAK,KAAK,MAAM,OAAOA,CAAK,MAC5BA,EAAM,OAAO,OAAOA,EAAM,IAAI,GAC9B,KAAK,QAAQA,EAAM,OAAOA,EAAM,OAAO,GACvC,KAAK,KAAKA,EAAM,KAAK;CACvB;AACF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isTensorPatch as e, isValidPatch as t } from "./surface.js";
|
|
2
|
+
//#region src/features/meshPaint/handles.ts
|
|
3
|
+
var n = [
|
|
4
|
+
12,
|
|
5
|
+
15,
|
|
6
|
+
14,
|
|
7
|
+
13
|
|
8
|
+
];
|
|
9
|
+
function r(e) {
|
|
10
|
+
return e >= 12 ? "interior" : e % 3 == 0 ? "corner" : "control";
|
|
11
|
+
}
|
|
12
|
+
function i(e, t) {
|
|
13
|
+
return Math.abs(e - t) <= 1e-9 * Math.max(1, Math.abs(e), Math.abs(t));
|
|
14
|
+
}
|
|
15
|
+
function a(e, t) {
|
|
16
|
+
return i(e.x, t.x) && i(e.y, t.y);
|
|
17
|
+
}
|
|
18
|
+
function o(e) {
|
|
19
|
+
let n = [];
|
|
20
|
+
return e.patches.forEach((e, i) => {
|
|
21
|
+
t(e) && e.points.forEach((e, t) => {
|
|
22
|
+
let o = r(t), s = n.find((t) => t.kind === o && a(t.at, e));
|
|
23
|
+
s ? s.refs.push({
|
|
24
|
+
patch: i,
|
|
25
|
+
index: t
|
|
26
|
+
}) : n.push({
|
|
27
|
+
id: `${i}:${t}`,
|
|
28
|
+
kind: o,
|
|
29
|
+
at: e,
|
|
30
|
+
refs: [{
|
|
31
|
+
patch: i,
|
|
32
|
+
index: t
|
|
33
|
+
}]
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}), n;
|
|
37
|
+
}
|
|
38
|
+
function s(t, r) {
|
|
39
|
+
let i = r / 3, a = [r + 1, (r + 11) % 12];
|
|
40
|
+
return e(t) && a.push(n[i]), a;
|
|
41
|
+
}
|
|
42
|
+
function c(e, t, n) {
|
|
43
|
+
let r = n.x - t.at.x, i = n.y - t.at.y, a = /* @__PURE__ */ new Map();
|
|
44
|
+
for (let { patch: e, index: r } of t.refs) a.set(`${e}:${r}`, n);
|
|
45
|
+
if (t.kind === "corner") for (let { patch: n, index: o } of t.refs) for (let t of s(e.patches[n], o)) {
|
|
46
|
+
let o = `${n}:${t}`;
|
|
47
|
+
if (a.has(o)) continue;
|
|
48
|
+
let s = e.patches[n].points[t];
|
|
49
|
+
a.set(o, {
|
|
50
|
+
x: s.x + r,
|
|
51
|
+
y: s.y + i
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
...e,
|
|
56
|
+
patches: e.patches.map((e, t) => ({
|
|
57
|
+
...e,
|
|
58
|
+
points: e.points.map((e, n) => a.get(`${t}:${n}`) ?? e)
|
|
59
|
+
}))
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
function l(e) {
|
|
63
|
+
let n = [], r = [];
|
|
64
|
+
for (let i of e.patches) {
|
|
65
|
+
if (!t(i)) continue;
|
|
66
|
+
let e = i.points;
|
|
67
|
+
for (let t = 0; t < 4; t++) {
|
|
68
|
+
let a = t * 3;
|
|
69
|
+
n.push([
|
|
70
|
+
e[a],
|
|
71
|
+
e[a + 1],
|
|
72
|
+
e[a + 2],
|
|
73
|
+
e[(a + 3) % 12]
|
|
74
|
+
]);
|
|
75
|
+
for (let t of s(i, a)) r.push([e[a], e[t]]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
edges: n,
|
|
80
|
+
arms: r
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { l as meshGuides, o as meshHandles, c as moveMeshHandle };
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=handles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handles.js","names":["INTERIOR_OF_CORNER","kindOf","index","near","a","b","same","meshHandles","handles","mesh","isValidPatch","patch","kind","twin","h","at","p","carriedBy","k","corner","carried","isTensorPatch","moveMeshHandle","dx","to","handle","dy","placed","key","from","i","point","meshGuides","edges","arms"],"sources":["../../../src/features/meshPaint/handles.ts"],"sourcesContent":["/**\n * The draggable points of a mesh paint, as pure geometry — what an on-canvas\n * editor lists, and what moving one of them does to the paint.\n *\n * Nothing here knows a frame: the handles are in whatever space the mesh's\n * points are, so a caller resolves a `'bounds'` mesh onto its box first\n * (`fillInPoseFrame`) and normalizes the result back (`fillToBoundsFrame`).\n */\n\nimport type { MeshGradientFill } from './meshPaint';\nimport { isTensorPatch, isValidPatch, type MeshPatch, type MeshPoint } from './surface';\n\n/** What a handle moves: a patch corner, one of the two controls of an edge,\n * or one of a tensor patch's four interior points. */\nexport type MeshHandleKind = 'corner' | 'control' | 'interior';\n\n/** One stored point: `patches[patch].points[index]`. */\nexport interface MeshPointRef {\n patch: number;\n index: number;\n}\n\n/**\n * One draggable point.\n *\n * Patches store their points in full rather than sharing edges, so two\n * patches that meet each carry a copy of the corner and controls they meet\n * at. Those copies are one handle, with a `ref` per copy — dragging one of\n * them alone would tear the surface open along the seam.\n */\nexport interface MeshHandle {\n /** Stable while the handle moves: its first ref, as `\"patch:index\"`. */\n id: string;\n kind: MeshHandleKind;\n at: MeshPoint;\n refs: readonly MeshPointRef[];\n}\n\n/** Corner `k`'s interior neighbor in the tensor net. PDF's trailing four walk\n * the net as (1,1) (1,2) (2,2) (2,1), which puts corner 1's at index 15 and\n * corner 3's at 13 — the transpose of the obvious reading. */\nconst INTERIOR_OF_CORNER = [12, 15, 14, 13] as const;\n\nfunction kindOf(index: number): MeshHandleKind {\n if (index >= 12) return 'interior';\n return index % 3 === 0 ? 'corner' : 'control';\n}\n\nfunction near(a: number, b: number): boolean {\n return Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(a), Math.abs(b));\n}\n\nfunction same(a: MeshPoint, b: MeshPoint): boolean {\n return near(a.x, b.x) && near(a.y, b.y);\n}\n\n/**\n * Every draggable point of `mesh`, in walk order: each patch's corners and\n * edge controls, then a tensor patch's interior. Coincident points of one\n * kind merge into one handle. A patch that cannot be evaluated has none.\n */\nexport function meshHandles(mesh: MeshGradientFill): MeshHandle[] {\n const handles: { id: string; kind: MeshHandleKind; at: MeshPoint; refs: MeshPointRef[] }[] = [];\n mesh.patches.forEach((patch, p) => {\n if (!isValidPatch(patch)) return;\n patch.points.forEach((at, index) => {\n const kind = kindOf(index);\n const twin = handles.find((h) => h.kind === kind && same(h.at, at));\n if (twin) twin.refs.push({ patch: p, index });\n else handles.push({ id: `${p}:${index}`, kind, at, refs: [{ patch: p, index }] });\n });\n });\n return handles;\n}\n\n/** The points a corner carries: the controls of the two edges it joins, and\n * its interior neighbor when the patch has one. */\nfunction carriedBy(patch: MeshPatch, corner: number): number[] {\n const k = corner / 3;\n const carried = [corner + 1, (corner + 11) % 12];\n if (isTensorPatch(patch)) carried.push(INTERIOR_OF_CORNER[k]);\n return carried;\n}\n\n/**\n * `mesh` with `handle` moved to `to`. A corner carries its edge controls\n * and interior neighbor along by the same offset, the way a path editor's\n * anchor carries its handles; a control or interior point moves alone.\n * Returns a new paint; `mesh` is not modified.\n */\nexport function moveMeshHandle(\n mesh: MeshGradientFill, handle: MeshHandle, to: MeshPoint,\n): MeshGradientFill {\n const dx = to.x - handle.at.x;\n const dy = to.y - handle.at.y;\n const placed = new Map<string, MeshPoint>();\n for (const { patch, index } of handle.refs) {\n placed.set(`${patch}:${index}`, to);\n }\n if (handle.kind === 'corner') {\n for (const { patch, index } of handle.refs) {\n for (const carried of carriedBy(mesh.patches[patch], index)) {\n const key = `${patch}:${carried}`;\n if (placed.has(key)) continue;\n const from = mesh.patches[patch].points[carried];\n placed.set(key, { x: from.x + dx, y: from.y + dy });\n }\n }\n }\n return {\n ...mesh,\n patches: mesh.patches.map((patch, p) => ({\n ...patch,\n points: patch.points.map((point, i) => placed.get(`${p}:${i}`) ?? point),\n })),\n };\n}\n\n/** The lines an editor draws under the handles, as control polygons. */\nexport interface MeshGuides {\n /** Every patch edge as its four cubic control points, from the corner it\n * leaves to the corner it reaches. */\n edges: [MeshPoint, MeshPoint, MeshPoint, MeshPoint][];\n /** Corner to each point it carries — an edge control or interior point. */\n arms: [MeshPoint, MeshPoint][];\n}\n\n/** The guides for `mesh`'s valid patches. Shared edges appear once per patch. */\nexport function meshGuides(mesh: MeshGradientFill): MeshGuides {\n const edges: MeshGuides['edges'] = [];\n const arms: MeshGuides['arms'] = [];\n for (const patch of mesh.patches) {\n if (!isValidPatch(patch)) continue;\n const p = patch.points;\n for (let k = 0; k < 4; k++) {\n const corner = k * 3;\n edges.push([p[corner], p[corner + 1], p[corner + 2], p[(corner + 3) % 12]]);\n for (const carried of carriedBy(patch, corner)) arms.push([p[corner], p[carried]]);\n }\n }\n return { edges, arms };\n}\n"],"mappings":"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"}
|