@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
@@ -0,0 +1,98 @@
1
+ import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
2
+ import { runBehaviorCancel as t, runBehaviorSettled as n } from "../gestureLifecycle.js";
3
+ import { carryPose as r, inPlane as i, invertPlane as a, planeOf as o, selectionLayer as s } from "../planeInput.js";
4
+ import { nodeDescriptors as c, poseDescriptorOf as l } from "../poseDescriptorDep.js";
5
+ import { selectedRoots as u, translateTargets as d } from "../selectionSubtree.js";
6
+ import { scenePoseFrame as f } from "../poseFrame.js";
7
+ import { defaultCommitAdapter as p } from "../defaultCommitAdapter.js";
8
+ import { startCloneBehaviors as m } from "./behaviors.js";
9
+ import { copySelection as h } from "../defaults/copySubtree.js";
10
+ //#region src/interactions/actions/clone/action.ts
11
+ function g(t, n, i, a) {
12
+ let s = t.originPoses.get(n), c = t.scene.get(n);
13
+ if (s === void 0 || !c) return;
14
+ let l = t.descriptorOf(n), u = e(s, i, a, l);
15
+ return t.frame.local(n, r(l, u, o(t.view, c.layer)));
16
+ }
17
+ function _(e, t, n) {
18
+ let { dx: r, dy: i } = e.currentDelta, a = (t) => {
19
+ e.applyOps ? e.applyOps(t, "Clone") : e.scene.applyBatch(t, "Clone", p(e.scene, n.adapterMethods));
20
+ }, o = t.end(e.currentDelta);
21
+ if (o === null) return !1;
22
+ if (o !== void 0) return o.length > 0 && a(o), !0;
23
+ let { ops: s, copies: c } = h(e.scene, e.ids, (t, n) => e.originPoses.has(t) ? g(e, t, r, i) : n.pose, "Clone");
24
+ return s.length !== 0 && (a(s), n.set(c), !0);
25
+ }
26
+ var v = i({
27
+ id: "clone",
28
+ label: "Clone",
29
+ cursor: "copy",
30
+ activeCursor: "copy",
31
+ eligible: { capability: ["edits-page", "creates-selection"] },
32
+ requires: [
33
+ "selection",
34
+ "scene",
35
+ "applyOps",
36
+ "poseDescriptor"
37
+ ],
38
+ invoker: {
39
+ timing: "ongoing",
40
+ start(e, i) {
41
+ let s = e.deps.selection, p = e.deps.scene, h = e.deps.applyOps;
42
+ if (!s || !p) return {};
43
+ let v = s.get();
44
+ if (v.length === 0) return {};
45
+ let y = f(p), b = /* @__PURE__ */ new Map(), x = c(p, l(e.deps.poseDescriptor));
46
+ for (let t of d(p, y, v)) {
47
+ let n = p.get(t);
48
+ if (n === void 0) continue;
49
+ let i = a(o(e.deps.view, n.layer));
50
+ b.set(t, r(x(t), y.world(t), i));
51
+ }
52
+ if (b.size === 0) return {};
53
+ let S = {
54
+ ids: u(p, v),
55
+ scene: p,
56
+ descriptorOf: x,
57
+ frame: y,
58
+ originPoses: b,
59
+ view: e.deps.view,
60
+ currentDelta: {
61
+ dx: 0,
62
+ dy: 0
63
+ },
64
+ previews: /* @__PURE__ */ new Map(),
65
+ applyOps: h
66
+ }, C = m(e, i, p, S.ids, b, x);
67
+ return {
68
+ kind: "clone",
69
+ previewHidesSource: !1,
70
+ onMove(e) {
71
+ if (!e.drag) return;
72
+ S.currentDelta = C.shape(e, {
73
+ dx: e.drag.delta.x,
74
+ dy: e.drag.delta.y
75
+ }), S.previews.clear();
76
+ let { dx: t, dy: n } = S.currentDelta;
77
+ if (t !== 0 || n !== 0) for (let e of S.originPoses.keys()) S.previews.set(e, g(S, e, t, n));
78
+ },
79
+ onEnd(e, r) {
80
+ let i = !1;
81
+ try {
82
+ let { dx: e, dy: n } = S.currentDelta;
83
+ r === "commit" && (e !== 0 || n !== 0) ? i = _(S, C, s) : t(C.list, C.gctx);
84
+ } finally {
85
+ S.previews.clear(), n(C.list, C.gctx, i);
86
+ }
87
+ },
88
+ previewIds: () => S.previews.keys(),
89
+ previewPose: (e) => S.previews.get(e) ?? null
90
+ };
91
+ }
92
+ },
93
+ enabled: () => !0
94
+ }, s);
95
+ //#endregion
96
+ export { v as cloneAction };
97
+
98
+ //# sourceMappingURL=action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action.js","names":["landed","origin","scratch","id","node","d","moved","translatePoseViaDescriptor","dx","dy","carryPose","planeOf","commitClone","apply","ops","defaultCommitAdapter","selection","answer","behaviors","copySelection","copies","cloneAction","inPlane","ctx","scene","applyOps","ids","frame","scenePoseFrame","originPoses","descriptorOf","nodeDescriptors","poseDescriptorOf","translateTargets","toEdited","invertPlane","selectedRoots","startCloneBehaviors","opts","moveCtx","committed","reason","runBehaviorCancel","runBehaviorSettled","selectionLayer"],"sources":["../../../../src/interactions/actions/clone/action.ts"],"sourcesContent":["/**\n * `cloneAction` — ongoing Action descriptor for alt-drag clone. Nothing is\n * written before the commit, so a cancel only clears the preview.\n *\n * The action does not gate on a modifier: it runs whenever the dispatcher\n * routes to it, and the binding that names it carries the `alt` requirement.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { BindingOpts, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { runBehaviorCancel, runBehaviorSettled } from '../gestureLifecycle';\nimport { startCloneBehaviors, type CloneBehaviors } from './behaviors';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport { copySelection } from '../defaults/copySubtree';\nimport { selectedRoots, translateTargets } from '../selectionSubtree';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport { carryPose, invertPlane, inPlane, planeOf, selectionLayer } from '../planeInput';\n\ninterface CloneScratch {\n /** The selected ids a copy starts from; each brings its subtree. */\n ids: NodeId[];\n scene: Scene<unknown, string, unknown>;\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>;\n /** World reads and local writes over the scene's composition strategy. */\n frame: PoseFrame<unknown>;\n /** Origin poses captured at drag start, in world — the frame the drag\n * delta is expressed in, and the plane the edit is measured in. The copy\n * keeps its source's parent and layer, so each translated result is\n * carried back to that layer's plane and stored in that same frame.\n * Holds every node the copy moves itself: a node stored in a copied frame\n * is absent, because the copy of that frame carries it. */\n originPoses: Map<NodeId, unknown>;\n /** The view the invocation started with, read for `planeOf`. */\n view: unknown;\n /** Running drag delta — updated each onMove, applied once at commit. */\n currentDelta: { dx: number; dy: number };\n /** Preview poses keyed by the original's id: the copies have no ids yet. */\n previews: Map<NodeId, unknown>;\n /** Optional consumer commit hook captured at gesture start. When present,\n * the insert ops route through it instead of `scene.applyBatch`. */\n applyOps?: (ops: Op[], label: string) => void;\n}\n\n/** Where the copy of `id` lands for a drag of `(dx, dy)`, as stored. */\nfunction landed(scratch: CloneScratch, id: NodeId, dx: number, dy: number): unknown {\n const origin = scratch.originPoses.get(id);\n const node = scratch.scene.get(id);\n if (origin === undefined || !node) return undefined;\n const d = scratch.descriptorOf(id);\n const moved = translatePoseViaDescriptor(origin, dx, dy, d);\n return scratch.frame.local(id, carryPose(d, moved, planeOf(scratch.view, node.layer)));\n}\n\n/** Commit the drag: a behavior's ops when one claims it, else the copies,\n * which become the selection. Returns whether anything was committed. */\nfunction commitClone(scratch: CloneScratch, behaviors: CloneBehaviors, selection: SelectionApi): boolean {\n const { dx, dy } = scratch.currentDelta;\n const apply = (ops: Op[]): void => {\n if (scratch.applyOps) scratch.applyOps(ops, 'Clone');\n else scratch.scene.applyBatch(ops, 'Clone', defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n };\n const answer = behaviors.end(scratch.currentDelta);\n if (answer === null) return false;\n if (answer !== undefined) {\n if (answer.length > 0) apply(answer);\n return true;\n }\n const { ops, copies } = copySelection(\n scratch.scene,\n scratch.ids,\n (id, node) => (scratch.originPoses.has(id) ? landed(scratch, id, dx, dy) : node.pose),\n 'Clone',\n );\n if (ops.length === 0) return false;\n apply(ops);\n selection.set(copies);\n return true;\n}\n\n/**\n * @experimental\n * Static descriptor for the `clone` Action. Copies each selected node, with\n * its subtree, to where the drag left it. One undo entry.\n */\nexport const cloneAction: Action & { requires: string[] } = inPlane({\n id: 'clone',\n label: 'Clone',\n // No default binding: a bare `{ kind: 'drag' }` would clone a non-empty\n // selection on any drag no tool claimed. Alt-drag on a body binds it\n // (`selectionMoveBindings`, the `move` preset).\n // The platform's duplicate cursor. The select tool binds clone behind\n // `mods: { alt: true }`, so the pump shows this only while Alt is down.\n cursor: 'copy',\n activeCursor: 'copy',\n eligible: { capability: ['edits-page', 'creates-selection'] },\n requires: ['selection', 'scene', 'applyOps', 'poseDescriptor'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene;\n const applyOps = ctx.deps.applyOps;\n\n if (!selection || !scene) return {};\n\n const ids = selection.get() as NodeId[];\n if (ids.length === 0) return {};\n\n // Capture origin poses once at drag start.\n const frame = scenePoseFrame(scene);\n const originPoses = new Map<NodeId, unknown>();\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(ctx.deps.poseDescriptor));\n for (const id of translateTargets(scene, frame, ids)) {\n const node = scene.get(id);\n if (node === undefined) continue;\n const toEdited = invertPlane(planeOf(ctx.deps.view, node.layer));\n originPoses.set(id, carryPose(descriptorOf(id), frame.world(id), toEdited));\n }\n\n if (originPoses.size === 0) return {};\n\n const scratch: CloneScratch = {\n ids: selectedRoots(scene, ids),\n scene,\n descriptorOf,\n frame,\n originPoses,\n view: ctx.deps.view,\n currentDelta: { dx: 0, dy: 0 },\n previews: new Map<NodeId, unknown>(),\n applyOps,\n };\n const behaviors = startCloneBehaviors(ctx, opts, scene, scratch.ids, originPoses, descriptorOf);\n\n return {\n kind: 'clone',\n // The source stays visible at its committed pose; the ghost appears\n // at the drag target.\n previewHidesSource: false,\n onMove(moveCtx: InvocationCtx): void {\n if (!moveCtx.drag) return;\n scratch.currentDelta = behaviors.shape(moveCtx, { dx: moveCtx.drag.delta.x, dy: moveCtx.drag.delta.y });\n scratch.previews.clear();\n const { dx, dy } = scratch.currentDelta;\n if (dx === 0 && dy === 0) return;\n for (const id of scratch.originPoses.keys()) scratch.previews.set(id, landed(scratch, id, dx, dy)!);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n const { dx, dy } = scratch.currentDelta;\n // A zero-delta drag makes no clone, so its behaviors are canceled.\n if (reason === 'commit' && (dx !== 0 || dy !== 0)) committed = commitClone(scratch, behaviors, selection);\n else runBehaviorCancel(behaviors.list, behaviors.gctx);\n } finally {\n scratch.previews.clear();\n runBehaviorSettled(behaviors.list, behaviors.gctx, committed);\n }\n },\n previewIds: () => scratch.previews.keys(),\n previewPose: (id: string) => scratch.previews.get(id as NodeId) ?? null,\n };\n },\n },\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
2
+ import { reduceBehaviorEnd as t } from "../gestureLifecycle.js";
3
+ import { gestureReaders as n } from "../../gestures/shared/screenTolerance.js";
4
+ import { pointerStateOf as r } from "../pointerState.js";
5
+ import { sceneGestureFrames as i } from "../gestureFrames.js";
6
+ import { defaultCommitAdapter as a } from "../defaultCommitAdapter.js";
7
+ //#region src/interactions/actions/clone/behaviors.ts
8
+ function o(o, s, c, l, u, d) {
9
+ let f = s?.behaviors ?? [], p = n(o.deps), m = new Map(u), h = {
10
+ draggedIds: l,
11
+ origin: m,
12
+ current: new Map(m),
13
+ snap: null,
14
+ modifiers: { ...o.modifiers },
15
+ pointer: r(o.world, o),
16
+ view: p.view(),
17
+ plane: p.plane(),
18
+ frames: i(c, o.deps.view),
19
+ adapter: a(c, o.deps.selection?.adapterMethods),
20
+ scratch: {}
21
+ }, g = ({ dx: t, dy: n }) => {
22
+ for (let [r, i] of u) h.current.set(r, e(i, t, n, d(r)));
23
+ };
24
+ for (let e of f) e.onStart?.(h);
25
+ return {
26
+ list: f,
27
+ gctx: h,
28
+ shape(e, t) {
29
+ if (f.length === 0) return t;
30
+ h.modifiers = { ...e.modifiers }, h.pointer = r(e.world, e), h.view = p.view(), h.plane = p.plane(), g(t);
31
+ let n = {
32
+ kind: "translate",
33
+ ...t
34
+ };
35
+ for (let e of f) {
36
+ let t = e.onMove?.(h, n);
37
+ t && (t.transform?.kind === "translate" && (n = t.transform), t.snap !== void 0 && (h.snap = t.snap));
38
+ }
39
+ return n.kind === "translate" ? {
40
+ dx: n.dx,
41
+ dy: n.dy
42
+ } : t;
43
+ },
44
+ end(e) {
45
+ return g(e), t(f, h);
46
+ }
47
+ };
48
+ }
49
+ //#endregion
50
+ export { o as startCloneBehaviors };
51
+
52
+ //# sourceMappingURL=behaviors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behaviors.js","names":["startCloneBehaviors","list","opts","readers","gestureReaders","ctx","origin","origins","gctx","roots","pointerStateOf","sceneGestureFrames","scene","defaultCommitAdapter","place","id","pose","translatePoseViaDescriptor","dx","dy","descriptorOf","b","raw","moveCtx","transform","r","delta","reduceBehaviorEnd"],"sources":["../../../../src/interactions/actions/clone/behaviors.ts"],"sourcesContent":["import type { ActionDeps, BindingOpts, InvocationCtx } from '@weasel-js/routing';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { gestureReaders, type GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { CloneBehavior, CloneBehaviorResult, GestureContext, GroupTransform } from '../../gestures/types';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { sceneGestureFrames } from '../gestureFrames';\nimport { reduceBehaviorEnd } from '../gestureLifecycle';\nimport { pointerStateOf } from '../pointerState';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from '../resize/geometry';\n\ntype Delta = { dx: number; dy: number };\n\n/** A clone drag's behaviors and the context they are told. */\nexport interface CloneBehaviors {\n readonly list: readonly CloneBehavior<unknown>[];\n readonly gctx: GestureContext<unknown>;\n /** The drag's delta as the behaviors reshape it, each seeing the one before. */\n shape(moveCtx: InvocationCtx, raw: Delta): Delta;\n /** What the behaviors answer for the commit; see `reduceBehaviorEnd`. */\n end(delta: Delta): Op[] | null | undefined;\n}\n\n/**\n * Start the binding's behaviors over the poses the copies are measured from:\n * `origins`, in world, keyed by the original's id.\n */\nexport function startCloneBehaviors(\n ctx: InvocationCtx,\n opts: BindingOpts | undefined,\n scene: Scene<unknown, string, unknown>,\n roots: readonly NodeId[],\n origins: ReadonlyMap<NodeId, unknown>,\n descriptorOf: (id: NodeId) => PoseDescriptor<unknown>,\n): CloneBehaviors {\n const list = (opts?.behaviors ?? []) as CloneBehavior<unknown>[];\n const readers: GestureReaders = gestureReaders(ctx.deps as Pick<ActionDeps, 'view'>);\n const origin = new Map<string, unknown>(origins as ReadonlyMap<string, unknown>);\n const gctx: GestureContext<unknown> = {\n draggedIds: roots as unknown as string[],\n origin,\n current: new Map(origin),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readers.view(),\n plane: readers.plane(),\n frames: sceneGestureFrames(scene, ctx.deps.view),\n adapter: defaultCommitAdapter(scene, ctx.deps.selection?.adapterMethods) as unknown as GestureContext<unknown>['adapter'],\n scratch: {},\n };\n const place = ({ dx, dy }: Delta): void => {\n for (const [id, pose] of origins) {\n gctx.current.set(id as string, translatePoseViaDescriptor(pose, dx, dy, descriptorOf(id)));\n }\n };\n for (const b of list) b.onStart?.(gctx);\n return {\n list,\n gctx,\n shape(moveCtx, raw) {\n if (list.length === 0) return raw;\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.world, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n place(raw);\n let transform: GroupTransform = { kind: 'translate', ...raw };\n for (const b of list) {\n const r: CloneBehaviorResult<unknown> | void = b.onMove?.(gctx, transform);\n if (!r) continue;\n if (r.transform?.kind === 'translate') transform = r.transform;\n if (r.snap !== undefined) gctx.snap = r.snap;\n }\n return transform.kind === 'translate' ? { dx: transform.dx, dy: transform.dy } : raw;\n },\n end(delta) {\n place(delta);\n return reduceBehaviorEnd(list, gctx);\n },\n };\n}\n"],"mappings":";;;;;;;AA2BA,SAAgBA,EACd,GACA,GACA,GACA,GACA,GACA,GACgB;CAChB,IAAMC,IAAQC,GAAM,aAAa,CAAC,GAC5BC,IAA0BC,EAAeC,EAAI,IAAgC,GAC7EC,IAAS,IAAI,IAAqBC,CAAuC,GACzEC,IAAgC;EACpC,YAAYC;EACZ;EACA,SAAS,IAAI,IAAIH,CAAM;EACvB,MAAM;EACN,WAAW,EAAE,GAAGD,EAAI,UAAU;EAC9B,SAASK,EAAeL,EAAI,OAAOA,CAAG;EACtC,MAAMF,EAAQ,KAAK;EACnB,OAAOA,EAAQ,MAAM;EACrB,QAAQQ,EAAmBC,GAAOP,EAAI,KAAK,IAAI;EAC/C,SAASQ,EAAqBD,GAAOP,EAAI,KAAK,WAAW,cAAc;EACvE,SAAS,CAAC;CACZ,GACMS,KAAS,EAAE,OAAI,YAAsB;EACzC,KAAK,IAAM,CAACC,GAAIC,MAAST,GACvB,EAAK,QAAQ,IAAIQ,GAAcE,EAA2BD,GAAME,GAAIC,GAAIC,EAAaL,CAAE,CAAC,CAAC;CAE7F;CACA,KAAK,IAAMM,KAAKpB,GAAM,EAAE,UAAUO,CAAI;CACtC,OAAO;EACL;EACA;EACA,MAAM,GAAS,GAAK;GAClB,IAAIP,EAAK,WAAW,GAAG,OAAOqB;GAK9B,AAJA,EAAK,YAAY,EAAE,GAAGC,EAAQ,UAAU,GACxC,EAAK,UAAUb,EAAea,EAAQ,OAAOA,CAAO,GACpD,EAAK,OAAOpB,EAAQ,KAAK,GACzB,EAAK,QAAQA,EAAQ,MAAM,GAC3BW,EAAMQ,CAAG;GACT,IAAIE,IAA4B;IAAE,MAAM;IAAa,GAAGF;GAAI;GAC5D,KAAK,IAAMD,KAAKpB,GAAM;IACpB,IAAMwB,IAAyCJ,EAAE,SAASb,GAAMgB,CAAS;IACzE,AAAKC,MACDA,EAAE,WAAW,SAAS,gBAAa,IAAYA,EAAE,YACjDA,EAAE,SAAS,KAAA,MAAW,EAAK,OAAOA,EAAE;GAC1C;GACA,OAAOD,EAAU,SAAS,cAAc;IAAE,IAAIA,EAAU;IAAI,IAAIA,EAAU;GAAG,IAAIF;EACnF;EACA,IAAI,GAAO;GAET,OADAR,EAAMY,CAAK,GACJC,EAAkB1B,GAAMO,CAAI;EACrC;CACF;AACF"}
@@ -1,44 +1,17 @@
1
- import { documentPose as e } from "../../core/scene/effectivePose.js";
2
- import { asNodeId as t } from "../../core/scene/types.js";
3
- import { fnFieldsOfNode as n } from "../../core/scene/nodeFnFields.js";
4
- import { pickability as r } from "../../core/scene/pickability.js";
1
+ import { asNodeId as e } from "../../core/scene/types.js";
2
+ import { documentReads as t, sceneMutators as n } from "../../core/scene/sceneMutators.js";
5
3
  //#region src/interactions/actions/defaultCommitAdapter.ts
6
- function i(i, a) {
4
+ function r(r, i) {
7
5
  return {
8
- getNode: (e) => i.get(t(e)),
9
- getNodes: () => [...i.renderOrderNodes()],
10
- getPose: (n) => e(i, i.get(t(n))),
11
- getSelection: () => [...a ? a.getSelection() : i.getSelection()],
12
- setSelection: (e) => {
13
- a ? a.setSelection(e.map(t)) : i.setSelection(e.map(t));
14
- },
15
- getParent: (e) => i.get(t(e))?.parent ?? null,
16
- getRemovalClosure: (e) => [...i.removalClosure(e.map(t))],
17
- getChildren: (e) => e === null ? [...i.roots] : [...i.childrenOf(t(e))],
18
- setChildOrder: (e, n) => {
19
- for (let r = 0; r < n.length; r++) (e === null ? i.roots : i.childrenOf(t(e)))[r] !== n[r] && i.reorder(t(n[r]), r);
20
- },
21
- setPose: (e, n) => i.setPose(t(e), n),
22
- setParent: (e, n) => i.move(t(e), n == null ? null : t(n)),
23
- setData: (e, n) => i.update(t(e), { data: n }),
24
- setLayer: (e, n) => i.setLayer(t(e), n),
25
- setLayout: (e, n) => i.setLayout(t(e), n),
26
- removeNode: (e) => i.remove(t(e)),
27
- insertNode: (e, t) => i.add({
28
- kind: e.kind,
29
- layer: e.layer,
30
- pose: e.pose,
31
- data: e.data,
32
- id: e.id,
33
- ...e.parent == null ? {} : { parent: e.parent },
34
- ...t === void 0 ? {} : { index: t },
35
- ...e.dependsOn === void 0 ? {} : { dependsOn: e.dependsOn },
36
- ...r(e),
37
- ...n(e)
38
- })
6
+ ...n(r),
7
+ ...t(r),
8
+ getSelection: () => [...i ? i.getSelection() : r.getSelection()],
9
+ setSelection: (t) => {
10
+ i ? i.setSelection(t.map(e)) : r.setSelection(t.map(e));
11
+ }
39
12
  };
40
13
  }
41
14
  //#endregion
42
- export { i as defaultCommitAdapter };
15
+ export { r as defaultCommitAdapter };
43
16
 
44
17
  //# sourceMappingURL=defaultCommitAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultCommitAdapter.js","names":["defaultCommitAdapter","scene","asNodeId","id","documentPose","selection","ids","parentId","i","orderedIds","pose","layer","layout","node","index","pickability","fnFieldsOfNode"],"sources":["../../../src/interactions/actions/defaultCommitAdapter.ts"],"sourcesContent":["/**\n * Shared scene-backed commit adapter for default actions.\n *\n * Default actions route data/layer/pose/parent mutations through the\n * consumer's `applyOps` commit hook when one is present; when it isn't, they\n * fall back to applying the committed ops directly against the scene through\n * this adapter. It carries the scene-backed op-apply methods (`setPose` /\n * `setParent` / `setData` / `setLayer` / `setLayout` / `removeNode` /\n * `insertNode` / `setChildOrder`) plus the read-side queries (`getNode` / `getNodes` /\n * `getPose` / `getParent` / `getChildren` / `getSelection`) and\n * `setSelection`. Known exclusions from the op factory roster — surfaces the\n * scene doesn't own: `setPath` and `setText`.\n *\n * Lives in `interactions/actions/` (not `canvas/sceneAdapter.ts`) so default\n * actions never import from `canvas/` — that back-edge would create an\n * `interactions → canvas → interactions` cycle. Mirrors `moveGestureAdapter`,\n * widened to all op-apply methods.\n */\nimport { fnFieldsOfNode } from 'core/scene/nodeFnFields';\nimport { pickability } from 'core/scene/pickability';\nimport { documentPose } from 'core/scene/effectivePose';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { LayoutStrategy } from '../../layout/types';\n\n/** Build the adapter the default actions commit through when the consumer\n * supplies no `applyOps` hook of its own — it applies ops straight to the\n * scene. Path and text ops are not covered; those surfaces belong to their\n * own owners.\n *\n * Pass `selection` (a `SelectionApi`'s `adapterMethods`) and selection reads\n * and writes go through it rather than the scene, so a canvas that gates its\n * selection — `selectable={false}` — gates what these batches select too. */\nexport function defaultCommitAdapter<TPose>(\n scene: Scene<unknown, string, TPose>,\n selection?: SelectionApi['adapterMethods'],\n) {\n return {\n getNode: (id: string) => scene.get(asNodeId(id)),\n getNodes: () => {\n return [...scene.renderOrderNodes()] as Node<unknown, string, TPose>[];\n },\n getPose: (id: string) => documentPose(scene, scene.get(asNodeId(id))!),\n getSelection: (): string[] => [...(selection ? selection.getSelection() : scene.getSelection())],\n setSelection: (ids: string[]) => {\n if (selection) selection.setSelection(ids.map(asNodeId));\n else scene.setSelection(ids.map(asNodeId));\n },\n getParent: (id: string) => (scene.get(asNodeId(id))?.parent ?? null) as string | null,\n getRemovalClosure: (ids: readonly string[]): string[] =>\n [...scene.removalClosure(ids.map(asNodeId))],\n getChildren: (parentId: string | null): string[] =>\n (parentId === null\n ? [...scene.roots]\n : [...scene.childrenOf(asNodeId(parentId))]) as string[],\n // Re-stamp each slot whose occupant changed. `scene.reorder` mutates the\n // live sibling list in place, so re-read it each iteration and skip slots\n // already holding the desired id (an earlier reorder may have shifted a\n // later id into place). One enclosing batch is provided by the caller\n // (`scene.applyBatch` / consumer `applyOps`), so no batch here.\n setChildOrder: (parentId: string | null, orderedIds: string[]): void => {\n for (let i = 0; i < orderedIds.length; i++) {\n const current = parentId === null\n ? (scene.roots as readonly NodeId[])\n : (scene.childrenOf(asNodeId(parentId)) as readonly NodeId[]);\n if ((current[i] as string) === orderedIds[i]) continue;\n scene.reorder(asNodeId(orderedIds[i]), i);\n }\n },\n setPose: (id: string, pose: TPose) => scene.setPose(asNodeId(id), pose),\n setParent: (id: string, parentId: string | null) =>\n scene.move(asNodeId(id), parentId == null ? null : asNodeId(parentId)),\n setData: (id: string, data: unknown) => scene.update(asNodeId(id), { data } as never),\n setLayer: (id: string, layer: string) => scene.setLayer(asNodeId(id), layer as never),\n setLayout: (id: string, layout: LayoutStrategy<TPose> | string | null) =>\n scene.setLayout(asNodeId(id), layout),\n removeNode: (id: string) => scene.remove(asNodeId(id)),\n insertNode: (node: Node<unknown, string, TPose>, index?: number) =>\n scene.add({\n kind: node.kind,\n layer: node.layer,\n pose: node.pose,\n data: node.data,\n id: node.id,\n ...(node.parent != null ? { parent: node.parent } : {}),\n // Sibling-index passthrough: undo of a delete (or a boolean op's\n // source removal) re-inserts at the recorded z-order slot instead\n // of appending at the end.\n ...(index !== undefined ? { index } : {}),\n ...(node.dependsOn !== undefined ? { dependsOn: node.dependsOn } : {}),\n ...pickability(node),\n ...fnFieldsOfNode(node),\n }),\n };\n}\n"],"mappings":";;;;;AAkCA,SAAgBA,EACd,GACA,GACA;CACA,OAAO;EACL,UAAU,MAAeC,EAAM,IAAIC,EAASC,CAAE,CAAC;EAC/C,gBACS,CAAC,GAAGF,EAAM,iBAAiB,CAAC;EAErC,UAAU,MAAeG,EAAaH,GAAOA,EAAM,IAAIC,EAASC,CAAE,CAAC,CAAE;EACrE,oBAA8B,CAAC,GAAIE,IAAYA,EAAU,aAAa,IAAIJ,EAAM,aAAa,CAAE;EAC/F,eAAe,MAAkB;GAC/B,AAAII,IAAWA,EAAU,aAAaC,EAAI,IAAIJ,CAAQ,CAAC,IAClDD,EAAM,aAAaK,EAAI,IAAIJ,CAAQ,CAAC;EAC3C;EACA,YAAY,MAAgBD,EAAM,IAAIC,EAASC,CAAE,CAAC,CAAC,EAAE,UAAU;EAC/D,oBAAoB,MAClB,CAAC,GAAGF,EAAM,eAAeK,EAAI,IAAIJ,CAAQ,CAAC,CAAC;EAC7C,cAAc,MACXK,MAAa,OACV,CAAC,GAAGN,EAAM,KAAK,IACf,CAAC,GAAGA,EAAM,WAAWC,EAASK,CAAQ,CAAC,CAAC;EAM9C,gBAAgB,GAAyB,MAA+B;GACtE,KAAK,IAAIC,IAAI,GAAGA,IAAIC,EAAW,QAAQ,KAIrC,CAHgBF,MAAa,OACxBN,EAAM,QACNA,EAAM,WAAWC,EAASK,CAAQ,CAAC,EAAA,CAC3BC,OAAkBC,EAAWD,MAC1CP,EAAM,QAAQC,EAASO,EAAWD,EAAE,GAAGA,CAAC;EAE5C;EACA,UAAU,GAAY,MAAgBP,EAAM,QAAQC,EAASC,CAAE,GAAGO,CAAI;EACtE,YAAY,GAAY,MACtBT,EAAM,KAAKC,EAASC,CAAE,GAAGI,KAAY,OAAO,OAAOL,EAASK,CAAQ,CAAC;EACvE,UAAU,GAAY,MAAkBN,EAAM,OAAOC,EAASC,CAAE,GAAG,EAAE,QAAK,CAAU;EACpF,WAAW,GAAY,MAAkBF,EAAM,SAASC,EAASC,CAAE,GAAGQ,CAAc;EACpF,YAAY,GAAY,MACtBV,EAAM,UAAUC,EAASC,CAAE,GAAGS,CAAM;EACtC,aAAa,MAAeX,EAAM,OAAOC,EAASC,CAAE,CAAC;EACrD,aAAa,GAAoC,MAC/CF,EAAM,IAAI;GACR,MAAMY,EAAK;GACX,OAAOA,EAAK;GACZ,MAAMA,EAAK;GACX,MAAMA,EAAK;GACX,IAAIA,EAAK;GACT,GAAIA,EAAK,UAAU,OAAiC,CAAC,IAA3B,EAAE,QAAQA,EAAK,OAAO;GAIhD,GAAIC,MAAU,KAAA,IAAwB,CAAC,IAAb,EAAE,SAAM;GAClC,GAAID,EAAK,cAAc,KAAA,IAA4C,CAAC,IAAjC,EAAE,WAAWA,EAAK,UAAU;GAC/D,GAAGE,EAAYF,CAAI;GACnB,GAAGG,EAAeH,CAAI;EACxB,CAAC;CACL;AACF"}
1
+ {"version":3,"file":"defaultCommitAdapter.js","names":["defaultCommitAdapter","sceneMutators","scene","documentReads","selection","ids","asNodeId"],"sources":["../../../src/interactions/actions/defaultCommitAdapter.ts"],"sourcesContent":["/**\n * Shared scene-backed commit adapter for default actions.\n *\n * Default actions route data/layer/pose/parent mutations through the\n * consumer's `applyOps` commit hook when one is present; when it isn't, they\n * fall back to applying the committed ops directly against the scene through\n * this adapter: the scene's mutators (`core/scene/sceneMutators.ts`), the\n * document's poses and nodes, and the selection. Known exclusions from the op\n * factory roster — surfaces the scene doesn't own: `setPath` and `setText`.\n */\nimport { documentReads, sceneMutators } from 'core/scene/sceneMutators';\nimport type { Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\n\n/** Build the adapter the default actions commit through when the consumer\n * supplies no `applyOps` hook of its own — it applies ops straight to the\n * scene. Path and text ops are not covered; those surfaces belong to their\n * own owners.\n *\n * Pass `selection` (a `SelectionApi`'s `adapterMethods`) and selection reads\n * and writes go through it rather than the scene, so a canvas that gates its\n * selection — `selectable={false}` — gates what these batches select too. */\nexport function defaultCommitAdapter<TPose>(\n scene: Scene<unknown, string, TPose>,\n selection?: SelectionApi['adapterMethods'],\n) {\n return {\n ...sceneMutators(scene),\n ...documentReads(scene),\n getSelection: (): string[] => [...(selection ? selection.getSelection() : scene.getSelection())],\n setSelection: (ids: string[]) => {\n if (selection) selection.setSelection(ids.map(asNodeId));\n else scene.setSelection(ids.map(asNodeId));\n },\n };\n}\n"],"mappings":";;;AAuBA,SAAgBA,EACd,GACA,GACA;CACA,OAAO;EACL,GAAGC,EAAcC,CAAK;EACtB,GAAGC,EAAcD,CAAK;EACtB,oBAA8B,CAAC,GAAIE,IAAYA,EAAU,aAAa,IAAIF,EAAM,aAAa,CAAE;EAC/F,eAAe,MAAkB;GAC/B,AAAIE,IAAWA,EAAU,aAAaC,EAAI,IAAIC,CAAQ,CAAC,IAClDJ,EAAM,aAAaG,EAAI,IAAIC,CAAQ,CAAC;EAC3C;CACF;AACF"}
@@ -1,17 +1,15 @@
1
- import { pxExtent as e } from "../../../core/viewport/pxExtent.js";
2
- import { pathToAnchors as t } from "../../../features/paths/anchors.js";
3
- import { editingLayer as n, inPlane as r } from "../planeInput.js";
4
- import { anchorsInRect as i, deleteAnchorsAt as a, editAnchorSet as o, openSubpathAt as s, translateAnchorBy as c } from "../../../features/paths/anchorEdits.js";
5
- import { selectionAfterAnchorPress as l } from "./editAnchors.js";
6
- import { NUDGE_KEY as u, NUDGE_LABEL as d, nudgeDelta as f } from "./nudgeSteps.js";
1
+ import { editingLayer as e, inPlane as t } from "../planeInput.js";
2
+ import { selectionAfterAnchorPress as n } from "../edit-anchors/action.js";
3
+ import { NUDGE_KEY as r, NUDGE_LABEL as i, nudgeDelta as a } from "./nudgeSteps.js";
4
+ import { anchorsInRect as o, deleteAnchorsAt as s, editAnchorSet as c, openSubpathAt as l, pathToAnchors as u, pxExtent as d, translateAnchorBy as f } from "@weasel-js/geom";
7
5
  import { ActionDisabledReason as p } from "@weasel-js/routing";
8
6
  //#region src/interactions/actions/defaults/anchorEditing.ts
9
7
  var m = 10;
10
- function h(t) {
11
- let n = t?.view?.get().scale;
12
- if (!n) return m;
13
- let r = e(m, n);
14
- return Math.max(r.x, r.y);
8
+ function h(e) {
9
+ let t = e?.view?.get().scale;
10
+ if (!t) return m;
11
+ let n = d(m, t);
12
+ return Math.max(n.x, n.y);
15
13
  }
16
14
  function g(e) {
17
15
  let t = e?.editAnchors;
@@ -24,14 +22,14 @@ function _(e) {
24
22
  function v(e, t, n) {
25
23
  let r = _(e);
26
24
  if (!r) return !1;
27
- let i = o(r, n);
25
+ let i = c(r, n);
28
26
  return i ? (e.applyEdit(e.editingId, i, t), !0) : !1;
29
27
  }
30
28
  function y(e) {
31
29
  let t = g(e);
32
30
  return !t || t.selectedAnchors.size === 0 ? p.SelectionRequired : !0;
33
31
  }
34
- var b = r({
32
+ var b = t({
35
33
  id: "selectAnchor",
36
34
  label: "Select anchor",
37
35
  defaultBinding: [{
@@ -52,37 +50,37 @@ var b = r({
52
50
  invoker: {
53
51
  timing: "immediate",
54
52
  run: (e, t) => {
55
- let n = g(e);
56
- if (!n) return;
57
- let r = t?.worldX, i = t?.worldY;
58
- if (typeof r != "number" || typeof i != "number") return;
59
- let a = _(n);
60
- if (!a) return;
61
- let o = O(a, r, i, h(e)), s = t?.additive === !0;
62
- if (o === -1) {
63
- s || n.setSelectedAnchors([]);
53
+ let r = g(e);
54
+ if (!r) return;
55
+ let i = t?.worldX, a = t?.worldY;
56
+ if (typeof i != "number" || typeof a != "number") return;
57
+ let o = _(r);
58
+ if (!o) return;
59
+ let s = O(o, i, a, h(e)), c = t?.additive === !0;
60
+ if (s === -1) {
61
+ c || r.setSelectedAnchors([]);
64
62
  return;
65
63
  }
66
- n.setSelectedAnchors(l(n.selectedAnchors, o, s));
64
+ r.setSelectedAnchors(n(r.selectedAnchors, s, c));
67
65
  }
68
66
  },
69
67
  enabled: (e) => g(e) ? !0 : p.SelectionRequired
70
- }, n);
68
+ }, e);
71
69
  function x(e) {
72
70
  return {
73
71
  id: `nudgeAnchors.${e}`,
74
- label: `Nudge Anchors ${d[e]}`,
72
+ label: `Nudge Anchors ${i[e]}`,
75
73
  group: "nudgeAnchors",
76
74
  defaultBinding: [{
77
75
  spec: {
78
76
  kind: "key",
79
- key: u[e]
77
+ key: r[e]
80
78
  },
81
79
  opts: { params: { magnitude: "small" } }
82
80
  }, {
83
81
  spec: {
84
82
  kind: "key",
85
- key: u[e],
83
+ key: r[e],
86
84
  mods: { shift: !0 }
87
85
  },
88
86
  opts: { params: { magnitude: "big" } }
@@ -94,10 +92,10 @@ function x(e) {
94
92
  run: (t, n) => {
95
93
  let r = g(t);
96
94
  if (!r || r.selectedAnchors.size === 0) return;
97
- let { dx: i, dy: a } = f(e, n?.magnitude), o = [...r.selectedAnchors];
95
+ let { dx: i, dy: o } = a(e, n?.magnitude), s = [...r.selectedAnchors];
98
96
  v(r, "Nudge anchor", (e) => {
99
97
  let t = !1;
100
- for (let n of o) t = c(e, n, i, a) || t;
98
+ for (let n of s) t = f(e, n, i, o) || t;
101
99
  return t;
102
100
  });
103
101
  }
@@ -124,11 +122,11 @@ var S = x("up"), C = x("down"), w = x("left"), T = x("right"), E = {
124
122
  let t = g(e);
125
123
  if (!t || t.selectedAnchors.size === 0) return;
126
124
  let n = [...t.selectedAnchors];
127
- v(t, "Delete anchor", (e) => a(e, n)) && t.setSelectedAnchors([]);
125
+ v(t, "Delete anchor", (e) => s(e, n)) && t.setSelectedAnchors([]);
128
126
  }
129
127
  },
130
128
  enabled: y
131
- }, D = r({
129
+ }, D = t({
132
130
  id: "cutPathAtAnchor",
133
131
  label: "Cut path at anchor",
134
132
  defaultBinding: {
@@ -150,20 +148,20 @@ var S = x("up"), C = x("down"), w = x("left"), T = x("right"), E = {
150
148
  let a = _(n);
151
149
  if (!a) return;
152
150
  let o = O(a, r, i, h(e));
153
- o !== -1 && v(n, "Cut path", (e) => s(e, o)) && n.setSelectedAnchors([]);
151
+ o !== -1 && v(n, "Cut path", (e) => l(e, o)) && n.setSelectedAnchors([]);
154
152
  }
155
153
  },
156
154
  enabled: (e) => g(e) ? !0 : p.SelectionRequired
157
- }, n);
158
- function O(e, n, r, i) {
159
- let a = -1, o = i * i, s = 0;
160
- for (let i of t(e).anchors) for (let e of i) {
161
- let t = e.x - n, i = e.y - r, c = t * t + i * i;
162
- c <= o && (a === -1 || c < o) && (o = c, a = s), s++;
155
+ }, e);
156
+ function O(e, t, n, r) {
157
+ let i = -1, a = r * r, o = 0;
158
+ for (let r of u(e).anchors) for (let e of r) {
159
+ let r = e.x - t, s = e.y - n, c = r * r + s * s;
160
+ c <= a && (i === -1 || c < a) && (a = c, i = o), o++;
163
161
  }
164
- return a;
162
+ return i;
165
163
  }
166
- var k = r({
164
+ var k = t({
167
165
  id: "marqueeAnchors",
168
166
  label: "Marquee-select anchors",
169
167
  defaultBinding: {
@@ -203,9 +201,9 @@ var k = r({
203
201
  }
204
202
  },
205
203
  enabled: () => !0
206
- }, n);
207
- function A(e, n) {
208
- return i(t(e), n);
204
+ }, e);
205
+ function A(e, t) {
206
+ return o(u(e), t);
209
207
  }
210
208
  //#endregion
211
209
  export { D as cutPathAtAnchorAction, E as deleteAnchorsAction, k as marqueeAnchorsAction, C as nudgeAnchorsDownAction, w as nudgeAnchorsLeftAction, T as nudgeAnchorsRightAction, S as nudgeAnchorsUpAction, b as selectAnchorAction };
@@ -1 +1 @@
1
- {"version":3,"file":"anchorEditing.js","names":["ANCHOR_CLICK_PX","anchorClickSlop","scale","deps","extent","pxExtent","depOf","dep","worldPathOf","p","commitAnchorEdit","worldPath","next","editAnchorSet","edit","label","requiresAnchorSelection","ActionDisabledReason","selectAnchorAction","inPlane","wx","params","wy","hit","nearestAnchorIndex","additive","selectionAfterAnchorPress","editingLayer","makeNudgeAnchorsAction","dir","NUDGE_LABEL","NUDGE_KEY","nudgeDelta","selected","any","flat","translateAnchorBy","set","dx","dy","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","doomed","deleteAnchorsAt","cutPathAtAnchorAction","nearest","openSubpathAt","best","bestD2","slop","sub","pathToAnchors","path","a","d2","marqueeAnchorsAction","ctx","base","start","rectFrom","cx","cy","rect","moveCtx","hits","anchorsOfPathInRect","reason","anchorsInRect"],"sources":["../../../../src/interactions/actions/defaults/anchorEditing.ts"],"sourcesContent":["/**\n * Anchor-editing Actions beyond the drag itself — the keyboard and\n * marquee half of path editing.\n *\n * These were previously only reachable through the pen tool's private\n * edit mode, which no consumer could actually enter (its `getPathObj`\n * hook needed a `pose.kind` that no kit-created node has). Porting them\n * onto the Action layer puts them behind the same `editAnchors` dep,\n * `edits-anchors` capability, and undo path as `editAnchorsAction`.\n *\n * ## Why these don't collide with their node-level counterparts\n *\n * Each has a node-level twin bound to the same gesture: `deleteAction`\n * (Delete/Backspace), `nudge.*` (arrows), `areaSelectAction` (drag on\n * empty). Two mechanisms keep them apart, and both are needed:\n *\n * - **Capability eligibility**, when a mode registry is wired. The\n * node-level twins gate on `edits-page` / `transforms-selection` /\n * `creates-selection`, none of which `path-edit` mode allows, so the\n * dispatcher filters them out before matching.\n * - **`enabled` fall-through**, for the many consumers with no mode\n * registry at all. There the eligibility filter is skipped entirely,\n * so these actions report themselves disabled unless a path is\n * actually being edited with anchors selected, and the dispatcher\n * moves on to the node-level twin.\n *\n * Relying on eligibility alone would break every non-modal consumer;\n * relying on `enabled` alone would let a node-level action fire inside\n * path-edit mode. See `anchorEditing.test.ts`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { ImmediateInvoker, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport {\n anchorsInRect,\n deleteAnchorsAt,\n editAnchorSet,\n openSubpathAt,\n translateAnchorBy,\n type AnchorSet,\n} from 'features/paths/anchorEdits';\nimport { pathToAnchors } from 'features/paths/anchors';\nimport { pxExtent } from 'core/viewport/pxExtent';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { selectionAfterAnchorPress } from './editAnchors';\nimport { inPlane, editingLayer } from '../planeInput';\nimport { NUDGE_KEY, NUDGE_LABEL, nudgeDelta, type NudgeDirection } from './nudgeSteps';\n\n// ---------------------------------------------------------------------------\n// Shared plumbing\n// ---------------------------------------------------------------------------\n\n/** Screen-pixel radius for \"this click landed on an anchor\". Matches the\n * affordance hit radius closely enough that anything the user can see as\n * an anchor marker is cuttable. */\nconst ANCHOR_CLICK_PX = 10;\n\n/** `ANCHOR_CLICK_PX` in world units through the view; with no view, one\n * pixel is one unit. */\nfunction anchorClickSlop(deps: ActionDeps | undefined): number {\n const scale = deps?.view?.get().scale;\n if (!scale) return ANCHOR_CLICK_PX;\n const extent = pxExtent(ANCHOR_CLICK_PX, scale);\n return Math.max(extent.x, extent.y);\n}\n\nfunction depOf(deps: ActionDeps | undefined): EditAnchorsDep | null {\n const dep = deps?.editAnchors;\n if (!dep || !dep.editingId) return null;\n return dep;\n}\n\n/** The edited node's world-space polygon, or null when unavailable. */\nfunction worldPathOf(dep: EditAnchorsDep): PolygonPath | null {\n const p = dep.getEditablePath(dep.editingId) as PolygonPath | undefined;\n if (!p || p.kind !== 'polygon') return null;\n return p;\n}\n\n/**\n * Decode → mutate → encode → commit, in one history entry. Returns false\n * when the edit changed nothing, so callers can skip the commit rather\n * than push an empty undo step.\n */\nfunction commitAnchorEdit(\n dep: EditAnchorsDep,\n label: string,\n edit: (set: Parameters<Parameters<typeof editAnchorSet>[1]>[0]) => boolean | void,\n): boolean {\n const worldPath = worldPathOf(dep);\n if (!worldPath) return false;\n const next = editAnchorSet(worldPath, edit);\n if (!next) return false;\n dep.applyEdit(dep.editingId, next, label);\n return true;\n}\n\n/** Enabled only while a path is in edit mode with anchors selected. */\nfunction requiresAnchorSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return ActionDisabledReason.SelectionRequired;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// selectAnchor\n// ---------------------------------------------------------------------------\n\n/**\n * Click an anchor to select it; Shift-click to toggle it in or out of the\n * selection. Clicking away from every anchor clears the anchor selection.\n *\n * ## Why this is a click action and not part of the drag\n *\n * The obvious home for \"pressing an anchor selects it\" is\n * `editAnchorsAction.start`, since that's the handler that receives the\n * anchor affordance. It can't live there: the dispatcher only dispatches\n * a drag binding once the pointer crosses the drag threshold, so a press\n * that never moves never reaches `start` at all. Verified in the running\n * app — down/up on an anchor logs a bare `click`, and down/move-3px/up\n * logs the same; only a real drag logs `pointerdown → editAnchors`.\n *\n * Clicks, in turn, carry no affordance (the dispatcher attaches those to\n * `pointerdown` only), so this resolves the anchor from the click's world\n * coords — the same thing `insertPathAnchorAction` does for segments.\n * `editAnchorsAction` still syncs the selection when a drag begins on an\n * unselected anchor, so drag-without-clicking-first behaves too.\n *\n * **Non-modal caveat:** `useSelectTool` binds `clearSelection` to\n * `{ click, target: 'empty', mods: {} }` at active scope, which outranks\n * this ambient binding. In path-edit mode that action is filtered out by\n * capability, so anchor clicks win. In a consumer with no mode registry\n * there's no filtering, so clicking an anchor that happens to sit over\n * empty canvas clears the node selection instead of selecting the anchor.\n * Anchors over the path body are unaffected.\n */\nexport const selectAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'selectAnchor',\n label: 'Select anchor',\n defaultBinding: [\n { spec: { kind: 'click', mods: {} }, opts: { params: { additive: false } } },\n { spec: { kind: 'click', mods: { shift: true } }, opts: { params: { additive: true } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\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 worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n const hit = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n const additive = params?.additive === true;\n if (hit === -1) {\n // Missed every anchor. A bare click clears; a shift-click leaves\n // the selection alone so a stray miss mid-multi-select doesn't\n // undo the work.\n if (!additive) dep.setSelectedAnchors([]);\n return;\n }\n dep.setSelectedAnchors(selectionAfterAnchorPress(dep.selectedAnchors, hit, additive));\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n// ---------------------------------------------------------------------------\n// nudgeAnchors\n// ---------------------------------------------------------------------------\n\n/**\n * Move the selected anchors by one step. Shift multiplies the step, same\n * as node nudging.\n *\n * Every keystroke is its own history entry, matching node nudge — hold an\n * arrow down and undo walks back one step at a time rather than\n * collapsing the run.\n */\nfunction makeNudgeAnchorsAction(dir: NudgeDirection): Action & { requires: string[] } {\n return {\n id: `nudgeAnchors.${dir}`,\n label: `Nudge Anchors ${NUDGE_LABEL[dir]}`,\n group: 'nudgeAnchors',\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: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const { dx, dy } = nudgeDelta(dir, params?.magnitude);\n const selected = [...dep.selectedAnchors];\n commitAnchorEdit(dep, 'Nudge anchor', (set) => {\n let any = false;\n for (const flat of selected) any = translateAnchorBy(set, flat, dx, dy) || any;\n return any;\n });\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n };\n}\n\nexport const nudgeAnchorsUpAction = makeNudgeAnchorsAction('up');\nexport const nudgeAnchorsDownAction = makeNudgeAnchorsAction('down');\nexport const nudgeAnchorsLeftAction = makeNudgeAnchorsAction('left');\nexport const nudgeAnchorsRightAction = makeNudgeAnchorsAction('right');\n\n// ---------------------------------------------------------------------------\n// deleteAnchors\n// ---------------------------------------------------------------------------\n\n/**\n * Delete the selected anchors, refitting the surrounding curve through\n * each gap so the path keeps its shape.\n *\n * Deleting renumbers every anchor after the lowest deleted index, so the\n * selection is cleared rather than left pointing at whatever slid into\n * those slots.\n */\nexport const deleteAnchorsAction: Action & { requires: string[] } = {\n id: 'deleteAnchors',\n label: 'Delete Anchors',\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const doomed = [...dep.selectedAnchors];\n const changed = commitAnchorEdit(dep, 'Delete anchor', (set) =>\n deleteAnchorsAt(set, doomed),\n );\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n};\n\n// ---------------------------------------------------------------------------\n// cutPathAtAnchor (scissors)\n// ---------------------------------------------------------------------------\n\n/**\n * Open a closed subpath at the alt+shift-clicked anchor — the scissors\n * operation the pen tool used to own.\n *\n * Bound to Alt+Shift+click rather than plain Alt+click so it doesn't\n * collide with `insertPathAnchorAction`, which is already Alt+click on\n * the same path. Both are \"alt-click surgery on the edited path\"; the\n * extra modifier picks which one, instead of the two actions racing on an\n * identical binding where only one could ever win.\n *\n * No-ops on an open subpath: there's nothing to cut.\n */\nexport const cutPathAtAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'cutPathAtAnchor',\n label: 'Cut path at anchor',\n defaultBinding: { kind: 'click', mods: { alt: true, shift: true } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\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 worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n // Find the anchor under the click. Clicks carry no affordance (only\n // pointerdown does), so this resolves the hit itself — the same\n // approach insertPathAnchorAction takes for segments.\n const nearest = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n if (nearest === -1) return;\n\n const changed = commitAnchorEdit(dep, 'Cut path', (set) => openSubpathAt(set, nearest));\n // Cutting rotates the subpath's anchor order, so held indices are stale.\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/** Flat index of the anchor nearest `(wx, wy)` within `slop`, else -1. */\nfunction nearestAnchorIndex(\n path: PolygonPath,\n wx: number,\n wy: number,\n slop: number,\n): number {\n let best = -1;\n let bestD2 = slop * slop;\n let flat = 0;\n for (const sub of (pathToAnchors(path) as AnchorSet).anchors) {\n for (const a of sub) {\n const dx = a.x - wx;\n const dy = a.y - wy;\n const d2 = dx * dx + dy * dy;\n // `<=` so an exact-slop hit counts; ties go to the earlier anchor.\n if (d2 <= bestD2 && (best === -1 || d2 < bestD2)) {\n bestD2 = d2;\n best = flat;\n }\n flat++;\n }\n }\n return best;\n}\n\n// ---------------------------------------------------------------------------\n// marqueeAnchors\n// ---------------------------------------------------------------------------\n\n/**\n * Rubber-band select anchors by dragging on empty canvas while a path is\n * in edit mode.\n *\n * Shift adds to the existing anchor selection instead of replacing it.\n * The in-flight rect goes on the `editAnchors` dep so the path-editing\n * overlay can draw it — same \"ongoing action owns the state, chrome\n * draws it\" split the move ghosts and the node marquee use.\n */\nexport const marqueeAnchorsAction: Action & { requires: string[] } = inPlane({\n id: 'marqueeAnchors',\n label: 'Marquee-select anchors',\n defaultBinding: { kind: 'drag', target: 'empty' },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const dep = depOf(ctx.deps);\n // Not editing → decline so the dispatcher falls through to the\n // node-level areaSelect. This is what keeps non-modal consumers\n // (no eligibility filtering) behaving normally.\n if (!dep) return {};\n const worldPath = worldPathOf(dep);\n if (!worldPath) return {};\n\n const additive = ctx.modifiers.shift;\n const base = new Set(dep.selectedAnchors);\n const start = { x: ctx.world.x, y: ctx.world.y };\n\n const rectFrom = (cx: number, cy: number) => ({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n width: Math.abs(cx - start.x),\n height: Math.abs(cy - start.y),\n });\n\n return {\n kind: 'marquee-anchors',\n onMove(moveCtx: InvocationCtx): void {\n const rect = rectFrom(moveCtx.world.x, moveCtx.world.y);\n dep.setMarquee(rect);\n // Live selection preview: the user sees anchors light up as the\n // band sweeps them, rather than only on release.\n const hits = anchorsOfPathInRect(worldPath, rect);\n dep.setSelectedAnchors(additive ? new Set([...base, ...hits]) : hits);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n dep.setMarquee(null);\n if (reason === 'cancel') dep.setSelectedAnchors(base);\n },\n };\n },\n },\n enabled: () => true,\n}, editingLayer);\n\n// ---------------------------------------------------------------------------\n// Local geometry helper\n// ---------------------------------------------------------------------------\n\n/** Flat indices of `path`'s anchors inside `rect`. */\nfunction anchorsOfPathInRect(\n path: PolygonPath,\n rect: { x: number; y: number; width: number; height: number },\n): number[] {\n return anchorsInRect(pathToAnchors(path) as AnchorSet, rect);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"anchorEditing.js","names":["ANCHOR_CLICK_PX","anchorClickSlop","scale","deps","extent","pxExtent","depOf","dep","worldPathOf","p","commitAnchorEdit","worldPath","next","editAnchorSet","edit","label","requiresAnchorSelection","ActionDisabledReason","selectAnchorAction","inPlane","wx","params","wy","hit","nearestAnchorIndex","additive","selectionAfterAnchorPress","editingLayer","makeNudgeAnchorsAction","dir","NUDGE_LABEL","NUDGE_KEY","nudgeDelta","selected","any","flat","translateAnchorBy","set","dx","dy","nudgeAnchorsUpAction","nudgeAnchorsDownAction","nudgeAnchorsLeftAction","nudgeAnchorsRightAction","deleteAnchorsAction","doomed","deleteAnchorsAt","cutPathAtAnchorAction","nearest","openSubpathAt","best","bestD2","slop","sub","pathToAnchors","path","a","d2","marqueeAnchorsAction","ctx","base","start","rectFrom","cx","cy","rect","moveCtx","hits","anchorsOfPathInRect","reason","anchorsInRect"],"sources":["../../../../src/interactions/actions/defaults/anchorEditing.ts"],"sourcesContent":["/**\n * Anchor-editing Actions beyond the drag itself — the keyboard and\n * marquee half of path editing.\n *\n * ## Why these don't collide with their node-level counterparts\n *\n * Each has a node-level twin bound to the same gesture: `deleteAction`\n * (Delete/Backspace), `nudge.*` (arrows), `areaSelectAction` (drag on\n * empty). Two mechanisms keep them apart, and both are needed:\n *\n * - **Capability eligibility**, when a mode registry is wired. The\n * node-level twins gate on `edits-page` / `transforms-selection` /\n * `creates-selection`, none of which `path-edit` mode allows, so the\n * dispatcher filters them out before matching.\n * - **`enabled` fall-through**, for the many consumers with no mode\n * registry at all. There the eligibility filter is skipped entirely,\n * so these actions report themselves disabled unless a path is\n * actually being edited with anchors selected, and the dispatcher\n * moves on to the node-level twin.\n *\n * Relying on eligibility alone would break every non-modal consumer;\n * relying on `enabled` alone would let a node-level action fire inside\n * path-edit mode. See `anchorEditing.test.ts`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { ImmediateInvoker, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { EditAnchorsDep } from '../depSchema';\nimport {\n anchorsInRect,\n deleteAnchorsAt,\n editAnchorSet,\n openSubpathAt,\n translateAnchorBy,\n type AnchorSet,\n} from '@weasel-js/geom';\nimport { pathToAnchors, type PolygonPath } from '@weasel-js/geom';\nimport { pxExtent } from '@weasel-js/geom';\nimport { selectionAfterAnchorPress } from '../edit-anchors/action';\nimport { inPlane, editingLayer } from '../planeInput';\nimport { NUDGE_KEY, NUDGE_LABEL, nudgeDelta, type NudgeDirection } from './nudgeSteps';\n\n/** Screen-pixel radius for \"this click landed on an anchor\". */\nconst ANCHOR_CLICK_PX = 10;\n\n/** `ANCHOR_CLICK_PX` in world units through the view; with no view, one\n * pixel is one unit. */\nfunction anchorClickSlop(deps: ActionDeps | undefined): number {\n const scale = deps?.view?.get().scale;\n if (!scale) return ANCHOR_CLICK_PX;\n const extent = pxExtent(ANCHOR_CLICK_PX, scale);\n return Math.max(extent.x, extent.y);\n}\n\nfunction depOf(deps: ActionDeps | undefined): EditAnchorsDep | null {\n const dep = deps?.editAnchors;\n if (!dep || !dep.editingId) return null;\n return dep;\n}\n\n/** The edited node's world-space polygon, or null when unavailable. */\nfunction worldPathOf(dep: EditAnchorsDep): PolygonPath | null {\n const p = dep.getEditablePath(dep.editingId) as PolygonPath | undefined;\n if (!p || p.kind !== 'polygon') return null;\n return p;\n}\n\n/**\n * Decode → mutate → encode → commit, in one history entry. Returns false\n * when the edit changed nothing, so callers can skip the commit rather\n * than push an empty undo step.\n */\nfunction commitAnchorEdit(\n dep: EditAnchorsDep,\n label: string,\n edit: (set: Parameters<Parameters<typeof editAnchorSet>[1]>[0]) => boolean | void,\n): boolean {\n const worldPath = worldPathOf(dep);\n if (!worldPath) return false;\n const next = editAnchorSet(worldPath, edit);\n if (!next) return false;\n dep.applyEdit(dep.editingId, next, label);\n return true;\n}\n\n/** Enabled only while a path is in edit mode with anchors selected. */\nfunction requiresAnchorSelection(deps?: ActionDeps): true | ActionDisabledReason {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return ActionDisabledReason.SelectionRequired;\n return true;\n}\n\n/**\n * Click an anchor to select it; Shift-click to toggle it in or out of the\n * selection. Clicking away from every anchor clears the anchor selection.\n *\n * A click action and not part of `editAnchorsAction.start`: the dispatcher\n * only dispatches a drag binding once the pointer crosses the drag\n * threshold, so a press that never moves never reaches `start` at all.\n * Clicks, in turn, carry no affordance (the dispatcher attaches those to\n * `pointerdown` only), so this resolves the anchor from the click's world\n * coords.\n *\n * **Non-modal caveat:** `useSelectTool` binds `clearSelection` to\n * `{ click, target: 'empty', mods: {} }` at active scope, which outranks\n * this ambient binding. In path-edit mode that action is filtered out by\n * capability, so anchor clicks win. In a consumer with no mode registry\n * there's no filtering, so clicking an anchor that happens to sit over\n * empty canvas clears the node selection instead of selecting the anchor.\n * Anchors over the path body are unaffected.\n */\nexport const selectAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'selectAnchor',\n label: 'Select anchor',\n defaultBinding: [\n { spec: { kind: 'click', mods: {} }, opts: { params: { additive: false } } },\n { spec: { kind: 'click', mods: { shift: true } }, opts: { params: { additive: true } } },\n ],\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\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 worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n const hit = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n const additive = params?.additive === true;\n if (hit === -1) {\n // Missed every anchor. A bare click clears; a shift-click leaves\n // the selection alone.\n if (!additive) dep.setSelectedAnchors([]);\n return;\n }\n dep.setSelectedAnchors(selectionAfterAnchorPress(dep.selectedAnchors, hit, additive));\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/**\n * Move the selected anchors by one step. Shift multiplies the step. Every\n * keystroke is its own history entry.\n */\nfunction makeNudgeAnchorsAction(dir: NudgeDirection): Action & { requires: string[] } {\n return {\n id: `nudgeAnchors.${dir}`,\n label: `Nudge Anchors ${NUDGE_LABEL[dir]}`,\n group: 'nudgeAnchors',\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: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const { dx, dy } = nudgeDelta(dir, params?.magnitude);\n const selected = [...dep.selectedAnchors];\n commitAnchorEdit(dep, 'Nudge anchor', (set) => {\n let any = false;\n for (const flat of selected) any = translateAnchorBy(set, flat, dx, dy) || any;\n return any;\n });\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n };\n}\n\nexport const nudgeAnchorsUpAction = makeNudgeAnchorsAction('up');\nexport const nudgeAnchorsDownAction = makeNudgeAnchorsAction('down');\nexport const nudgeAnchorsLeftAction = makeNudgeAnchorsAction('left');\nexport const nudgeAnchorsRightAction = makeNudgeAnchorsAction('right');\n\n/**\n * Delete the selected anchors, refitting the surrounding curve through\n * each gap so the path keeps its shape.\n *\n * Deleting renumbers every anchor after the lowest deleted index, so the\n * selection is cleared rather than left pointing at whatever slid into\n * those slots.\n */\nexport const deleteAnchorsAction: Action & { requires: string[] } = {\n id: 'deleteAnchors',\n label: 'Delete Anchors',\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size === 0) return;\n const doomed = [...dep.selectedAnchors];\n const changed = commitAnchorEdit(dep, 'Delete anchor', (set) =>\n deleteAnchorsAt(set, doomed),\n );\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: requiresAnchorSelection,\n};\n\n/**\n * Open a closed subpath at the alt+shift-clicked anchor.\n *\n * Bound to Alt+Shift+click rather than plain Alt+click so it doesn't\n * collide with `insertPathAnchorAction`, which is already Alt+click on\n * the same path.\n *\n * No-ops on an open subpath: there's nothing to cut.\n */\nexport const cutPathAtAnchorAction: Action & { requires: string[] } = inPlane({\n id: 'cutPathAtAnchor',\n label: 'Cut path at anchor',\n defaultBinding: { kind: 'click', mods: { alt: true, shift: true } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep) return;\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 worldPath = worldPathOf(dep);\n if (!worldPath) return;\n\n // Clicks carry no affordance (only pointerdown does), so this resolves\n // the hit itself.\n const nearest = nearestAnchorIndex(worldPath, wx, wy, anchorClickSlop(deps));\n if (nearest === -1) return;\n\n const changed = commitAnchorEdit(dep, 'Cut path', (set) => openSubpathAt(set, nearest));\n // Cutting rotates the subpath's anchor order, so held indices are stale.\n if (changed) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: (deps) => (depOf(deps) ? true : ActionDisabledReason.SelectionRequired),\n}, editingLayer);\n\n/** Flat index of the anchor nearest `(wx, wy)` within `slop`, else -1. */\nfunction nearestAnchorIndex(\n path: PolygonPath,\n wx: number,\n wy: number,\n slop: number,\n): number {\n let best = -1;\n let bestD2 = slop * slop;\n let flat = 0;\n for (const sub of (pathToAnchors(path) as AnchorSet).anchors) {\n for (const a of sub) {\n const dx = a.x - wx;\n const dy = a.y - wy;\n const d2 = dx * dx + dy * dy;\n // `<=` so an exact-slop hit counts; ties go to the earlier anchor.\n if (d2 <= bestD2 && (best === -1 || d2 < bestD2)) {\n bestD2 = d2;\n best = flat;\n }\n flat++;\n }\n }\n return best;\n}\n\n/**\n * Rubber-band select anchors by dragging on empty canvas while a path is\n * in edit mode.\n *\n * Shift adds to the existing anchor selection instead of replacing it.\n * The in-flight rect goes on the `editAnchors` dep so the path-editing\n * overlay can draw it.\n */\nexport const marqueeAnchorsAction: Action & { requires: string[] } = inPlane({\n id: 'marqueeAnchors',\n label: 'Marquee-select anchors',\n defaultBinding: { kind: 'drag', target: 'empty' },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const dep = depOf(ctx.deps);\n // Not editing → decline so the dispatcher falls through to the\n // node-level areaSelect.\n if (!dep) return {};\n const worldPath = worldPathOf(dep);\n if (!worldPath) return {};\n\n const additive = ctx.modifiers.shift;\n const base = new Set(dep.selectedAnchors);\n const start = { x: ctx.world.x, y: ctx.world.y };\n\n const rectFrom = (cx: number, cy: number) => ({\n x: Math.min(start.x, cx),\n y: Math.min(start.y, cy),\n width: Math.abs(cx - start.x),\n height: Math.abs(cy - start.y),\n });\n\n return {\n kind: 'marquee-anchors',\n onMove(moveCtx: InvocationCtx): void {\n const rect = rectFrom(moveCtx.world.x, moveCtx.world.y);\n dep.setMarquee(rect);\n // Live selection preview: the user sees anchors light up as the\n // band sweeps them, rather than only on release.\n const hits = anchorsOfPathInRect(worldPath, rect);\n dep.setSelectedAnchors(additive ? new Set([...base, ...hits]) : hits);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n dep.setMarquee(null);\n if (reason === 'cancel') dep.setSelectedAnchors(base);\n },\n };\n },\n },\n enabled: () => true,\n}, editingLayer);\n\n/** Flat indices of `path`'s anchors inside `rect`. */\nfunction anchorsOfPathInRect(\n path: PolygonPath,\n rect: { x: number; y: number; width: number; height: number },\n): number[] {\n return anchorsInRect(pathToAnchors(path) as AnchorSet, rect);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"areaSelect.js","names":["areaSelectAction","dep","ctx","affordanceKind","scratch","moveCtx","reason","d","x","startX","currentX","y","startY","currentY","width","height","shiftHeld","hits","view","selectionFromHits"],"sources":["../../../../src/interactions/actions/defaults/areaSelect.ts"],"sourcesContent":["/**\n * `areaSelectAction` — ongoing Action descriptor for marquee area selection.\n *\n * The marquee selection:\n * - `start`: records the drag start world point and shift state.\n * - `onMove`: tracks the current drag corner (no scene writes).\n * - `onEnd('commit')`: derives the marquee bounds from start + current;\n * calls `deps.areaSelect.hitTestArea(bounds)` to find overlapping nodes;\n * calls `deps.areaSelect.setSelection(ids)` to update selection (extending\n * with shift held). This is a **transient** write (no undo entry).\n * - `onEnd('cancel')`: no-op.\n *\n * ## Dependencies\n *\n * Requires `areaSelect` dep from DepSchema:\n * `{ hitTestArea(bounds): NodeId[], getSelection(): NodeId[], setSelection(ids): void }`\n *\n * `<SceneCanvas>` / `<StandardActionsRegistrar>` should source this dep by\n * iterating scene nodes and checking AABB overlap. The dep is intentionally\n * simple — consumers override it for custom hit-testing (contain-mode,\n * layer-aware filtering, etc.).\n *\n * ## What this does not wire\n *\n * - `AreaSelectBehavior` pipeline — omitted; only the default replace/extend\n * semantics are implemented.\n * - Debug sink recording — not available in the descriptor model.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, OngoingOverlay } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport type { AreaSelectDep, ViewApi } from '../depSchema';\nimport { selectionFromHits } from '../hitSelection';\n\n// ---------------------------------------------------------------------------\n// Internal scratch\n// ---------------------------------------------------------------------------\n\ninterface AreaSelectScratch {\n dep: AreaSelectDep;\n /** The view the marquee started in: what it does not paint is not taken. */\n view: ViewApi | undefined;\n startX: number;\n startY: number;\n shiftHeld: boolean;\n currentX: number;\n currentY: number;\n /** Cleared once `onEnd` runs so subsequent `overlay()` calls report no\n * in-flight marquee (the dispatcher releases the handle after onEnd so\n * this is belt-and-suspenders for any consumer that retains a handle). */\n open: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Static descriptor for the `areaSelect` Action.\n *\n * Requires dep-schema entry: `areaSelect`.\n *\n * The invoker implements replace/extend marquee selection via the `areaSelect`\n * dep. Hit-testing and selection writes are delegated to the dep; the invoker\n * contains only the bounds-derivation and shift-extend logic.\n */\nexport const areaSelectAction: Action & { requires: string[] } = {\n id: 'areaSelect',\n label: 'Area Select',\n // Crosshair while the marquee is being pulled — the select tool used to\n // read this off its own gesture scratch.\n activeCursor: 'crosshair',\n eligible: { capability: 'creates-selection' },\n requires: ['areaSelect', 'editAnchors', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const dep = ctx.deps.areaSelect;\n if (!dep) return {};\n\n // Decline on anchor / control-handle affordances: the select tool's\n // active-scope binding for this action is `{ kind: 'drag', target: 'empty' }`,\n // which matches whenever `bodyTarget === 'empty'` — including drags\n // where an anchor was hit on top of empty body. Without this opt-out\n // areaSelect would beat editAnchors via scope priority. The\n // dispatcher's empty-handle fallthrough then forwards the gesture.\n const affordanceKind = ctx.drag?.affordance?.kind;\n if (\n typeof affordanceKind === 'string'\n && /^(anchor|controlIn|controlOut):/.test(affordanceKind)\n ) {\n return {};\n }\n\n // Decline for the same reason while a path is in anchor-edit mode:\n // an empty-canvas drag there means \"rubber-band some anchors\", which\n // is `marqueeAnchorsAction`'s job. Capability eligibility already\n // filters this action out in path-edit mode, but only for consumers\n // that wired a mode registry — without one the dispatcher skips\n // eligibility entirely and areaSelect's active scope would beat\n // marqueeAnchors' ambient scope. Declining here covers both.\n const editAnchors = ctx.deps.editAnchors;\n if (editAnchors?.editingId) return {};\n\n // Drag start is the world point at the moment start() is called.\n const scratch: AreaSelectScratch = {\n dep,\n view: ctx.deps.view,\n startX: ctx.world.x,\n startY: ctx.world.y,\n shiftHeld: ctx.modifiers.shift,\n currentX: ctx.world.x,\n currentY: ctx.world.y,\n open: true,\n };\n\n return {\n kind: 'marquee',\n onMove(moveCtx: InvocationCtx): void {\n scratch.currentX = moveCtx.world.x;\n scratch.currentY = moveCtx.world.y;\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n return {\n kind: 'marquee',\n start: { x: scratch.startX, y: scratch.startY },\n current: { x: scratch.currentX, y: scratch.currentY },\n shiftHeld: scratch.shiftHeld,\n };\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n\n const { dep: d, view, startX, startY, currentX, currentY, shiftHeld } = scratch;\n\n // Derive the marquee AABB from the two world-space corners.\n const x = Math.min(startX, currentX);\n const y = Math.min(startY, currentY);\n const width = Math.abs(currentX - startX);\n const height = Math.abs(currentY - startY);\n\n // Zero-size marquee (click without drag) → clear selection (or no-op with shift).\n if (width === 0 || height === 0) {\n if (!shiftHeld) d.setSelection([]);\n return;\n }\n\n const hits = d.hitTestArea({ x, y, width, height }, view) as NodeId[];\n\n d.setSelection(selectionFromHits(d.getSelection(), hits, shiftHeld));\n },\n };\n },\n },\n /**\n * Always enabled at the dispatcher level. The dispatcher's\n * specificity-fallthrough loop treats anything `!== true` as \"skip this\n * match\" — returning a disabled reason would let lower-specificity\n * ambient bindings win. The invoker has no preconditions to guard.\n */\n enabled: () => true,\n};\n"],"mappings":";;AAoEA,IAAaA,IAAoD;CAC/D,IAAI;CACJ,OAAO;CAGP,cAAc;CACd,UAAU,EAAE,YAAY,oBAAoB;CAC5C,UAAU;EAAC;EAAc;EAAe;CAAM;CAC9C,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAMC,EAAI,KAAK;GACrB,IAAI,CAACD,GAAK,OAAO,CAAC;GAQlB,IAAME,IAAiBD,EAAI,MAAM,YAAY;GAgB7C,IAdE,OAAOC,KAAmB,YACvB,kCAAkC,KAAKA,CAAc,KAYtCD,EAAI,KAAK,aACZ,WAAW,OAAO,CAAC;GAGpC,IAAME,IAA6B;IACjC;IACA,MAAMF,EAAI,KAAK;IACf,QAAQA,EAAI,MAAM;IAClB,QAAQA,EAAI,MAAM;IAClB,WAAWA,EAAI,UAAU;IACzB,UAAUA,EAAI,MAAM;IACpB,UAAUA,EAAI,MAAM;IACpB,MAAM;GACR;GAEA,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KAEnC,AADA,EAAQ,WAAWG,EAAQ,MAAM,GACjC,EAAQ,WAAWA,EAAQ,MAAM;IACnC;IACA,UAAiC;KAE/B,OADKD,EAAQ,OACN;MACL,MAAM;MACN,OAAO;OAAE,GAAGA,EAAQ;OAAQ,GAAGA,EAAQ;MAAO;MAC9C,SAAS;OAAE,GAAGA,EAAQ;OAAU,GAAGA,EAAQ;MAAS;MACpD,WAAWA,EAAQ;KACrB,IAN0B;IAO5B;IACA,MAAM,GAAwB,GAAmC;KAE/D,IADA,EAAQ,OAAO,IACXE,MAAW,UAAU;KAEzB,IAAM,EAAE,KAAKC,GAAG,SAAM,WAAQ,WAAQ,aAAU,aAAU,iBAAcH,GAGlEI,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAQ,KAAK,IAAIJ,IAAWD,CAAM,GAClCM,IAAS,KAAK,IAAIF,IAAWD,CAAM;KAGzC,IAAIE,MAAU,KAAKC,MAAW,GAAG;MAC/B,AAAKC,KAAWT,EAAE,aAAa,CAAC,CAAC;MACjC;KACF;KAEA,IAAMU,IAAOV,EAAE,YAAY;MAAE;MAAG;MAAG;MAAO;KAAO,GAAGW,CAAI;KAExD,EAAE,aAAaC,EAAkBZ,EAAE,aAAa,GAAGU,GAAMD,CAAS,CAAC;IACrE;GACF;EACF;CACF;CAOA,eAAe;AACjB"}
1
+ {"version":3,"file":"areaSelect.js","names":["areaSelectAction","dep","ctx","affordanceKind","scratch","moveCtx","reason","d","x","startX","currentX","y","startY","currentY","width","height","shiftHeld","hits","view","selectionFromHits"],"sources":["../../../../src/interactions/actions/defaults/areaSelect.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, OngoingOverlay } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport type { AreaSelectDep, ViewApi } from '../depSchema';\nimport { selectionFromHits } from '../hitSelection';\n\ninterface AreaSelectScratch {\n dep: AreaSelectDep;\n /** The view the marquee started in: what it does not paint is not taken. */\n view: ViewApi | undefined;\n startX: number;\n startY: number;\n shiftHeld: boolean;\n currentX: number;\n currentY: number;\n /** Cleared once `onEnd` runs, so a consumer that retains the handle gets\n * no marquee from `overlay()`. */\n open: boolean;\n}\n\n/**\n * @experimental\n * Marquee selection: replace, or extend with shift held. Hit-testing and\n * selection writes are delegated to the `areaSelect` dep, and the selection\n * write makes no undo entry.\n */\nexport const areaSelectAction: Action & { requires: string[] } = {\n id: 'areaSelect',\n label: 'Area Select',\n activeCursor: 'crosshair',\n eligible: { capability: 'creates-selection' },\n requires: ['areaSelect', 'editAnchors', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const dep = ctx.deps.areaSelect;\n if (!dep) return {};\n\n // Decline on anchor / control-handle affordances: the select tool's\n // `{ kind: 'drag', target: 'empty' }` binding also matches an anchor hit\n // on top of empty body, and would beat editAnchors via scope priority.\n const affordanceKind = ctx.drag?.affordance?.kind;\n if (\n typeof affordanceKind === 'string'\n && /^(anchor|controlIn|controlOut):/.test(affordanceKind)\n ) {\n return {};\n }\n\n // Decline while a path is in anchor-edit mode, where an empty-canvas\n // drag is `marqueeAnchorsAction`'s. Capability eligibility filters this\n // only for consumers that wired a mode registry; without one\n // areaSelect's active scope would beat marqueeAnchors' ambient scope.\n const editAnchors = ctx.deps.editAnchors;\n if (editAnchors?.editingId) return {};\n\n const scratch: AreaSelectScratch = {\n dep,\n view: ctx.deps.view,\n startX: ctx.world.x,\n startY: ctx.world.y,\n shiftHeld: ctx.modifiers.shift,\n currentX: ctx.world.x,\n currentY: ctx.world.y,\n open: true,\n };\n\n return {\n kind: 'marquee',\n onMove(moveCtx: InvocationCtx): void {\n scratch.currentX = moveCtx.world.x;\n scratch.currentY = moveCtx.world.y;\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n return {\n kind: 'marquee',\n start: { x: scratch.startX, y: scratch.startY },\n current: { x: scratch.currentX, y: scratch.currentY },\n shiftHeld: scratch.shiftHeld,\n };\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n\n const { dep: d, view, startX, startY, currentX, currentY, shiftHeld } = scratch;\n\n const x = Math.min(startX, currentX);\n const y = Math.min(startY, currentY);\n const width = Math.abs(currentX - startX);\n const height = Math.abs(currentY - startY);\n\n // Zero-size marquee (click without drag) → clear selection (or no-op with shift).\n if (width === 0 || height === 0) {\n if (!shiftHeld) d.setSelection([]);\n return;\n }\n\n const hits = d.hitTestArea({ x, y, width, height }, view) as NodeId[];\n\n d.setSelection(selectionFromHits(d.getSelection(), hits, shiftHeld));\n },\n };\n },\n },\n /** Always enabled: the dispatcher treats anything `!== true` as \"skip this\n * match\", so a disabled reason would let lower-specificity ambient bindings win. */\n enabled: () => true,\n};\n"],"mappings":";;AA0BA,IAAaA,IAAoD;CAC/D,IAAI;CACJ,OAAO;CACP,cAAc;CACd,UAAU,EAAE,YAAY,oBAAoB;CAC5C,UAAU;EAAC;EAAc;EAAe;CAAM;CAC9C,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAMC,EAAI,KAAK;GACrB,IAAI,CAACD,GAAK,OAAO,CAAC;GAKlB,IAAME,IAAiBD,EAAI,MAAM,YAAY;GAa7C,IAXE,OAAOC,KAAmB,YACvB,kCAAkC,KAAKA,CAAc,KAStCD,EAAI,KAAK,aACZ,WAAW,OAAO,CAAC;GAEpC,IAAME,IAA6B;IACjC;IACA,MAAMF,EAAI,KAAK;IACf,QAAQA,EAAI,MAAM;IAClB,QAAQA,EAAI,MAAM;IAClB,WAAWA,EAAI,UAAU;IACzB,UAAUA,EAAI,MAAM;IACpB,UAAUA,EAAI,MAAM;IACpB,MAAM;GACR;GAEA,OAAO;IACL,MAAM;IACN,OAAO,GAA8B;KAEnC,AADA,EAAQ,WAAWG,EAAQ,MAAM,GACjC,EAAQ,WAAWA,EAAQ,MAAM;IACnC;IACA,UAAiC;KAE/B,OADKD,EAAQ,OACN;MACL,MAAM;MACN,OAAO;OAAE,GAAGA,EAAQ;OAAQ,GAAGA,EAAQ;MAAO;MAC9C,SAAS;OAAE,GAAGA,EAAQ;OAAU,GAAGA,EAAQ;MAAS;MACpD,WAAWA,EAAQ;KACrB,IAN0B;IAO5B;IACA,MAAM,GAAwB,GAAmC;KAE/D,IADA,EAAQ,OAAO,IACXE,MAAW,UAAU;KAEzB,IAAM,EAAE,KAAKC,GAAG,SAAM,WAAQ,WAAQ,aAAU,aAAU,iBAAcH,GAElEI,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAI,KAAK,IAAIC,GAAQC,CAAQ,GAC7BC,IAAQ,KAAK,IAAIJ,IAAWD,CAAM,GAClCM,IAAS,KAAK,IAAIF,IAAWD,CAAM;KAGzC,IAAIE,MAAU,KAAKC,MAAW,GAAG;MAC/B,AAAKC,KAAWT,EAAE,aAAa,CAAC,CAAC;MACjC;KACF;KAEA,IAAMU,IAAOV,EAAE,YAAY;MAAE;MAAG;MAAG;MAAO;KAAO,GAAGW,CAAI;KAExD,EAAE,aAAaC,EAAkBZ,EAAE,aAAa,GAAGU,GAAMD,CAAS,CAAC;IACrE;GACF;EACF;CACF;CAGA,eAAe;AACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"cancelGesture.js","names":["cancelGestureAction"],"sources":["../../../../src/interactions/actions/defaults/cancelGesture.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Static descriptor for the `cancelGesture` Action — Escape mid-drag\n * tells the dispatcher to abort every in-flight handle (`onEnd('cancel')`\n * on each, scratch discarded, no scene mutation).\n *\n * Phase-gated to `[*:engaged]` so it fires only when at least one tool\n * has a handle in flight; the unmodified `escape` action retains its\n * idle-phase binding (clears selection) without conflict.\n */\n// No `eligible` field → always eligible. Cancelling an in-flight gesture\n// must work regardless of mode.\nexport const cancelGestureAction: Action & { requires: string[] } = {\n id: 'cancelGesture',\n label: 'Cancel gesture',\n defaultBinding: {\n kind: 'key',\n key: 'Escape',\n phase: [{ channel: '*', phase: 'engaged' }],\n },\n requires: ['dispatcher'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const d = deps.dispatcher;\n d?.cancelAll('cancel');\n },\n },\n};\n"],"mappings":";AAcA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,gBAAgB;EACd,MAAM;EACN,KAAK;EACL,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,CAAC,YAAY;CACvB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GAEb,EADe,YACZ,UAAU,QAAQ;EACvB;CACF;AACF"}
1
+ {"version":3,"file":"cancelGesture.js","names":["cancelGestureAction"],"sources":["../../../../src/interactions/actions/defaults/cancelGesture.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Escape mid-drag tells the dispatcher to abort every in-flight handle\n * (`onEnd('cancel')` on each, no scene mutation).\n *\n * Phase-gated to `[*:engaged]` so it fires only when a handle is in flight,\n * leaving the idle-phase `escape` action (clears selection) without conflict.\n */\n// No `eligible` field: canceling an in-flight gesture must work in every mode.\nexport const cancelGestureAction: Action & { requires: string[] } = {\n id: 'cancelGesture',\n label: 'Cancel gesture',\n defaultBinding: {\n kind: 'key',\n key: 'Escape',\n phase: [{ channel: '*', phase: 'engaged' }],\n },\n requires: ['dispatcher'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const d = deps.dispatcher;\n d?.cancelAll('cancel');\n },\n },\n};\n"],"mappings":";AAWA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,gBAAgB;EACd,MAAM;EACN,KAAK;EACL,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,CAAC,YAAY;CACvB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GAEb,EADe,YACZ,UAAU,QAAQ;EACvB;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"clearSelection.js","names":["clearSelectionAction","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clearSelection.ts"],"sourcesContent":["/**\n * `clearSelectionAction` — immediate Action descriptor for click-on-empty\n * selection clearing.\n *\n * ## Status: REAL\n *\n * Fires via `useSelectTool.bindings` when the user clicks on empty canvas\n * with no modifier held. Clears the selection by calling `deps.selection.set([])`.\n *\n * ## No defaultBinding\n *\n * This action has no ambient `defaultBinding` / `defaultBinding` — it fires\n * ONLY via `useSelectTool`'s `Tool.bindings` entry:\n * `{ spec: { kind: 'click', target: 'empty', mods: {} }, actionId: 'clearSelection' }`\n *\n * This avoids ambient double-fire and keeps the action scoped to select-tool\n * context where `classifyTarget` is wired.\n *\n * ## enabled — the anchor-editing fall-through\n *\n * There is no \"is anything selected?\" guard: clearing an already-empty\n * selection is a safe no-op, and the binding spec is the real gate for\n * where the click landed.\n *\n * What `enabled` *does* do is decline while a path is in anchor-edit mode,\n * so the dispatcher falls through to `selectAnchorAction`. This is the\n * click twin of the opt-out `areaSelectAction.start` already performs for\n * the drag gesture, and it exists for the same reason: `useSelectTool`\n * binds this action at **active** scope while `selectAnchor` is **ambient**,\n * so without the gate an anchor that happens to sit over empty canvas\n * clears the node selection instead of selecting the anchor.\n *\n * Capability eligibility (`creates-selection`, which `path-edit` does not\n * allow) already covers consumers that wired a mode registry. Consumers\n * without one get no eligibility filtering at all, so this gate is the only\n * thing separating the two. Both mechanisms are needed — see the header of\n * `anchorEditing.ts`.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Static descriptor for the `clearSelection` Action.\n *\n * Requires dep-schema entries: `selection`, `editAnchors`.\n *\n * Registered via `useStandardActions`; bound via `useSelectTool.bindings`.\n */\nexport const clearSelectionAction: Action & { requires: string[] } = {\n id: 'clearSelection',\n label: 'Clear selection',\n // No defaultBinding / defaultBinding — fires only via Tool.bindings.\n eligible: { capability: 'creates-selection' },\n // `editAnchors` is required for the `enabled` gate below, not for the run.\n requires: ['selection', 'editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n deps.selection?.set([]);\n },\n },\n enabled: (deps?: ActionDeps) => {\n const editAnchors = deps?.editAnchors;\n // Absent dep means the consumer never wired anchor editing — nothing to\n // defer to, so the click is ours.\n if (editAnchors?.editingId) return ActionDisabledReason.NotApplicable;\n return true;\n },\n};\n"],"mappings":";;AAmDA,IAAaA,IAAwD;CACnE,IAAI;CACJ,OAAO;CAEP,UAAU,EAAE,YAAY,oBAAoB;CAE5C,UAAU,CAAC,aAAa,aAAa;CACrC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAK,WAAW,IAAI,CAAC,CAAC;EACxB;CACF;CACA,UAAU,MAIR,CAHoBC,GAAM,aAGT,aAAkBC,EAAqB;AAG5D"}
1
+ {"version":3,"file":"clearSelection.js","names":["clearSelectionAction","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clearSelection.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { ActionDeps } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Clears the selection on a click on empty canvas. It has no ambient\n * `defaultBinding`: it fires only through `useSelectTool`'s bindings.\n *\n * `enabled` declines while a path is in anchor-edit mode, so the dispatcher\n * falls through to `selectAnchorAction`. `useSelectTool` binds this action at\n * **active** scope while `selectAnchor` is **ambient**, so without the gate an\n * anchor that sits over empty canvas clears the node selection instead of\n * selecting the anchor. Capability eligibility covers only consumers that\n * wired a mode registry.\n */\nexport const clearSelectionAction: Action & { requires: string[] } = {\n id: 'clearSelection',\n label: 'Clear selection',\n eligible: { capability: 'creates-selection' },\n // `editAnchors` is required for the `enabled` gate below, not for the run.\n requires: ['selection', 'editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n deps.selection?.set([]);\n },\n },\n enabled: (deps?: ActionDeps) => {\n const editAnchors = deps?.editAnchors;\n // Absent dep means the consumer never wired anchor editing — nothing to\n // defer to, so the click is ours.\n if (editAnchors?.editingId) return ActionDisabledReason.NotApplicable;\n return true;\n },\n};\n"],"mappings":";;AAgBA,IAAaA,IAAwD;CACnE,IAAI;CACJ,OAAO;CACP,UAAU,EAAE,YAAY,oBAAoB;CAE5C,UAAU,CAAC,aAAa,aAAa;CACrC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAK,WAAW,IAAI,CAAC,CAAC;EACxB;CACF;CACA,UAAU,MAIR,CAHoBC,GAAM,aAGT,aAAkBC,EAAqB;AAG5D"}