@weasel-js/core 1.9.4 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1092) hide show
  1. package/CHANGELOG.md +750 -0
  2. package/README.md +5 -3
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +91 -83
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +3 -2
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +54 -100
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js.map +1 -1
  12. package/dist/affordances/rotationHandle.js +5 -4
  13. package/dist/affordances/rotationHandle.js.map +1 -1
  14. package/dist/animation/behaviors/coast.js +21 -0
  15. package/dist/animation/behaviors/coast.js.map +1 -0
  16. package/dist/animation/behaviors/coastByWrite.js +107 -0
  17. package/dist/animation/behaviors/coastByWrite.js.map +1 -0
  18. package/dist/animation/behaviors/coastOnTargets.js +94 -0
  19. package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
  20. package/dist/animation/behaviors/momentum.js +48 -136
  21. package/dist/animation/behaviors/momentum.js.map +1 -1
  22. package/dist/animation/clipTargets.js +12 -0
  23. package/dist/animation/clipTargets.js.map +1 -0
  24. package/dist/animation/index.js +15 -20
  25. package/dist/animation/poseHelpers.js +112 -33
  26. package/dist/animation/poseHelpers.js.map +1 -1
  27. package/dist/animation/poseTarget.js +115 -0
  28. package/dist/animation/poseTarget.js.map +1 -0
  29. package/dist/animation/reflow.js +113 -83
  30. package/dist/animation/reflow.js.map +1 -1
  31. package/dist/animation/rewind.js +66 -0
  32. package/dist/animation/rewind.js.map +1 -0
  33. package/dist/animation/rig/bindRig.js +85 -53
  34. package/dist/animation/rig/bindRig.js.map +1 -1
  35. package/dist/animation/rig/rigNode.js +93 -0
  36. package/dist/animation/rig/rigNode.js.map +1 -0
  37. package/dist/animation/rig/rigSeat.js +26 -0
  38. package/dist/animation/rig/rigSeat.js.map +1 -0
  39. package/dist/animation/rig/skinBinding.js +56 -0
  40. package/dist/animation/rig/skinBinding.js.map +1 -0
  41. package/dist/animation/rig/useRig.js +31 -16
  42. package/dist/animation/rig/useRig.js.map +1 -1
  43. package/dist/animation/wrappers/animateLifecycle.js +8 -7
  44. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  45. package/dist/animation/wrappers/animateOnSetPose.js +31 -31
  46. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  47. package/dist/animation/wrappers/instantPose.js.map +1 -1
  48. package/dist/animation/writtenPoseTarget.js +33 -0
  49. package/dist/animation/writtenPoseTarget.js.map +1 -0
  50. package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
  51. package/dist/barrel/canvas.js +31 -0
  52. package/dist/barrel/chrome.js +10 -10
  53. package/dist/barrel/input.js +16 -17
  54. package/dist/barrel/interactions.js +35 -39
  55. package/dist/barrel/paint.js +11 -18
  56. package/dist/barrel/paths.js +12 -19
  57. package/dist/barrel/renderer.js +14 -20
  58. package/dist/barrel/routing.js +42 -36
  59. package/dist/barrel/scene.js +37 -0
  60. package/dist/barrel/text.js +9 -18
  61. package/dist/barrel/viewport.js +41 -51
  62. package/dist/canvas/Canvas.js +281 -475
  63. package/dist/canvas/Canvas.js.map +1 -1
  64. package/dist/canvas/CanvasView.js +169 -188
  65. package/dist/canvas/CanvasView.js.map +1 -1
  66. package/dist/canvas/CursorCoordsHud.js +22 -23
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  68. package/dist/canvas/DrawCanvas.js +39 -56
  69. package/dist/canvas/DrawCanvas.js.map +1 -1
  70. package/dist/canvas/ModalityHud.js.map +1 -1
  71. package/dist/canvas/NodeShape.js +28 -29
  72. package/dist/canvas/NodeShape.js.map +1 -1
  73. package/dist/canvas/PickHud.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  75. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  76. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
  77. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
  79. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  80. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +51 -54
  81. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
  83. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
  85. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +40 -29
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/features.js +73 -43
  92. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  96. package/dist/canvas/SceneCanvas/props.js +15 -14
  97. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  98. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  99. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  101. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  102. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  104. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
  106. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  107. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  108. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  109. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  110. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  112. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  113. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
  114. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  116. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  117. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  118. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  119. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  120. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  121. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +39 -37
  122. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  123. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  124. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  125. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  126. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  127. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  128. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  129. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  130. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  131. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +76 -80
  132. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  133. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  134. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  135. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  136. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  137. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  138. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  139. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  140. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  141. package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
  142. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  143. package/dist/canvas/SceneCanvas.js +303 -707
  144. package/dist/canvas/SceneCanvas.js.map +1 -1
  145. package/dist/canvas/SceneViewCanvas.js +41 -47
  146. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  147. package/dist/canvas/adapterDerivedPath.js +26 -0
  148. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  149. package/dist/canvas/affordanceAt.js +11 -1
  150. package/dist/canvas/affordanceAt.js.map +1 -1
  151. package/dist/canvas/buildSceneLayer.js +81 -61
  152. package/dist/canvas/buildSceneLayer.js.map +1 -1
  153. package/dist/canvas/buildSceneTree.js.map +1 -1
  154. package/dist/canvas/canvasRenderer.js +40 -44
  155. package/dist/canvas/canvasRenderer.js.map +1 -1
  156. package/dist/canvas/colorOverrides.js.map +1 -1
  157. package/dist/canvas/defaultDrawOne.js +12 -12
  158. package/dist/canvas/defaultDrawOne.js.map +1 -1
  159. package/dist/canvas/deps/areaSelect.js +4 -4
  160. package/dist/canvas/deps/areaSelect.js.map +1 -1
  161. package/dist/canvas/deps/debug.js.map +1 -1
  162. package/dist/canvas/deps/editAnchors.js +49 -68
  163. package/dist/canvas/deps/editAnchors.js.map +1 -1
  164. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  165. package/dist/canvas/deps/hitTestArea.js +31 -26
  166. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  167. package/dist/canvas/deps/insert.js +65 -54
  168. package/dist/canvas/deps/insert.js.map +1 -1
  169. package/dist/canvas/deps/lassoSelect.js +5 -5
  170. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  171. package/dist/canvas/deps/poseDescriptor.js +1 -1
  172. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  173. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  174. package/dist/canvas/deps/slice.js +44 -45
  175. package/dist/canvas/deps/slice.js.map +1 -1
  176. package/dist/canvas/deps/textEdit.js +8 -8
  177. package/dist/canvas/deps/textEdit.js.map +1 -1
  178. package/dist/canvas/deps/view.js.map +1 -1
  179. package/dist/canvas/derivedPath.js +43 -41
  180. package/dist/canvas/derivedPath.js.map +1 -1
  181. package/dist/canvas/drawEnvelope.js +8 -4
  182. package/dist/canvas/drawEnvelope.js.map +1 -1
  183. package/dist/canvas/getNodeAtPoint.js +2 -6
  184. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  185. package/dist/canvas/hud.module.js.map +1 -1
  186. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  187. package/dist/canvas/layerOrder.js.map +1 -1
  188. package/dist/canvas/layerSlots.js +6 -1
  189. package/dist/canvas/layerSlots.js.map +1 -1
  190. package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
  191. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  192. package/dist/canvas/nodeShapes/imagePainter.js +10 -10
  193. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  194. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  195. package/dist/canvas/nodeShapes/nodePaint.js +34 -23
  196. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  197. package/dist/canvas/nodeShapes/pathPainter.js +23 -22
  198. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  199. package/dist/canvas/nodeShapes/poseBox.js +6 -6
  200. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  201. package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
  202. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  203. package/dist/canvas/nodeShapes/shapePainter.js +16 -16
  204. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  205. package/dist/canvas/nodeShapes/textPainter.js +1 -1
  206. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  207. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  208. package/dist/canvas/paintCull.js +6 -8
  209. package/dist/canvas/paintCull.js.map +1 -1
  210. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  211. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  212. package/dist/canvas/pickWalk.js +52 -50
  213. package/dist/canvas/pickWalk.js.map +1 -1
  214. package/dist/canvas/planeClips.js +18 -19
  215. package/dist/canvas/planeClips.js.map +1 -1
  216. package/dist/canvas/poseCascade.js +41 -0
  217. package/dist/canvas/poseCascade.js.map +1 -0
  218. package/dist/canvas/poseRotation.js +1 -3
  219. package/dist/canvas/poseRotation.js.map +1 -1
  220. package/dist/canvas/rasterReadback.js +22 -0
  221. package/dist/canvas/rasterReadback.js.map +1 -0
  222. package/dist/canvas/renderDebugSnapshot.js +12 -12
  223. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  224. package/dist/canvas/renderNeeds.js +3 -3
  225. package/dist/canvas/renderNeeds.js.map +1 -1
  226. package/dist/canvas/renderSceneToPixels.js +64 -83
  227. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  228. package/dist/canvas/sceneAdapter.js +68 -132
  229. package/dist/canvas/sceneAdapter.js.map +1 -1
  230. package/dist/canvas/sceneClipboard.js +1 -1
  231. package/dist/canvas/sceneClipboard.js.map +1 -1
  232. package/dist/canvas/sceneLayerPaint.js +4 -4
  233. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  234. package/dist/canvas/sceneSlotWiring.js +4 -4
  235. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  236. package/dist/canvas/sceneViewRender.js +36 -35
  237. package/dist/canvas/sceneViewRender.js.map +1 -1
  238. package/dist/canvas/slopsDebugLayer.js +4 -4
  239. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  240. package/dist/canvas/surface.module.js +6 -0
  241. package/dist/canvas/surface.module.js.map +1 -0
  242. package/dist/canvas/surfaceBox.js +16 -0
  243. package/dist/canvas/surfaceBox.js.map +1 -0
  244. package/dist/canvas/useCanvasRenderer.js +23 -11
  245. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  246. package/dist/canvas/useCanvasSurface.js +31 -0
  247. package/dist/canvas/useCanvasSurface.js.map +1 -0
  248. package/dist/canvas/useCanvasView.js +46 -37
  249. package/dist/canvas/useCanvasView.js.map +1 -1
  250. package/dist/canvas/useFrameLoop.js +11 -12
  251. package/dist/canvas/useFrameLoop.js.map +1 -1
  252. package/dist/canvas/useHostAnchor.js +35 -33
  253. package/dist/canvas/useHostAnchor.js.map +1 -1
  254. package/dist/canvas/useLateContentRedraw.js +8 -8
  255. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  256. package/dist/canvas/useSceneLayerList.js +4 -14
  257. package/dist/canvas/useSceneLayerList.js.map +1 -1
  258. package/dist/canvas/useSurfaceInput.js +42 -0
  259. package/dist/canvas/useSurfaceInput.js.map +1 -0
  260. package/dist/canvas/useToolCursor.js +29 -0
  261. package/dist/canvas/useToolCursor.js.map +1 -0
  262. package/dist/canvas/useViewHelpers.js +46 -85
  263. package/dist/canvas/useViewHelpers.js.map +1 -1
  264. package/dist/canvas/viewInputs.js.map +1 -1
  265. package/dist/canvas/viewRegistry.js +25 -27
  266. package/dist/canvas/viewRegistry.js.map +1 -1
  267. package/dist/canvas/watchElementMove.js +43 -0
  268. package/dist/canvas/watchElementMove.js.map +1 -0
  269. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  270. package/dist/clipboard.d.ts +7 -14
  271. package/dist/{types-B4iJRHC3.d.ts → clone-2a5hVbBd.d.ts} +122 -77
  272. package/dist/clone.d.ts +4 -8
  273. package/dist/clone.js +0 -2
  274. package/dist/core/device/targets.js.map +1 -1
  275. package/dist/core/device/useDeviceProfile.js +13 -13
  276. package/dist/core/device/useDeviceProfile.js.map +1 -1
  277. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  278. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  279. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  280. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  281. package/dist/core/geometry/poseDescriptor.js +61 -14
  282. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  283. package/dist/core/geometry/regionHit.js +35 -37
  284. package/dist/core/geometry/regionHit.js.map +1 -1
  285. package/dist/core/geometry/targetFrame.js +94 -0
  286. package/dist/core/geometry/targetFrame.js.map +1 -0
  287. package/dist/core/geometry/unionBounds.js +4 -5
  288. package/dist/core/geometry/unionBounds.js.map +1 -1
  289. package/dist/core/layers/backgroundFill.js +31 -0
  290. package/dist/core/layers/backgroundFill.js.map +1 -0
  291. package/dist/{features/groups → core/layers}/children.js +1 -1
  292. package/dist/core/layers/children.js.map +1 -0
  293. package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
  294. package/dist/core/layers/gateLayer.js.map +1 -0
  295. package/dist/core/layers/layerGroup.js +40 -0
  296. package/dist/core/layers/layerGroup.js.map +1 -0
  297. package/dist/core/layers/render.js +50 -76
  298. package/dist/core/layers/render.js.map +1 -1
  299. package/dist/core/ops/createHistory.js +9 -9
  300. package/dist/core/ops/createHistory.js.map +1 -1
  301. package/dist/core/ops/delete.js.map +1 -1
  302. package/dist/core/paint/meshKind.js +16 -0
  303. package/dist/core/paint/meshKind.js.map +1 -0
  304. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +103 -92
  305. package/dist/core/paint/meshKindLazy.js.map +1 -0
  306. package/dist/core/paint/paintKindEntry.js +8 -0
  307. package/dist/core/paint/paintKindEntry.js.map +1 -0
  308. package/dist/core/paint/paintKinds.js +144 -0
  309. package/dist/core/paint/paintKinds.js.map +1 -0
  310. package/dist/core/paint/registerMesh.js +7 -0
  311. package/dist/core/paint/registerMesh.js.map +1 -0
  312. package/dist/core/scene/NodeProperties.js.map +1 -1
  313. package/dist/core/scene/NodeRouting.js.map +1 -1
  314. package/dist/core/scene/arrivalWindow.js +65 -64
  315. package/dist/core/scene/arrivalWindow.js.map +1 -1
  316. package/dist/core/scene/boundOps.js +40 -0
  317. package/dist/core/scene/boundOps.js.map +1 -0
  318. package/dist/core/scene/composeFrame.js +9 -6
  319. package/dist/core/scene/composeFrame.js.map +1 -1
  320. package/dist/{features/groups → core/scene}/composePose.js +18 -18
  321. package/dist/core/scene/composePose.js.map +1 -0
  322. package/dist/core/scene/depMemo.js +31 -6
  323. package/dist/core/scene/depMemo.js.map +1 -1
  324. package/dist/core/scene/derivedPath.js +19 -20
  325. package/dist/core/scene/derivedPath.js.map +1 -1
  326. package/dist/core/scene/editMode.js +26 -0
  327. package/dist/core/scene/editMode.js.map +1 -0
  328. package/dist/core/scene/effectivePose.js +38 -39
  329. package/dist/core/scene/effectivePose.js.map +1 -1
  330. package/dist/core/scene/fieldEdits.js +98 -0
  331. package/dist/core/scene/fieldEdits.js.map +1 -0
  332. package/dist/core/scene/historyFacade.js +116 -70
  333. package/dist/core/scene/historyFacade.js.map +1 -1
  334. package/dist/core/scene/historyForm.js +6 -0
  335. package/dist/core/scene/historyForm.js.map +1 -0
  336. package/dist/core/scene/kitOps.js +83 -71
  337. package/dist/core/scene/kitOps.js.map +1 -1
  338. package/dist/core/scene/kitRegistry.js.map +1 -1
  339. package/dist/core/scene/layerStack.js +105 -12
  340. package/dist/core/scene/layerStack.js.map +1 -1
  341. package/dist/core/scene/layoutPass.js +58 -59
  342. package/dist/core/scene/layoutPass.js.map +1 -1
  343. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  344. package/dist/core/scene/nestedHit.js.map +1 -0
  345. package/dist/core/scene/nodeFnFields.js +9 -9
  346. package/dist/core/scene/nodeFnFields.js.map +1 -1
  347. package/dist/core/scene/nodeMemo.js.map +1 -1
  348. package/dist/core/scene/nodeStore.js +72 -71
  349. package/dist/core/scene/nodeStore.js.map +1 -1
  350. package/dist/core/scene/notifier.js +37 -0
  351. package/dist/core/scene/notifier.js.map +1 -0
  352. package/dist/core/scene/opTable.js +50 -0
  353. package/dist/core/scene/opTable.js.map +1 -0
  354. package/dist/core/scene/outerOps.js +66 -0
  355. package/dist/core/scene/outerOps.js.map +1 -0
  356. package/dist/core/scene/poseHold.js +39 -0
  357. package/dist/core/scene/poseHold.js.map +1 -0
  358. package/dist/core/scene/poseOverrides.js +44 -36
  359. package/dist/core/scene/poseOverrides.js.map +1 -1
  360. package/dist/core/scene/poseSnapshot.js.map +1 -1
  361. package/dist/core/scene/reconcileSpecs.js +3 -2
  362. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  363. package/dist/core/scene/recorder.js +86 -0
  364. package/dist/core/scene/recorder.js.map +1 -0
  365. package/dist/core/scene/renderOrder.js.map +1 -1
  366. package/dist/core/scene/scene.js +81 -690
  367. package/dist/core/scene/scene.js.map +1 -1
  368. package/dist/core/scene/sceneEdits.js +58 -0
  369. package/dist/core/scene/sceneEdits.js.map +1 -0
  370. package/dist/core/scene/sceneMutators.js +49 -0
  371. package/dist/core/scene/sceneMutators.js.map +1 -0
  372. package/dist/core/scene/scenePoseAdapter.js +16 -0
  373. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  374. package/dist/core/scene/sceneRecording.js +90 -0
  375. package/dist/core/scene/sceneRecording.js.map +1 -0
  376. package/dist/core/scene/sceneSelection.js +28 -0
  377. package/dist/core/scene/sceneSelection.js.map +1 -0
  378. package/dist/core/scene/sceneState.js +49 -0
  379. package/dist/core/scene/sceneState.js.map +1 -0
  380. package/dist/core/scene/serialization.js +8 -5
  381. package/dist/core/scene/serialization.js.map +1 -1
  382. package/dist/core/scene/staleReplay.js +51 -0
  383. package/dist/core/scene/staleReplay.js.map +1 -0
  384. package/dist/core/scene/statedFields.js +9 -0
  385. package/dist/core/scene/statedFields.js.map +1 -0
  386. package/dist/core/scene/treeEdits.js +127 -0
  387. package/dist/core/scene/treeEdits.js.map +1 -0
  388. package/dist/core/scene/treeReads.js +26 -0
  389. package/dist/core/scene/treeReads.js.map +1 -0
  390. package/dist/core/scene/types.js.map +1 -1
  391. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  392. package/dist/core/scene/unionOfChildren.js.map +1 -0
  393. package/dist/core/scene/unitScopes.js +13 -0
  394. package/dist/core/scene/unitScopes.js.map +1 -0
  395. package/dist/core/scene/useScene.js.map +1 -1
  396. package/dist/core/selection/readOnlySelection.js +32 -0
  397. package/dist/core/selection/readOnlySelection.js.map +1 -0
  398. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  399. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  400. package/dist/core/selection/useSelection.js +34 -25
  401. package/dist/core/selection/useSelection.js.map +1 -1
  402. package/dist/core/shapeKinds.js.map +1 -1
  403. package/dist/core/stylus/stylus.js.map +1 -1
  404. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  405. package/dist/core/usePaintKinds.js +1 -1
  406. package/dist/core/usePaintKinds.js.map +1 -1
  407. package/dist/core/viewport/clientToWorld.js.map +1 -1
  408. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  409. package/dist/core/viewport/parallax.js.map +1 -1
  410. package/dist/core/viewport/screenSlop.js +11 -11
  411. package/dist/core/viewport/screenSlop.js.map +1 -1
  412. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  413. package/dist/core/viewport/useDecayLoop.js +8 -8
  414. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  415. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  416. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  417. package/dist/core/viewport/useViewAnimation.js +102 -43
  418. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  419. package/dist/core/viewport/view.js +7 -7
  420. package/dist/core/viewport/view.js.map +1 -1
  421. package/dist/core/viewport/wheelHandler.js.map +1 -1
  422. package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
  423. package/dist/debug/createDebugOverlayLayer.js +100 -100
  424. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  425. package/dist/debug/createDebugSink.js.map +1 -1
  426. package/dist/debug/frameStats.js.map +1 -1
  427. package/dist/debug/useDebugSink.js +52 -0
  428. package/dist/debug/useDebugSink.js.map +1 -0
  429. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  430. package/dist/features/chrome-caps/conditions.js.map +1 -1
  431. package/dist/features/chrome-caps/defaults.js.map +1 -1
  432. package/dist/features/chrome-caps/resolve.js.map +1 -1
  433. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  434. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  435. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  436. package/dist/features/ingestion/contentHandlers.js +25 -19
  437. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  438. package/dist/features/ingestion/imageHandler.js +21 -24
  439. package/dist/features/ingestion/imageHandler.js.map +1 -1
  440. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  441. package/dist/features/ingestion/placement.js +16 -0
  442. package/dist/features/ingestion/placement.js.map +1 -0
  443. package/dist/features/ingestion/svgHandler.js +5 -0
  444. package/dist/features/ingestion/svgHandler.js.map +1 -1
  445. package/dist/features/ingestion/textHandler.js +28 -0
  446. package/dist/features/ingestion/textHandler.js.map +1 -0
  447. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  448. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  449. package/dist/features/ingestion/weaselJsonHandler.js +5 -0
  450. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  451. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  452. package/dist/features/modes/modeLayers.js +7 -7
  453. package/dist/features/modes/modeLayers.js.map +1 -1
  454. package/dist/features/paths/editablePath.js +47 -0
  455. package/dist/features/paths/editablePath.js.map +1 -0
  456. package/dist/features/paths/index.js +9 -16
  457. package/dist/features/paths/pathEditState.js +41 -0
  458. package/dist/features/paths/pathEditState.js.map +1 -0
  459. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  460. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  461. package/dist/features/paths/pathLayer.js +3 -2
  462. package/dist/features/paths/pathLayer.js.map +1 -1
  463. package/dist/features/paths/penPreviewLayer.js +86 -88
  464. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  465. package/dist/features/paths/usePathEdit.js +34 -0
  466. package/dist/features/paths/usePathEdit.js.map +1 -0
  467. package/dist/features/poseRun/usePoseRun.js +42 -55
  468. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  469. package/dist/features/selection/overlay.js +170 -178
  470. package/dist/features/selection/overlay.js.map +1 -1
  471. package/dist/features/text/index.js +6 -0
  472. package/dist/features/text/textLayer.js +1 -1
  473. package/dist/features/text/textLayer.js.map +1 -1
  474. package/dist/features/text/useSceneTextEdit.js +95 -82
  475. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  476. package/dist/features/viewports/viewportLayer.js +25 -36
  477. package/dist/features/viewports/viewportLayer.js.map +1 -1
  478. package/dist/index.d.ts +4507 -8459
  479. package/dist/index.js +275 -320
  480. package/dist/input/keyState.js +14 -14
  481. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  482. package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
  483. package/dist/interactions/actions/align/action.js.map +1 -0
  484. package/dist/interactions/actions/align/align.js +23 -23
  485. package/dist/interactions/actions/align/align.js.map +1 -1
  486. package/dist/interactions/actions/booleans/action.js +65 -0
  487. package/dist/interactions/actions/booleans/action.js.map +1 -0
  488. package/dist/interactions/actions/booleans/booleans.js +69 -78
  489. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  490. package/dist/interactions/actions/booleans/operands.js +40 -0
  491. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  492. package/dist/interactions/actions/booleans/pieces.js +45 -0
  493. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  494. package/dist/interactions/actions/booleans/placement.js +24 -0
  495. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  496. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  497. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  498. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  499. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
  500. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  501. package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
  502. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  503. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  504. package/dist/interactions/actions/clone/action.js +98 -0
  505. package/dist/interactions/actions/clone/action.js.map +1 -0
  506. package/dist/interactions/actions/clone/behaviors.js +52 -0
  507. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  508. package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
  509. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  510. package/dist/interactions/actions/defaults/anchorEditing.js +41 -43
  511. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  512. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  513. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  514. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  515. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  516. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  517. package/dist/interactions/actions/defaults/duplicate.js +19 -19
  518. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  519. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  520. package/dist/interactions/actions/defaults/group.js +35 -40
  521. package/dist/interactions/actions/defaults/group.js.map +1 -1
  522. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  523. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  524. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  525. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  526. package/dist/interactions/actions/defaults/ingest.js +19 -15
  527. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  528. package/dist/interactions/actions/defaults/insertPathAnchor.js +14 -15
  529. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  530. package/dist/interactions/actions/defaults/nudge.js +30 -31
  531. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  532. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  533. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  534. package/dist/interactions/actions/defaults/setFill.js +9 -3
  535. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  536. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
  537. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  538. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  539. package/dist/interactions/actions/defaults/sliceOps.js +20 -22
  540. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  541. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  542. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  543. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
  544. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  545. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  546. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  547. package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
  548. package/dist/interactions/actions/distribute/action.js.map +1 -0
  549. package/dist/interactions/actions/distribute/distribute.js +11 -11
  550. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  551. package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +19 -21
  552. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  553. package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
  554. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  555. package/dist/interactions/actions/flip/action.js +124 -0
  556. package/dist/interactions/actions/flip/action.js.map +1 -0
  557. package/dist/interactions/actions/flip/helpers.js +1 -1
  558. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  559. package/dist/interactions/actions/gestureFrames.js +18 -0
  560. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  561. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  562. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  563. package/dist/interactions/actions/insert/action.js +72 -0
  564. package/dist/interactions/actions/insert/action.js.map +1 -0
  565. package/dist/interactions/actions/insert/commit.js +28 -0
  566. package/dist/interactions/actions/insert/commit.js.map +1 -0
  567. package/dist/interactions/actions/insert/extras.js +65 -0
  568. package/dist/interactions/actions/insert/extras.js.map +1 -0
  569. package/dist/interactions/actions/insert/frame.js +48 -0
  570. package/dist/interactions/actions/insert/frame.js.map +1 -0
  571. package/dist/interactions/actions/insert/geometry.js +35 -0
  572. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  573. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  574. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  575. package/dist/interactions/actions/insert/session.js +59 -0
  576. package/dist/interactions/actions/insert/session.js.map +1 -0
  577. package/dist/interactions/actions/insert/shape.js +34 -0
  578. package/dist/interactions/actions/insert/shape.js.map +1 -0
  579. package/dist/interactions/actions/lasso-select/action.js +143 -0
  580. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  581. package/dist/interactions/actions/move/action.js +87 -0
  582. package/dist/interactions/actions/move/action.js.map +1 -0
  583. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  584. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  585. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  586. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  587. package/dist/interactions/actions/move/behaviors/snapToContainer.js +24 -23
  588. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  589. package/dist/interactions/actions/move/capture.js +99 -0
  590. package/dist/interactions/actions/move/capture.js.map +1 -0
  591. package/dist/interactions/actions/move/commit/index.js +41 -0
  592. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  593. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  594. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  595. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  596. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  597. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  598. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  599. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  600. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  601. package/dist/interactions/actions/move/delta.js +51 -0
  602. package/dist/interactions/actions/move/delta.js.map +1 -0
  603. package/dist/interactions/actions/move/frame.js +59 -0
  604. package/dist/interactions/actions/move/frame.js.map +1 -0
  605. package/dist/interactions/actions/move/gestureAdapter.js +15 -40
  606. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  607. package/dist/interactions/actions/move/landedDescendants.js +8 -8
  608. package/dist/interactions/actions/move/layout/container.js +94 -0
  609. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  610. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  611. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  612. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  613. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  614. package/dist/interactions/actions/move/layout/exits.js +38 -0
  615. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  616. package/dist/interactions/actions/move/layout/glide.js +48 -0
  617. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  618. package/dist/interactions/actions/move/session.js +63 -0
  619. package/dist/interactions/actions/move/session.js.map +1 -0
  620. package/dist/interactions/actions/move/translate.js +61 -0
  621. package/dist/interactions/actions/move/translate.js.map +1 -0
  622. package/dist/interactions/actions/outlines/createOutlines.js +17 -64
  623. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  624. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  625. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  626. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  627. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  628. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  629. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  630. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  631. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  632. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  633. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  634. package/dist/interactions/actions/planeInput.js.map +1 -1
  635. package/dist/interactions/actions/pointerState.js +12 -0
  636. package/dist/interactions/actions/pointerState.js.map +1 -0
  637. package/dist/interactions/actions/poseDescriptorDep.js +1 -1
  638. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  639. package/dist/interactions/actions/poseFrame.js +26 -26
  640. package/dist/interactions/actions/poseFrame.js.map +1 -1
  641. package/dist/interactions/actions/resize/action.js +55 -0
  642. package/dist/interactions/actions/resize/action.js.map +1 -0
  643. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  644. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  645. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  646. package/dist/interactions/actions/resize/capture.js +85 -0
  647. package/dist/interactions/actions/resize/capture.js.map +1 -0
  648. package/dist/interactions/actions/resize/commit.js +69 -0
  649. package/dist/interactions/actions/resize/commit.js.map +1 -0
  650. package/dist/interactions/actions/resize/frame.js +74 -0
  651. package/dist/interactions/actions/resize/frame.js.map +1 -0
  652. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  653. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  654. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  655. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  656. package/dist/interactions/actions/resize/session.js +49 -0
  657. package/dist/interactions/actions/resize/session.js.map +1 -0
  658. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  659. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  660. package/dist/interactions/actions/rotate/action.js +56 -0
  661. package/dist/interactions/actions/rotate/action.js.map +1 -0
  662. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  663. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  664. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  665. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  666. package/dist/interactions/actions/rotate/commit.js +40 -0
  667. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  668. package/dist/interactions/actions/rotate/frame.js +65 -0
  669. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  670. package/dist/interactions/actions/rotate/handle.js +12 -12
  671. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  672. package/dist/interactions/actions/rotate/session.js +92 -0
  673. package/dist/interactions/actions/rotate/session.js.map +1 -0
  674. package/dist/interactions/actions/spatialReference.js.map +1 -1
  675. package/dist/interactions/actions/useStandardActions.js +77 -72
  676. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  677. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
  678. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  679. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  680. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  681. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  682. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  683. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  684. package/dist/layout/arrivals.js +20 -23
  685. package/dist/layout/arrivals.js.map +1 -1
  686. package/dist/math-CYUjoyyU.d.ts +33 -0
  687. package/dist/math.d.ts +5 -2
  688. package/dist/math.js +6 -6
  689. package/dist/mesh.d.ts +4 -268
  690. package/dist/mesh.js +3 -7
  691. package/dist/move.d.ts +6 -4
  692. package/dist/{originProjection-gHnOup4e.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
  693. package/dist/patterns-builtin.d.ts +1 -118
  694. package/dist/patterns-builtin.js +2 -3
  695. package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
  696. package/dist/renderer.d.ts +1 -92
  697. package/dist/renderer.js +2 -19
  698. package/dist/resize.d.ts +11 -22
  699. package/dist/resize.js +1 -1
  700. package/dist/style.css +1 -1
  701. package/dist/test-hook/install.js.map +1 -1
  702. package/dist/test-hook/useTestHook.js +22 -0
  703. package/dist/test-hook/useTestHook.js.map +1 -0
  704. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  705. package/dist/test-seams.d.ts +4 -4
  706. package/dist/test-seams.js +2 -2
  707. package/dist/tools/builtin/bone/boneActions.js +130 -0
  708. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  709. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  710. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  711. package/dist/tools/builtin/bone/placedRig.js +24 -0
  712. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  713. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  714. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  715. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  716. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  717. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  718. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  719. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  720. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  721. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  722. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  723. package/dist/tools/builtin/pen/usePenTool.js +161 -163
  724. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  725. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  726. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  727. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  728. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  729. package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
  730. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  731. package/dist/tools/builtin/select/selectionContributions.js +4 -4
  732. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  733. package/dist/tools/builtin/select/useSelectTool.js +43 -71
  734. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  735. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  736. package/dist/tools/builtin/slice/useSliceTool.js +67 -72
  737. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  738. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  739. package/dist/tools/builtin/text/useTextTool.js +8 -0
  740. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  741. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  742. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  743. package/dist/tools/builtin/weight/weightActions.js +112 -0
  744. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  745. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  746. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  747. package/dist/tools/overlayBinding.js.map +1 -1
  748. package/dist/tools/useKeybindings.js +20 -14
  749. package/dist/tools/useKeybindings.js.map +1 -1
  750. package/dist/{types-k-5Oqh-U.d.ts → types-CIKDwlsP.d.ts} +84 -164
  751. package/dist/util/paint.js +1 -1
  752. package/dist/util/paint.js.map +1 -1
  753. package/dist/version.js +1 -1
  754. package/package.json +26 -21
  755. package/dist/animation/colorHelpers.js +0 -135
  756. package/dist/animation/colorHelpers.js.map +0 -1
  757. package/dist/animation/colorRegistry.js +0 -37
  758. package/dist/animation/colorRegistry.js.map +0 -1
  759. package/dist/animation/engine/axes.js +0 -36
  760. package/dist/animation/engine/axes.js.map +0 -1
  761. package/dist/animation/engine/codec.js +0 -170
  762. package/dist/animation/engine/codec.js.map +0 -1
  763. package/dist/animation/engine/integrator.js +0 -12
  764. package/dist/animation/engine/integrator.js.map +0 -1
  765. package/dist/animation/loop.js +0 -60
  766. package/dist/animation/loop.js.map +0 -1
  767. package/dist/animation/observe.js +0 -23
  768. package/dist/animation/observe.js.map +0 -1
  769. package/dist/animation/rig/blendPoses.js +0 -43
  770. package/dist/animation/rig/blendPoses.js.map +0 -1
  771. package/dist/animation/rig/mirrorPose.js +0 -19
  772. package/dist/animation/rig/mirrorPose.js.map +0 -1
  773. package/dist/animation/rig/resolveSkeleton.js +0 -33
  774. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  775. package/dist/animation/rig/solveIk.js +0 -103
  776. package/dist/animation/rig/solveIk.js.map +0 -1
  777. package/dist/animation/rig/types.js +0 -12
  778. package/dist/animation/rig/types.js.map +0 -1
  779. package/dist/animation/slew.js +0 -27
  780. package/dist/animation/slew.js.map +0 -1
  781. package/dist/animation/stagger.js +0 -146
  782. package/dist/animation/stagger.js.map +0 -1
  783. package/dist/animation/timeline/booking.js +0 -114
  784. package/dist/animation/timeline/booking.js.map +0 -1
  785. package/dist/animation/timeline/createTimeline.js +0 -125
  786. package/dist/animation/timeline/createTimeline.js.map +0 -1
  787. package/dist/animation/timeline/sampleTrack.js +0 -79
  788. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  789. package/dist/animation/useAnimator.js +0 -388
  790. package/dist/animation/useAnimator.js.map +0 -1
  791. package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
  792. package/dist/builtins-DPcdghtB.d.ts +0 -1223
  793. package/dist/canvas/MinimapCanvas.js +0 -140
  794. package/dist/canvas/MinimapCanvas.js.map +0 -1
  795. package/dist/canvas/deps/poseComposition.js +0 -11
  796. package/dist/canvas/deps/poseComposition.js.map +0 -1
  797. package/dist/canvas/minimapMath.js +0 -82
  798. package/dist/canvas/minimapMath.js.map +0 -1
  799. package/dist/canvas/toolPreview.js +0 -39
  800. package/dist/canvas/toolPreview.js.map +0 -1
  801. package/dist/core/adapters/arrayAdapter.js +0 -94
  802. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  803. package/dist/core/adapters/useArrayAdapter.js +0 -13
  804. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  805. package/dist/core/fillInPoseFrame.js +0 -102
  806. package/dist/core/fillInPoseFrame.js.map +0 -1
  807. package/dist/core/geometry/poseFrame.js +0 -44
  808. package/dist/core/geometry/poseFrame.js.map +0 -1
  809. package/dist/core/geometry/poseRotation.js +0 -58
  810. package/dist/core/geometry/poseRotation.js.map +0 -1
  811. package/dist/core/gradient.js +0 -136
  812. package/dist/core/gradient.js.map +0 -1
  813. package/dist/core/markerInset.js +0 -24
  814. package/dist/core/markerInset.js.map +0 -1
  815. package/dist/core/mixed.js +0 -6
  816. package/dist/core/mixed.js.map +0 -1
  817. package/dist/core/paintKinds.js +0 -156
  818. package/dist/core/paintKinds.js.map +0 -1
  819. package/dist/core/scene/pickability.js +0 -6
  820. package/dist/core/scene/pickability.js.map +0 -1
  821. package/dist/core/strokeMarkerShapes.js +0 -139
  822. package/dist/core/strokeMarkerShapes.js.map +0 -1
  823. package/dist/core/strokeMarkers.js +0 -28
  824. package/dist/core/strokeMarkers.js.map +0 -1
  825. package/dist/core/viewport/meanScale.js +0 -8
  826. package/dist/core/viewport/meanScale.js.map +0 -1
  827. package/dist/core/viewport/pxExtent.js +0 -42
  828. package/dist/core/viewport/pxExtent.js.map +0 -1
  829. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  830. package/dist/features/focus/gateLayer.js.map +0 -1
  831. package/dist/features/focus/useCanvasFocus.js +0 -29
  832. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  833. package/dist/features/groups/children.js.map +0 -1
  834. package/dist/features/groups/composePose.js.map +0 -1
  835. package/dist/features/groups/nestedHit.js.map +0 -1
  836. package/dist/features/groups/unionOfChildren.js.map +0 -1
  837. package/dist/features/images/imageCache.js +0 -104
  838. package/dist/features/images/imageCache.js.map +0 -1
  839. package/dist/features/ingestion/index.js +0 -8
  840. package/dist/features/meshPaint/bake.js +0 -79
  841. package/dist/features/meshPaint/bake.js.map +0 -1
  842. package/dist/features/meshPaint/bakeCache.js +0 -59
  843. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  844. package/dist/features/meshPaint/handles.js +0 -86
  845. package/dist/features/meshPaint/handles.js.map +0 -1
  846. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  847. package/dist/features/meshPaint/meshPaint.js +0 -239
  848. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  849. package/dist/features/meshPaint/meshShader.js +0 -6
  850. package/dist/features/meshPaint/meshShader.js.map +0 -1
  851. package/dist/features/meshPaint/register.js +0 -7
  852. package/dist/features/meshPaint/register.js.map +0 -1
  853. package/dist/features/meshPaint/surface.js +0 -110
  854. package/dist/features/meshPaint/surface.js.map +0 -1
  855. package/dist/features/minimap/actions.js +0 -53
  856. package/dist/features/minimap/actions.js.map +0 -1
  857. package/dist/features/minimap/createMinimapContribution.js +0 -96
  858. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  859. package/dist/features/minimap/layers.js +0 -85
  860. package/dist/features/minimap/layers.js.map +0 -1
  861. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  862. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  863. package/dist/features/parallax/createParallaxLayer.js +0 -26
  864. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  865. package/dist/features/parallax/createParallaxPlane.js +0 -22
  866. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  867. package/dist/features/paths/anchorEdits.js +0 -167
  868. package/dist/features/paths/anchorEdits.js.map +0 -1
  869. package/dist/features/paths/anchors.js +0 -159
  870. package/dist/features/paths/anchors.js.map +0 -1
  871. package/dist/features/paths/booleans.js +0 -2
  872. package/dist/features/paths/markerCommands.js +0 -149
  873. package/dist/features/paths/markerCommands.js.map +0 -1
  874. package/dist/features/paths/markerSites.js +0 -59
  875. package/dist/features/paths/markerSites.js.map +0 -1
  876. package/dist/features/paths/markers.js +0 -95
  877. package/dist/features/paths/markers.js.map +0 -1
  878. package/dist/features/paths/nearestAnchor.js +0 -36
  879. package/dist/features/paths/nearestAnchor.js.map +0 -1
  880. package/dist/features/paths/pathInWorld.js +0 -41
  881. package/dist/features/paths/pathInWorld.js.map +0 -1
  882. package/dist/features/paths/poseDescriptor.js +0 -39
  883. package/dist/features/paths/poseDescriptor.js.map +0 -1
  884. package/dist/features/paths/strokeToPath.js +0 -40
  885. package/dist/features/paths/strokeToPath.js.map +0 -1
  886. package/dist/features/paths/tessellate/dash.js +0 -52
  887. package/dist/features/paths/tessellate/dash.js.map +0 -1
  888. package/dist/features/paths/tessellate/insets.js +0 -32
  889. package/dist/features/paths/tessellate/insets.js.map +0 -1
  890. package/dist/features/paths/tessellate/metric.js +0 -72
  891. package/dist/features/paths/tessellate/metric.js.map +0 -1
  892. package/dist/features/paths/tessellate/stroke.js +0 -170
  893. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  894. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  895. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  896. package/dist/features/patterns/commandPaint.js +0 -18
  897. package/dist/features/patterns/commandPaint.js.map +0 -1
  898. package/dist/features/patterns/index.js +0 -11
  899. package/dist/features/patterns/index.js.map +0 -1
  900. package/dist/features/patterns/patterns-builtin.js +0 -38
  901. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  902. package/dist/features/patterns/rasterizeTile.js +0 -17
  903. package/dist/features/patterns/rasterizeTile.js.map +0 -1
  904. package/dist/features/patterns/resolveSpec.js +0 -65
  905. package/dist/features/patterns/resolveSpec.js.map +0 -1
  906. package/dist/features/patterns/tileGeometry.js +0 -158
  907. package/dist/features/patterns/tileGeometry.js.map +0 -1
  908. package/dist/features/pointer/PointerContext.js +0 -45
  909. package/dist/features/pointer/PointerContext.js.map +0 -1
  910. package/dist/features/selection/SelectionContext.js +0 -51
  911. package/dist/features/selection/SelectionContext.js.map +0 -1
  912. package/dist/features/simulation/createSimulation.js +0 -61
  913. package/dist/features/simulation/createSimulation.js.map +0 -1
  914. package/dist/features/simulation/types.js +0 -6
  915. package/dist/features/simulation/types.js.map +0 -1
  916. package/dist/features/simulation/useSimulation.js +0 -74
  917. package/dist/features/simulation/useSimulation.js.map +0 -1
  918. package/dist/features/text/domOffsets.js +0 -82
  919. package/dist/features/text/domOffsets.js.map +0 -1
  920. package/dist/features/text/domRuns.js +0 -230
  921. package/dist/features/text/domRuns.js.map +0 -1
  922. package/dist/features/text/fitTextPose.js +0 -38
  923. package/dist/features/text/fitTextPose.js.map +0 -1
  924. package/dist/features/text/hitTest.js +0 -48
  925. package/dist/features/text/hitTest.js.map +0 -1
  926. package/dist/features/text/isTextData.js +0 -8
  927. package/dist/features/text/isTextData.js.map +0 -1
  928. package/dist/features/text/overlayDirection.js +0 -15
  929. package/dist/features/text/overlayDirection.js.map +0 -1
  930. package/dist/features/text/renderLabel.js +0 -14
  931. package/dist/features/text/renderLabel.js.map +0 -1
  932. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  933. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  934. package/dist/features/text/runs/flagRange.js +0 -53
  935. package/dist/features/text/runs/flagRange.js.map +0 -1
  936. package/dist/features/text/runs/rangeStyle.js +0 -133
  937. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  938. package/dist/features/text/textCommand.js +0 -60
  939. package/dist/features/text/textCommand.js.map +0 -1
  940. package/dist/features/text/textToPath.js +0 -181
  941. package/dist/features/text/textToPath.js.map +0 -1
  942. package/dist/features/text/useTextEdit.js +0 -491
  943. package/dist/features/text/useTextEdit.js.map +0 -1
  944. package/dist/features/tiling/createTiledLayer.js +0 -65
  945. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  946. package/dist/features/tiling/tiledProject.js +0 -14
  947. package/dist/features/tiling/tiledProject.js.map +0 -1
  948. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  949. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  950. package/dist/interactions/actions/defaults/align.js.map +0 -1
  951. package/dist/interactions/actions/defaults/booleans.js +0 -52
  952. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  953. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  954. package/dist/interactions/actions/defaults/clone.js +0 -91
  955. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  956. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  957. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  958. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  959. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  960. package/dist/interactions/actions/defaults/flip.js +0 -125
  961. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  962. package/dist/interactions/actions/defaults/insert.js +0 -287
  963. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  964. package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
  965. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  966. package/dist/interactions/actions/defaults/move.js +0 -778
  967. package/dist/interactions/actions/defaults/move.js.map +0 -1
  968. package/dist/interactions/actions/defaults/resize.js +0 -341
  969. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  970. package/dist/interactions/actions/defaults/rotate.js +0 -185
  971. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  972. package/dist/interactions/actions/previewOverrides.js +0 -25
  973. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  974. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  975. package/dist/math-J-ACHyEg.d.ts +0 -159
  976. package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
  977. package/dist/renderer/DrawCommand.js +0 -6
  978. package/dist/renderer/DrawCommand.js.map +0 -1
  979. package/dist/renderer/WeaselRenderer.js +0 -333
  980. package/dist/renderer/WeaselRenderer.js.map +0 -1
  981. package/dist/renderer/batchClip.js +0 -46
  982. package/dist/renderer/batchClip.js.map +0 -1
  983. package/dist/renderer/cache/GLImageCache.js +0 -74
  984. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  985. package/dist/renderer/cache/GLMeshCache.js +0 -102
  986. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  987. package/dist/renderer/cache/GLTextureCache.js +0 -68
  988. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  989. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  990. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  991. package/dist/renderer/cache/cache.js +0 -13
  992. package/dist/renderer/cache/cache.js.map +0 -1
  993. package/dist/renderer/cache/markerCommandCache.js +0 -63
  994. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  995. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  996. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  997. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  998. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  999. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1000. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1001. package/dist/renderer/cullDrawCommands.js +0 -90
  1002. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1003. package/dist/renderer/draw/batch.js +0 -133
  1004. package/dist/renderer/draw/batch.js.map +0 -1
  1005. package/dist/renderer/draw/clip.js +0 -89
  1006. package/dist/renderer/draw/clip.js.map +0 -1
  1007. package/dist/renderer/draw/customShader.js +0 -230
  1008. package/dist/renderer/draw/customShader.js.map +0 -1
  1009. package/dist/renderer/draw/drawTriangles.js +0 -8
  1010. package/dist/renderer/draw/drawTriangles.js.map +0 -1
  1011. package/dist/renderer/draw/effects.js +0 -28
  1012. package/dist/renderer/draw/effects.js.map +0 -1
  1013. package/dist/renderer/draw/flushBatch.js +0 -35
  1014. package/dist/renderer/draw/flushBatch.js.map +0 -1
  1015. package/dist/renderer/draw/gradient.js +0 -90
  1016. package/dist/renderer/draw/gradient.js.map +0 -1
  1017. package/dist/renderer/draw/image.js +0 -38
  1018. package/dist/renderer/draw/image.js.map +0 -1
  1019. package/dist/renderer/draw/mesh.js +0 -16
  1020. package/dist/renderer/draw/mesh.js.map +0 -1
  1021. package/dist/renderer/draw/paintBind.js +0 -70
  1022. package/dist/renderer/draw/paintBind.js.map +0 -1
  1023. package/dist/renderer/draw/pathPaint.js +0 -142
  1024. package/dist/renderer/draw/pathPaint.js.map +0 -1
  1025. package/dist/renderer/draw/scratchPass.js +0 -83
  1026. package/dist/renderer/draw/scratchPass.js.map +0 -1
  1027. package/dist/renderer/draw/stencil.js +0 -28
  1028. package/dist/renderer/draw/stencil.js.map +0 -1
  1029. package/dist/renderer/draw/text.js +0 -167
  1030. package/dist/renderer/draw/text.js.map +0 -1
  1031. package/dist/renderer/draw/uniforms.js +0 -77
  1032. package/dist/renderer/draw/uniforms.js.map +0 -1
  1033. package/dist/renderer/draw.js +0 -79
  1034. package/dist/renderer/draw.js.map +0 -1
  1035. package/dist/renderer/drawBatch.js +0 -198
  1036. package/dist/renderer/drawBatch.js.map +0 -1
  1037. package/dist/renderer/effects/EffectTargets.js +0 -48
  1038. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1039. package/dist/renderer/effects/builtins.js +0 -31
  1040. package/dist/renderer/effects/builtins.js.map +0 -1
  1041. package/dist/renderer/effects/composite.js +0 -11
  1042. package/dist/renderer/effects/composite.js.map +0 -1
  1043. package/dist/renderer/effects/effectPrelude.js +0 -10
  1044. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1045. package/dist/renderer/effects/types.js +0 -10
  1046. package/dist/renderer/effects/types.js.map +0 -1
  1047. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1048. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1049. package/dist/renderer/index.js +0 -20
  1050. package/dist/renderer/math/color.js +0 -321
  1051. package/dist/renderer/math/color.js.map +0 -1
  1052. package/dist/renderer/math/mat3.js +0 -80
  1053. package/dist/renderer/math/mat3.js.map +0 -1
  1054. package/dist/renderer/math/patternSpace.js +0 -22
  1055. package/dist/renderer/math/patternSpace.js.map +0 -1
  1056. package/dist/renderer/math/viewToMat3.js +0 -19
  1057. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1058. package/dist/renderer/paintResources.js +0 -18
  1059. package/dist/renderer/paintResources.js.map +0 -1
  1060. package/dist/renderer/paintScratch.js +0 -37
  1061. package/dist/renderer/paintScratch.js.map +0 -1
  1062. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1063. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1064. package/dist/renderer/shaders/batchFill.js +0 -119
  1065. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1066. package/dist/renderer/shaders/customPrelude.js +0 -34
  1067. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1068. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1069. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1070. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1071. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1072. package/dist/renderer/shaders/gradFill.js +0 -31
  1073. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1074. package/dist/renderer/shaders/pathFill.js +0 -14
  1075. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1076. package/dist/renderer/shaders/patternFill.js +0 -25
  1077. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1078. package/dist/renderer/shaders/registerProgram.js +0 -18
  1079. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1080. package/dist/renderer/spriteSheet.js +0 -14
  1081. package/dist/renderer/spriteSheet.js.map +0 -1
  1082. package/dist/renderer/state/GroupState.js +0 -77
  1083. package/dist/renderer/state/GroupState.js.map +0 -1
  1084. package/dist/renderer/strokeLengths.js +0 -50
  1085. package/dist/renderer/strokeLengths.js.map +0 -1
  1086. package/dist/renderer/syntheticItalic.js +0 -6
  1087. package/dist/renderer/syntheticItalic.js.map +0 -1
  1088. package/dist/renderer/textures/registerTexture.js +0 -34
  1089. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1090. package/dist/scheduling/useVisibleRaf.js +0 -69
  1091. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1092. package/dist/test-seams-DM2B87-g.d.ts +0 -356
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.js","names":["ANY_INGEST_MODS","INGEST_REQUIRES","ingestFromEvent","items","params","ingestion","deps","insert","scene","selection","applyOps","ctx","ops","label","defaultCommitAdapter","opts","err","ingestAction"],"sources":["../../../../src/interactions/actions/defaults/ingest.ts"],"sourcesContent":["/**\n * @experimental\n * `ingest` — routes externally-arrived content (OS drop, clipboard paste,\n * file picker / `CanvasExtensionApi.ingest`) through the content-handler\n * registry (`features/ingestion/contentHandlers`).\n *\n * Registered ambient with both `drop` and `paste` default bindings, so\n * external content works regardless of the active tool. A tool can still\n * bind `{ kind: 'drop', types: [...] }` itself to intercept (active scope\n * beats ambient).\n *\n * This is the `ingest` preset's action. A canvas with `edit` and without\n * `ingest` answers a paste with `clipboard.pasteEvent` instead, which runs\n * the same `ingestFromEvent` limited to the kit's copied-node payload;\n * `useStandardActions` never registers the two together.\n *\n * Every binding declares every modifier `'optional'`: strict matching would\n * otherwise reject Cmd+V paste and macOS Option-drag drops outright.\n *\n * The dispatcher merges event data into `params`: `items` (IngestItem[]),\n * `via` ('drop' | 'paste'), plus `worldX`/`worldY` for drops. Absent\n * coords → `point: null`; handlers pick their own placement policy.\n */\nimport type { Action } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport { runIngest, type IngestCtx, type RunIngestOptions } from 'features/ingestion/contentHandlers';\nimport type { IngestItem } from '@weasel-js/routing';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\nexport const ANY_INGEST_MODS = {\n alt: 'optional', ctrl: 'optional', meta: 'optional', shift: 'optional',\n} as const;\n\n/** The deps {@link ingestFromEvent} reads; an action calling it declares these. */\nexport const INGEST_REQUIRES = ['scene', 'selection', 'insert', 'applyOps', 'ingestion'] as const;\n\n/**\n * @experimental\n * Route one drop or paste event's dispatcher params through the content\n * handlers: builds the `IngestCtx` from the action's deps and calls\n * `runIngest`. `opts` is `runIngest`'s, so an action accepting only some\n * content passes `handlers`.\n */\nexport function ingestFromEvent(\n deps: ActionDeps,\n params: Record<string, unknown> | undefined,\n opts?: RunIngestOptions,\n): void {\n const items = params?.items as IngestItem[] | undefined;\n if (!items || items.length === 0) return;\n const ingestion = deps.ingestion;\n const insert = deps.insert;\n const scene = deps.scene;\n const selection = deps.selection;\n if (!ingestion || !insert || !scene || !selection) return;\n const applyOps = deps.applyOps;\n\n const point =\n typeof params?.worldX === 'number' && typeof params?.worldY === 'number'\n ? { x: params.worldX as number, y: params.worldY as number }\n : null;\n\n const ctx: IngestCtx = {\n point,\n viewportWorldRect: () => ingestion.viewportWorldRect(),\n insert,\n applyOps: (ops, label) => {\n if (applyOps) applyOps(ops, label ?? 'Ingest');\n else scene.applyBatch(ops, label ?? 'Ingest', defaultCommitAdapter(scene, selection.adapterMethods));\n },\n scene,\n selection,\n // Snapshot per ingest event — intentional. The dep's live getters are\n // fresh at dispatch time, and one consistent resolver per drop/paste\n // beats half a multi-file drop resolving through a swapped-in one.\n resolveSrc: ingestion.resolveSrc,\n svg: ingestion.svg,\n clipboard: ingestion.clipboard,\n deps,\n };\n // Fire-and-forget: handler errors are caught inside runIngest, but a\n // malformed item (non-string mime via untyped JS) can still throw in\n // the matching path — keep the rejection out of the event loop.\n runIngest(items, ctx, opts).catch((err) => console.warn('weasel ingest:', err));\n}\n\nexport const ingestAction: Action & { requires: string[] } = {\n id: 'ingest',\n label: 'Insert external content',\n defaultBinding: [\n { kind: 'drop', mods: ANY_INGEST_MODS },\n { kind: 'paste', mods: ANY_INGEST_MODS },\n ],\n requires: [...INGEST_REQUIRES],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => ingestFromEvent(deps, params),\n },\n // No `eligible` rule (always eligible): external-content arrival is\n // mode-agnostic in v1. Revisit if a capability-restricted mode needs to\n // refuse drops/pastes (the listener-level editable-target guard already\n // keeps text-editing pastes away from the scene).\n enabled: () => true,\n};\n"],"mappings":";;;AA6BA,IAAaA,IAAkB;CAC7B,KAAK;CAAY,MAAM;CAAY,MAAM;CAAY,OAAO;AAC9D,GAGaC,IAAkB;CAAC;CAAS;CAAa;CAAU;CAAY;AAAW;AASvF,SAAgBC,EACd,GACA,GACA,GACM;CACN,IAAMC,IAAQC,GAAQ;CACtB,IAAI,CAACD,KAASA,EAAM,WAAW,GAAG;CAClC,IAAME,IAAYC,EAAK,WACjBC,IAASD,EAAK,QACdE,IAAQF,EAAK,OACbG,IAAYH,EAAK;CACvB,IAAI,CAACD,KAAa,CAACE,KAAU,CAACC,KAAS,CAACC,GAAW;CACnD,IAAMC,IAAWJ,EAAK,UAOhBK,IAAiB;EACrB,OALA,OAAOP,GAAQ,UAAW,YAAY,OAAOA,GAAQ,UAAW,WAC5D;GAAE,GAAGA,EAAO;GAAkB,GAAGA,EAAO;EAAiB,IACzD;EAIJ,yBAAyBC,EAAU,kBAAkB;EACrD;EACA,WAAW,GAAK,MAAU;GACxB,AAAIK,IAAUA,EAASE,GAAKC,KAAS,QAAQ,IACxCL,EAAM,WAAWI,GAAKC,KAAS,UAAUC,EAAqBN,GAAOC,EAAU,cAAc,CAAC;EACrG;EACA;EACA;EAIA,YAAYJ,EAAU;EACtB,KAAKA,EAAU;EACf,WAAWA,EAAU;EACrB;CACF;CAIA,EAAUF,GAAOQ,GAAKI,CAAI,CAAC,CAAC,OAAO,MAAQ,QAAQ,KAAK,kBAAkBC,CAAG,CAAC;AAChF;AAEA,IAAaC,IAAgD;CAC3D,IAAI;CACJ,OAAO;CACP,gBAAgB,CACd;EAAE,MAAM;EAAQ,MAAMjB;CAAgB,GACtC;EAAE,MAAM;EAAS,MAAMA;CAAgB,CACzC;CACA,UAAU,CAAC,GAAGC,CAAe;CAC7B,SAAS;EACP,QAAQ;EACR,MAAM,GAAM,MAAWC,EAAgBI,GAAMF,CAAM;CACrD;CAKA,eAAe;AACjB"}
1
+ {"version":3,"file":"ingest.js","names":["ANY_INGEST_MODS","INGEST_REQUIRES","ingestFromEvent","items","params","ingestion","deps","insert","scene","selection","applyOps","ctx","ops","label","defaultCommitAdapter","opts","err","claimable","carried","couldClaim","handlers","ActionDisabledReason","ingestAction"],"sources":["../../../../src/interactions/actions/defaults/ingest.ts"],"sourcesContent":["/**\n * @experimental\n * `ingest` — routes externally-arrived content (OS drop, clipboard paste,\n * file picker / `CanvasExtensionApi.ingest`) through the content-handler\n * registry (`features/ingestion/contentHandlers`).\n *\n * Registered ambient with both `drop` and `paste` default bindings, so\n * external content works regardless of the active tool. A tool can still\n * bind `{ kind: 'drop', types: [...] }` itself to intercept (active scope\n * beats ambient).\n *\n * This is the `ingest` preset's action. A canvas with `edit` and without\n * `ingest` answers a paste with `clipboard.pasteEvent` instead, which runs\n * the same `ingestFromEvent` limited to the kit's copied-node payload;\n * `useStandardActions` never registers the two together.\n *\n * Every binding declares every modifier `'optional'`: strict matching would\n * otherwise reject Cmd+V paste and macOS Option-drag drops outright.\n *\n * The dispatcher merges event data into `params`: `items` (IngestItem[]),\n * `via` ('drop' | 'paste'), plus `worldX`/`worldY` for drops. Absent\n * coords → `point: null`; handlers pick their own placement policy.\n */\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason, type ActionDeps } from '@weasel-js/routing';\nimport {\n couldClaim, runIngest, type ContentHandlerEntry, type IngestCtx, type RunIngestOptions,\n} from 'features/ingestion/contentHandlers';\nimport type { IngestItem } from '@weasel-js/routing';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\nexport const ANY_INGEST_MODS = {\n alt: 'optional', ctrl: 'optional', meta: 'optional', shift: 'optional',\n} as const;\n\n/** The deps {@link ingestFromEvent} reads; an action calling it declares these. */\nexport const INGEST_REQUIRES = ['scene', 'selection', 'insert', 'applyOps', 'ingestion'] as const;\n\n/**\n * @experimental\n * Route one drop or paste event's dispatcher params through the content\n * handlers: builds the `IngestCtx` from the action's deps and calls\n * `runIngest`. `opts` is `runIngest`'s, so an action accepting only some\n * content passes `handlers`.\n */\nexport function ingestFromEvent(\n deps: ActionDeps,\n params: Record<string, unknown> | undefined,\n opts?: RunIngestOptions,\n): void {\n const items = params?.items as IngestItem[] | undefined;\n if (!items || items.length === 0) return;\n const ingestion = deps.ingestion;\n const insert = deps.insert;\n const scene = deps.scene;\n const selection = deps.selection;\n if (!ingestion || !insert || !scene || !selection) return;\n const applyOps = deps.applyOps;\n\n const point =\n typeof params?.worldX === 'number' && typeof params?.worldY === 'number'\n ? { x: params.worldX as number, y: params.worldY as number }\n : null;\n\n const ctx: IngestCtx = {\n point,\n viewportWorldRect: () => ingestion.viewportWorldRect(),\n insert,\n applyOps: (ops, label) => {\n if (applyOps) applyOps(ops, label ?? 'Ingest');\n else scene.applyBatch(ops, label ?? 'Ingest', defaultCommitAdapter(scene, selection.adapterMethods));\n },\n scene,\n selection,\n // Snapshot per ingest event — intentional. The dep's live getters are\n // fresh at dispatch time, and one consistent resolver per drop/paste\n // beats half a multi-file drop resolving through a swapped-in one.\n resolveSrc: ingestion.resolveSrc,\n svg: ingestion.svg,\n clipboard: ingestion.clipboard,\n deps,\n };\n // Fire-and-forget: handler errors are caught inside runIngest, but a\n // malformed item (non-string mime via untyped JS) can still throw in\n // the matching path — keep the rejection out of the event loop.\n runIngest(items, ctx, opts).catch((err) => console.warn('weasel ingest:', err));\n}\n\n/** `Action.enabled` for an action that routes what an event carries through\n * `handlers` (the registry's when omitted): refused when none could claim any\n * of it. An invocation that carries nothing, a trigger, is taken. */\nexport function claimable(\n carried: { items: readonly IngestItem[] } | undefined,\n handlers?: readonly ContentHandlerEntry[],\n): true | ActionDisabledReason {\n return !carried || couldClaim(carried.items, handlers) ? true : ActionDisabledReason.NotApplicable;\n}\n\nexport const ingestAction: Action & { requires: string[] } = {\n id: 'ingest',\n label: 'Insert external content',\n defaultBinding: [\n { kind: 'drop', mods: ANY_INGEST_MODS },\n { kind: 'paste', mods: ANY_INGEST_MODS },\n ],\n requires: [...INGEST_REQUIRES],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => ingestFromEvent(deps, params),\n },\n // No `eligible` rule: external-content arrival is mode-agnostic. The\n // listener-level editable-target guard already keeps text-editing pastes\n // away from the scene.\n enabled: (_deps, _at, carried) => claimable(carried),\n};\n"],"mappings":";;;;AA+BA,IAAaA,IAAkB;CAC7B,KAAK;CAAY,MAAM;CAAY,MAAM;CAAY,OAAO;AAC9D,GAGaC,IAAkB;CAAC;CAAS;CAAa;CAAU;CAAY;AAAW;AASvF,SAAgBC,EACd,GACA,GACA,GACM;CACN,IAAMC,IAAQC,GAAQ;CACtB,IAAI,CAACD,KAASA,EAAM,WAAW,GAAG;CAClC,IAAME,IAAYC,EAAK,WACjBC,IAASD,EAAK,QACdE,IAAQF,EAAK,OACbG,IAAYH,EAAK;CACvB,IAAI,CAACD,KAAa,CAACE,KAAU,CAACC,KAAS,CAACC,GAAW;CACnD,IAAMC,IAAWJ,EAAK,UAOhBK,IAAiB;EACrB,OALA,OAAOP,GAAQ,UAAW,YAAY,OAAOA,GAAQ,UAAW,WAC5D;GAAE,GAAGA,EAAO;GAAkB,GAAGA,EAAO;EAAiB,IACzD;EAIJ,yBAAyBC,EAAU,kBAAkB;EACrD;EACA,WAAW,GAAK,MAAU;GACxB,AAAIK,IAAUA,EAASE,GAAKC,KAAS,QAAQ,IACxCL,EAAM,WAAWI,GAAKC,KAAS,UAAUC,EAAqBN,GAAOC,EAAU,cAAc,CAAC;EACrG;EACA;EACA;EAIA,YAAYJ,EAAU;EACtB,KAAKA,EAAU;EACf,WAAWA,EAAU;EACrB;CACF;CAIA,EAAUF,GAAOQ,GAAKI,CAAI,CAAC,CAAC,OAAO,MAAQ,QAAQ,KAAK,kBAAkBC,CAAG,CAAC;AAChF;AAKA,SAAgBC,EACd,GACA,GAC6B;CAC7B,OAAO,CAACC,KAAWC,EAAWD,EAAQ,OAAOE,CAAQ,IAAI,KAAOC,EAAqB;AACvF;AAEA,IAAaC,IAAgD;CAC3D,IAAI;CACJ,OAAO;CACP,gBAAgB,CACd;EAAE,MAAM;EAAQ,MAAMtB;CAAgB,GACtC;EAAE,MAAM;EAAS,MAAMA;CAAgB,CACzC;CACA,UAAU,CAAC,GAAGC,CAAe;CAC7B,SAAS;EACP,QAAQ;EACR,MAAM,GAAM,MAAWC,EAAgBI,GAAMF,CAAM;CACrD;CAIA,UAAU,GAAO,GAAK,MAAYa,EAAUC,CAAO;AACrD"}
@@ -1,27 +1,26 @@
1
- import { pathToAnchors as e } from "../../../features/paths/anchors.js";
2
- import { editingLayer as t, inPlane as n } from "../planeInput.js";
3
- import { editAnchorSet as r, insertAnchorOnSegment as i, segmentAt as a } from "../../../features/paths/anchorEdits.js";
1
+ import { editingLayer as e, inPlane as t } from "../planeInput.js";
2
+ import { editAnchorSet as n, insertAnchorOnSegment as r, pathToAnchors as i, segmentAt as a } from "@weasel-js/geom";
4
3
  import { ActionDisabledReason as o } from "@weasel-js/routing";
5
4
  //#region src/interactions/actions/defaults/insertPathAnchor.ts
6
5
  var s = 8, c = {
7
6
  glyph: "penPlus",
8
7
  fallback: "crosshair"
9
8
  };
10
- function l(t, n, r) {
11
- let i = t?.editAnchors;
12
- if (!i?.editingId) return null;
13
- let o = i.getEditablePath(i.editingId);
9
+ function l(e, t, n) {
10
+ let r = e?.editAnchors;
11
+ if (!r?.editingId) return null;
12
+ let o = r.getEditablePath(r.editingId);
14
13
  if (!o || o.kind !== "polygon") return null;
15
- let c = t?.view?.get().scale, l = a(e(o), n, r, {
14
+ let c = e?.view?.get().scale, l = a(i(o), t, n, {
16
15
  tolerancePx: s,
17
16
  ...c ? { scale: c } : {}
18
17
  });
19
18
  return l ? {
20
- dep: i,
19
+ dep: r,
21
20
  hit: l
22
21
  } : null;
23
22
  }
24
- var u = n({
23
+ var u = t({
25
24
  id: "insertPathAnchor",
26
25
  label: "Insert anchor",
27
26
  defaultBinding: {
@@ -34,16 +33,16 @@ var u = n({
34
33
  invoker: {
35
34
  timing: "immediate",
36
35
  run(e, t) {
37
- let n = t?.worldX, a = t?.worldY;
38
- if (typeof n != "number" || typeof a != "number") return;
39
- let o = l(e, n, a);
36
+ let i = t?.worldX, a = t?.worldY;
37
+ if (typeof i != "number" || typeof a != "number") return;
38
+ let o = l(e, i, a);
40
39
  if (!o) return;
41
- let { dep: s, hit: c } = o, u = s.getEditablePath(s.editingId), d = -1, f = r(u, (e) => (d = i(e, c), d !== -1));
40
+ let { dep: s, hit: c } = o, u = s.getEditablePath(s.editingId), d = -1, f = n(u, (e) => (d = r(e, c), d !== -1));
42
41
  f && (s.applyEdit(s.editingId, f, "Insert anchor"), s.setSelectedAnchors([d]));
43
42
  }
44
43
  },
45
44
  enabled: (e, t) => !e?.editAnchors?.editingId || t && !l(e, t.x, t.y) ? o.NotApplicable : !0
46
- }, t);
45
+ }, e);
47
46
  //#endregion
48
47
  export { u as insertPathAnchorAction };
49
48
 
@@ -1 +1 @@
1
- {"version":3,"file":"insertPathAnchor.js","names":["SEGMENT_HIT_PX","INSERT_CURSOR","segmentUnder","dep","deps","path","scale","hit","segmentAt","pathToAnchors","x","y","insertPathAnchorAction","inPlane","wx","params","wy","under","inserted","next","editAnchorSet","insertAnchorOnSegment","set","at","ActionDisabledReason","editingLayer"],"sources":["../../../../src/interactions/actions/defaults/insertPathAnchor.ts"],"sourcesContent":["/**\n * `insertPathAnchorAction` — Alt+click on a segment of the path being\n * edited inserts a new anchor there, without changing the path's shape.\n *\n * Alt+click because plain click already belongs to `selectAnchorAction`\n * (select an anchor, or clear the anchor selection on a miss), and\n * Alt+Shift+click to `cutPathAtAnchorAction`.\n *\n * The segment test lives in `enabled`, which the dispatcher hands the\n * event's world point: a click off every segment (or on an anchor) reports\n * not-applicable, so the dispatcher falls through to whatever else the\n * click could mean, and the hover pump shows `cursor` only where a click\n * would insert.\n */\n\nimport type { Action, ActionDeps, ImmediateInvoker } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { CursorSpec } from '@weasel-js/cursor';\nimport type { EditAnchorsDep } from '../depSchema';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { pathToAnchors } from 'features/paths/anchors';\nimport {\n editAnchorSet,\n insertAnchorOnSegment,\n segmentAt,\n type AnchorSet,\n type SegmentHit,\n} from 'features/paths/anchorEdits';\nimport { inPlane, editingLayer } from '../planeInput';\n\n/** Screen-px reach of a segment, and the radius around each anchor that\n * stays the anchor's. Matches the path-anchor affordance's default hit\n * radius, so the two regions meet without a gap. */\nconst SEGMENT_HIT_PX = 8;\n\nconst INSERT_CURSOR: CursorSpec = { glyph: 'penPlus', fallback: 'crosshair' };\n\nfunction segmentUnder(\n deps: ActionDeps | undefined,\n x: number,\n y: number,\n): { dep: EditAnchorsDep; hit: SegmentHit } | null {\n const dep = deps?.editAnchors;\n if (!dep?.editingId) return null;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath | null | undefined;\n if (!path || path.kind !== 'polygon') return null;\n const scale = deps?.view?.get().scale;\n const hit = segmentAt(pathToAnchors(path) as AnchorSet, x, y, {\n tolerancePx: SEGMENT_HIT_PX,\n ...(scale ? { scale } : {}),\n });\n return hit ? { dep, hit } : null;\n}\n\nexport const insertPathAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'insertPathAnchor',\n label: 'Insert anchor',\n defaultBinding: { kind: 'click', mods: { alt: true } },\n cursor: INSERT_CURSOR,\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const under = segmentUnder(deps, wx, wy);\n if (!under) return;\n const { dep, hit } = under;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath;\n let inserted = -1;\n const next = editAnchorSet(path, (set) => {\n inserted = insertAnchorOnSegment(set, hit);\n return inserted !== -1;\n });\n if (!next) return;\n dep.applyEdit(dep.editingId, next, 'Insert anchor');\n dep.setSelectedAnchors([inserted]);\n },\n } as ImmediateInvoker,\n enabled: (deps, at) => {\n const dep = deps?.editAnchors;\n if (!dep?.editingId) return ActionDisabledReason.NotApplicable;\n if (at && !segmentUnder(deps, at.x, at.y)) return ActionDisabledReason.NotApplicable;\n return true;\n },\n}, editingLayer);\n"],"mappings":";;;;;AAiCA,IAAMA,IAAiB,GAEjBC,IAA4B;CAAE,OAAO;CAAW,UAAU;AAAY;AAE5E,SAASC,EACP,GACA,GACA,GACiD;CACjD,IAAMC,IAAMC,GAAM;CAClB,IAAI,CAACD,GAAK,WAAW,OAAO;CAC5B,IAAME,IAAOF,EAAI,gBAAgBA,EAAI,SAAS;CAC9C,IAAI,CAACE,KAAQA,EAAK,SAAS,WAAW,OAAO;CAC7C,IAAMC,IAAQF,GAAM,MAAM,IAAI,CAAC,CAAC,OAC1BG,IAAMC,EAAUC,EAAcJ,CAAI,GAAgBK,GAAGC,GAAG;EAC5D,aAAaX;EACb,GAAIM,IAAQ,EAAE,SAAM,IAAI,CAAC;CAC3B,CAAC;CACD,OAAOC,IAAM;EAAE;EAAK;CAAI,IAAI;AAC9B;AAEA,IAAaK,IAA0DC,EAAQ;CAC7E,IAAI;CACJ,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAS,MAAM,EAAE,KAAK,GAAK;CAAE;CACrD,QAAQZ;CACR,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,eAAe,MAAM;CAChC,SAAS;EACP,QAAQ;EACR,IAAI,GAAM,GAAQ;GAChB,IAAMa,IAAKC,GAAQ,QACbC,IAAKD,GAAQ;GACnB,IAAI,OAAOD,KAAO,YAAY,OAAOE,KAAO,UAAU;GACtD,IAAMC,IAAQf,EAAaE,GAAMU,GAAIE,CAAE;GACvC,IAAI,CAACC,GAAO;GACZ,IAAM,EAAE,QAAK,WAAQA,GACfZ,IAAOF,EAAI,gBAAgBA,EAAI,SAAS,GAC1Ce,IAAW,IACTC,IAAOC,EAAcf,IAAO,OAChC,IAAWgB,EAAsBC,GAAKf,CAAG,GAClCW,MAAa,GACrB;GACD,AAAKC,MACLhB,EAAI,UAAUA,EAAI,WAAWgB,GAAM,eAAe,GAClDhB,EAAI,mBAAmB,CAACe,CAAQ,CAAC;EACnC;CACF;CACA,UAAU,GAAM,MAEV,CADQd,GAAM,aACR,aACNmB,KAAM,CAACrB,EAAaE,GAAMmB,EAAG,GAAGA,EAAG,CAAC,IAAUC,EAAqB,gBAChE;AAEX,GAAGC,CAAY"}
1
+ {"version":3,"file":"insertPathAnchor.js","names":["SEGMENT_HIT_PX","INSERT_CURSOR","segmentUnder","dep","deps","path","scale","hit","segmentAt","pathToAnchors","x","y","insertPathAnchorAction","inPlane","wx","params","wy","under","inserted","next","editAnchorSet","insertAnchorOnSegment","set","at","ActionDisabledReason","editingLayer"],"sources":["../../../../src/interactions/actions/defaults/insertPathAnchor.ts"],"sourcesContent":["/**\n * `insertPathAnchorAction` — Alt+click on a segment of the path being\n * edited inserts a new anchor there, without changing the path's shape.\n *\n * Alt+click because plain click already belongs to `selectAnchorAction`\n * (select an anchor, or clear the anchor selection on a miss), and\n * Alt+Shift+click to `cutPathAtAnchorAction`.\n *\n * The segment test lives in `enabled`, which the dispatcher hands the\n * event's world point: a click off every segment (or on an anchor) reports\n * not-applicable, so the dispatcher falls through to whatever else the\n * click could mean, and the hover pump shows `cursor` only where a click\n * would insert.\n */\n\nimport type { Action, ActionDeps, ImmediateInvoker } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { CursorSpec } from '@weasel-js/cursor';\nimport type { EditAnchorsDep } from '../depSchema';\nimport { type PolygonPath, pathToAnchors } from '@weasel-js/geom';\nimport {\n editAnchorSet,\n insertAnchorOnSegment,\n segmentAt,\n type AnchorSet,\n type SegmentHit,\n} from '@weasel-js/geom';\nimport { inPlane, editingLayer } from '../planeInput';\n\n/** Screen-px reach of a segment, and the radius around each anchor that\n * stays the anchor's. Matches the path-anchor affordance's default hit\n * radius, so the two regions meet without a gap. */\nconst SEGMENT_HIT_PX = 8;\n\nconst INSERT_CURSOR: CursorSpec = { glyph: 'penPlus', fallback: 'crosshair' };\n\nfunction segmentUnder(\n deps: ActionDeps | undefined,\n x: number,\n y: number,\n): { dep: EditAnchorsDep; hit: SegmentHit } | null {\n const dep = deps?.editAnchors;\n if (!dep?.editingId) return null;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath | null | undefined;\n if (!path || path.kind !== 'polygon') return null;\n const scale = deps?.view?.get().scale;\n const hit = segmentAt(pathToAnchors(path) as AnchorSet, x, y, {\n tolerancePx: SEGMENT_HIT_PX,\n ...(scale ? { scale } : {}),\n });\n return hit ? { dep, hit } : null;\n}\n\nexport const insertPathAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'insertPathAnchor',\n label: 'Insert anchor',\n defaultBinding: { kind: 'click', mods: { alt: true } },\n cursor: INSERT_CURSOR,\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const wx = params?.worldX as number | undefined;\n const wy = params?.worldY as number | undefined;\n if (typeof wx !== 'number' || typeof wy !== 'number') return;\n const under = segmentUnder(deps, wx, wy);\n if (!under) return;\n const { dep, hit } = under;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath;\n let inserted = -1;\n const next = editAnchorSet(path, (set) => {\n inserted = insertAnchorOnSegment(set, hit);\n return inserted !== -1;\n });\n if (!next) return;\n dep.applyEdit(dep.editingId, next, 'Insert anchor');\n dep.setSelectedAnchors([inserted]);\n },\n } as ImmediateInvoker,\n enabled: (deps, at) => {\n const dep = deps?.editAnchors;\n if (!dep?.editingId) return ActionDisabledReason.NotApplicable;\n if (at && !segmentUnder(deps, at.x, at.y)) return ActionDisabledReason.NotApplicable;\n return true;\n },\n}, editingLayer);\n"],"mappings":";;;;AAgCA,IAAMA,IAAiB,GAEjBC,IAA4B;CAAE,OAAO;CAAW,UAAU;AAAY;AAE5E,SAASC,EACP,GACA,GACA,GACiD;CACjD,IAAMC,IAAMC,GAAM;CAClB,IAAI,CAACD,GAAK,WAAW,OAAO;CAC5B,IAAME,IAAOF,EAAI,gBAAgBA,EAAI,SAAS;CAC9C,IAAI,CAACE,KAAQA,EAAK,SAAS,WAAW,OAAO;CAC7C,IAAMC,IAAQF,GAAM,MAAM,IAAI,CAAC,CAAC,OAC1BG,IAAMC,EAAUC,EAAcJ,CAAI,GAAgBK,GAAGC,GAAG;EAC5D,aAAaX;EACb,GAAIM,IAAQ,EAAE,SAAM,IAAI,CAAC;CAC3B,CAAC;CACD,OAAOC,IAAM;EAAE;EAAK;CAAI,IAAI;AAC9B;AAEA,IAAaK,IAA0DC,EAAQ;CAC7E,IAAI;CACJ,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAS,MAAM,EAAE,KAAK,GAAK;CAAE;CACrD,QAAQZ;CACR,UAAU,EAAE,YAAY,gBAAgB;CACxC,UAAU,CAAC,eAAe,MAAM;CAChC,SAAS;EACP,QAAQ;EACR,IAAI,GAAM,GAAQ;GAChB,IAAMa,IAAKC,GAAQ,QACbC,IAAKD,GAAQ;GACnB,IAAI,OAAOD,KAAO,YAAY,OAAOE,KAAO,UAAU;GACtD,IAAMC,IAAQf,EAAaE,GAAMU,GAAIE,CAAE;GACvC,IAAI,CAACC,GAAO;GACZ,IAAM,EAAE,QAAK,WAAQA,GACfZ,IAAOF,EAAI,gBAAgBA,EAAI,SAAS,GAC1Ce,IAAW,IACTC,IAAOC,EAAcf,IAAO,OAChC,IAAWgB,EAAsBC,GAAKf,CAAG,GAClCW,MAAa,GACrB;GACD,AAAKC,MACLhB,EAAI,UAAUA,EAAI,WAAWgB,GAAM,eAAe,GAClDhB,EAAI,mBAAmB,CAACe,CAAQ,CAAC;EACnC;CACF;CACA,UAAU,GAAM,MAEV,CADQd,GAAM,aACR,aACNmB,KAAM,CAACrB,EAAaE,GAAMmB,EAAG,GAAGA,EAAG,CAAC,IAAUC,EAAqB,gBAChE;AAEX,GAAGC,CAAY"}
@@ -1,41 +1,41 @@
1
- import { createTransformOp as e } from "../../../core/ops/transform.js";
2
- import { translatePoseViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
3
- import { moveSources as n, translateTargets as r } from "../selectionSubtree.js";
4
- import { geometryDataOp as i } from "../geometryProjection.js";
5
- import { nodeDescriptors as a, poseDescriptorOf as o } from "../poseDescriptorDep.js";
6
- import { defaultCommitAdapter as s } from "../defaultCommitAdapter.js";
7
- import { scenePoseFrame as c } from "../poseFrame.js";
1
+ import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
2
+ import { nodeDescriptors as t, poseDescriptorOf as n } from "../poseDescriptorDep.js";
3
+ import { moveSources as r, translateTargets as i } from "../selectionSubtree.js";
4
+ import { createTransformOp as a } from "../../../core/ops/transform.js";
5
+ import { geometryDataOp as o } from "../geometryProjection.js";
6
+ import { scenePoseFrame as s } from "../poseFrame.js";
7
+ import { defaultCommitAdapter as c } from "../defaultCommitAdapter.js";
8
8
  import { requiresSelection as l } from "./requiresSelection.js";
9
9
  import { NUDGE_KEY as u, NUDGE_LABEL as d, nudgeDelta as f } from "./nudgeSteps.js";
10
10
  //#region src/interactions/actions/defaults/nudge.ts
11
- function p(o, l, u, d, f, p, m, h) {
12
- let g = a(l, m), _ = r(l, c(l, h), n(l, o.get()));
13
- if (_.length === 0) return;
14
- let v = [
11
+ function p(n, l, u, d, f, p, m) {
12
+ let h = t(l, m), g = i(l, s(l), r(l, n.get()));
13
+ if (g.length === 0) return;
14
+ let _ = [
15
15
  1,
16
16
  0,
17
17
  0,
18
18
  1,
19
19
  u,
20
20
  d
21
- ], y = [];
22
- for (let n of _) {
23
- let r = l.get(n);
24
- if (!r) continue;
25
- y.push(e({
26
- id: n,
27
- from: r.pose,
28
- to: t(r.pose, u, d, g(n)),
21
+ ], v = [];
22
+ for (let t of g) {
23
+ let n = l.get(t);
24
+ if (!n) continue;
25
+ v.push(a({
26
+ id: t,
27
+ from: n.pose,
28
+ to: e(n.pose, u, d, h(t)),
29
29
  label: "Nudge"
30
30
  }));
31
- let a = i(p, {
32
- id: n,
33
- data: r.data,
34
- pose: r.pose
35
- }, v, "Nudge");
36
- a && y.push(a);
31
+ let r = o(p, {
32
+ id: t,
33
+ data: n.data,
34
+ pose: n.pose
35
+ }, _, "Nudge");
36
+ r && v.push(r);
37
37
  }
38
- y.length !== 0 && (f ? f(y, "Nudge") : l.applyBatch(y, "Nudge", s(l, o.adapterMethods)));
38
+ v.length !== 0 && (f ? f(v, "Nudge") : l.applyBatch(v, "Nudge", c(l, n.adapterMethods)));
39
39
  }
40
40
  function m(e) {
41
41
  return {
@@ -62,14 +62,13 @@ function m(e) {
62
62
  "scene",
63
63
  "applyOps",
64
64
  "geometryProjection",
65
- "poseDescriptor",
66
- "poseComposition"
65
+ "poseDescriptor"
67
66
  ],
68
67
  invoker: {
69
68
  timing: "immediate",
70
- run: (t, n) => {
71
- let { dx: r, dy: i } = f(e, n?.magnitude), a = t.selection, s = t.scene, c = t.applyOps, l = t.geometryProjection;
72
- a && s && p(a, s, r, i, c, l, o(t.poseDescriptor), t.poseComposition);
69
+ run: (t, r) => {
70
+ let { dx: i, dy: a } = f(e, r?.magnitude), o = t.selection, s = t.scene, c = t.applyOps, l = t.geometryProjection;
71
+ o && s && p(o, s, i, a, c, l, n(t.poseDescriptor));
73
72
  }
74
73
  },
75
74
  enabled: l
@@ -1 +1 @@
1
- {"version":3,"file":"nudge.js","names":["nudgeSelection","descriptorOf","nodeDescriptors","scene","d","ids","translateTargets","scenePoseFrame","poseComposition","moveSources","selection","m","dx","dy","ops","id","node","createTransformOp","translatePoseViaDescriptor","dataOp","geometryDataOp","geometryProjection","applyOps","defaultCommitAdapter","makeNudgeAction","dir","NUDGE_LABEL","NUDGE_KEY","nudgeDelta","params","deps","poseDescriptorOf","requiresSelection","nudgeUpAction","nudgeDownAction","nudgeLeftAction","nudgeRightAction"],"sources":["../../../../src/interactions/actions/defaults/nudge.ts"],"sourcesContent":["import type { Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Op } from 'core/ops/types';\nimport type { Mat3 } from '@weasel-js/geom';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { translatePoseViaDescriptor } from '../resize/geometry';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport type { Action } from '@weasel-js/routing';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { requiresSelection } from './requiresSelection';\nimport { geometryDataOp, type GeometryProjection } from '../geometryProjection';\nimport { scenePoseFrame } from '../poseFrame';\nimport { moveSources, translateTargets } from '../selectionSubtree';\nimport { NUDGE_KEY, NUDGE_LABEL, nudgeDelta, type NudgeDirection } from './nudgeSteps';\n\n/**\n * Apply a translation of (dx, dy) to the selected nodes and the descendants\n * that do not ride on one of them, by building one `createTransformOp` per\n * node (from = pre-mutation pose, to = nudged pose) and routing the batch\n * through the consumer commit hook. Translates through the `poseDescriptor`\n * dep, so any pose shape moves.\n *\n * Mirrors `moveAction`'s `commitOps` helper: when `deps.applyOps` is present\n * the ops route through the consumer's history (one undo entry there);\n * otherwise they apply straight to the scene's own history via\n * `scene.applyBatch` + `defaultCommitAdapter`. Either way the whole nudge is a\n * single batch → one undo entry, preserving the old `scene.batch('Nudge', …)`\n * semantics exactly.\n */\nfunction nudgeSelection(\n selection: SelectionApi,\n scene: Scene<unknown, string, unknown>,\n dx: number,\n dy: number,\n applyOps: ((ops: Op[], label: string) => void) | undefined,\n geometryProjection: GeometryProjection | undefined,\n d: PoseDescriptor<unknown>,\n poseComposition: unknown,\n): void {\n const descriptorOf = nodeDescriptors(scene, d);\n const ids = translateTargets(\n scene, scenePoseFrame(scene, poseComposition), moveSources(scene, selection.get()),\n );\n if (ids.length === 0) return;\n // Pure translation by the nudge step. Pushed alongside each transform op so\n // a wired geometryProjection mirrors the node's data-held geometry too.\n const m: Mat3 = [1, 0, 0, 1, dx, dy];\n\n // Read poses BEFORE building ops so each op's `from` is the pre-mutation\n // value (the same value the old direct mutation captured implicitly).\n const ops: Op[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n ops.push(createTransformOp<unknown>({\n id: id as string,\n from: node.pose,\n to: translatePoseViaDescriptor(node.pose, dx, dy, descriptorOf(id)),\n label: 'Nudge',\n }));\n const dataOp = geometryDataOp(\n geometryProjection,\n { id: id as string, data: node.data, pose: node.pose },\n m,\n 'Nudge',\n );\n if (dataOp) ops.push(dataOp);\n }\n if (ops.length === 0) return;\n\n if (applyOps) applyOps(ops, 'Nudge');\n else scene.applyBatch(ops, 'Nudge', defaultCommitAdapter(scene, selection.adapterMethods));\n}\n\n/**\n * @experimental\n * Build one static nudge descriptor for the given direction. Each descriptor\n * carries two parametric bindings: bare arrow (magnitude='small') and\n * Shift+arrow (magnitude='big').\n *\n * Requires dep-schema entries: `selection`, `scene`.\n */\nfunction makeNudgeAction(dir: NudgeDirection): Action & { requires: string[] } {\n return {\n id: `nudge.${dir}`,\n label: `Nudge ${NUDGE_LABEL[dir]}`,\n group: 'nudge',\n defaultBinding: [\n { spec: { kind: 'key', key: NUDGE_KEY[dir] }, opts: { params: { magnitude: 'small' } } },\n { spec: { kind: 'key', key: NUDGE_KEY[dir], mods: { shift: true } }, opts: { params: { magnitude: 'big' } } },\n ],\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'applyOps', 'geometryProjection', 'poseDescriptor', 'poseComposition'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const { dx, dy } = nudgeDelta(dir, params?.magnitude);\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n const geometryProjection = deps.geometryProjection;\n if (!selection || !scene) return;\n nudgeSelection(selection, scene, dx, dy, applyOps, geometryProjection, poseDescriptorOf(deps.poseDescriptor), deps.poseComposition);\n },\n },\n enabled: requiresSelection,\n };\n}\n\nexport const nudgeUpAction = makeNudgeAction('up');\nexport const nudgeDownAction = makeNudgeAction('down');\nexport const nudgeLeftAction = makeNudgeAction('left');\nexport const nudgeRightAction = makeNudgeAction('right');\n"],"mappings":";;;;;;;;;;AA8BA,SAASA,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAeC,EAAgBC,GAAOC,CAAC,GACvCC,IAAMC,EACVH,GAAOI,EAAeJ,GAAOK,CAAe,GAAGC,EAAYN,GAAOO,EAAU,IAAI,CAAC,CACnF;CACA,IAAIL,EAAI,WAAW,GAAG;CAGtB,IAAMM,IAAU;EAAC;EAAG;EAAG;EAAG;EAAGC;EAAIC;CAAE,GAI7BC,IAAY,CAAC;CACnB,KAAK,IAAMC,KAAMV,GAAK;EACpB,IAAMW,IAAOb,EAAM,IAAIY,CAAE;EACzB,IAAI,CAACC,GAAM;EACX,EAAI,KAAKC,EAA2B;GAC9B;GACJ,MAAMD,EAAK;GACX,IAAIE,EAA2BF,EAAK,MAAMJ,GAAIC,GAAIZ,EAAac,CAAE,CAAC;GAClE,OAAO;EACT,CAAC,CAAC;EACF,IAAMI,IAASC,EACbC,GACA;GAAM;GAAc,MAAML,EAAK;GAAM,MAAMA,EAAK;EAAK,GACrDL,GACA,OACF;EACA,AAAIQ,KAAQL,EAAI,KAAKK,CAAM;CAC7B;CACA,AAAIL,EAAI,WAAW,MAEfQ,IAAUA,EAASR,GAAK,OAAO,IAC9BX,EAAM,WAAWW,GAAK,SAASS,EAAqBpB,GAAOO,EAAU,cAAc,CAAC;AAC3F;AAUA,SAASc,EAAgB,GAAsD;CAC7E,OAAO;EACL,IAAI,SAASC;EACb,OAAO,SAASC,EAAYD;EAC5B,OAAO;EACP,gBAAgB,CACd;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;GAAK;GAAgC,MAAM,EAAE,QAAQ,EAAE,WAAW,QAAQ,EAAE;EAAE,GACpH;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;IAAM,MAAM,EAAE,OAAO,GAAK;GAAE;GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,MAAM,EAAE;EAAE,CAC9G;EACA,UAAU,EAAE,YAAY,uBAAuB;EAC/C,UAAU;GAAC;GAAa;GAAS;GAAY;GAAsB;GAAkB;EAAiB;EACtG,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAM,EAAE,OAAI,UAAOG,EAAWH,GAAKI,GAAQ,SAAS,GAC9CnB,IAAYoB,EAAK,WACjB3B,IAAQ2B,EAAK,OACbR,IAAWQ,EAAK,UAChBT,IAAqBS,EAAK;IAChC,AAAKpB,KAAcP,KACnBH,EAAeU,GAAWP,GAAOS,GAAIC,GAAIS,GAAUD,GAAoBU,EAAiBD,EAAK,cAAc,GAAGA,EAAK,eAAe;GACpI;EACF;EACA,SAASE;CACX;AACF;AAEA,IAAaC,IAAmBT,EAAgB,IAAI,GACvCU,IAAmBV,EAAgB,MAAM,GACzCW,IAAmBX,EAAgB,MAAM,GACzCY,IAAmBZ,EAAgB,OAAO"}
1
+ {"version":3,"file":"nudge.js","names":["nudgeSelection","descriptorOf","nodeDescriptors","scene","d","ids","translateTargets","scenePoseFrame","moveSources","selection","m","dx","dy","ops","id","node","createTransformOp","translatePoseViaDescriptor","dataOp","geometryDataOp","geometryProjection","applyOps","defaultCommitAdapter","makeNudgeAction","dir","NUDGE_LABEL","NUDGE_KEY","nudgeDelta","params","deps","poseDescriptorOf","requiresSelection","nudgeUpAction","nudgeDownAction","nudgeLeftAction","nudgeRightAction"],"sources":["../../../../src/interactions/actions/defaults/nudge.ts"],"sourcesContent":["import type { Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Op } from 'core/ops/types';\nimport type { Mat3 } from '@weasel-js/geom';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { translatePoseViaDescriptor } from '../resize/geometry';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport type { Action } from '@weasel-js/routing';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { requiresSelection } from './requiresSelection';\nimport { geometryDataOp, type GeometryProjection } from '../geometryProjection';\nimport { scenePoseFrame } from '../poseFrame';\nimport { moveSources, translateTargets } from '../selectionSubtree';\nimport { NUDGE_KEY, NUDGE_LABEL, nudgeDelta, type NudgeDirection } from './nudgeSteps';\n\n/**\n * Apply a translation of (dx, dy) to the selected nodes and the descendants\n * that do not ride on one of them, as one undo entry. Translates through the\n * `poseDescriptor` dep, so any pose shape moves.\n */\nfunction nudgeSelection(\n selection: SelectionApi,\n scene: Scene<unknown, string, unknown>,\n dx: number,\n dy: number,\n applyOps: ((ops: Op[], label: string) => void) | undefined,\n geometryProjection: GeometryProjection | undefined,\n d: PoseDescriptor<unknown>,\n): void {\n const descriptorOf = nodeDescriptors(scene, d);\n const ids = translateTargets(\n scene, scenePoseFrame(scene), moveSources(scene, selection.get()),\n );\n if (ids.length === 0) return;\n // Pushed alongside each transform op so a wired geometryProjection moves\n // the node's data-held geometry too.\n const m: Mat3 = [1, 0, 0, 1, dx, dy];\n\n const ops: Op[] = [];\n for (const id of ids) {\n const node = scene.get(id);\n if (!node) continue;\n ops.push(createTransformOp<unknown>({\n id: id as string,\n from: node.pose,\n to: translatePoseViaDescriptor(node.pose, dx, dy, descriptorOf(id)),\n label: 'Nudge',\n }));\n const dataOp = geometryDataOp(\n geometryProjection,\n { id: id as string, data: node.data, pose: node.pose },\n m,\n 'Nudge',\n );\n if (dataOp) ops.push(dataOp);\n }\n if (ops.length === 0) return;\n\n if (applyOps) applyOps(ops, 'Nudge');\n else scene.applyBatch(ops, 'Nudge', defaultCommitAdapter(scene, selection.adapterMethods));\n}\n\n/**\n * @experimental\n * The nudge descriptor for one direction: bare arrow (magnitude='small') and\n * Shift+arrow (magnitude='big').\n */\nfunction makeNudgeAction(dir: NudgeDirection): Action & { requires: string[] } {\n return {\n id: `nudge.${dir}`,\n label: `Nudge ${NUDGE_LABEL[dir]}`,\n group: 'nudge',\n defaultBinding: [\n { spec: { kind: 'key', key: NUDGE_KEY[dir] }, opts: { params: { magnitude: 'small' } } },\n { spec: { kind: 'key', key: NUDGE_KEY[dir], mods: { shift: true } }, opts: { params: { magnitude: 'big' } } },\n ],\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'applyOps', 'geometryProjection', 'poseDescriptor'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const { dx, dy } = nudgeDelta(dir, params?.magnitude);\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n const geometryProjection = deps.geometryProjection;\n if (!selection || !scene) return;\n nudgeSelection(selection, scene, dx, dy, applyOps, geometryProjection, poseDescriptorOf(deps.poseDescriptor));\n },\n },\n enabled: requiresSelection,\n };\n}\n\nexport const nudgeUpAction = makeNudgeAction('up');\nexport const nudgeDownAction = makeNudgeAction('down');\nexport const nudgeLeftAction = makeNudgeAction('left');\nexport const nudgeRightAction = makeNudgeAction('right');\n"],"mappings":";;;;;;;;;;AAqBA,SAASA,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAeC,EAAgBC,GAAOC,CAAC,GACvCC,IAAMC,EACVH,GAAOI,EAAeJ,CAAK,GAAGK,EAAYL,GAAOM,EAAU,IAAI,CAAC,CAClE;CACA,IAAIJ,EAAI,WAAW,GAAG;CAGtB,IAAMK,IAAU;EAAC;EAAG;EAAG;EAAG;EAAGC;EAAIC;CAAE,GAE7BC,IAAY,CAAC;CACnB,KAAK,IAAMC,KAAMT,GAAK;EACpB,IAAMU,IAAOZ,EAAM,IAAIW,CAAE;EACzB,IAAI,CAACC,GAAM;EACX,EAAI,KAAKC,EAA2B;GAC9B;GACJ,MAAMD,EAAK;GACX,IAAIE,EAA2BF,EAAK,MAAMJ,GAAIC,GAAIX,EAAaa,CAAE,CAAC;GAClE,OAAO;EACT,CAAC,CAAC;EACF,IAAMI,IAASC,EACbC,GACA;GAAM;GAAc,MAAML,EAAK;GAAM,MAAMA,EAAK;EAAK,GACrDL,GACA,OACF;EACA,AAAIQ,KAAQL,EAAI,KAAKK,CAAM;CAC7B;CACA,AAAIL,EAAI,WAAW,MAEfQ,IAAUA,EAASR,GAAK,OAAO,IAC9BV,EAAM,WAAWU,GAAK,SAASS,EAAqBnB,GAAOM,EAAU,cAAc,CAAC;AAC3F;AAOA,SAASc,EAAgB,GAAsD;CAC7E,OAAO;EACL,IAAI,SAASC;EACb,OAAO,SAASC,EAAYD;EAC5B,OAAO;EACP,gBAAgB,CACd;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;GAAK;GAAgC,MAAM,EAAE,QAAQ,EAAE,WAAW,QAAQ,EAAE;EAAE,GACpH;GAAE,MAAM;IAAE,MAAM;IAAO,KAAKE,EAAUF;IAAM,MAAM,EAAE,OAAO,GAAK;GAAE;GAAG,MAAM,EAAE,QAAQ,EAAE,WAAW,MAAM,EAAE;EAAE,CAC9G;EACA,UAAU,EAAE,YAAY,uBAAuB;EAC/C,UAAU;GAAC;GAAa;GAAS;GAAY;GAAsB;EAAgB;EACnF,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAM,EAAE,OAAI,UAAOG,EAAWH,GAAKI,GAAQ,SAAS,GAC9CnB,IAAYoB,EAAK,WACjB1B,IAAQ0B,EAAK,OACbR,IAAWQ,EAAK,UAChBT,IAAqBS,EAAK;IAChC,AAAKpB,KAAcN,KACnBH,EAAeS,GAAWN,GAAOQ,GAAIC,GAAIS,GAAUD,GAAoBU,EAAiBD,EAAK,cAAc,CAAC;GAC9G;EACF;EACA,SAASE;CACX;AACF;AAEA,IAAaC,IAAmBT,EAAgB,IAAI,GACvCU,IAAmBV,EAAgB,MAAM,GACzCW,IAAmBX,EAAgB,MAAM,GACzCY,IAAmBZ,EAAgB,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"pinchZoom.js","names":["makePinchZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","view","ctx","multiTouch","scratch","debug","startView","ax","ay","screenToWorld","viewToTransform","mt","moveCtx","currentSpread","factor","prev","centroid","current","zoomed","zoomAt","next","pinchZoomAction"],"sources":["../../../../src/interactions/actions/defaults/pinchZoom.ts"],"sourcesContent":["/**\n * `pinchZoomAction` — ongoing Action descriptor for two-finger pinch zoom\n * and pan. The id and label stay `pinchZoom` / `Pinch Zoom`.\n *\n * ## Status: REAL\n *\n * Implements pinch-zoom via the multi-touch pointer stream:\n * - `start`: captures startSpread from `ctx.multiTouch.pinch.startSpread`\n * (or falls back to `ctx.multiTouch.spread`). Records the initial centroid.\n * - `onMove`: computes zoom factor = currentSpread / startSpread, anchors\n * `zoomAt` on the previous centroid, then translates by the centroid\n * delta. Together those pin the world point under the gesture midpoint\n * as the midpoint moves, so the same gesture zooms and pans.\n * - `onEnd`: no-op — zoom is already applied each frame.\n *\n * ## Dispatcher extensions required\n *\n * - `InvocationCtx.multiTouch.pinch`: the dispatcher\n * populates it on every multitouch move-pump event. `startSpread` is\n * captured once when the handle opens; `currentSpread` updates each frame.\n * - `InputEvent.multitouch.centroid / spread`:\n * `useGestureDispatcher` synthesizes updated geometry on `pointermove`\n * when a multitouch handle is in flight.\n *\n * ## Graceful degradation\n *\n * If `ctx.multiTouch.pinch` is absent (e.g. old dispatcher without these\n * extensions), `start` returns an empty handle — no-op, no crash.\n *\n * @see zoomAt — fixed-point zoom primitive from `core/viewport/zoomAt`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { zoomAt } from 'core/viewport/zoomAt';\nimport { viewToTransform } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\n\n// ---------------------------------------------------------------------------\n// Internal scratch\n// ---------------------------------------------------------------------------\n\ninterface PinchScratch {\n view: ViewApi;\n startSpread: number;\n centroid: { x: number; y: number };\n}\n\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Tuning for {@link makePinchZoomAction}.\n */\nexport interface PinchZoomOptions {\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n}\n\n/**\n * @experimental\n * Build a `viewport.pinchZoom` Action descriptor with a configurable scale\n * clamp. The binding (two-finger multitouch) is fixed; only the clamp varies.\n *\n * Requires dep-schema entries: `view`.\n *\n * The invoker is `ongoing`. Zoom is applied per-frame via `view.set(zoomAt(...))`.\n */\n// No `eligible` field → pinch zoom is always eligible across all modes.\nexport function makePinchZoomAction(\n opts: PinchZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n return {\n id: 'viewport.pinchZoom',\n label: 'Pinch Zoom',\n group: 'viewport',\n defaultBinding: { kind: 'multiTouch', fingers: 2 },\n requires: ['view', 'debug'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const view = ctx.deps.view;\n if (!view) return {};\n\n const multiTouch = ctx.multiTouch;\n if (!multiTouch) return {};\n\n // On start, spread comes from the initial multitouch event.\n // The pinch field may not be set yet on start (it's populated on moves).\n const startSpread = multiTouch.spread > 0 ? multiTouch.spread : 1;\n\n const scratch: PinchScratch = { view, startSpread, centroid: multiTouch.centroid };\n const debug = ctx.deps.debug;\n const startView = view.get();\n const [ax, ay] = screenToWorld(multiTouch.centroid.x, multiTouch.centroid.y, viewToTransform(startView));\n\n return {\n kind: 'pinch',\n onMove(moveCtx: InvocationCtx): void {\n const mt = moveCtx.multiTouch;\n if (!mt?.pinch) return;\n const { currentSpread, centroid } = mt.pinch;\n if (currentSpread <= 0 || scratch.startSpread <= 0) return;\n const factor = currentSpread / scratch.startSpread;\n // Update startSpread each frame so the factor is incremental.\n // This avoids drift accumulation across many frames.\n scratch.startSpread = currentSpread;\n const prev = scratch.centroid;\n scratch.centroid = centroid;\n const current = scratch.view.get();\n // Anchor the zoom on where the fingers *were*, then translate by how\n // far they travelled — together those pin the world point under the\n // centroid as it moves. Anchoring on the new centroid instead drops\n // the translation half, so a two-finger drag zooms without panning.\n const zoomed = zoomAt(current, prev, factor, clamp);\n const next = {\n scale: zoomed.scale,\n x: zoomed.x - (centroid.x - prev.x) / zoomed.scale.x,\n y: zoomed.y - (centroid.y - prev.y) / zoomed.scale.y,\n };\n scratch.view.set(next);\n debug?.recordViewport('zoom', startView, next, { x: ax, y: ay });\n },\n // onEnd: nothing to do — zoom was applied each frame.\n };\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.pinchZoom` descriptor: two-finger pinch with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makePinchZoomAction()`.\n */\nexport const pinchZoomAction: Action & { requires: string[] } = makePinchZoomAction();\n"],"mappings":";;;;;AA2EA,SAAgBA,EACd,IAAyB,CAAC,GACO;CACjC,IAAMC,IAAQ;EAAE,KAAKC,EAAK,OAAOC;EAAkB,KAAKD,EAAK,OAAOE;CAAiB;CACrF,OAAO;EACL,IAAI;EACJ,OAAO;EACP,OAAO;EACP,gBAAgB;GAAE,MAAM;GAAc,SAAS;EAAE;EACjD,UAAU,CAAC,QAAQ,OAAO;EAC1B,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAsB;IAC9C,IAAMC,IAAOC,EAAI,KAAK;IACtB,IAAI,CAACD,GAAM,OAAO,CAAC;IAEnB,IAAME,IAAaD,EAAI;IACvB,IAAI,CAACC,GAAY,OAAO,CAAC;IAMzB,IAAMC,IAAwB;KAAE;KAAM,aAFlBD,EAAW,SAAS,IAAIA,EAAW,SAAS;KAEb,UAAUA,EAAW;IAAS,GAC3EE,IAAQH,EAAI,KAAK,OACjBI,IAAYL,EAAK,IAAI,GACrB,CAACM,GAAIC,KAAMC,EAAcN,EAAW,SAAS,GAAGA,EAAW,SAAS,GAAGO,EAAgBJ,CAAS,CAAC;IAEvG,OAAO;KACL,MAAM;KACN,OAAO,GAA8B;MACnC,IAAMK,IAAKC,EAAQ;MACnB,IAAI,CAACD,GAAI,OAAO;MAChB,IAAM,EAAE,kBAAe,gBAAaA,EAAG;MACvC,IAAIE,KAAiB,KAAKT,EAAQ,eAAe,GAAG;MACpD,IAAMU,IAASD,IAAgBT,EAAQ;MAGvC,EAAQ,cAAcS;MACtB,IAAME,IAAOX,EAAQ;MACrB,EAAQ,WAAWY;MACnB,IAAMC,IAAUb,EAAQ,KAAK,IAAI,GAK3Bc,IAASC,EAAOF,GAASF,GAAMD,GAAQjB,CAAK,GAC5CuB,IAAO;OACX,OAAOF,EAAO;OACd,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;OACnD,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;MACrD;MAEA,AADAd,EAAQ,KAAK,IAAIgB,CAAI,GACrBf,GAAO,eAAe,QAAQC,GAAWc,GAAM;OAAE,GAAGb;OAAI,GAAGC;MAAG,CAAC;KACjE;IAEF;GACF;EACF;EACA,eAAe;CACjB;AACF;AAOA,IAAaa,IAAmDzB,EAAoB"}
1
+ {"version":3,"file":"pinchZoom.js","names":["makePinchZoomAction","clamp","opts","DEFAULT_MIN_ZOOM","DEFAULT_MAX_ZOOM","view","ctx","multiTouch","scratch","debug","startView","ax","ay","screenToWorld","viewToTransform","mt","moveCtx","currentSpread","factor","prev","centroid","current","zoomed","zoomAt","next","pinchZoomAction"],"sources":["../../../../src/interactions/actions/defaults/pinchZoom.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { ViewApi } from '../depSchema';\nimport { zoomAt } from 'core/viewport/zoomAt';\nimport { viewToTransform } from 'core/viewport/view';\nimport { screenToWorld } from 'core/viewport/viewTransform';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM } from 'core/viewport/zoomBounds';\n\ninterface PinchScratch {\n view: ViewApi;\n startSpread: number;\n centroid: { x: number; y: number };\n}\n\n/**\n * @experimental\n * Tuning for {@link makePinchZoomAction}.\n */\nexport interface PinchZoomOptions {\n /** Lower clamp on the resulting view scale, forwarded to `zoomAt`. Default 0.1. */\n min?: number;\n /** Upper clamp on the resulting view scale, forwarded to `zoomAt`. Default 8. */\n max?: number;\n}\n\n/**\n * @experimental\n * Build a `viewport.pinchZoom` Action descriptor with a configurable scale\n * clamp. The same two-finger gesture zooms and pans, applied each frame.\n */\n// No `eligible` field → pinch zoom is always eligible across all modes.\nexport function makePinchZoomAction(\n opts: PinchZoomOptions = {},\n): Action & { requires: string[] } {\n const clamp = { min: opts.min ?? DEFAULT_MIN_ZOOM, max: opts.max ?? DEFAULT_MAX_ZOOM };\n return {\n id: 'viewport.pinchZoom',\n label: 'Pinch Zoom',\n group: 'viewport',\n defaultBinding: { kind: 'multiTouch', fingers: 2 },\n requires: ['view', 'debug'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const view = ctx.deps.view;\n if (!view) return {};\n\n const multiTouch = ctx.multiTouch;\n if (!multiTouch) return {};\n\n const startSpread = multiTouch.spread > 0 ? multiTouch.spread : 1;\n\n const scratch: PinchScratch = { view, startSpread, centroid: multiTouch.centroid };\n const debug = ctx.deps.debug;\n const startView = view.get();\n const [ax, ay] = screenToWorld(multiTouch.centroid.x, multiTouch.centroid.y, viewToTransform(startView));\n\n return {\n kind: 'pinch',\n onMove(moveCtx: InvocationCtx): void {\n const mt = moveCtx.multiTouch;\n if (!mt?.pinch) return;\n const { currentSpread, centroid } = mt.pinch;\n if (currentSpread <= 0 || scratch.startSpread <= 0) return;\n const factor = currentSpread / scratch.startSpread;\n // Rebase each frame so the factor is incremental.\n scratch.startSpread = currentSpread;\n const prev = scratch.centroid;\n scratch.centroid = centroid;\n const current = scratch.view.get();\n // Anchor the zoom on where the fingers *were*, then translate by how\n // far they travelled — together those pin the world point under the\n // centroid as it moves. Anchoring on the new centroid instead drops\n // the translation half, so a two-finger drag zooms without panning.\n const zoomed = zoomAt(current, prev, factor, clamp);\n const next = {\n scale: zoomed.scale,\n x: zoomed.x - (centroid.x - prev.x) / zoomed.scale.x,\n y: zoomed.y - (centroid.y - prev.y) / zoomed.scale.y,\n };\n scratch.view.set(next);\n debug?.recordViewport('zoom', startView, next, { x: ax, y: ay });\n },\n };\n },\n },\n enabled: () => true,\n };\n}\n\n/**\n * @experimental\n * Default `viewport.pinchZoom` descriptor: two-finger pinch with the kit's\n * default 0.1–8 scale clamp. Equivalent to `makePinchZoomAction()`.\n */\nexport const pinchZoomAction: Action & { requires: string[] } = makePinchZoomAction();\n"],"mappings":";;;;;AA+BA,SAAgBA,EACd,IAAyB,CAAC,GACO;CACjC,IAAMC,IAAQ;EAAE,KAAKC,EAAK,OAAOC;EAAkB,KAAKD,EAAK,OAAOE;CAAiB;CACrF,OAAO;EACL,IAAI;EACJ,OAAO;EACP,OAAO;EACP,gBAAgB;GAAE,MAAM;GAAc,SAAS;EAAE;EACjD,UAAU,CAAC,QAAQ,OAAO;EAC1B,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAsB;IAC9C,IAAMC,IAAOC,EAAI,KAAK;IACtB,IAAI,CAACD,GAAM,OAAO,CAAC;IAEnB,IAAME,IAAaD,EAAI;IACvB,IAAI,CAACC,GAAY,OAAO,CAAC;IAIzB,IAAMC,IAAwB;KAAE;KAAM,aAFlBD,EAAW,SAAS,IAAIA,EAAW,SAAS;KAEb,UAAUA,EAAW;IAAS,GAC3EE,IAAQH,EAAI,KAAK,OACjBI,IAAYL,EAAK,IAAI,GACrB,CAACM,GAAIC,KAAMC,EAAcN,EAAW,SAAS,GAAGA,EAAW,SAAS,GAAGO,EAAgBJ,CAAS,CAAC;IAEvG,OAAO;KACL,MAAM;KACN,OAAO,GAA8B;MACnC,IAAMK,IAAKC,EAAQ;MACnB,IAAI,CAACD,GAAI,OAAO;MAChB,IAAM,EAAE,kBAAe,gBAAaA,EAAG;MACvC,IAAIE,KAAiB,KAAKT,EAAQ,eAAe,GAAG;MACpD,IAAMU,IAASD,IAAgBT,EAAQ;MAEvC,EAAQ,cAAcS;MACtB,IAAME,IAAOX,EAAQ;MACrB,EAAQ,WAAWY;MACnB,IAAMC,IAAUb,EAAQ,KAAK,IAAI,GAK3Bc,IAASC,EAAOF,GAASF,GAAMD,GAAQjB,CAAK,GAC5CuB,IAAO;OACX,OAAOF,EAAO;OACd,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;OACnD,GAAGA,EAAO,KAAKF,EAAS,IAAID,EAAK,KAAKG,EAAO,MAAM;MACrD;MAEA,AADAd,EAAQ,KAAK,IAAIgB,CAAI,GACrBf,GAAO,eAAe,QAAQC,GAAWc,GAAM;OAAE,GAAGb;OAAI,GAAGC;MAAG,CAAC;KACjE;IACF;GACF;EACF;EACA,eAAe;CACjB;AACF;AAOA,IAAaa,IAAmDzB,EAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"requiresSelection.js","names":["requiresSelection","selection","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/requiresSelection.ts"],"sourcesContent":["import type { ActionDeps } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\n\n/**\n * Shared `enabled` predicate for selection-gated actions (reorder, duplicate,\n * flip, nudge, …).\n *\n * Returns `true` when the active selection is non-empty, otherwise\n * `SelectionRequired` so the palette/ActionBar can grey the entry out.\n *\n * The dispatcher evaluates this gate with the action's built deps, so a\n * deps-aware predicate is required for these actions to dispatch at all — a\n * constant `() => SelectionRequired` stub falls through forever. When called\n * without deps (e.g. a bare `enabled()` introspection) it conservatively\n * reports `SelectionRequired`; the invoker independently no-ops on an empty\n * selection, so dispatch correctness never relies on the gate alone.\n */\nexport function requiresSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const selection = deps?.selection;\n if (!selection || (selection.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n}\n"],"mappings":";;AAiBA,SAAgBA,EAAkB,GAAgD;CAChF,IAAMC,IAAYC,GAAM;CAIxB,OAHI,CAACD,KAAcA,EAAU,IAAI,CAAC,CAAe,WAAW,IACnDE,EAAqB,oBAEvB;AACT"}
1
+ {"version":3,"file":"requiresSelection.js","names":["requiresSelection","selection","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/requiresSelection.ts"],"sourcesContent":["import type { ActionDeps } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\n\n/**\n * Shared `enabled` predicate for selection-gated actions: `true` when the\n * selection is non-empty, otherwise `SelectionRequired`. Called without deps\n * it reports `SelectionRequired`.\n */\nexport function requiresSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const selection = deps?.selection;\n if (!selection || (selection.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n}\n"],"mappings":";;AAQA,SAAgBA,EAAkB,GAAgD;CAChF,IAAMC,IAAYC,GAAM;CAIxB,OAHI,CAACD,KAAcA,EAAU,IAAI,CAAC,CAAe,WAAW,IACnDE,EAAqB,oBAEvB;AACT"}
@@ -1,7 +1,13 @@
1
1
  import { DEFAULT_FILL_COLOR as e, paintWithColor as t } from "../../../util/paint.js";
2
2
  import { createPaintAction as n } from "./createPaintAction.js";
3
3
  //#region src/interactions/actions/defaults/setFill.ts
4
- var r = n({
4
+ function r(e, n) {
5
+ return n.paint === null ? null : {
6
+ ...e,
7
+ paint: n.paint ?? t(e?.paint, n.color)
8
+ };
9
+ }
10
+ var i = n({
5
11
  id: "setFill",
6
12
  label: "Set fill",
7
13
  dataKey: "fill",
@@ -19,9 +25,9 @@ var r = n({
19
25
  paint: r
20
26
  };
21
27
  },
22
- merge: (e, n) => n.paint === void 0 ? t(e ?? void 0, n.color) : n.paint
28
+ merge: r
23
29
  });
24
30
  //#endregion
25
- export { r as setFillAction };
31
+ export { i as setFillAction };
26
32
 
27
33
  //# sourceMappingURL=setFill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"setFill.js","names":["setFillAction","createPaintAction","pick","DEFAULT_FILL_COLOR","color","params","paint","prev","state","paintWithColor"],"sources":["../../../../src/interactions/actions/defaults/setFill.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { FillStyle } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithColor, DEFAULT_FILL_COLOR } from '../../../util/paint';\n\n/** `setFill`'s gesture state. A `paint` shadows the color until a later color\n * supersedes it. */\ninterface SetFillState {\n /** May be 6- or 8-char hex. Ignored while `paint` is set. */\n color: string;\n /** `null` is an explicit no-fill, distinct from `undefined`, which means\n * this gesture carries no paint and the color applies. */\n paint?: FillStyle | null;\n}\n\n/**\n * Static descriptor for the `setFill` Action.\n *\n * Takes either `color` (a hex string) or `paint` (a whole `FillStyle`, for\n * gradients and patterns). `paint` wins when both are present.\n *\n * Alpha semantics: alpha lives on the paint's `opacity`. A 6-char (no-alpha)\n * color adopts the alpha of the node's existing paint; an 8-char color states\n * its own. A `paint` is written verbatim.\n */\nexport const setFillAction: Action & { requires: string[] } = createPaintAction<\n SetFillState,\n FillStyle,\n 'fill'\n>({\n id: 'setFill',\n label: 'Set fill',\n dataKey: 'fill',\n initialState: (pick) => ({\n color: pick<string>('color') ?? DEFAULT_FILL_COLOR,\n paint: pick<FillStyle | null>('paint'),\n }),\n readParams: (prev, params) => {\n const color = params?.color as string | undefined;\n const paint = params?.paint as FillStyle | null | undefined;\n if (color === undefined && paint === undefined) return null;\n if (color === undefined) return { ...prev, paint };\n // An explicit color supersedes a paint from an earlier tick; otherwise a\n // picker drag after a gradient would do nothing.\n return { color, paint };\n },\n // `??` would read an explicit no-fill as \"no paint given\" and repaint the\n // node with the state's color, so absence has to be tested for.\n merge: (prev, state) => (state.paint !== undefined\n ? state.paint\n : paintWithColor(prev ?? undefined, state.color)),\n});\n"],"mappings":";;;AAyBA,IAAaA,IAAiDC,EAI5D;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,OAAU;EACvB,OAAOC,EAAa,OAAO,KAAKC;EAChC,OAAOD,EAAuB,OAAO;CACvC;CACA,aAAa,GAAM,MAAW;EAC5B,IAAME,IAAQC,GAAQ,OAChBC,IAAQD,GAAQ;EAKtB,OAJID,MAAU,KAAA,KAAaE,MAAU,KAAA,IAAkB,OACnDF,MAAU,KAAA,IAAkB;GAAE,GAAGG;GAAM;EAAM,IAG1C;GAAE;GAAO;EAAM;CACxB;CAGA,QAAQ,GAAM,MAAWC,EAAM,UAAU,KAAA,IAErCC,EAAeF,KAAQ,KAAA,GAAWC,EAAM,KAAK,IAD7CA,EAAM;AAEZ,CAAC"}
1
+ {"version":3,"file":"setFill.js","names":["repaint","state","prev","paintWithColor","setFillAction","createPaintAction","pick","DEFAULT_FILL_COLOR","color","params","paint"],"sources":["../../../../src/interactions/actions/defaults/setFill.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { Fill, Paint } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithColor, DEFAULT_FILL_COLOR } from '../../../util/paint';\n\n/** `setFill`'s gesture state. A `paint` shadows the color until a later color\n * supersedes it. */\ninterface SetFillState {\n /** May be 6- or 8-char hex. Ignored while `paint` is set. */\n color: string;\n /** `null` is an explicit no-fill, distinct from `undefined`, which means\n * this gesture carries no paint and the color applies. */\n paint?: Paint | null;\n}\n\n/** Repaint a node's fill, keeping whatever else the fill carries. */\nfunction repaint(prev: Fill | null | undefined, state: SetFillState): Fill | null {\n // `??` would read an explicit no-fill as \"no paint given\" and repaint the\n // node with the state's color, so absence has to be tested for.\n if (state.paint === null) return null;\n return { ...prev, paint: state.paint ?? paintWithColor(prev?.paint, state.color) };\n}\n\n/**\n * Static descriptor for the `setFill` Action.\n *\n * Takes either `color` (a hex string) or `paint` (a whole `Paint`, for\n * gradients and patterns). `paint` wins when both are present.\n *\n * Alpha semantics: alpha lives on the paint's `opacity`. A 6-char (no-alpha)\n * color adopts the alpha of the node's existing paint; an 8-char color states\n * its own. A `paint` is written verbatim.\n */\nexport const setFillAction: Action & { requires: string[] } = createPaintAction<\n SetFillState,\n Fill,\n 'fill'\n>({\n id: 'setFill',\n label: 'Set fill',\n dataKey: 'fill',\n initialState: (pick) => ({\n color: pick<string>('color') ?? DEFAULT_FILL_COLOR,\n paint: pick<Paint | null>('paint'),\n }),\n readParams: (prev, params) => {\n const color = params?.color as string | undefined;\n const paint = params?.paint as Paint | null | undefined;\n if (color === undefined && paint === undefined) return null;\n if (color === undefined) return { ...prev, paint };\n // An explicit color supersedes a paint from an earlier tick; otherwise a\n // picker drag after a gradient would do nothing.\n return { color, paint };\n },\n merge: repaint,\n});\n"],"mappings":";;;AAgBA,SAASA,EAAQ,GAA+B,GAAkC;CAIhF,OADIC,EAAM,UAAU,OAAa,OAC1B;EAAE,GAAGC;EAAM,OAAOD,EAAM,SAASE,EAAeD,GAAM,OAAOD,EAAM,KAAK;CAAE;AACnF;AAYA,IAAaG,IAAiDC,EAI5D;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,OAAU;EACvB,OAAOC,EAAa,OAAO,KAAKC;EAChC,OAAOD,EAAmB,OAAO;CACnC;CACA,aAAa,GAAM,MAAW;EAC5B,IAAME,IAAQC,GAAQ,OAChBC,IAAQD,GAAQ;EAKtB,OAJID,MAAU,KAAA,KAAaE,MAAU,KAAA,IAAkB,OACnDF,MAAU,KAAA,IAAkB;GAAE,GAAGN;GAAM;EAAM,IAG1C;GAAE;GAAO;EAAM;CACxB;CACA,OAAOF;AACT,CAAC"}
@@ -7,7 +7,10 @@ var i = r({
7
7
  dataKey: "fill",
8
8
  initialState: (e) => e("alpha01") ?? 1,
9
9
  readParams: (e, t) => t?.alpha01 ?? null,
10
- merge: (r, i) => t(r ?? n(e), i)
10
+ merge: (r, i) => ({
11
+ ...r,
12
+ paint: t(r?.paint ?? n(e), i)
13
+ })
11
14
  });
12
15
  //#endregion
13
16
  export { i as setFillOpacityAction };
@@ -1 +1 @@
1
- {"version":3,"file":"setFillOpacity.js","names":["setFillOpacityAction","createPaintAction","pick","params","paintWithAlpha","prev","solid","DEFAULT_FILL_COLOR","alpha01"],"sources":["../../../../src/interactions/actions/defaults/setFillOpacity.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { FillStyle } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithAlpha, solid, DEFAULT_FILL_COLOR } from '../../../util/paint';\n\n/**\n * Static descriptor for the `setFillOpacity` Action.\n *\n * `params.alpha01` (0..1) becomes each node's fill paint `opacity`, leaving\n * the rest of the paint — color, gradient stops, pattern — alone. That is the\n * one alpha slot a gradient or a pattern has, so it is the slot all of them\n * use. A node with no fill yet takes the kit's default one.\n */\nexport const setFillOpacityAction: Action & { requires: string[] } = createPaintAction<\n number,\n FillStyle,\n 'fill'\n>({\n id: 'setFillOpacity',\n label: 'Set fill opacity',\n dataKey: 'fill',\n initialState: (pick) => pick<number>('alpha01') ?? 1,\n readParams: (_prev, params) => (params?.alpha01 as number | undefined) ?? null,\n merge: (prev, alpha01) => paintWithAlpha(prev ?? solid(DEFAULT_FILL_COLOR), alpha01),\n});\n"],"mappings":";;;AAaA,IAAaA,IAAwDC,EAInE;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,MAASC,EAAa,SAAS,KAAK;CACnD,aAAa,GAAO,MAAYC,GAAQ,WAAkC;CAC1E,QAAQ,GAAM,MAAYC,EAAeC,KAAQC,EAAMC,CAAkB,GAAGC,CAAO;AACrF,CAAC"}
1
+ {"version":3,"file":"setFillOpacity.js","names":["setFillOpacityAction","createPaintAction","pick","params","prev","paintWithAlpha","solid","DEFAULT_FILL_COLOR","alpha01"],"sources":["../../../../src/interactions/actions/defaults/setFillOpacity.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { Fill } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithAlpha, solid, DEFAULT_FILL_COLOR } from '../../../util/paint';\n\n/**\n * Static descriptor for the `setFillOpacity` Action.\n *\n * `params.alpha01` (0..1) becomes each node's fill paint `opacity`, leaving\n * the rest of the paint — color, gradient stops, pattern — alone. That is the\n * one alpha slot a gradient or a pattern has, so it is the slot all of them\n * use. A node with no fill yet takes the kit's default one.\n */\nexport const setFillOpacityAction: Action & { requires: string[] } = createPaintAction<\n number,\n Fill,\n 'fill'\n>({\n id: 'setFillOpacity',\n label: 'Set fill opacity',\n dataKey: 'fill',\n initialState: (pick) => pick<number>('alpha01') ?? 1,\n readParams: (_prev, params) => (params?.alpha01 as number | undefined) ?? null,\n merge: (prev, alpha01) => ({ ...prev, paint: paintWithAlpha(prev?.paint ?? solid(DEFAULT_FILL_COLOR), alpha01) }),\n});\n"],"mappings":";;;AAaA,IAAaA,IAAwDC,EAInE;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,MAASC,EAAa,SAAS,KAAK;CACnD,aAAa,GAAO,MAAYC,GAAQ,WAAkC;CAC1E,QAAQ,GAAM,OAAa;EAAE,GAAGC;EAAM,OAAOC,EAAeD,GAAM,SAASE,EAAMC,CAAkB,GAAGC,CAAO;CAAE;AACjH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"setStroke.js","names":["repaint","state","prev","strokeWith","paintWithColor","strokeOf","setStrokeAction","createPaintAction","pick","DEFAULT_STROKE_COLOR","color","params","paint"],"sources":["../../../../src/interactions/actions/defaults/setStroke.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { FillStyle, Stroke } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithColor, strokeOf, strokeWith, DEFAULT_STROKE_COLOR } from '../../../util/paint';\n\n/** `setStroke`'s gesture state — `setFill`'s, against a stroke. */\ninterface SetStrokeState {\n /** May be 6- or 8-char hex. Ignored while `paint` is set. */\n color: string;\n /** `null` is an explicit no-stroke, distinct from `undefined`, which means\n * this gesture carries no paint and the color applies. */\n paint?: FillStyle | null;\n}\n\n/** Repaint a node's stroke, keeping its width, cap, join, dash and align, so\n * picking a paint does not discard the rest of the stroke. A node with no\n * stroke yet gets a hairline one. */\nfunction repaint(prev: Stroke | null | undefined, state: SetStrokeState): Stroke | null {\n // A stroke whose paint is none paints nothing, so the whole stroke goes\n // rather than being kept as a widthful thing that draws no ink.\n if (state.paint === null) return null;\n if (state.paint) return prev ? { ...prev, paint: state.paint } : strokeWith(state.paint);\n if (!prev) return strokeOf(state.color);\n return { ...prev, paint: paintWithColor(prev.paint, state.color) };\n}\n\n/**\n * Static descriptor for the `setStroke` Action.\n *\n * Takes either `color` (a hex string) or `paint` (a whole `FillStyle`, for\n * gradients and patterns). `paint` wins when both are present. A stroke's\n * width, cap, join, dash and align survive either.\n *\n * Alpha semantics: alpha lives on the stroke paint's `opacity`. A 6-char\n * (no-alpha) color adopts the alpha of the node's existing stroke paint; an\n * 8-char color states its own. A `paint` is written verbatim.\n */\nexport const setStrokeAction: Action & { requires: string[] } = createPaintAction<\n SetStrokeState,\n Stroke,\n 'stroke'\n>({\n id: 'setStroke',\n label: 'Set stroke',\n dataKey: 'stroke',\n initialState: (pick) => ({\n color: pick<string>('color') ?? DEFAULT_STROKE_COLOR,\n paint: pick<FillStyle | null>('paint'),\n }),\n readParams: (prev, params) => {\n const color = params?.color as string | undefined;\n const paint = params?.paint as FillStyle | null | undefined;\n if (color === undefined && paint === undefined) return null;\n if (color === undefined) return { ...prev, paint };\n // An explicit color supersedes a paint from an earlier tick; otherwise a\n // picker drag after a gradient would do nothing.\n return { color, paint };\n },\n merge: repaint,\n});\n"],"mappings":";;;AAiBA,SAASA,EAAQ,GAAiC,GAAsC;CAMtF,OAHIC,EAAM,UAAU,OAAa,OAC7BA,EAAM,QAAcC,IAAO;EAAE,GAAGA;EAAM,OAAOD,EAAM;CAAM,IAAIE,EAAWF,EAAM,KAAK,IAClFC,IACE;EAAE,GAAGA;EAAM,OAAOE,EAAeF,EAAK,OAAOD,EAAM,KAAK;CAAE,IAD/CI,EAASJ,EAAM,KAAK;AAExC;AAaA,IAAaK,IAAmDC,EAI9D;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,OAAU;EACvB,OAAOC,EAAa,OAAO,KAAKC;EAChC,OAAOD,EAAuB,OAAO;CACvC;CACA,aAAa,GAAM,MAAW;EAC5B,IAAME,IAAQC,GAAQ,OAChBC,IAAQD,GAAQ;EAKtB,OAJID,MAAU,KAAA,KAAaE,MAAU,KAAA,IAAkB,OACnDF,MAAU,KAAA,IAAkB;GAAE,GAAGR;GAAM;EAAM,IAG1C;GAAE;GAAO;EAAM;CACxB;CACA,OAAOF;AACT,CAAC"}
1
+ {"version":3,"file":"setStroke.js","names":["repaint","state","prev","strokeWith","paintWithColor","strokeOf","setStrokeAction","createPaintAction","pick","DEFAULT_STROKE_COLOR","color","params","paint"],"sources":["../../../../src/interactions/actions/defaults/setStroke.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { Paint, Stroke } from '@weasel-js/paint';\nimport { createPaintAction } from './createPaintAction';\nimport { paintWithColor, strokeOf, strokeWith, DEFAULT_STROKE_COLOR } from '../../../util/paint';\n\n/** `setStroke`'s gesture state — `setFill`'s, against a stroke. */\ninterface SetStrokeState {\n /** May be 6- or 8-char hex. Ignored while `paint` is set. */\n color: string;\n /** `null` is an explicit no-stroke, distinct from `undefined`, which means\n * this gesture carries no paint and the color applies. */\n paint?: Paint | null;\n}\n\n/** Repaint a node's stroke, keeping its width, cap, join, dash and align, so\n * picking a paint does not discard the rest of the stroke. A node with no\n * stroke yet gets a hairline one. */\nfunction repaint(prev: Stroke | null | undefined, state: SetStrokeState): Stroke | null {\n // A stroke whose paint is none paints nothing, so the whole stroke goes\n // rather than being kept as a widthful thing that draws no ink.\n if (state.paint === null) return null;\n if (state.paint) return prev ? { ...prev, paint: state.paint } : strokeWith(state.paint);\n if (!prev) return strokeOf(state.color);\n return { ...prev, paint: paintWithColor(prev.paint, state.color) };\n}\n\n/**\n * Static descriptor for the `setStroke` Action.\n *\n * Takes either `color` (a hex string) or `paint` (a whole `Paint`, for\n * gradients and patterns). `paint` wins when both are present. A stroke's\n * width, cap, join, dash and align survive either.\n *\n * Alpha semantics: alpha lives on the stroke paint's `opacity`. A 6-char\n * (no-alpha) color adopts the alpha of the node's existing stroke paint; an\n * 8-char color states its own. A `paint` is written verbatim.\n */\nexport const setStrokeAction: Action & { requires: string[] } = createPaintAction<\n SetStrokeState,\n Stroke,\n 'stroke'\n>({\n id: 'setStroke',\n label: 'Set stroke',\n dataKey: 'stroke',\n initialState: (pick) => ({\n color: pick<string>('color') ?? DEFAULT_STROKE_COLOR,\n paint: pick<Paint | null>('paint'),\n }),\n readParams: (prev, params) => {\n const color = params?.color as string | undefined;\n const paint = params?.paint as Paint | null | undefined;\n if (color === undefined && paint === undefined) return null;\n if (color === undefined) return { ...prev, paint };\n // An explicit color supersedes a paint from an earlier tick; otherwise a\n // picker drag after a gradient would do nothing.\n return { color, paint };\n },\n merge: repaint,\n});\n"],"mappings":";;;AAiBA,SAASA,EAAQ,GAAiC,GAAsC;CAMtF,OAHIC,EAAM,UAAU,OAAa,OAC7BA,EAAM,QAAcC,IAAO;EAAE,GAAGA;EAAM,OAAOD,EAAM;CAAM,IAAIE,EAAWF,EAAM,KAAK,IAClFC,IACE;EAAE,GAAGA;EAAM,OAAOE,EAAeF,EAAK,OAAOD,EAAM,KAAK;CAAE,IAD/CI,EAASJ,EAAM,KAAK;AAExC;AAaA,IAAaK,IAAmDC,EAI9D;CACA,IAAI;CACJ,OAAO;CACP,SAAS;CACT,eAAe,OAAU;EACvB,OAAOC,EAAa,OAAO,KAAKC;EAChC,OAAOD,EAAmB,OAAO;CACnC;CACA,aAAa,GAAM,MAAW;EAC5B,IAAME,IAAQC,GAAQ,OAChBC,IAAQD,GAAQ;EAKtB,OAJID,MAAU,KAAA,KAAaE,MAAU,KAAA,IAAkB,OACnDF,MAAU,KAAA,IAAkB;GAAE,GAAGR;GAAM;EAAM,IAG1C;GAAE;GAAO;EAAM;CACxB;CACA,OAAOF;AACT,CAAC"}
@@ -1,39 +1,38 @@
1
- import { pathToAnchors as e } from "../../../features/paths/anchors.js";
2
- import { createDeleteOp as t } from "../../../core/ops/delete.js";
3
- import { createInsertOp as n } from "../../../core/ops/create.js";
4
- import { boundsOfPath as r } from "@weasel-js/geom";
1
+ import { createDeleteOp as e } from "../../../core/ops/delete.js";
2
+ import { createInsertOp as t } from "../../../core/ops/create.js";
3
+ import { boundsOfPath as n, hasOpenSubpath as r } from "@weasel-js/geom";
5
4
  import { snipPathByPolyline as i, splitPathByPolyline as a } from "@weasel-js/geom/booleans";
6
5
  //#region src/interactions/actions/defaults/sliceOps.ts
7
- function o(e) {
8
- let { cut: o, nextId: l, selection: u } = e, d = e.placePiece ?? ((e, t) => ({
9
- pose: s(e.node.pose, r(t)),
6
+ function o(o) {
7
+ let { cut: c, nextId: l, selection: u } = o, d = o.placePiece ?? ((e, t) => ({
8
+ pose: s(e.node.pose, n(t)),
10
9
  path: t
11
- })), f = [], p = new Set(u ?? []), m = /* @__PURE__ */ new Set(), h = [], g = e.leaves.map((e, t) => ({
10
+ })), f = [], p = new Set(u ?? []), m = /* @__PURE__ */ new Set(), h = [], g = o.leaves.map((e, t) => ({
12
11
  leaf: e,
13
12
  i: t
14
13
  })).sort((e, t) => t.leaf.index - e.leaf.index || e.i - t.i);
15
- for (let { leaf: e } of g) {
16
- let r = c(e.worldPath) ? i(e.worldPath, o) : a(e.worldPath, o);
17
- if (!r) continue;
18
- let s = e.node.id;
19
- m.add(s), f.push(t({
20
- node: e.node,
21
- index: e.index,
14
+ for (let { leaf: n } of g) {
15
+ let o = r(n.worldPath) ? i(n.worldPath, c) : a(n.worldPath, c);
16
+ if (!o) continue;
17
+ let s = n.node.id;
18
+ m.add(s), f.push(e({
19
+ node: n.node,
20
+ index: n.index,
22
21
  label: "Slice"
23
22
  }));
24
- for (let t of r) {
25
- let r = d(e, t), i = {
26
- ...e.node,
23
+ for (let e of o) {
24
+ let r = d(n, e), i = {
25
+ ...n.node,
27
26
  id: l(),
28
27
  pose: r.pose,
29
28
  data: {
30
- ...e.node.data,
29
+ ...n.node.data,
31
30
  path: r.path
32
31
  }
33
32
  };
34
- f.push(n({
33
+ f.push(t({
35
34
  node: i,
36
- index: e.index,
35
+ index: n.index,
37
36
  label: "Slice"
38
37
  })), p.has(s) && h.push(i.id);
39
38
  }
@@ -53,7 +52,6 @@ function s(e, t) {
53
52
  height: t.height
54
53
  };
55
54
  }
56
- var c = (t) => t.kind === "polygon" && e(t).closed.some((e) => !e);
57
55
  //#endregion
58
56
  export { o as computeSliceOps };
59
57
 
@@ -1 +1 @@
1
- {"version":3,"file":"sliceOps.js","names":["computeSliceOps","args","placePiece","piecePose","leaf","boundsOfPath","piece","ops","selected","selection","cutIds","inherited","ordered","b","a","pieces","hasOpenSubpath","snipPathByPolyline","cut","splitPathByPolyline","sourceId","createDeleteOp","stored","node","nextId","createInsertOp","id","rest","source","\"rotation\"","path","pathToAnchors","closed"],"sources":["../../../../src/interactions/actions/defaults/sliceOps.ts"],"sourcesContent":["import { boundsOfPath, type Path } from '@weasel-js/geom';\nimport { splitPathByPolyline, snipPathByPolyline } from '@weasel-js/geom/booleans';\nimport { pathToAnchors } from 'features/paths/anchors';\nimport type { Op } from 'core/ops/types';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { createInsertOp } from 'core/ops/create';\n\n/** The fields a slice reads from and writes to a node. */\nexport interface SliceableNode {\n id: string;\n pose: unknown;\n data: unknown;\n}\n\n/** One scene leaf a cut is tested against. */\nexport interface SliceLeaf<TNode extends SliceableNode = SliceableNode> {\n /** The whole node, which the delete op carries so undo restores it intact. */\n node: TNode;\n /** Its ordinal among its siblings: where the delete's undo puts it back,\n * and where its pieces go in. */\n index: number;\n /** Its path with every pose above it baked in: the space the cut is in. */\n worldPath: Path;\n}\n\ninterface SliceBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Arguments to {@link computeSliceOps}. */\nexport interface ComputeSliceOpsArgs<TNode extends SliceableNode = SliceableNode> {\n leaves: readonly SliceLeaf<TNode>[];\n /** The cut, a polyline in world space. A last point equal to the first\n * closes it into a loop. */\n cut: ReadonlyArray<{ x: number; y: number }>;\n /** Mints the id of each piece. */\n nextId: () => string;\n /** The selection before the cut. Given, the result carries the selection\n * after it; omitted, `nextSelection` is `null`. */\n selection?: readonly string[];\n /** How a piece, cut in world space, is stored on its node. By default the\n * pose is the source's with the piece's bounds and no rotation, and the\n * path is the world piece itself, so any rotation is baked into it. A\n * scene with rotated poses or parent frames maps the piece back into the\n * node's own frame here. */\n placePiece?: (leaf: SliceLeaf<TNode>, piece: Path) => SlicePiece;\n}\n\n/** One piece as it is stored: the node's pose and its `data.path`. */\nexport interface SlicePiece {\n pose: unknown;\n path: Path;\n}\n\n/** Result of {@link computeSliceOps}. */\nexport interface ComputeSliceResult {\n /** A delete per cut leaf followed by an insert per piece, as one batch. */\n ops: Op[];\n /**\n * The selection after the cut: the cut sources dropped, the pieces of each\n * selected one added, everything else kept. `null` when no selection was\n * given or nothing was cut. It is not an op, so the caller sets it after\n * the batch commits; undo restores the one before either way.\n */\n nextSelection: string[] | null;\n}\n\n/**\n * Cut `leaves` along `cut` and return the ops that swap each crossed leaf for\n * its pieces.\n *\n * A path with an open subpath is snipped along its stroke\n * (`snipPathByPolyline`); a closed one is knifed into closed pieces\n * (`splitPathByPolyline`), which is also where a closed loop cuts out the\n * region it encloses. Each piece copies its source's node with the piece as\n * `data.path` and a fresh id. Leaves the cut misses produce nothing.\n */\nexport function computeSliceOps<TNode extends SliceableNode>(\n args: ComputeSliceOpsArgs<TNode>,\n): ComputeSliceResult {\n const { cut, nextId, selection } = args;\n const placePiece = args.placePiece\n ?? ((leaf: SliceLeaf<TNode>, piece: Path): SlicePiece => ({ pose: piecePose(leaf.node.pose, boundsOfPath(piece)), path: piece }));\n const ops: Op[] = [];\n const selected = new Set(selection ?? []);\n const cutIds = new Set<string>();\n const inherited: string[] = [];\n\n // Highest slot first: swapping a leaf changes how many siblings sit below\n // the next one only when the next one is above it.\n const ordered = args.leaves.map((leaf, i) => ({ leaf, i })).sort((a, b) => b.leaf.index - a.leaf.index || a.i - b.i);\n\n for (const { leaf } of ordered) {\n const pieces = hasOpenSubpath(leaf.worldPath)\n ? snipPathByPolyline(leaf.worldPath, cut)\n : splitPathByPolyline(leaf.worldPath, cut);\n if (!pieces) continue;\n\n const sourceId = leaf.node.id;\n cutIds.add(sourceId);\n ops.push(createDeleteOp({ node: leaf.node, index: leaf.index, label: 'Slice' }));\n for (const piece of pieces) {\n const stored = placePiece(leaf, piece);\n const node = {\n ...leaf.node,\n id: nextId(),\n pose: stored.pose,\n data: { ...(leaf.node.data as object), path: stored.path },\n };\n ops.push(createInsertOp({ node, index: leaf.index, label: 'Slice' }));\n if (selected.has(sourceId)) inherited.push(node.id);\n }\n }\n\n const nextSelection = selection && cutIds.size > 0\n ? [...selection.filter((id) => !cutIds.has(id)), ...inherited]\n : null;\n return { ops, nextSelection };\n}\n\nfunction piecePose(source: unknown, b: SliceBounds): SliceBounds {\n const rest = source && typeof source === 'object' ? { ...(source as Record<string, unknown>) } : {};\n delete rest['rotation'];\n return { ...rest, x: b.x, y: b.y, width: b.width, height: b.height };\n}\n\nconst hasOpenSubpath = (path: Path): boolean =>\n path.kind === 'polygon' && pathToAnchors(path).closed.some((closed) => !closed);\n"],"mappings":";;;;;;AAgFA,SAAgBA,EACd,GACoB;CACpB,IAAM,EAAE,QAAK,WAAQ,iBAAcC,GAC7BC,IAAaD,EAAK,gBACjB,GAAwB,OAA6B;EAAE,MAAME,EAAUC,EAAK,KAAK,MAAMC,EAAaC,CAAK,CAAC;EAAG,MAAMA;CAAM,KAC1HC,IAAY,CAAC,GACbC,IAAW,IAAI,IAAIC,KAAa,CAAC,CAAC,GAClCC,oBAAS,IAAI,IAAY,GACzBC,IAAsB,CAAC,GAIvBC,IAAUX,EAAK,OAAO,KAAK,GAAM,OAAO;EAAE;EAAM;CAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAMY,EAAE,KAAK,QAAQC,EAAE,KAAK,SAASA,EAAE,IAAID,EAAE,CAAC;CAEnH,KAAK,IAAM,EAAE,aAAUD,GAAS;EAC9B,IAAMG,IAASC,EAAeZ,EAAK,SAAS,IACxCa,EAAmBb,EAAK,WAAWc,CAAG,IACtCC,EAAoBf,EAAK,WAAWc,CAAG;EAC3C,IAAI,CAACH,GAAQ;EAEb,IAAMK,IAAWhB,EAAK,KAAK;EAE3B,AADAM,EAAO,IAAIU,CAAQ,GACnBb,EAAI,KAAKc,EAAe;GAAE,MAAMjB,EAAK;GAAM,OAAOA,EAAK;GAAO,OAAO;EAAQ,CAAC,CAAC;EAC/E,KAAK,IAAME,KAASS,GAAQ;GAC1B,IAAMO,IAASpB,EAAWE,GAAME,CAAK,GAC/BiB,IAAO;IACX,GAAGnB,EAAK;IACR,IAAIoB,EAAO;IACX,MAAMF,EAAO;IACb,MAAM;KAAE,GAAIlB,EAAK,KAAK;KAAiB,MAAMkB,EAAO;IAAK;GAC3D;GAEA,AADAf,EAAI,KAAKkB,EAAe;IAAE;IAAM,OAAOrB,EAAK;IAAO,OAAO;GAAQ,CAAC,CAAC,GAChEI,EAAS,IAAIY,CAAQ,KAAGT,EAAU,KAAKY,EAAK,EAAE;EACpD;CACF;CAKA,OAAO;EAAE;EAAK,eAHQd,KAAaC,EAAO,OAAO,IAC7C,CAAC,GAAGD,EAAU,QAAQ,MAAO,CAACC,EAAO,IAAIgB,CAAE,CAAC,GAAG,GAAGf,CAAS,IAC3D;CACwB;AAC9B;AAEA,SAASR,EAAU,GAAiB,GAA6B;CAC/D,IAAMwB,IAAOC,KAAU,OAAOA,KAAW,WAAW,EAAE,GAAIA,EAAmC,IAAI,CAAC;CAElG,OADA,OAAOD,EAAKE,UACL;EAAE,GAAGF;EAAM,GAAGd,EAAE;EAAG,GAAGA,EAAE;EAAG,OAAOA,EAAE;EAAO,QAAQA,EAAE;CAAO;AACrE;AAEA,IAAMG,KAAkB,MACtBc,EAAK,SAAS,aAAaC,EAAcD,CAAI,CAAC,CAAC,OAAO,MAAM,MAAW,CAACE,CAAM"}
1
+ {"version":3,"file":"sliceOps.js","names":["computeSliceOps","args","placePiece","piecePose","leaf","boundsOfPath","piece","ops","selected","selection","cutIds","inherited","ordered","b","a","pieces","hasOpenSubpath","snipPathByPolyline","cut","splitPathByPolyline","sourceId","createDeleteOp","stored","node","nextId","createInsertOp","id","rest","source","\"rotation\""],"sources":["../../../../src/interactions/actions/defaults/sliceOps.ts"],"sourcesContent":["import { boundsOfPath, hasOpenSubpath, type Path } from '@weasel-js/geom';\nimport { splitPathByPolyline, snipPathByPolyline } from '@weasel-js/geom/booleans';\nimport type { Op } from 'core/ops/types';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { createInsertOp } from 'core/ops/create';\n\n/** The fields a slice reads from and writes to a node. */\nexport interface SliceableNode {\n id: string;\n pose: unknown;\n data: unknown;\n}\n\n/** One scene leaf a cut is tested against. */\nexport interface SliceLeaf<TNode extends SliceableNode = SliceableNode> {\n /** The whole node, which the delete op carries so undo restores it intact. */\n node: TNode;\n /** Its ordinal among its siblings: where the delete's undo puts it back,\n * and where its pieces go in. */\n index: number;\n /** Its path with every pose above it baked in: the space the cut is in. */\n worldPath: Path;\n}\n\ninterface SliceBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Arguments to {@link computeSliceOps}. */\nexport interface ComputeSliceOpsArgs<TNode extends SliceableNode = SliceableNode> {\n leaves: readonly SliceLeaf<TNode>[];\n /** The cut, a polyline in world space. A last point equal to the first\n * closes it into a loop. */\n cut: ReadonlyArray<{ x: number; y: number }>;\n /** Mints the id of each piece. */\n nextId: () => string;\n /** The selection before the cut. Given, the result carries the selection\n * after it; omitted, `nextSelection` is `null`. */\n selection?: readonly string[];\n /** How a piece, cut in world space, is stored on its node. By default the\n * pose is the source's with the piece's bounds and no rotation, and the\n * path is the world piece itself, so any rotation is baked into it. A\n * scene with rotated poses or parent frames maps the piece back into the\n * node's own frame here. */\n placePiece?: (leaf: SliceLeaf<TNode>, piece: Path) => SlicePiece;\n}\n\n/** One piece as it is stored: the node's pose and its `data.path`. */\nexport interface SlicePiece {\n pose: unknown;\n path: Path;\n}\n\n/** Result of {@link computeSliceOps}. */\nexport interface ComputeSliceResult {\n /** A delete per cut leaf followed by an insert per piece, as one batch. */\n ops: Op[];\n /**\n * The selection after the cut: the cut sources dropped, the pieces of each\n * selected one added, everything else kept. `null` when no selection was\n * given or nothing was cut. It is not an op, so the caller sets it after\n * the batch commits; undo restores the one before either way.\n */\n nextSelection: string[] | null;\n}\n\n/**\n * Cut `leaves` along `cut` and return the ops that swap each crossed leaf for\n * its pieces.\n *\n * A path with an open subpath is snipped along its stroke\n * (`snipPathByPolyline`); a closed one is knifed into closed pieces\n * (`splitPathByPolyline`), which is also where a closed loop cuts out the\n * region it encloses. Each piece copies its source's node with the piece as\n * `data.path` and a fresh id. Leaves the cut misses produce nothing.\n */\nexport function computeSliceOps<TNode extends SliceableNode>(\n args: ComputeSliceOpsArgs<TNode>,\n): ComputeSliceResult {\n const { cut, nextId, selection } = args;\n const placePiece = args.placePiece\n ?? ((leaf: SliceLeaf<TNode>, piece: Path): SlicePiece => ({ pose: piecePose(leaf.node.pose, boundsOfPath(piece)), path: piece }));\n const ops: Op[] = [];\n const selected = new Set(selection ?? []);\n const cutIds = new Set<string>();\n const inherited: string[] = [];\n\n // Highest slot first: swapping a leaf changes how many siblings sit below\n // the next one only when the next one is above it.\n const ordered = args.leaves.map((leaf, i) => ({ leaf, i })).sort((a, b) => b.leaf.index - a.leaf.index || a.i - b.i);\n\n for (const { leaf } of ordered) {\n const pieces = hasOpenSubpath(leaf.worldPath)\n ? snipPathByPolyline(leaf.worldPath, cut)\n : splitPathByPolyline(leaf.worldPath, cut);\n if (!pieces) continue;\n\n const sourceId = leaf.node.id;\n cutIds.add(sourceId);\n ops.push(createDeleteOp({ node: leaf.node, index: leaf.index, label: 'Slice' }));\n for (const piece of pieces) {\n const stored = placePiece(leaf, piece);\n const node = {\n ...leaf.node,\n id: nextId(),\n pose: stored.pose,\n data: { ...(leaf.node.data as object), path: stored.path },\n };\n ops.push(createInsertOp({ node, index: leaf.index, label: 'Slice' }));\n if (selected.has(sourceId)) inherited.push(node.id);\n }\n }\n\n const nextSelection = selection && cutIds.size > 0\n ? [...selection.filter((id) => !cutIds.has(id)), ...inherited]\n : null;\n return { ops, nextSelection };\n}\n\nfunction piecePose(source: unknown, b: SliceBounds): SliceBounds {\n const rest = source && typeof source === 'object' ? { ...(source as Record<string, unknown>) } : {};\n delete rest['rotation'];\n return { ...rest, x: b.x, y: b.y, width: b.width, height: b.height };\n}\n"],"mappings":";;;;;AA+EA,SAAgBA,EACd,GACoB;CACpB,IAAM,EAAE,QAAK,WAAQ,iBAAcC,GAC7BC,IAAaD,EAAK,gBACjB,GAAwB,OAA6B;EAAE,MAAME,EAAUC,EAAK,KAAK,MAAMC,EAAaC,CAAK,CAAC;EAAG,MAAMA;CAAM,KAC1HC,IAAY,CAAC,GACbC,IAAW,IAAI,IAAIC,KAAa,CAAC,CAAC,GAClCC,oBAAS,IAAI,IAAY,GACzBC,IAAsB,CAAC,GAIvBC,IAAUX,EAAK,OAAO,KAAK,GAAM,OAAO;EAAE;EAAM;CAAE,EAAE,CAAC,CAAC,MAAM,GAAG,MAAMY,EAAE,KAAK,QAAQC,EAAE,KAAK,SAASA,EAAE,IAAID,EAAE,CAAC;CAEnH,KAAK,IAAM,EAAE,aAAUD,GAAS;EAC9B,IAAMG,IAASC,EAAeZ,EAAK,SAAS,IACxCa,EAAmBb,EAAK,WAAWc,CAAG,IACtCC,EAAoBf,EAAK,WAAWc,CAAG;EAC3C,IAAI,CAACH,GAAQ;EAEb,IAAMK,IAAWhB,EAAK,KAAK;EAE3B,AADAM,EAAO,IAAIU,CAAQ,GACnBb,EAAI,KAAKc,EAAe;GAAE,MAAMjB,EAAK;GAAM,OAAOA,EAAK;GAAO,OAAO;EAAQ,CAAC,CAAC;EAC/E,KAAK,IAAME,KAASS,GAAQ;GAC1B,IAAMO,IAASpB,EAAWE,GAAME,CAAK,GAC/BiB,IAAO;IACX,GAAGnB,EAAK;IACR,IAAIoB,EAAO;IACX,MAAMF,EAAO;IACb,MAAM;KAAE,GAAIlB,EAAK,KAAK;KAAiB,MAAMkB,EAAO;IAAK;GAC3D;GAEA,AADAf,EAAI,KAAKkB,EAAe;IAAE;IAAM,OAAOrB,EAAK;IAAO,OAAO;GAAQ,CAAC,CAAC,GAChEI,EAAS,IAAIY,CAAQ,KAAGT,EAAU,KAAKY,EAAK,EAAE;EACpD;CACF;CAKA,OAAO;EAAE;EAAK,eAHQd,KAAaC,EAAO,OAAO,IAC7C,CAAC,GAAGD,EAAU,QAAQ,MAAO,CAACC,EAAO,IAAIgB,CAAE,CAAC,GAAG,GAAGf,CAAS,IAC3D;CACwB;AAC9B;AAEA,SAASR,EAAU,GAAiB,GAA6B;CAC/D,IAAMwB,IAAOC,KAAU,OAAOA,KAAW,WAAW,EAAE,GAAIA,EAAmC,IAAI,CAAC;CAElG,OADA,OAAOD,EAAKE,UACL;EAAE,GAAGF;EAAM,GAAGd,EAAE;EAAG,GAAGA,EAAE;EAAG,OAAOA,EAAE;EAAO,QAAQA,EAAE;CAAO;AACrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolActivate.js","names":["TOOL_ACTIVATE_ID","buildToolActivateBindings","specs","mods","keyOpts","makeToolActivateAction","bindings","activeTool","deps","toolId","params","isEligible"],"sources":["../../../../src/interactions/actions/defaults/toolActivate.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { BoundGesture } from '@weasel-js/routing';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\n\n/** Canonical id of the consolidated tool-activation action. One descriptor\n * serves every tool; the matched binding (or imperative caller) supplies\n * `params.toolId` to select which tool to activate. */\nexport const TOOL_ACTIVATE_ID = 'tool.activate';\n\n/** Per-tool key spec consumed by `makeToolActivateAction`. `mod/alt/shift`\n * sit at the top level, mirroring the `KeyBinding` shape tools declare. */\nexport interface ToolActivateKeyOpts {\n key: string;\n mod?: boolean;\n alt?: boolean;\n shift?: boolean | 'optional';\n}\n\n/** Single entry pairing a tool id with the key spec that activates it. */\nexport interface ToolActivateBindingSpec {\n toolId: string;\n keyOpts: ToolActivateKeyOpts;\n}\n\n/** Build the per-tool `BoundGesture` list for the consolidated action's\n * `defaultBinding`. Each entry carries `opts.params.toolId` so the\n * invoker's `run` can pick out which tool to activate. */\nexport function buildToolActivateBindings(\n specs: readonly ToolActivateBindingSpec[],\n): BoundGesture[] {\n return specs.map(({ toolId, keyOpts }) => {\n // Modifiers belong under `mods` (a `ModSpec`), not at the top level of\n // the spec. They used to be spread flat and the mismatch was hidden by an\n // `as never` cast, so the matcher — which treats an absent modifier as\n // \"must NOT be held\" — could never match a modifier-qualified shortcut\n // like Cmd+D. Nobody noticed while `useKeybindings`'s own document\n // listener was doing the real matching.\n const mods: Record<string, boolean | 'optional'> = {};\n if (keyOpts.mod !== undefined) mods.mod = keyOpts.mod;\n if (keyOpts.alt !== undefined) mods.alt = keyOpts.alt;\n if (keyOpts.shift !== undefined) mods.shift = keyOpts.shift;\n return {\n spec: {\n kind: 'key',\n key: keyOpts.key,\n ...(Object.keys(mods).length > 0 ? { mods } : {}),\n },\n opts: { params: { toolId } },\n } as BoundGesture;\n });\n}\n\n/** Build the consolidated `tool.activate` action. `bindings` enumerates one\n * `{ spec, opts: { params: { toolId } } }` per tool; the invoker reads\n * `params.toolId` and calls `activeTool.setActive(toolId)`. Imperative\n * callers (palette, toolbar) reach the same effect via\n * `registry.trigger('tool.activate', { toolId })`.\n *\n * `isEligible` gates activation on the tool's `eligibility.capabilities` vs the active\n * mode — the same predicate `ToolPalette` uses to grey a button out. It has\n * to live in the invoker rather than in `Action.eligible` because eligibility\n * here is per-TOOL (read off `params.toolId`), while `Action.eligible` is a\n * static per-action descriptor. Omit it (or pass one that always returns\n * true) for consumers with no mode registry. */\nexport function makeToolActivateAction(\n bindings: BoundGesture[],\n isEligible?: (toolId: string) => boolean,\n): Action {\n const invoker: ImmediateInvoker = {\n timing: 'immediate',\n run: (deps, params) => {\n const activeTool = deps.activeTool;\n const toolId = params?.toolId as string | undefined;\n if (!activeTool || !toolId) return;\n // Greyed out in the palette ⇒ not reachable by shortcut either. Before\n // this, `ToolDef.capabilities` described an intent the runtime never\n // enforced: in text-edit mode the palette greyed the pen button while\n // `P` still activated pen.\n if (isEligible && !isEligible(toolId)) return;\n activeTool.setActive(toolId);\n },\n };\n\n return {\n id: TOOL_ACTIVATE_ID,\n label: 'Activate tool',\n defaultBinding: bindings,\n scope: 'hotkey',\n invoker,\n requires: ['activeTool'],\n } as Action & { requires: string[] };\n}\n"],"mappings":";AAOA,IAAaA,IAAmB;AAoBhC,SAAgBC,EACd,GACgB;CAChB,OAAOC,EAAM,KAAK,EAAE,WAAQ,iBAAc;EAOxC,IAAMC,IAA6C,CAAC;EAIpD,OAHIC,EAAQ,QAAQ,KAAA,MAAW,EAAK,MAAMA,EAAQ,MAC9CA,EAAQ,QAAQ,KAAA,MAAW,EAAK,MAAMA,EAAQ,MAC9CA,EAAQ,UAAU,KAAA,MAAW,EAAK,QAAQA,EAAQ,QAC/C;GACL,MAAM;IACJ,MAAM;IACN,KAAKA,EAAQ;IACb,GAAI,OAAO,KAAKD,CAAI,CAAC,CAAC,SAAS,IAAI,EAAE,QAAK,IAAI,CAAC;GACjD;GACA,MAAM,EAAE,QAAQ,EAAE,UAAO,EAAE;EAC7B;CACF,CAAC;AACH;AAcA,SAAgBE,EACd,GACA,GACQ;CAgBR,OAAO;EACL,IAAIL;EACJ,OAAO;EACP,gBAAgBM;EAChB,OAAO;EACP,SAAA;GAnBA,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMC,IAAaC,EAAK,YAClBC,IAASC,GAAQ;IACvB,AAAKH,KAAeE,MAKhB,MAAeE,EAAWF,CAAM,MACpCF,EAAW,UAAUE,CAAM;GAC7B;EAQA;EACA,UAAU,CAAC,YAAY;CACzB;AACF"}
1
+ {"version":3,"file":"toolActivate.js","names":["TOOL_ACTIVATE_ID","buildToolActivateBindings","specs","mods","keyOpts","makeToolActivateAction","bindings","activeTool","deps","toolId","params","isEligible"],"sources":["../../../../src/interactions/actions/defaults/toolActivate.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { BoundGesture } from '@weasel-js/routing';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\n\n/** Canonical id of the consolidated tool-activation action. One descriptor\n * serves every tool; the matched binding (or imperative caller) supplies\n * `params.toolId` to select which tool to activate. */\nexport const TOOL_ACTIVATE_ID = 'tool.activate';\n\n/** Per-tool key spec consumed by `makeToolActivateAction`. `mod/alt/shift`\n * sit at the top level, mirroring the `KeyBinding` shape tools declare. */\nexport interface ToolActivateKeyOpts {\n key: string;\n mod?: boolean;\n alt?: boolean;\n shift?: boolean | 'optional';\n}\n\n/** Single entry pairing a tool id with the key spec that activates it. */\nexport interface ToolActivateBindingSpec {\n toolId: string;\n keyOpts: ToolActivateKeyOpts;\n}\n\n/** Build the per-tool `BoundGesture` list for the consolidated action's\n * `defaultBinding`. Each entry carries `opts.params.toolId` so the\n * invoker's `run` can pick out which tool to activate. */\nexport function buildToolActivateBindings(\n specs: readonly ToolActivateBindingSpec[],\n): BoundGesture[] {\n return specs.map(({ toolId, keyOpts }) => {\n // Modifiers belong under `mods` (a `ModSpec`), not at the top level of\n // the spec: the matcher treats an absent modifier as \"must NOT be held\".\n const mods: Record<string, boolean | 'optional'> = {};\n if (keyOpts.mod !== undefined) mods.mod = keyOpts.mod;\n if (keyOpts.alt !== undefined) mods.alt = keyOpts.alt;\n if (keyOpts.shift !== undefined) mods.shift = keyOpts.shift;\n return {\n spec: {\n kind: 'key',\n key: keyOpts.key,\n ...(Object.keys(mods).length > 0 ? { mods } : {}),\n },\n opts: { params: { toolId } },\n } as BoundGesture;\n });\n}\n\n/** Build the consolidated `tool.activate` action. `bindings` enumerates one\n * `{ spec, opts: { params: { toolId } } }` per tool. Imperative callers reach\n * the same effect via `registry.trigger('tool.activate', { toolId })`.\n *\n * `isEligible` gates activation per tool, which the static per-action\n * `Action.eligible` cannot. Omit it for consumers with no mode registry. */\nexport function makeToolActivateAction(\n bindings: BoundGesture[],\n isEligible?: (toolId: string) => boolean,\n): Action {\n const invoker: ImmediateInvoker = {\n timing: 'immediate',\n run: (deps, params) => {\n const activeTool = deps.activeTool;\n const toolId = params?.toolId as string | undefined;\n if (!activeTool || !toolId) return;\n // Grayed out in the palette ⇒ not reachable by shortcut either.\n if (isEligible && !isEligible(toolId)) return;\n activeTool.setActive(toolId);\n },\n };\n\n return {\n id: TOOL_ACTIVATE_ID,\n label: 'Activate tool',\n defaultBinding: bindings,\n scope: 'hotkey',\n invoker,\n requires: ['activeTool'],\n } as Action & { requires: string[] };\n}\n"],"mappings":";AAOA,IAAaA,IAAmB;AAoBhC,SAAgBC,EACd,GACgB;CAChB,OAAOC,EAAM,KAAK,EAAE,WAAQ,iBAAc;EAGxC,IAAMC,IAA6C,CAAC;EAIpD,OAHIC,EAAQ,QAAQ,KAAA,MAAW,EAAK,MAAMA,EAAQ,MAC9CA,EAAQ,QAAQ,KAAA,MAAW,EAAK,MAAMA,EAAQ,MAC9CA,EAAQ,UAAU,KAAA,MAAW,EAAK,QAAQA,EAAQ,QAC/C;GACL,MAAM;IACJ,MAAM;IACN,KAAKA,EAAQ;IACb,GAAI,OAAO,KAAKD,CAAI,CAAC,CAAC,SAAS,IAAI,EAAE,QAAK,IAAI,CAAC;GACjD;GACA,MAAM,EAAE,QAAQ,EAAE,UAAO,EAAE;EAC7B;CACF,CAAC;AACH;AAQA,SAAgBE,EACd,GACA,GACQ;CAaR,OAAO;EACL,IAAIL;EACJ,OAAO;EACP,gBAAgBM;EAChB,OAAO;EACP,SAAA;GAhBA,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMC,IAAaC,EAAK,YAClBC,IAASC,GAAQ;IACvB,AAAKH,KAAeE,MAEhB,MAAeE,EAAWF,CAAM,MACpCF,EAAW,UAAUE,CAAM;GAC7B;EAQA;EACA,UAAU,CAAC,YAAY;CACzB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolResetToDefault.js","names":["TOOL_RESET_TO_DEFAULT_ID","makeToolResetToDefaultAction","activeTool","deps","target","getTarget","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/toolResetToDefault.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\n\n/** Canonical id of the \"Escape returns to the default tool\" action. */\nexport const TOOL_RESET_TO_DEFAULT_ID = 'tool.resetToDefault';\n\n/**\n * Build the Escape-returns-to-default-tool action.\n *\n * This used to live in a raw document `keydown` listener inside\n * `useKeybindings`, running alongside — and unaware of — the dispatcher's own\n * Escape bindings (`cancelGesture`, `exitPathEdit`, `escape`). Both fired on\n * the same keypress because they were separate listeners.\n *\n * As an Action it joins the dispatcher's Escape order, which is\n * first-match-wins. It registers at ambient scope, the lowest priority, so\n * one Escape press does exactly one thing, in this order:\n *\n * 1. cancel an in-flight gesture\n * 2. exit path-anchor edit mode\n * 3. clear the selection\n * 4. return to the default tool ← this action\n *\n * That IS a behavior change from \"reset the tool *and* clear the selection on\n * the same press.\" That order is the coherent reading of Escape, and the old\n * pairing was an artifact of two uncoordinated listeners rather than a design.\n *\n * `getTarget` returns the tool id to return to, or `null` when the behavior\n * is disabled (consumer passed `defaultTool: null`) or already satisfied.\n */\nexport function makeToolResetToDefaultAction(\n getTarget: () => string | null,\n): Action {\n const invoker: ImmediateInvoker = {\n timing: 'immediate',\n run: (deps) => {\n const activeTool = deps.activeTool;\n const target = getTarget();\n if (!activeTool || !target) return;\n activeTool.setActive(target);\n },\n };\n\n return {\n id: TOOL_RESET_TO_DEFAULT_ID,\n label: 'Return to default tool',\n defaultBinding: { kind: 'key', key: 'Escape' },\n invoker,\n requires: ['activeTool'],\n // Report disabled (rather than silently no-op'ing) when there's nothing\n // to return to, so the dispatcher falls through and the keypress isn't\n // swallowed.\n enabled: () => (getTarget() ? true : ActionDisabledReason.NotApplicable),\n } as Action & { requires: string[] };\n}\n"],"mappings":";;AAKA,IAAaA,IAA2B;AA0BxC,SAAgBC,EACd,GACQ;CAWR,OAAO;EACL,IAAID;EACJ,OAAO;EACP,gBAAgB;GAAE,MAAM;GAAO,KAAK;EAAS;EAC7C,SAAA;GAbA,QAAQ;GACR,MAAM,MAAS;IACb,IAAME,IAAaC,EAAK,YAClBC,IAASC,EAAU;IACzB,AAAKH,KAAeE,KACpBF,EAAW,UAAUE,CAAM;GAC7B;EAOA;EACA,UAAU,CAAC,YAAY;EAIvB,eAAgBC,EAAU,IAAI,KAAOC,EAAqB;CAC5D;AACF"}
1
+ {"version":3,"file":"toolResetToDefault.js","names":["TOOL_RESET_TO_DEFAULT_ID","makeToolResetToDefaultAction","activeTool","deps","target","getTarget","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/toolResetToDefault.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\n\n/** Canonical id of the \"Escape returns to the default tool\" action. */\nexport const TOOL_RESET_TO_DEFAULT_ID = 'tool.resetToDefault';\n\n/**\n * Build the Escape-returns-to-default-tool action.\n *\n * It joins the dispatcher's Escape order, which is first-match-wins, at\n * ambient scope, the lowest priority, so one Escape press does exactly one\n * thing, in this order:\n *\n * 1. cancel an in-flight gesture\n * 2. exit path-anchor edit mode\n * 3. clear the selection\n * 4. return to the default tool ← this action\n *\n * `getTarget` returns the tool id to return to, or `null` when the behavior\n * is disabled (consumer passed `defaultTool: null`) or already satisfied.\n */\nexport function makeToolResetToDefaultAction(\n getTarget: () => string | null,\n): Action {\n const invoker: ImmediateInvoker = {\n timing: 'immediate',\n run: (deps) => {\n const activeTool = deps.activeTool;\n const target = getTarget();\n if (!activeTool || !target) return;\n activeTool.setActive(target);\n },\n };\n\n return {\n id: TOOL_RESET_TO_DEFAULT_ID,\n label: 'Return to default tool',\n defaultBinding: { kind: 'key', key: 'Escape' },\n invoker,\n requires: ['activeTool'],\n // Report disabled (rather than silently no-op'ing) when there's nothing\n // to return to, so the dispatcher falls through and the keypress isn't\n // swallowed.\n enabled: () => (getTarget() ? true : ActionDisabledReason.NotApplicable),\n } as Action & { requires: string[] };\n}\n"],"mappings":";;AAKA,IAAaA,IAA2B;AAiBxC,SAAgBC,EACd,GACQ;CAWR,OAAO;EACL,IAAID;EACJ,OAAO;EACP,gBAAgB;GAAE,MAAM;GAAO,KAAK;EAAS;EAC7C,SAAA;GAbA,QAAQ;GACR,MAAM,MAAS;IACb,IAAME,IAAaC,EAAK,YAClBC,IAASC,EAAU;IACzB,AAAKH,KAAeE,KACpBF,EAAW,UAAUE,CAAM;GAC7B;EAOA;EACA,UAAU,CAAC,YAAY;EAIvB,eAAgBC,EAAU,IAAI,KAAOC,EAAqB;CAC5D;AACF"}
@@ -23,7 +23,7 @@ var i = {
23
23
  start(i, a) {
24
24
  let o = i.deps.view;
25
25
  if (!o) return {};
26
- let s = o.get(), c = t(a?.params) ?? {}, l = c.inertia === !1 ? void 0 : c.inertia, u = {
26
+ let s = o.get(), c = t(a?.params) ?? {}, l = c.inertia === !0 ? {} : c.inertia || void 0, u = {
27
27
  startView: s,
28
28
  base: s,
29
29
  baseScreen: {