@weasel-js/core 1.9.4 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1092) hide show
  1. package/CHANGELOG.md +750 -0
  2. package/README.md +5 -3
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +91 -83
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +3 -2
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +54 -100
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js.map +1 -1
  12. package/dist/affordances/rotationHandle.js +5 -4
  13. package/dist/affordances/rotationHandle.js.map +1 -1
  14. package/dist/animation/behaviors/coast.js +21 -0
  15. package/dist/animation/behaviors/coast.js.map +1 -0
  16. package/dist/animation/behaviors/coastByWrite.js +107 -0
  17. package/dist/animation/behaviors/coastByWrite.js.map +1 -0
  18. package/dist/animation/behaviors/coastOnTargets.js +94 -0
  19. package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
  20. package/dist/animation/behaviors/momentum.js +48 -136
  21. package/dist/animation/behaviors/momentum.js.map +1 -1
  22. package/dist/animation/clipTargets.js +12 -0
  23. package/dist/animation/clipTargets.js.map +1 -0
  24. package/dist/animation/index.js +15 -20
  25. package/dist/animation/poseHelpers.js +112 -33
  26. package/dist/animation/poseHelpers.js.map +1 -1
  27. package/dist/animation/poseTarget.js +115 -0
  28. package/dist/animation/poseTarget.js.map +1 -0
  29. package/dist/animation/reflow.js +113 -83
  30. package/dist/animation/reflow.js.map +1 -1
  31. package/dist/animation/rewind.js +66 -0
  32. package/dist/animation/rewind.js.map +1 -0
  33. package/dist/animation/rig/bindRig.js +85 -53
  34. package/dist/animation/rig/bindRig.js.map +1 -1
  35. package/dist/animation/rig/rigNode.js +93 -0
  36. package/dist/animation/rig/rigNode.js.map +1 -0
  37. package/dist/animation/rig/rigSeat.js +26 -0
  38. package/dist/animation/rig/rigSeat.js.map +1 -0
  39. package/dist/animation/rig/skinBinding.js +56 -0
  40. package/dist/animation/rig/skinBinding.js.map +1 -0
  41. package/dist/animation/rig/useRig.js +31 -16
  42. package/dist/animation/rig/useRig.js.map +1 -1
  43. package/dist/animation/wrappers/animateLifecycle.js +8 -7
  44. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  45. package/dist/animation/wrappers/animateOnSetPose.js +31 -31
  46. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  47. package/dist/animation/wrappers/instantPose.js.map +1 -1
  48. package/dist/animation/writtenPoseTarget.js +33 -0
  49. package/dist/animation/writtenPoseTarget.js.map +1 -0
  50. package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
  51. package/dist/barrel/canvas.js +31 -0
  52. package/dist/barrel/chrome.js +10 -10
  53. package/dist/barrel/input.js +16 -17
  54. package/dist/barrel/interactions.js +35 -39
  55. package/dist/barrel/paint.js +11 -18
  56. package/dist/barrel/paths.js +12 -19
  57. package/dist/barrel/renderer.js +14 -20
  58. package/dist/barrel/routing.js +42 -36
  59. package/dist/barrel/scene.js +37 -0
  60. package/dist/barrel/text.js +9 -18
  61. package/dist/barrel/viewport.js +41 -51
  62. package/dist/canvas/Canvas.js +281 -475
  63. package/dist/canvas/Canvas.js.map +1 -1
  64. package/dist/canvas/CanvasView.js +169 -188
  65. package/dist/canvas/CanvasView.js.map +1 -1
  66. package/dist/canvas/CursorCoordsHud.js +22 -23
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  68. package/dist/canvas/DrawCanvas.js +39 -56
  69. package/dist/canvas/DrawCanvas.js.map +1 -1
  70. package/dist/canvas/ModalityHud.js.map +1 -1
  71. package/dist/canvas/NodeShape.js +28 -29
  72. package/dist/canvas/NodeShape.js.map +1 -1
  73. package/dist/canvas/PickHud.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  75. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  76. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
  77. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
  79. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  80. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +51 -54
  81. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
  83. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
  85. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +40 -29
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/features.js +73 -43
  92. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  96. package/dist/canvas/SceneCanvas/props.js +15 -14
  97. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  98. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  99. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  101. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  102. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  104. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
  106. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  107. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  108. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  109. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  110. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  112. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  113. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
  114. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  116. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  117. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  118. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  119. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  120. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  121. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +39 -37
  122. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  123. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  124. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  125. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  126. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  127. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  128. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  129. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  130. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  131. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +76 -80
  132. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  133. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  134. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  135. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  136. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  137. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  138. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  139. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  140. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  141. package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
  142. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  143. package/dist/canvas/SceneCanvas.js +303 -707
  144. package/dist/canvas/SceneCanvas.js.map +1 -1
  145. package/dist/canvas/SceneViewCanvas.js +41 -47
  146. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  147. package/dist/canvas/adapterDerivedPath.js +26 -0
  148. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  149. package/dist/canvas/affordanceAt.js +11 -1
  150. package/dist/canvas/affordanceAt.js.map +1 -1
  151. package/dist/canvas/buildSceneLayer.js +81 -61
  152. package/dist/canvas/buildSceneLayer.js.map +1 -1
  153. package/dist/canvas/buildSceneTree.js.map +1 -1
  154. package/dist/canvas/canvasRenderer.js +40 -44
  155. package/dist/canvas/canvasRenderer.js.map +1 -1
  156. package/dist/canvas/colorOverrides.js.map +1 -1
  157. package/dist/canvas/defaultDrawOne.js +12 -12
  158. package/dist/canvas/defaultDrawOne.js.map +1 -1
  159. package/dist/canvas/deps/areaSelect.js +4 -4
  160. package/dist/canvas/deps/areaSelect.js.map +1 -1
  161. package/dist/canvas/deps/debug.js.map +1 -1
  162. package/dist/canvas/deps/editAnchors.js +49 -68
  163. package/dist/canvas/deps/editAnchors.js.map +1 -1
  164. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  165. package/dist/canvas/deps/hitTestArea.js +31 -26
  166. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  167. package/dist/canvas/deps/insert.js +65 -54
  168. package/dist/canvas/deps/insert.js.map +1 -1
  169. package/dist/canvas/deps/lassoSelect.js +5 -5
  170. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  171. package/dist/canvas/deps/poseDescriptor.js +1 -1
  172. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  173. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  174. package/dist/canvas/deps/slice.js +44 -45
  175. package/dist/canvas/deps/slice.js.map +1 -1
  176. package/dist/canvas/deps/textEdit.js +8 -8
  177. package/dist/canvas/deps/textEdit.js.map +1 -1
  178. package/dist/canvas/deps/view.js.map +1 -1
  179. package/dist/canvas/derivedPath.js +43 -41
  180. package/dist/canvas/derivedPath.js.map +1 -1
  181. package/dist/canvas/drawEnvelope.js +8 -4
  182. package/dist/canvas/drawEnvelope.js.map +1 -1
  183. package/dist/canvas/getNodeAtPoint.js +2 -6
  184. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  185. package/dist/canvas/hud.module.js.map +1 -1
  186. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  187. package/dist/canvas/layerOrder.js.map +1 -1
  188. package/dist/canvas/layerSlots.js +6 -1
  189. package/dist/canvas/layerSlots.js.map +1 -1
  190. package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
  191. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  192. package/dist/canvas/nodeShapes/imagePainter.js +10 -10
  193. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  194. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  195. package/dist/canvas/nodeShapes/nodePaint.js +34 -23
  196. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  197. package/dist/canvas/nodeShapes/pathPainter.js +23 -22
  198. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  199. package/dist/canvas/nodeShapes/poseBox.js +6 -6
  200. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  201. package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
  202. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  203. package/dist/canvas/nodeShapes/shapePainter.js +16 -16
  204. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  205. package/dist/canvas/nodeShapes/textPainter.js +1 -1
  206. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  207. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  208. package/dist/canvas/paintCull.js +6 -8
  209. package/dist/canvas/paintCull.js.map +1 -1
  210. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  211. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  212. package/dist/canvas/pickWalk.js +52 -50
  213. package/dist/canvas/pickWalk.js.map +1 -1
  214. package/dist/canvas/planeClips.js +18 -19
  215. package/dist/canvas/planeClips.js.map +1 -1
  216. package/dist/canvas/poseCascade.js +41 -0
  217. package/dist/canvas/poseCascade.js.map +1 -0
  218. package/dist/canvas/poseRotation.js +1 -3
  219. package/dist/canvas/poseRotation.js.map +1 -1
  220. package/dist/canvas/rasterReadback.js +22 -0
  221. package/dist/canvas/rasterReadback.js.map +1 -0
  222. package/dist/canvas/renderDebugSnapshot.js +12 -12
  223. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  224. package/dist/canvas/renderNeeds.js +3 -3
  225. package/dist/canvas/renderNeeds.js.map +1 -1
  226. package/dist/canvas/renderSceneToPixels.js +64 -83
  227. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  228. package/dist/canvas/sceneAdapter.js +68 -132
  229. package/dist/canvas/sceneAdapter.js.map +1 -1
  230. package/dist/canvas/sceneClipboard.js +1 -1
  231. package/dist/canvas/sceneClipboard.js.map +1 -1
  232. package/dist/canvas/sceneLayerPaint.js +4 -4
  233. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  234. package/dist/canvas/sceneSlotWiring.js +4 -4
  235. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  236. package/dist/canvas/sceneViewRender.js +36 -35
  237. package/dist/canvas/sceneViewRender.js.map +1 -1
  238. package/dist/canvas/slopsDebugLayer.js +4 -4
  239. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  240. package/dist/canvas/surface.module.js +6 -0
  241. package/dist/canvas/surface.module.js.map +1 -0
  242. package/dist/canvas/surfaceBox.js +16 -0
  243. package/dist/canvas/surfaceBox.js.map +1 -0
  244. package/dist/canvas/useCanvasRenderer.js +23 -11
  245. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  246. package/dist/canvas/useCanvasSurface.js +31 -0
  247. package/dist/canvas/useCanvasSurface.js.map +1 -0
  248. package/dist/canvas/useCanvasView.js +46 -37
  249. package/dist/canvas/useCanvasView.js.map +1 -1
  250. package/dist/canvas/useFrameLoop.js +11 -12
  251. package/dist/canvas/useFrameLoop.js.map +1 -1
  252. package/dist/canvas/useHostAnchor.js +35 -33
  253. package/dist/canvas/useHostAnchor.js.map +1 -1
  254. package/dist/canvas/useLateContentRedraw.js +8 -8
  255. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  256. package/dist/canvas/useSceneLayerList.js +4 -14
  257. package/dist/canvas/useSceneLayerList.js.map +1 -1
  258. package/dist/canvas/useSurfaceInput.js +42 -0
  259. package/dist/canvas/useSurfaceInput.js.map +1 -0
  260. package/dist/canvas/useToolCursor.js +29 -0
  261. package/dist/canvas/useToolCursor.js.map +1 -0
  262. package/dist/canvas/useViewHelpers.js +46 -85
  263. package/dist/canvas/useViewHelpers.js.map +1 -1
  264. package/dist/canvas/viewInputs.js.map +1 -1
  265. package/dist/canvas/viewRegistry.js +25 -27
  266. package/dist/canvas/viewRegistry.js.map +1 -1
  267. package/dist/canvas/watchElementMove.js +43 -0
  268. package/dist/canvas/watchElementMove.js.map +1 -0
  269. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  270. package/dist/clipboard.d.ts +7 -14
  271. package/dist/{types-B4iJRHC3.d.ts → clone-2a5hVbBd.d.ts} +122 -77
  272. package/dist/clone.d.ts +4 -8
  273. package/dist/clone.js +0 -2
  274. package/dist/core/device/targets.js.map +1 -1
  275. package/dist/core/device/useDeviceProfile.js +13 -13
  276. package/dist/core/device/useDeviceProfile.js.map +1 -1
  277. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  278. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  279. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  280. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  281. package/dist/core/geometry/poseDescriptor.js +61 -14
  282. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  283. package/dist/core/geometry/regionHit.js +35 -37
  284. package/dist/core/geometry/regionHit.js.map +1 -1
  285. package/dist/core/geometry/targetFrame.js +94 -0
  286. package/dist/core/geometry/targetFrame.js.map +1 -0
  287. package/dist/core/geometry/unionBounds.js +4 -5
  288. package/dist/core/geometry/unionBounds.js.map +1 -1
  289. package/dist/core/layers/backgroundFill.js +31 -0
  290. package/dist/core/layers/backgroundFill.js.map +1 -0
  291. package/dist/{features/groups → core/layers}/children.js +1 -1
  292. package/dist/core/layers/children.js.map +1 -0
  293. package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
  294. package/dist/core/layers/gateLayer.js.map +1 -0
  295. package/dist/core/layers/layerGroup.js +40 -0
  296. package/dist/core/layers/layerGroup.js.map +1 -0
  297. package/dist/core/layers/render.js +50 -76
  298. package/dist/core/layers/render.js.map +1 -1
  299. package/dist/core/ops/createHistory.js +9 -9
  300. package/dist/core/ops/createHistory.js.map +1 -1
  301. package/dist/core/ops/delete.js.map +1 -1
  302. package/dist/core/paint/meshKind.js +16 -0
  303. package/dist/core/paint/meshKind.js.map +1 -0
  304. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +103 -92
  305. package/dist/core/paint/meshKindLazy.js.map +1 -0
  306. package/dist/core/paint/paintKindEntry.js +8 -0
  307. package/dist/core/paint/paintKindEntry.js.map +1 -0
  308. package/dist/core/paint/paintKinds.js +144 -0
  309. package/dist/core/paint/paintKinds.js.map +1 -0
  310. package/dist/core/paint/registerMesh.js +7 -0
  311. package/dist/core/paint/registerMesh.js.map +1 -0
  312. package/dist/core/scene/NodeProperties.js.map +1 -1
  313. package/dist/core/scene/NodeRouting.js.map +1 -1
  314. package/dist/core/scene/arrivalWindow.js +65 -64
  315. package/dist/core/scene/arrivalWindow.js.map +1 -1
  316. package/dist/core/scene/boundOps.js +40 -0
  317. package/dist/core/scene/boundOps.js.map +1 -0
  318. package/dist/core/scene/composeFrame.js +9 -6
  319. package/dist/core/scene/composeFrame.js.map +1 -1
  320. package/dist/{features/groups → core/scene}/composePose.js +18 -18
  321. package/dist/core/scene/composePose.js.map +1 -0
  322. package/dist/core/scene/depMemo.js +31 -6
  323. package/dist/core/scene/depMemo.js.map +1 -1
  324. package/dist/core/scene/derivedPath.js +19 -20
  325. package/dist/core/scene/derivedPath.js.map +1 -1
  326. package/dist/core/scene/editMode.js +26 -0
  327. package/dist/core/scene/editMode.js.map +1 -0
  328. package/dist/core/scene/effectivePose.js +38 -39
  329. package/dist/core/scene/effectivePose.js.map +1 -1
  330. package/dist/core/scene/fieldEdits.js +98 -0
  331. package/dist/core/scene/fieldEdits.js.map +1 -0
  332. package/dist/core/scene/historyFacade.js +116 -70
  333. package/dist/core/scene/historyFacade.js.map +1 -1
  334. package/dist/core/scene/historyForm.js +6 -0
  335. package/dist/core/scene/historyForm.js.map +1 -0
  336. package/dist/core/scene/kitOps.js +83 -71
  337. package/dist/core/scene/kitOps.js.map +1 -1
  338. package/dist/core/scene/kitRegistry.js.map +1 -1
  339. package/dist/core/scene/layerStack.js +105 -12
  340. package/dist/core/scene/layerStack.js.map +1 -1
  341. package/dist/core/scene/layoutPass.js +58 -59
  342. package/dist/core/scene/layoutPass.js.map +1 -1
  343. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  344. package/dist/core/scene/nestedHit.js.map +1 -0
  345. package/dist/core/scene/nodeFnFields.js +9 -9
  346. package/dist/core/scene/nodeFnFields.js.map +1 -1
  347. package/dist/core/scene/nodeMemo.js.map +1 -1
  348. package/dist/core/scene/nodeStore.js +72 -71
  349. package/dist/core/scene/nodeStore.js.map +1 -1
  350. package/dist/core/scene/notifier.js +37 -0
  351. package/dist/core/scene/notifier.js.map +1 -0
  352. package/dist/core/scene/opTable.js +50 -0
  353. package/dist/core/scene/opTable.js.map +1 -0
  354. package/dist/core/scene/outerOps.js +66 -0
  355. package/dist/core/scene/outerOps.js.map +1 -0
  356. package/dist/core/scene/poseHold.js +39 -0
  357. package/dist/core/scene/poseHold.js.map +1 -0
  358. package/dist/core/scene/poseOverrides.js +44 -36
  359. package/dist/core/scene/poseOverrides.js.map +1 -1
  360. package/dist/core/scene/poseSnapshot.js.map +1 -1
  361. package/dist/core/scene/reconcileSpecs.js +3 -2
  362. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  363. package/dist/core/scene/recorder.js +86 -0
  364. package/dist/core/scene/recorder.js.map +1 -0
  365. package/dist/core/scene/renderOrder.js.map +1 -1
  366. package/dist/core/scene/scene.js +81 -690
  367. package/dist/core/scene/scene.js.map +1 -1
  368. package/dist/core/scene/sceneEdits.js +58 -0
  369. package/dist/core/scene/sceneEdits.js.map +1 -0
  370. package/dist/core/scene/sceneMutators.js +49 -0
  371. package/dist/core/scene/sceneMutators.js.map +1 -0
  372. package/dist/core/scene/scenePoseAdapter.js +16 -0
  373. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  374. package/dist/core/scene/sceneRecording.js +90 -0
  375. package/dist/core/scene/sceneRecording.js.map +1 -0
  376. package/dist/core/scene/sceneSelection.js +28 -0
  377. package/dist/core/scene/sceneSelection.js.map +1 -0
  378. package/dist/core/scene/sceneState.js +49 -0
  379. package/dist/core/scene/sceneState.js.map +1 -0
  380. package/dist/core/scene/serialization.js +8 -5
  381. package/dist/core/scene/serialization.js.map +1 -1
  382. package/dist/core/scene/staleReplay.js +51 -0
  383. package/dist/core/scene/staleReplay.js.map +1 -0
  384. package/dist/core/scene/statedFields.js +9 -0
  385. package/dist/core/scene/statedFields.js.map +1 -0
  386. package/dist/core/scene/treeEdits.js +127 -0
  387. package/dist/core/scene/treeEdits.js.map +1 -0
  388. package/dist/core/scene/treeReads.js +26 -0
  389. package/dist/core/scene/treeReads.js.map +1 -0
  390. package/dist/core/scene/types.js.map +1 -1
  391. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  392. package/dist/core/scene/unionOfChildren.js.map +1 -0
  393. package/dist/core/scene/unitScopes.js +13 -0
  394. package/dist/core/scene/unitScopes.js.map +1 -0
  395. package/dist/core/scene/useScene.js.map +1 -1
  396. package/dist/core/selection/readOnlySelection.js +32 -0
  397. package/dist/core/selection/readOnlySelection.js.map +1 -0
  398. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  399. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  400. package/dist/core/selection/useSelection.js +34 -25
  401. package/dist/core/selection/useSelection.js.map +1 -1
  402. package/dist/core/shapeKinds.js.map +1 -1
  403. package/dist/core/stylus/stylus.js.map +1 -1
  404. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  405. package/dist/core/usePaintKinds.js +1 -1
  406. package/dist/core/usePaintKinds.js.map +1 -1
  407. package/dist/core/viewport/clientToWorld.js.map +1 -1
  408. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  409. package/dist/core/viewport/parallax.js.map +1 -1
  410. package/dist/core/viewport/screenSlop.js +11 -11
  411. package/dist/core/viewport/screenSlop.js.map +1 -1
  412. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  413. package/dist/core/viewport/useDecayLoop.js +8 -8
  414. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  415. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  416. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  417. package/dist/core/viewport/useViewAnimation.js +102 -43
  418. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  419. package/dist/core/viewport/view.js +7 -7
  420. package/dist/core/viewport/view.js.map +1 -1
  421. package/dist/core/viewport/wheelHandler.js.map +1 -1
  422. package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
  423. package/dist/debug/createDebugOverlayLayer.js +100 -100
  424. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  425. package/dist/debug/createDebugSink.js.map +1 -1
  426. package/dist/debug/frameStats.js.map +1 -1
  427. package/dist/debug/useDebugSink.js +52 -0
  428. package/dist/debug/useDebugSink.js.map +1 -0
  429. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  430. package/dist/features/chrome-caps/conditions.js.map +1 -1
  431. package/dist/features/chrome-caps/defaults.js.map +1 -1
  432. package/dist/features/chrome-caps/resolve.js.map +1 -1
  433. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  434. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  435. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  436. package/dist/features/ingestion/contentHandlers.js +25 -19
  437. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  438. package/dist/features/ingestion/imageHandler.js +21 -24
  439. package/dist/features/ingestion/imageHandler.js.map +1 -1
  440. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  441. package/dist/features/ingestion/placement.js +16 -0
  442. package/dist/features/ingestion/placement.js.map +1 -0
  443. package/dist/features/ingestion/svgHandler.js +5 -0
  444. package/dist/features/ingestion/svgHandler.js.map +1 -1
  445. package/dist/features/ingestion/textHandler.js +28 -0
  446. package/dist/features/ingestion/textHandler.js.map +1 -0
  447. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  448. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  449. package/dist/features/ingestion/weaselJsonHandler.js +5 -0
  450. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  451. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  452. package/dist/features/modes/modeLayers.js +7 -7
  453. package/dist/features/modes/modeLayers.js.map +1 -1
  454. package/dist/features/paths/editablePath.js +47 -0
  455. package/dist/features/paths/editablePath.js.map +1 -0
  456. package/dist/features/paths/index.js +9 -16
  457. package/dist/features/paths/pathEditState.js +41 -0
  458. package/dist/features/paths/pathEditState.js.map +1 -0
  459. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  460. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  461. package/dist/features/paths/pathLayer.js +3 -2
  462. package/dist/features/paths/pathLayer.js.map +1 -1
  463. package/dist/features/paths/penPreviewLayer.js +86 -88
  464. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  465. package/dist/features/paths/usePathEdit.js +34 -0
  466. package/dist/features/paths/usePathEdit.js.map +1 -0
  467. package/dist/features/poseRun/usePoseRun.js +42 -55
  468. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  469. package/dist/features/selection/overlay.js +170 -178
  470. package/dist/features/selection/overlay.js.map +1 -1
  471. package/dist/features/text/index.js +6 -0
  472. package/dist/features/text/textLayer.js +1 -1
  473. package/dist/features/text/textLayer.js.map +1 -1
  474. package/dist/features/text/useSceneTextEdit.js +95 -82
  475. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  476. package/dist/features/viewports/viewportLayer.js +25 -36
  477. package/dist/features/viewports/viewportLayer.js.map +1 -1
  478. package/dist/index.d.ts +4507 -8459
  479. package/dist/index.js +275 -320
  480. package/dist/input/keyState.js +14 -14
  481. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  482. package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
  483. package/dist/interactions/actions/align/action.js.map +1 -0
  484. package/dist/interactions/actions/align/align.js +23 -23
  485. package/dist/interactions/actions/align/align.js.map +1 -1
  486. package/dist/interactions/actions/booleans/action.js +65 -0
  487. package/dist/interactions/actions/booleans/action.js.map +1 -0
  488. package/dist/interactions/actions/booleans/booleans.js +69 -78
  489. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  490. package/dist/interactions/actions/booleans/operands.js +40 -0
  491. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  492. package/dist/interactions/actions/booleans/pieces.js +45 -0
  493. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  494. package/dist/interactions/actions/booleans/placement.js +24 -0
  495. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  496. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  497. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  498. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  499. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
  500. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  501. package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
  502. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  503. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  504. package/dist/interactions/actions/clone/action.js +98 -0
  505. package/dist/interactions/actions/clone/action.js.map +1 -0
  506. package/dist/interactions/actions/clone/behaviors.js +52 -0
  507. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  508. package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
  509. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  510. package/dist/interactions/actions/defaults/anchorEditing.js +41 -43
  511. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  512. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  513. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  514. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  515. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  516. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  517. package/dist/interactions/actions/defaults/duplicate.js +19 -19
  518. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  519. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  520. package/dist/interactions/actions/defaults/group.js +35 -40
  521. package/dist/interactions/actions/defaults/group.js.map +1 -1
  522. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  523. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  524. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  525. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  526. package/dist/interactions/actions/defaults/ingest.js +19 -15
  527. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  528. package/dist/interactions/actions/defaults/insertPathAnchor.js +14 -15
  529. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  530. package/dist/interactions/actions/defaults/nudge.js +30 -31
  531. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  532. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  533. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  534. package/dist/interactions/actions/defaults/setFill.js +9 -3
  535. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  536. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
  537. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  538. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  539. package/dist/interactions/actions/defaults/sliceOps.js +20 -22
  540. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  541. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  542. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  543. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
  544. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  545. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  546. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  547. package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
  548. package/dist/interactions/actions/distribute/action.js.map +1 -0
  549. package/dist/interactions/actions/distribute/distribute.js +11 -11
  550. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  551. package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +19 -21
  552. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  553. package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
  554. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  555. package/dist/interactions/actions/flip/action.js +124 -0
  556. package/dist/interactions/actions/flip/action.js.map +1 -0
  557. package/dist/interactions/actions/flip/helpers.js +1 -1
  558. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  559. package/dist/interactions/actions/gestureFrames.js +18 -0
  560. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  561. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  562. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  563. package/dist/interactions/actions/insert/action.js +72 -0
  564. package/dist/interactions/actions/insert/action.js.map +1 -0
  565. package/dist/interactions/actions/insert/commit.js +28 -0
  566. package/dist/interactions/actions/insert/commit.js.map +1 -0
  567. package/dist/interactions/actions/insert/extras.js +65 -0
  568. package/dist/interactions/actions/insert/extras.js.map +1 -0
  569. package/dist/interactions/actions/insert/frame.js +48 -0
  570. package/dist/interactions/actions/insert/frame.js.map +1 -0
  571. package/dist/interactions/actions/insert/geometry.js +35 -0
  572. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  573. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  574. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  575. package/dist/interactions/actions/insert/session.js +59 -0
  576. package/dist/interactions/actions/insert/session.js.map +1 -0
  577. package/dist/interactions/actions/insert/shape.js +34 -0
  578. package/dist/interactions/actions/insert/shape.js.map +1 -0
  579. package/dist/interactions/actions/lasso-select/action.js +143 -0
  580. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  581. package/dist/interactions/actions/move/action.js +87 -0
  582. package/dist/interactions/actions/move/action.js.map +1 -0
  583. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  584. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  585. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  586. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  587. package/dist/interactions/actions/move/behaviors/snapToContainer.js +24 -23
  588. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  589. package/dist/interactions/actions/move/capture.js +99 -0
  590. package/dist/interactions/actions/move/capture.js.map +1 -0
  591. package/dist/interactions/actions/move/commit/index.js +41 -0
  592. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  593. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  594. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  595. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  596. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  597. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  598. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  599. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  600. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  601. package/dist/interactions/actions/move/delta.js +51 -0
  602. package/dist/interactions/actions/move/delta.js.map +1 -0
  603. package/dist/interactions/actions/move/frame.js +59 -0
  604. package/dist/interactions/actions/move/frame.js.map +1 -0
  605. package/dist/interactions/actions/move/gestureAdapter.js +15 -40
  606. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  607. package/dist/interactions/actions/move/landedDescendants.js +8 -8
  608. package/dist/interactions/actions/move/layout/container.js +94 -0
  609. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  610. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  611. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  612. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  613. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  614. package/dist/interactions/actions/move/layout/exits.js +38 -0
  615. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  616. package/dist/interactions/actions/move/layout/glide.js +48 -0
  617. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  618. package/dist/interactions/actions/move/session.js +63 -0
  619. package/dist/interactions/actions/move/session.js.map +1 -0
  620. package/dist/interactions/actions/move/translate.js +61 -0
  621. package/dist/interactions/actions/move/translate.js.map +1 -0
  622. package/dist/interactions/actions/outlines/createOutlines.js +17 -64
  623. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  624. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  625. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  626. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  627. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  628. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  629. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  630. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  631. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  632. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  633. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  634. package/dist/interactions/actions/planeInput.js.map +1 -1
  635. package/dist/interactions/actions/pointerState.js +12 -0
  636. package/dist/interactions/actions/pointerState.js.map +1 -0
  637. package/dist/interactions/actions/poseDescriptorDep.js +1 -1
  638. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  639. package/dist/interactions/actions/poseFrame.js +26 -26
  640. package/dist/interactions/actions/poseFrame.js.map +1 -1
  641. package/dist/interactions/actions/resize/action.js +55 -0
  642. package/dist/interactions/actions/resize/action.js.map +1 -0
  643. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  644. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  645. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  646. package/dist/interactions/actions/resize/capture.js +85 -0
  647. package/dist/interactions/actions/resize/capture.js.map +1 -0
  648. package/dist/interactions/actions/resize/commit.js +69 -0
  649. package/dist/interactions/actions/resize/commit.js.map +1 -0
  650. package/dist/interactions/actions/resize/frame.js +74 -0
  651. package/dist/interactions/actions/resize/frame.js.map +1 -0
  652. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  653. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  654. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  655. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  656. package/dist/interactions/actions/resize/session.js +49 -0
  657. package/dist/interactions/actions/resize/session.js.map +1 -0
  658. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  659. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  660. package/dist/interactions/actions/rotate/action.js +56 -0
  661. package/dist/interactions/actions/rotate/action.js.map +1 -0
  662. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  663. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  664. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  665. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  666. package/dist/interactions/actions/rotate/commit.js +40 -0
  667. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  668. package/dist/interactions/actions/rotate/frame.js +65 -0
  669. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  670. package/dist/interactions/actions/rotate/handle.js +12 -12
  671. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  672. package/dist/interactions/actions/rotate/session.js +92 -0
  673. package/dist/interactions/actions/rotate/session.js.map +1 -0
  674. package/dist/interactions/actions/spatialReference.js.map +1 -1
  675. package/dist/interactions/actions/useStandardActions.js +77 -72
  676. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  677. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
  678. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  679. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  680. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  681. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  682. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  683. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  684. package/dist/layout/arrivals.js +20 -23
  685. package/dist/layout/arrivals.js.map +1 -1
  686. package/dist/math-CYUjoyyU.d.ts +33 -0
  687. package/dist/math.d.ts +5 -2
  688. package/dist/math.js +6 -6
  689. package/dist/mesh.d.ts +4 -268
  690. package/dist/mesh.js +3 -7
  691. package/dist/move.d.ts +6 -4
  692. package/dist/{originProjection-gHnOup4e.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
  693. package/dist/patterns-builtin.d.ts +1 -118
  694. package/dist/patterns-builtin.js +2 -3
  695. package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
  696. package/dist/renderer.d.ts +1 -92
  697. package/dist/renderer.js +2 -19
  698. package/dist/resize.d.ts +11 -22
  699. package/dist/resize.js +1 -1
  700. package/dist/style.css +1 -1
  701. package/dist/test-hook/install.js.map +1 -1
  702. package/dist/test-hook/useTestHook.js +22 -0
  703. package/dist/test-hook/useTestHook.js.map +1 -0
  704. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  705. package/dist/test-seams.d.ts +4 -4
  706. package/dist/test-seams.js +2 -2
  707. package/dist/tools/builtin/bone/boneActions.js +130 -0
  708. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  709. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  710. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  711. package/dist/tools/builtin/bone/placedRig.js +24 -0
  712. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  713. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  714. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  715. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  716. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  717. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  718. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  719. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  720. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  721. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  722. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  723. package/dist/tools/builtin/pen/usePenTool.js +161 -163
  724. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  725. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  726. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  727. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  728. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  729. package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
  730. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  731. package/dist/tools/builtin/select/selectionContributions.js +4 -4
  732. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  733. package/dist/tools/builtin/select/useSelectTool.js +43 -71
  734. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  735. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  736. package/dist/tools/builtin/slice/useSliceTool.js +67 -72
  737. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  738. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  739. package/dist/tools/builtin/text/useTextTool.js +8 -0
  740. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  741. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  742. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  743. package/dist/tools/builtin/weight/weightActions.js +112 -0
  744. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  745. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  746. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  747. package/dist/tools/overlayBinding.js.map +1 -1
  748. package/dist/tools/useKeybindings.js +20 -14
  749. package/dist/tools/useKeybindings.js.map +1 -1
  750. package/dist/{types-k-5Oqh-U.d.ts → types-CIKDwlsP.d.ts} +84 -164
  751. package/dist/util/paint.js +1 -1
  752. package/dist/util/paint.js.map +1 -1
  753. package/dist/version.js +1 -1
  754. package/package.json +26 -21
  755. package/dist/animation/colorHelpers.js +0 -135
  756. package/dist/animation/colorHelpers.js.map +0 -1
  757. package/dist/animation/colorRegistry.js +0 -37
  758. package/dist/animation/colorRegistry.js.map +0 -1
  759. package/dist/animation/engine/axes.js +0 -36
  760. package/dist/animation/engine/axes.js.map +0 -1
  761. package/dist/animation/engine/codec.js +0 -170
  762. package/dist/animation/engine/codec.js.map +0 -1
  763. package/dist/animation/engine/integrator.js +0 -12
  764. package/dist/animation/engine/integrator.js.map +0 -1
  765. package/dist/animation/loop.js +0 -60
  766. package/dist/animation/loop.js.map +0 -1
  767. package/dist/animation/observe.js +0 -23
  768. package/dist/animation/observe.js.map +0 -1
  769. package/dist/animation/rig/blendPoses.js +0 -43
  770. package/dist/animation/rig/blendPoses.js.map +0 -1
  771. package/dist/animation/rig/mirrorPose.js +0 -19
  772. package/dist/animation/rig/mirrorPose.js.map +0 -1
  773. package/dist/animation/rig/resolveSkeleton.js +0 -33
  774. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  775. package/dist/animation/rig/solveIk.js +0 -103
  776. package/dist/animation/rig/solveIk.js.map +0 -1
  777. package/dist/animation/rig/types.js +0 -12
  778. package/dist/animation/rig/types.js.map +0 -1
  779. package/dist/animation/slew.js +0 -27
  780. package/dist/animation/slew.js.map +0 -1
  781. package/dist/animation/stagger.js +0 -146
  782. package/dist/animation/stagger.js.map +0 -1
  783. package/dist/animation/timeline/booking.js +0 -114
  784. package/dist/animation/timeline/booking.js.map +0 -1
  785. package/dist/animation/timeline/createTimeline.js +0 -125
  786. package/dist/animation/timeline/createTimeline.js.map +0 -1
  787. package/dist/animation/timeline/sampleTrack.js +0 -79
  788. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  789. package/dist/animation/useAnimator.js +0 -388
  790. package/dist/animation/useAnimator.js.map +0 -1
  791. package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
  792. package/dist/builtins-DPcdghtB.d.ts +0 -1223
  793. package/dist/canvas/MinimapCanvas.js +0 -140
  794. package/dist/canvas/MinimapCanvas.js.map +0 -1
  795. package/dist/canvas/deps/poseComposition.js +0 -11
  796. package/dist/canvas/deps/poseComposition.js.map +0 -1
  797. package/dist/canvas/minimapMath.js +0 -82
  798. package/dist/canvas/minimapMath.js.map +0 -1
  799. package/dist/canvas/toolPreview.js +0 -39
  800. package/dist/canvas/toolPreview.js.map +0 -1
  801. package/dist/core/adapters/arrayAdapter.js +0 -94
  802. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  803. package/dist/core/adapters/useArrayAdapter.js +0 -13
  804. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  805. package/dist/core/fillInPoseFrame.js +0 -102
  806. package/dist/core/fillInPoseFrame.js.map +0 -1
  807. package/dist/core/geometry/poseFrame.js +0 -44
  808. package/dist/core/geometry/poseFrame.js.map +0 -1
  809. package/dist/core/geometry/poseRotation.js +0 -58
  810. package/dist/core/geometry/poseRotation.js.map +0 -1
  811. package/dist/core/gradient.js +0 -136
  812. package/dist/core/gradient.js.map +0 -1
  813. package/dist/core/markerInset.js +0 -24
  814. package/dist/core/markerInset.js.map +0 -1
  815. package/dist/core/mixed.js +0 -6
  816. package/dist/core/mixed.js.map +0 -1
  817. package/dist/core/paintKinds.js +0 -156
  818. package/dist/core/paintKinds.js.map +0 -1
  819. package/dist/core/scene/pickability.js +0 -6
  820. package/dist/core/scene/pickability.js.map +0 -1
  821. package/dist/core/strokeMarkerShapes.js +0 -139
  822. package/dist/core/strokeMarkerShapes.js.map +0 -1
  823. package/dist/core/strokeMarkers.js +0 -28
  824. package/dist/core/strokeMarkers.js.map +0 -1
  825. package/dist/core/viewport/meanScale.js +0 -8
  826. package/dist/core/viewport/meanScale.js.map +0 -1
  827. package/dist/core/viewport/pxExtent.js +0 -42
  828. package/dist/core/viewport/pxExtent.js.map +0 -1
  829. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  830. package/dist/features/focus/gateLayer.js.map +0 -1
  831. package/dist/features/focus/useCanvasFocus.js +0 -29
  832. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  833. package/dist/features/groups/children.js.map +0 -1
  834. package/dist/features/groups/composePose.js.map +0 -1
  835. package/dist/features/groups/nestedHit.js.map +0 -1
  836. package/dist/features/groups/unionOfChildren.js.map +0 -1
  837. package/dist/features/images/imageCache.js +0 -104
  838. package/dist/features/images/imageCache.js.map +0 -1
  839. package/dist/features/ingestion/index.js +0 -8
  840. package/dist/features/meshPaint/bake.js +0 -79
  841. package/dist/features/meshPaint/bake.js.map +0 -1
  842. package/dist/features/meshPaint/bakeCache.js +0 -59
  843. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  844. package/dist/features/meshPaint/handles.js +0 -86
  845. package/dist/features/meshPaint/handles.js.map +0 -1
  846. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  847. package/dist/features/meshPaint/meshPaint.js +0 -239
  848. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  849. package/dist/features/meshPaint/meshShader.js +0 -6
  850. package/dist/features/meshPaint/meshShader.js.map +0 -1
  851. package/dist/features/meshPaint/register.js +0 -7
  852. package/dist/features/meshPaint/register.js.map +0 -1
  853. package/dist/features/meshPaint/surface.js +0 -110
  854. package/dist/features/meshPaint/surface.js.map +0 -1
  855. package/dist/features/minimap/actions.js +0 -53
  856. package/dist/features/minimap/actions.js.map +0 -1
  857. package/dist/features/minimap/createMinimapContribution.js +0 -96
  858. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  859. package/dist/features/minimap/layers.js +0 -85
  860. package/dist/features/minimap/layers.js.map +0 -1
  861. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  862. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  863. package/dist/features/parallax/createParallaxLayer.js +0 -26
  864. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  865. package/dist/features/parallax/createParallaxPlane.js +0 -22
  866. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  867. package/dist/features/paths/anchorEdits.js +0 -167
  868. package/dist/features/paths/anchorEdits.js.map +0 -1
  869. package/dist/features/paths/anchors.js +0 -159
  870. package/dist/features/paths/anchors.js.map +0 -1
  871. package/dist/features/paths/booleans.js +0 -2
  872. package/dist/features/paths/markerCommands.js +0 -149
  873. package/dist/features/paths/markerCommands.js.map +0 -1
  874. package/dist/features/paths/markerSites.js +0 -59
  875. package/dist/features/paths/markerSites.js.map +0 -1
  876. package/dist/features/paths/markers.js +0 -95
  877. package/dist/features/paths/markers.js.map +0 -1
  878. package/dist/features/paths/nearestAnchor.js +0 -36
  879. package/dist/features/paths/nearestAnchor.js.map +0 -1
  880. package/dist/features/paths/pathInWorld.js +0 -41
  881. package/dist/features/paths/pathInWorld.js.map +0 -1
  882. package/dist/features/paths/poseDescriptor.js +0 -39
  883. package/dist/features/paths/poseDescriptor.js.map +0 -1
  884. package/dist/features/paths/strokeToPath.js +0 -40
  885. package/dist/features/paths/strokeToPath.js.map +0 -1
  886. package/dist/features/paths/tessellate/dash.js +0 -52
  887. package/dist/features/paths/tessellate/dash.js.map +0 -1
  888. package/dist/features/paths/tessellate/insets.js +0 -32
  889. package/dist/features/paths/tessellate/insets.js.map +0 -1
  890. package/dist/features/paths/tessellate/metric.js +0 -72
  891. package/dist/features/paths/tessellate/metric.js.map +0 -1
  892. package/dist/features/paths/tessellate/stroke.js +0 -170
  893. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  894. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  895. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  896. package/dist/features/patterns/commandPaint.js +0 -18
  897. package/dist/features/patterns/commandPaint.js.map +0 -1
  898. package/dist/features/patterns/index.js +0 -11
  899. package/dist/features/patterns/index.js.map +0 -1
  900. package/dist/features/patterns/patterns-builtin.js +0 -38
  901. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  902. package/dist/features/patterns/rasterizeTile.js +0 -17
  903. package/dist/features/patterns/rasterizeTile.js.map +0 -1
  904. package/dist/features/patterns/resolveSpec.js +0 -65
  905. package/dist/features/patterns/resolveSpec.js.map +0 -1
  906. package/dist/features/patterns/tileGeometry.js +0 -158
  907. package/dist/features/patterns/tileGeometry.js.map +0 -1
  908. package/dist/features/pointer/PointerContext.js +0 -45
  909. package/dist/features/pointer/PointerContext.js.map +0 -1
  910. package/dist/features/selection/SelectionContext.js +0 -51
  911. package/dist/features/selection/SelectionContext.js.map +0 -1
  912. package/dist/features/simulation/createSimulation.js +0 -61
  913. package/dist/features/simulation/createSimulation.js.map +0 -1
  914. package/dist/features/simulation/types.js +0 -6
  915. package/dist/features/simulation/types.js.map +0 -1
  916. package/dist/features/simulation/useSimulation.js +0 -74
  917. package/dist/features/simulation/useSimulation.js.map +0 -1
  918. package/dist/features/text/domOffsets.js +0 -82
  919. package/dist/features/text/domOffsets.js.map +0 -1
  920. package/dist/features/text/domRuns.js +0 -230
  921. package/dist/features/text/domRuns.js.map +0 -1
  922. package/dist/features/text/fitTextPose.js +0 -38
  923. package/dist/features/text/fitTextPose.js.map +0 -1
  924. package/dist/features/text/hitTest.js +0 -48
  925. package/dist/features/text/hitTest.js.map +0 -1
  926. package/dist/features/text/isTextData.js +0 -8
  927. package/dist/features/text/isTextData.js.map +0 -1
  928. package/dist/features/text/overlayDirection.js +0 -15
  929. package/dist/features/text/overlayDirection.js.map +0 -1
  930. package/dist/features/text/renderLabel.js +0 -14
  931. package/dist/features/text/renderLabel.js.map +0 -1
  932. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  933. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  934. package/dist/features/text/runs/flagRange.js +0 -53
  935. package/dist/features/text/runs/flagRange.js.map +0 -1
  936. package/dist/features/text/runs/rangeStyle.js +0 -133
  937. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  938. package/dist/features/text/textCommand.js +0 -60
  939. package/dist/features/text/textCommand.js.map +0 -1
  940. package/dist/features/text/textToPath.js +0 -181
  941. package/dist/features/text/textToPath.js.map +0 -1
  942. package/dist/features/text/useTextEdit.js +0 -491
  943. package/dist/features/text/useTextEdit.js.map +0 -1
  944. package/dist/features/tiling/createTiledLayer.js +0 -65
  945. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  946. package/dist/features/tiling/tiledProject.js +0 -14
  947. package/dist/features/tiling/tiledProject.js.map +0 -1
  948. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  949. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  950. package/dist/interactions/actions/defaults/align.js.map +0 -1
  951. package/dist/interactions/actions/defaults/booleans.js +0 -52
  952. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  953. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  954. package/dist/interactions/actions/defaults/clone.js +0 -91
  955. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  956. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  957. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  958. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  959. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  960. package/dist/interactions/actions/defaults/flip.js +0 -125
  961. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  962. package/dist/interactions/actions/defaults/insert.js +0 -287
  963. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  964. package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
  965. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  966. package/dist/interactions/actions/defaults/move.js +0 -778
  967. package/dist/interactions/actions/defaults/move.js.map +0 -1
  968. package/dist/interactions/actions/defaults/resize.js +0 -341
  969. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  970. package/dist/interactions/actions/defaults/rotate.js +0 -185
  971. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  972. package/dist/interactions/actions/previewOverrides.js +0 -25
  973. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  974. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  975. package/dist/math-J-ACHyEg.d.ts +0 -159
  976. package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
  977. package/dist/renderer/DrawCommand.js +0 -6
  978. package/dist/renderer/DrawCommand.js.map +0 -1
  979. package/dist/renderer/WeaselRenderer.js +0 -333
  980. package/dist/renderer/WeaselRenderer.js.map +0 -1
  981. package/dist/renderer/batchClip.js +0 -46
  982. package/dist/renderer/batchClip.js.map +0 -1
  983. package/dist/renderer/cache/GLImageCache.js +0 -74
  984. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  985. package/dist/renderer/cache/GLMeshCache.js +0 -102
  986. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  987. package/dist/renderer/cache/GLTextureCache.js +0 -68
  988. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  989. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  990. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  991. package/dist/renderer/cache/cache.js +0 -13
  992. package/dist/renderer/cache/cache.js.map +0 -1
  993. package/dist/renderer/cache/markerCommandCache.js +0 -63
  994. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  995. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  996. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  997. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  998. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  999. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1000. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1001. package/dist/renderer/cullDrawCommands.js +0 -90
  1002. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1003. package/dist/renderer/draw/batch.js +0 -133
  1004. package/dist/renderer/draw/batch.js.map +0 -1
  1005. package/dist/renderer/draw/clip.js +0 -89
  1006. package/dist/renderer/draw/clip.js.map +0 -1
  1007. package/dist/renderer/draw/customShader.js +0 -230
  1008. package/dist/renderer/draw/customShader.js.map +0 -1
  1009. package/dist/renderer/draw/drawTriangles.js +0 -8
  1010. package/dist/renderer/draw/drawTriangles.js.map +0 -1
  1011. package/dist/renderer/draw/effects.js +0 -28
  1012. package/dist/renderer/draw/effects.js.map +0 -1
  1013. package/dist/renderer/draw/flushBatch.js +0 -35
  1014. package/dist/renderer/draw/flushBatch.js.map +0 -1
  1015. package/dist/renderer/draw/gradient.js +0 -90
  1016. package/dist/renderer/draw/gradient.js.map +0 -1
  1017. package/dist/renderer/draw/image.js +0 -38
  1018. package/dist/renderer/draw/image.js.map +0 -1
  1019. package/dist/renderer/draw/mesh.js +0 -16
  1020. package/dist/renderer/draw/mesh.js.map +0 -1
  1021. package/dist/renderer/draw/paintBind.js +0 -70
  1022. package/dist/renderer/draw/paintBind.js.map +0 -1
  1023. package/dist/renderer/draw/pathPaint.js +0 -142
  1024. package/dist/renderer/draw/pathPaint.js.map +0 -1
  1025. package/dist/renderer/draw/scratchPass.js +0 -83
  1026. package/dist/renderer/draw/scratchPass.js.map +0 -1
  1027. package/dist/renderer/draw/stencil.js +0 -28
  1028. package/dist/renderer/draw/stencil.js.map +0 -1
  1029. package/dist/renderer/draw/text.js +0 -167
  1030. package/dist/renderer/draw/text.js.map +0 -1
  1031. package/dist/renderer/draw/uniforms.js +0 -77
  1032. package/dist/renderer/draw/uniforms.js.map +0 -1
  1033. package/dist/renderer/draw.js +0 -79
  1034. package/dist/renderer/draw.js.map +0 -1
  1035. package/dist/renderer/drawBatch.js +0 -198
  1036. package/dist/renderer/drawBatch.js.map +0 -1
  1037. package/dist/renderer/effects/EffectTargets.js +0 -48
  1038. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1039. package/dist/renderer/effects/builtins.js +0 -31
  1040. package/dist/renderer/effects/builtins.js.map +0 -1
  1041. package/dist/renderer/effects/composite.js +0 -11
  1042. package/dist/renderer/effects/composite.js.map +0 -1
  1043. package/dist/renderer/effects/effectPrelude.js +0 -10
  1044. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1045. package/dist/renderer/effects/types.js +0 -10
  1046. package/dist/renderer/effects/types.js.map +0 -1
  1047. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1048. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1049. package/dist/renderer/index.js +0 -20
  1050. package/dist/renderer/math/color.js +0 -321
  1051. package/dist/renderer/math/color.js.map +0 -1
  1052. package/dist/renderer/math/mat3.js +0 -80
  1053. package/dist/renderer/math/mat3.js.map +0 -1
  1054. package/dist/renderer/math/patternSpace.js +0 -22
  1055. package/dist/renderer/math/patternSpace.js.map +0 -1
  1056. package/dist/renderer/math/viewToMat3.js +0 -19
  1057. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1058. package/dist/renderer/paintResources.js +0 -18
  1059. package/dist/renderer/paintResources.js.map +0 -1
  1060. package/dist/renderer/paintScratch.js +0 -37
  1061. package/dist/renderer/paintScratch.js.map +0 -1
  1062. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1063. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1064. package/dist/renderer/shaders/batchFill.js +0 -119
  1065. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1066. package/dist/renderer/shaders/customPrelude.js +0 -34
  1067. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1068. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1069. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1070. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1071. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1072. package/dist/renderer/shaders/gradFill.js +0 -31
  1073. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1074. package/dist/renderer/shaders/pathFill.js +0 -14
  1075. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1076. package/dist/renderer/shaders/patternFill.js +0 -25
  1077. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1078. package/dist/renderer/shaders/registerProgram.js +0 -18
  1079. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1080. package/dist/renderer/spriteSheet.js +0 -14
  1081. package/dist/renderer/spriteSheet.js.map +0 -1
  1082. package/dist/renderer/state/GroupState.js +0 -77
  1083. package/dist/renderer/state/GroupState.js.map +0 -1
  1084. package/dist/renderer/strokeLengths.js +0 -50
  1085. package/dist/renderer/strokeLengths.js.map +0 -1
  1086. package/dist/renderer/syntheticItalic.js +0 -6
  1087. package/dist/renderer/syntheticItalic.js.map +0 -1
  1088. package/dist/renderer/textures/registerTexture.js +0 -34
  1089. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1090. package/dist/scheduling/useVisibleRaf.js +0 -69
  1091. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1092. package/dist/test-seams-DM2B87-g.d.ts +0 -356
@@ -1 +1 @@
1
- {"version":3,"file":"createPaintAction.js","names":["createPaintAction","refreshPreviews","id","scratch","prev","next","spec","selection","ctx","scene","applyOps","ids","fallback","opts","pick","key","startData","node","moveCtx","reason","ops","merged","nodeNow","from","to","createSetDataOp","defaultCommitAdapter","sel","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createPaintAction.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createSetDataOp } from 'core/ops/setData';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/** The node data one paint action reads and writes: its own key, nothing else. */\ntype PaintData<K extends string, TValue> = { [P in K]?: TValue | null };\n\ntype Params = Record<string, unknown> | undefined;\n\n/** Read a param from the invocation, falling back to the binding's. */\nexport type PickParam = <T>(key: string) => T | undefined;\n\n/**\n * What distinguishes one paint action from the other three.\n *\n * `TState` is the action's gesture state — a color plus an optional paint for\n * the two setters, a bare alpha for the two opacity actions. It is a reducer,\n * not a paint: `setFill` and `setStroke` supersede a paint with a later color,\n * which no per-field merge of the params can express.\n */\nexport interface PaintActionSpec<TState, TValue, K extends string> {\n id: string;\n label: string;\n /** The `data` key this action owns. */\n dataKey: K;\n /** Gesture state at start. */\n initialState(pick: PickParam): TState;\n /** The state one onMove tick moves to, or `null` when its params carry\n * nothing this action reads — the preview then stands. */\n readParams(prev: TState, params: Params): TState | null;\n /** The value to write for one node, from that node's value at gesture start.\n * `null` writes the absence of paint, which is a value like any other —\n * a node with `fill: null` paints no fill. */\n merge(prev: TValue | null | undefined, state: TState): TValue | null;\n}\n\ninterface Scratch<TState, TValue, K extends string> {\n ids: NodeId[];\n scene: Scene<PaintData<K, TValue>, string, unknown>;\n /** Data snapshot at gesture start, keyed by node id. */\n startData: Map<NodeId, PaintData<K, TValue>>;\n state: TState;\n /** Preview data entries — the merged value per selected node. Populated on\n * start and refreshed on every onMove. */\n previews: Map<NodeId, PaintData<K, TValue>>;\n /** Optional consumer commit hook captured at gesture start. When present,\n * the ops-based commit routes through it (consumer history) instead of\n * `scene.applyBatch`. Undefined → fall back to `scene.applyBatch`. */\n applyOps?: (ops: Op[], label: string) => void;\n}\n\n/**\n * The one ongoing-action body the four paint actions share.\n *\n * On start it captures each selected node's data; on each onMove it refreshes\n * the preview without touching the scene; on commit it emits one\n * `createSetDataOp` per node (from = pre-commit data, to = the same data with\n * the merged value) and routes the batch through the consumer `applyOps` hook\n * when present (consumer history) else `scene.applyBatch` +\n * `defaultCommitAdapter` (whose `setData` delegates to `scene.update({ data })`).\n * Either path is a single batch → one undo entry.\n *\n * The `from` data is re-read at commit rather than reused from the start\n * snapshot, so a concurrent edit to a field this action does not own is not\n * clobbered.\n */\nexport function createPaintAction<TState, TValue, K extends string>(\n spec: PaintActionSpec<TState, TValue, K>,\n): Action & { requires: string[] } {\n type Data = PaintData<K, TValue>;\n\n const refreshPreviews = (scratch: Scratch<TState, TValue, K>): void => {\n scratch.previews.clear();\n for (const id of scratch.ids) {\n const prev = scratch.startData.get(id);\n const next = spec.merge(prev?.[spec.dataKey], scratch.state);\n scratch.previews.set(id, { ...(prev ?? {}), [spec.dataKey]: next } as Data);\n }\n };\n\n return {\n id: spec.id,\n label: spec.label,\n eligible: { capability: 'applies-fill' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene as Scene<Data, string, unknown> | undefined;\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 const fallback = opts?.params as Params;\n const pick = (<T>(key: string) =>\n (ctx.params?.[key] ?? fallback?.[key]) as T | undefined) as PickParam;\n\n const startData = new Map<NodeId, Data>();\n for (const id of ids) {\n const node = scene.get(id);\n if (node) startData.set(id, { ...(node.data as Data) });\n }\n\n const scratch: Scratch<TState, TValue, K> = {\n ids,\n scene,\n startData,\n state: spec.initialState(pick),\n previews: new Map(),\n applyOps,\n };\n refreshPreviews(scratch);\n\n return {\n onMove(moveCtx: InvocationCtx): void {\n const next = spec.readParams(scratch.state, moveCtx.params);\n if (next === null) return;\n scratch.state = next;\n refreshPreviews(scratch);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') {\n scratch.previews.clear();\n return;\n }\n const ops: Op[] = [];\n for (const id of scratch.ids) {\n const merged = spec.merge(\n scratch.startData.get(id)?.[spec.dataKey],\n scratch.state,\n );\n const nodeNow = scratch.scene.get(id);\n if (!nodeNow) continue;\n const from = { ...(nodeNow.data as object) } as Data;\n const to = { ...from, [spec.dataKey]: merged } as Data;\n ops.push(createSetDataOp<Data>({ id: id as string, from, to }));\n }\n if (ops.length > 0) {\n if (scratch.applyOps) scratch.applyOps(ops, spec.label);\n else scratch.scene.applyBatch(ops, spec.label, defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n }\n scratch.previews.clear();\n },\n previewIds: () => scratch.previews.keys(),\n previewData: (id: string) => scratch.previews.get(id as unknown as NodeId) ?? null,\n };\n },\n },\n enabled: (deps) => {\n const sel = deps?.selection;\n if (!sel || (sel.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n },\n };\n}\n"],"mappings":";;;;AAsEA,SAAgBA,EACd,GACiC;CAGjC,IAAMC,KAAmB,MAA8C;EACrE,EAAQ,SAAS,MAAM;EACvB,KAAK,IAAMC,KAAMC,EAAQ,KAAK;GAC5B,IAAMC,IAAOD,EAAQ,UAAU,IAAID,CAAE,GAC/BG,IAAOC,EAAK,MAAMF,IAAOE,EAAK,UAAUH,EAAQ,KAAK;GAC3D,EAAQ,SAAS,IAAID,GAAI;IAAE,GAAIE,KAAQ,CAAC;KAAKE,EAAK,UAAUD;GAAK,CAAS;EAC5E;CACF;CAEA,OAAO;EACL,IAAIC,EAAK;EACT,OAAOA,EAAK;EACZ,UAAU,EAAE,YAAY,eAAe;EACvC,UAAU;GAAC;GAAa;GAAS;EAAU;EAC3C,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAmC;IAC3D,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAWF,EAAI,KAAK;IAE1B,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO,CAAC;IAElC,IAAME,IAAMJ,EAAU,IAAI;IAC1B,IAAII,EAAI,WAAW,GAAG,OAAO,CAAC;IAE9B,IAAMC,IAAWC,GAAM,QACjBC,MAAY,MACfN,EAAI,SAASO,MAAQH,IAAWG,KAE7BC,oBAAY,IAAI,IAAkB;IACxC,KAAK,IAAMd,KAAMS,GAAK;KACpB,IAAMM,IAAOR,EAAM,IAAIP,CAAE;KACzB,AAAIe,KAAMD,EAAU,IAAId,GAAI,EAAE,GAAIe,EAAK,KAAc,CAAC;IACxD;IAEA,IAAMd,IAAsC;KAC1C;KACA;KACA;KACA,OAAOG,EAAK,aAAaQ,CAAI;KAC7B,0BAAU,IAAI,IAAI;KAClB;IACF;IAGA,OAFAb,EAAgBE,CAAO,GAEhB;KACL,OAAO,GAA8B;MACnC,IAAME,IAAOC,EAAK,WAAWH,EAAQ,OAAOe,EAAQ,MAAM;MAC1D,AAAIb,MAAS,SACb,EAAQ,QAAQA,GAChBJ,EAAgBE,CAAO;KACzB;KACA,MAAM,GAAwB,GAAmC;MAC/D,IAAIgB,MAAW,UAAU;OACvB,EAAQ,SAAS,MAAM;OACvB;MACF;MACA,IAAMC,IAAY,CAAC;MACnB,KAAK,IAAMlB,KAAMC,EAAQ,KAAK;OAC5B,IAAMkB,IAASf,EAAK,MAClBH,EAAQ,UAAU,IAAID,CAAE,CAAC,GAAGI,EAAK,UACjCH,EAAQ,KACV,GACMmB,IAAUnB,EAAQ,MAAM,IAAID,CAAE;OACpC,IAAI,CAACoB,GAAS;OACd,IAAMC,IAAO,EAAE,GAAID,EAAQ,KAAgB,GACrCE,IAAK;QAAE,GAAGD;SAAOjB,EAAK,UAAUe;OAAO;OAC7C,EAAI,KAAKI,EAAsB;QAAM;QAAc;QAAM;OAAG,CAAC,CAAC;MAChE;MAKA,AAJIL,EAAI,SAAS,MACXjB,EAAQ,WAAUA,EAAQ,SAASiB,GAAKd,EAAK,KAAK,IACjDH,EAAQ,MAAM,WAAWiB,GAAKd,EAAK,OAAOoB,EAAqBvB,EAAQ,OAAOI,EAAU,cAAc,CAAC,IAE9GJ,EAAQ,SAAS,MAAM;KACzB;KACA,kBAAkBA,EAAQ,SAAS,KAAK;KACxC,cAAc,MAAeA,EAAQ,SAAS,IAAID,CAAuB,KAAK;IAChF;GACF;EACF;EACA,UAAU,MAAS;GACjB,IAAMyB,IAAMC,GAAM;GAIlB,OAHI,CAACD,KAAQA,EAAI,IAAI,CAAC,CAAe,WAAW,IACvCE,EAAqB,oBAEvB;EACT;CACF;AACF"}
1
+ {"version":3,"file":"createPaintAction.js","names":["createPaintAction","refreshPreviews","id","scratch","prev","next","spec","selection","ctx","scene","applyOps","ids","fallback","opts","pick","key","startData","node","moveCtx","reason","ops","merged","nodeNow","from","to","createSetDataOp","defaultCommitAdapter","sel","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createPaintAction.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { Scene, NodeId } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createSetDataOp } from 'core/ops/setData';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/** The node data one paint action reads and writes: its own key, nothing else. */\ntype PaintData<K extends string, TValue> = { [P in K]?: TValue | null };\n\ntype Params = Record<string, unknown> | undefined;\n\n/** Read a param from the invocation, falling back to the binding's. */\nexport type PickParam = <T>(key: string) => T | undefined;\n\n/**\n * What distinguishes one paint action from another.\n *\n * `TState` is the action's gesture state. It is a reducer, not a paint:\n * `setFill` and `setStroke` supersede a paint with a later color, which no\n * per-field merge of the params can express.\n */\nexport interface PaintActionSpec<TState, TValue, K extends string> {\n id: string;\n label: string;\n /** The `data` key this action owns. */\n dataKey: K;\n /** Gesture state at start. */\n initialState(pick: PickParam): TState;\n /** The state one onMove tick moves to, or `null` when its params carry\n * nothing this action reads — the preview then stands. */\n readParams(prev: TState, params: Params): TState | null;\n /** The value to write for one node, from that node's value at gesture start.\n * `null` writes the absence of paint, which is a value like any other —\n * a node with `fill: null` paints no fill. */\n merge(prev: TValue | null | undefined, state: TState): TValue | null;\n}\n\ninterface Scratch<TState, TValue, K extends string> {\n ids: NodeId[];\n scene: Scene<PaintData<K, TValue>, string, unknown>;\n /** Data snapshot at gesture start, keyed by node id. */\n startData: Map<NodeId, PaintData<K, TValue>>;\n state: TState;\n /** Preview data entries — the merged value per selected node. */\n previews: Map<NodeId, PaintData<K, TValue>>;\n /** Consumer commit hook captured at gesture start; undefined falls back to\n * `scene.applyBatch`. */\n applyOps?: (ops: Op[], label: string) => void;\n}\n\n/**\n * The ongoing-action body the paint actions share: it previews without\n * touching the scene, and commits one batch (one undo entry) through the\n * consumer `applyOps` hook when present, else `scene.applyBatch`.\n *\n * The `from` data is re-read at commit rather than reused from the start\n * snapshot, so a concurrent edit to a field this action does not own is not\n * clobbered.\n */\nexport function createPaintAction<TState, TValue, K extends string>(\n spec: PaintActionSpec<TState, TValue, K>,\n): Action & { requires: string[] } {\n type Data = PaintData<K, TValue>;\n\n const refreshPreviews = (scratch: Scratch<TState, TValue, K>): void => {\n scratch.previews.clear();\n for (const id of scratch.ids) {\n const prev = scratch.startData.get(id);\n const next = spec.merge(prev?.[spec.dataKey], scratch.state);\n scratch.previews.set(id, { ...(prev ?? {}), [spec.dataKey]: next } as Data);\n }\n };\n\n return {\n id: spec.id,\n label: spec.label,\n eligible: { capability: 'applies-fill' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const selection = ctx.deps.selection;\n const scene = ctx.deps.scene as Scene<Data, string, unknown> | undefined;\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 const fallback = opts?.params as Params;\n const pick = (<T>(key: string) =>\n (ctx.params?.[key] ?? fallback?.[key]) as T | undefined) as PickParam;\n\n const startData = new Map<NodeId, Data>();\n for (const id of ids) {\n const node = scene.get(id);\n if (node) startData.set(id, { ...(node.data as Data) });\n }\n\n const scratch: Scratch<TState, TValue, K> = {\n ids,\n scene,\n startData,\n state: spec.initialState(pick),\n previews: new Map(),\n applyOps,\n };\n refreshPreviews(scratch);\n\n return {\n onMove(moveCtx: InvocationCtx): void {\n const next = spec.readParams(scratch.state, moveCtx.params);\n if (next === null) return;\n scratch.state = next;\n refreshPreviews(scratch);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') {\n scratch.previews.clear();\n return;\n }\n const ops: Op[] = [];\n for (const id of scratch.ids) {\n const merged = spec.merge(\n scratch.startData.get(id)?.[spec.dataKey],\n scratch.state,\n );\n const nodeNow = scratch.scene.get(id);\n if (!nodeNow) continue;\n const from = { ...(nodeNow.data as object) } as Data;\n const to = { ...from, [spec.dataKey]: merged } as Data;\n ops.push(createSetDataOp<Data>({ id: id as string, from, to }));\n }\n if (ops.length > 0) {\n if (scratch.applyOps) scratch.applyOps(ops, spec.label);\n else scratch.scene.applyBatch(ops, spec.label, defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n }\n scratch.previews.clear();\n },\n previewIds: () => scratch.previews.keys(),\n previewData: (id: string) => scratch.previews.get(id as unknown as NodeId) ?? null,\n };\n },\n },\n enabled: (deps) => {\n const sel = deps?.selection;\n if (!sel || (sel.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n },\n };\n}\n"],"mappings":";;;;AA6DA,SAAgBA,EACd,GACiC;CAGjC,IAAMC,KAAmB,MAA8C;EACrE,EAAQ,SAAS,MAAM;EACvB,KAAK,IAAMC,KAAMC,EAAQ,KAAK;GAC5B,IAAMC,IAAOD,EAAQ,UAAU,IAAID,CAAE,GAC/BG,IAAOC,EAAK,MAAMF,IAAOE,EAAK,UAAUH,EAAQ,KAAK;GAC3D,EAAQ,SAAS,IAAID,GAAI;IAAE,GAAIE,KAAQ,CAAC;KAAKE,EAAK,UAAUD;GAAK,CAAS;EAC5E;CACF;CAEA,OAAO;EACL,IAAIC,EAAK;EACT,OAAOA,EAAK;EACZ,UAAU,EAAE,YAAY,eAAe;EACvC,UAAU;GAAC;GAAa;GAAS;EAAU;EAC3C,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAmC;IAC3D,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAWF,EAAI,KAAK;IAE1B,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO,CAAC;IAElC,IAAME,IAAMJ,EAAU,IAAI;IAC1B,IAAII,EAAI,WAAW,GAAG,OAAO,CAAC;IAE9B,IAAMC,IAAWC,GAAM,QACjBC,MAAY,MACfN,EAAI,SAASO,MAAQH,IAAWG,KAE7BC,oBAAY,IAAI,IAAkB;IACxC,KAAK,IAAMd,KAAMS,GAAK;KACpB,IAAMM,IAAOR,EAAM,IAAIP,CAAE;KACzB,AAAIe,KAAMD,EAAU,IAAId,GAAI,EAAE,GAAIe,EAAK,KAAc,CAAC;IACxD;IAEA,IAAMd,IAAsC;KAC1C;KACA;KACA;KACA,OAAOG,EAAK,aAAaQ,CAAI;KAC7B,0BAAU,IAAI,IAAI;KAClB;IACF;IAGA,OAFAb,EAAgBE,CAAO,GAEhB;KACL,OAAO,GAA8B;MACnC,IAAME,IAAOC,EAAK,WAAWH,EAAQ,OAAOe,EAAQ,MAAM;MAC1D,AAAIb,MAAS,SACb,EAAQ,QAAQA,GAChBJ,EAAgBE,CAAO;KACzB;KACA,MAAM,GAAwB,GAAmC;MAC/D,IAAIgB,MAAW,UAAU;OACvB,EAAQ,SAAS,MAAM;OACvB;MACF;MACA,IAAMC,IAAY,CAAC;MACnB,KAAK,IAAMlB,KAAMC,EAAQ,KAAK;OAC5B,IAAMkB,IAASf,EAAK,MAClBH,EAAQ,UAAU,IAAID,CAAE,CAAC,GAAGI,EAAK,UACjCH,EAAQ,KACV,GACMmB,IAAUnB,EAAQ,MAAM,IAAID,CAAE;OACpC,IAAI,CAACoB,GAAS;OACd,IAAMC,IAAO,EAAE,GAAID,EAAQ,KAAgB,GACrCE,IAAK;QAAE,GAAGD;SAAOjB,EAAK,UAAUe;OAAO;OAC7C,EAAI,KAAKI,EAAsB;QAAM;QAAc;QAAM;OAAG,CAAC,CAAC;MAChE;MAKA,AAJIL,EAAI,SAAS,MACXjB,EAAQ,WAAUA,EAAQ,SAASiB,GAAKd,EAAK,KAAK,IACjDH,EAAQ,MAAM,WAAWiB,GAAKd,EAAK,OAAOoB,EAAqBvB,EAAQ,OAAOI,EAAU,cAAc,CAAC,IAE9GJ,EAAQ,SAAS,MAAM;KACzB;KACA,kBAAkBA,EAAQ,SAAS,KAAK;KACxC,cAAc,MAAeA,EAAQ,SAAS,IAAID,CAAuB,KAAK;IAChF;GACF;EACF;EACA,UAAU,MAAS;GACjB,IAAMyB,IAAMC,GAAM;GAIlB,OAHI,CAACD,KAAQA,EAAI,IAAI,CAAC,CAAe,WAAW,IACvCE,EAAqB,oBAEvB;EACT;CACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete.js","names":["hostIndex","node","scene","id","buildDeleteOps","covered","ops","ids","taken","createDeleteOp","deleteAction","createElement","DeleteIcon","selection","deps","applyOps","defaultCommitAdapter","requiresSelection"],"sources":["../../../../src/interactions/actions/defaults/delete.ts"],"sourcesContent":["import { createElement } from 'react';\nimport { DeleteIcon } from './icons/actionGlyphIcons';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport type { Action } from '@weasel-js/routing';\nimport { requiresSelection } from './requiresSelection';\n\n/** Host-array index of `id`: its slot among the scene roots (parent `null`)\n * or among its parent's children. `-1` when not found. Forwarded to\n * `createDeleteOp` so the inverse re-insert restores paint order on undo. */\nfunction hostIndex(scene: Scene<unknown, string, unknown>, id: NodeId): number {\n const node = scene.get(id);\n const siblings = node?.parent == null ? scene.roots : scene.childrenOf(node.parent);\n return siblings.indexOf(id);\n}\n\n/**\n * Delete ops for `ids`, in the order given. Each op captures the node and its\n * host-array index BEFORE any removal, so `invert()` re-inserts at the right\n * slot and undo restores paint order. Ids with no live node are skipped.\n *\n * Ids an already-emitted op will take are skipped: `removeNode` cascades both\n * the subtree and the dependents, so a second op for a node the first has taken\n * would throw `unknown node id` mid-batch — escaping the batch with the scene\n * already mutated. Selecting a container and its members, or a node and an edge\n * drawn from it, is the ordinary way to hit this; Cmd+A does both.\n *\n * `scene.removalClosure` is what decides that, rather than a walk back up from\n * each candidate: the scene owns the cascade relations, so a third one added\n * there is honored here for free. Asking about the ops already emitted, rather\n * than about the whole selection, is what settles a cycle — two ids that reach\n * each other each cover the other, and filtering both deletes nothing, while\n * growing the covered set in input order keeps the first and drops the rest.\n *\n * Which ids survive the filter depends on their order, so the ops are a cover\n * of the selection rather than its minimal set of roots.\n *\n * Shared with `clipboardCutAction` — cut is copy plus exactly this.\n */\nexport function buildDeleteOps(\n scene: Scene<unknown, string, unknown>,\n ids: readonly string[],\n label: string,\n): Op[] {\n const covered = new Set<string>();\n const ops: Op[] = [];\n for (const id of ids) {\n const node = scene.get(id as NodeId);\n if (!node) continue;\n if (covered.has(id)) continue;\n for (const taken of scene.removalClosure([id as NodeId])) covered.add(taken);\n ops.push(createDeleteOp<Node<unknown, string, unknown>>({\n node,\n index: hostIndex(scene, id as NodeId),\n label,\n }));\n }\n return ops;\n}\n\n/**\n * @experimental\n * Static descriptor for the `delete` Action. Removes every selected\n * node from the scene as a single batched op (one undo entry).\n *\n * Undo restores everything the removal cascaded — a container's children and\n * a deleted node's dependents come back with it, at their own slots. Each op\n * snapshots that set through the adapter's `getRemovalClosure` before removing.\n */\nexport const deleteAction: Action & { requires: string[] } = {\n id: 'delete',\n label: 'Delete',\n icon: createElement(DeleteIcon),\n group: 'edit',\n // Suppressed while any tool is mid-gesture — accidentally hitting\n // Delete during a drag shouldn't wipe the selection out from under\n // the in-flight handle.\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n // Optional consumer commit hook. When present, ops route through it\n // (consumer history) as one undo entry; otherwise they fall back to the\n // scene's own history via `scene.applyBatch`.\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const ops = buildDeleteOps(scene, ids, 'Delete');\n\n if (ops.length > 0) {\n if (applyOps) applyOps(ops, 'Delete');\n else scene.applyBatch(ops, 'Delete', defaultCommitAdapter(scene, selection.adapterMethods));\n }\n selection.set([]);\n },\n },\n enabled: requiresSelection,\n};\n"],"mappings":";;;;;;AAYA,SAASA,EAAU,GAAwC,GAAoB;CAC7E,IAAMC,IAAOC,EAAM,IAAIC,CAAE;CAEzB,QADiBF,GAAM,UAAU,OAAOC,EAAM,QAAQA,EAAM,WAAWD,EAAK,MAAM,EAAA,CAClE,QAAQE,CAAE;AAC5B;AAyBA,SAAgBC,EACd,GACA,GACA,GACM;CACN,IAAMC,oBAAU,IAAI,IAAY,GAC1BC,IAAY,CAAC;CACnB,KAAK,IAAMH,KAAMI,GAAK;EACpB,IAAMN,IAAOC,EAAM,IAAIC,CAAY;EACnC,IAAKF,KACD,GAAQ,IAAIE,CAAE,GAClB;QAAK,IAAMK,KAASN,EAAM,eAAe,CAACC,CAAY,CAAC,GAAG,EAAQ,IAAIK,CAAK;GAC3E,EAAI,KAAKC,EAA+C;IACtD;IACA,OAAOT,EAAUE,GAAOC,CAAY;IACpC;GACF,CAAC,CAAC;EALyE;CAM7E;CACA,OAAOG;AACT;AAWA,IAAaI,IAAgD;CAC3D,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAU;CAC9B,OAAO;CAIP,gBAAgB;EACd,MAAM;EACN,KAAK,CAAC,UAAU,WAAW;EAC3B,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU;EAAC;EAAS;EAAa;CAAU;CAC3C,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBZ,IAAQY,EAAK,OAIbC,IAAWD,EAAK;GACtB,IAAI,CAACD,KAAa,CAACX,GAAO;GAC1B,IAAMK,IAAMM,EAAU,IAAI;GAC1B,IAAIN,EAAI,WAAW,GAAG;GAEtB,IAAMD,IAAMF,EAAeF,GAAOK,GAAK,QAAQ;GAM/C,AAJID,EAAI,SAAS,MACXS,IAAUA,EAAST,GAAK,QAAQ,IAC/BJ,EAAM,WAAWI,GAAK,UAAUU,EAAqBd,GAAOW,EAAU,cAAc,CAAC,IAE5FA,EAAU,IAAI,CAAC,CAAC;EAClB;CACF;CACA,SAASI;AACX"}
1
+ {"version":3,"file":"delete.js","names":["hostIndex","node","scene","id","buildDeleteOps","covered","ops","ids","taken","createDeleteOp","deleteAction","createElement","DeleteIcon","selection","deps","applyOps","defaultCommitAdapter","requiresSelection"],"sources":["../../../../src/interactions/actions/defaults/delete.ts"],"sourcesContent":["import { createElement } from 'react';\nimport { DeleteIcon } from './icons/actionGlyphIcons';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport type { Action } from '@weasel-js/routing';\nimport { requiresSelection } from './requiresSelection';\n\n/** `id`'s slot among the scene roots or its parent's children, or `-1`. */\nfunction hostIndex(scene: Scene<unknown, string, unknown>, id: NodeId): number {\n const node = scene.get(id);\n const siblings = node?.parent == null ? scene.roots : scene.childrenOf(node.parent);\n return siblings.indexOf(id);\n}\n\n/**\n * Delete ops for `ids`, in the order given. Each op captures the node and its\n * host-array index BEFORE any removal, so `invert()` re-inserts at the right\n * slot and undo restores paint order. Ids with no live node are skipped.\n *\n * Ids an already-emitted op will take are skipped: `removeNode` cascades both\n * the subtree and the dependents, so a second op for a node the first has taken\n * would throw `unknown node id` mid-batch — escaping the batch with the scene\n * already mutated. Selecting a container and its members does this.\n *\n * The covered set grows from the ops already emitted, not from the whole\n * selection, which is what settles a cycle: two ids that reach each other each\n * cover the other, and filtering both would delete nothing. So which ids\n * survive depends on their order, and the ops are a cover of the selection\n * rather than its minimal set of roots.\n */\nexport function buildDeleteOps(\n scene: Scene<unknown, string, unknown>,\n ids: readonly string[],\n label: string,\n): Op[] {\n const covered = new Set<string>();\n const ops: Op[] = [];\n for (const id of ids) {\n const node = scene.get(id as NodeId);\n if (!node) continue;\n if (covered.has(id)) continue;\n for (const taken of scene.removalClosure([id as NodeId])) covered.add(taken);\n ops.push(createDeleteOp<Node<unknown, string, unknown>>({\n node,\n index: hostIndex(scene, id as NodeId),\n label,\n }));\n }\n return ops;\n}\n\n/**\n * @experimental\n * Removes every selected node from the scene as one undo entry. Undo restores\n * everything the removal cascaded — a container's children and a deleted\n * node's dependents come back with it, at their own slots.\n */\nexport const deleteAction: Action & { requires: string[] } = {\n id: 'delete',\n label: 'Delete',\n icon: createElement(DeleteIcon),\n group: 'edit',\n // Suppressed while any tool is mid-gesture — accidentally hitting\n // Delete during a drag shouldn't wipe the selection out from under\n // the in-flight handle.\n defaultBinding: {\n kind: 'key',\n key: ['Delete', 'Backspace'],\n phase: [{ channel: '*', phase: 'initial' }],\n },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const ops = buildDeleteOps(scene, ids, 'Delete');\n\n if (ops.length > 0) {\n if (applyOps) applyOps(ops, 'Delete');\n else scene.applyBatch(ops, 'Delete', defaultCommitAdapter(scene, selection.adapterMethods));\n }\n selection.set([]);\n },\n },\n enabled: requiresSelection,\n};\n"],"mappings":";;;;;;AAUA,SAASA,EAAU,GAAwC,GAAoB;CAC7E,IAAMC,IAAOC,EAAM,IAAIC,CAAE;CAEzB,QADiBF,GAAM,UAAU,OAAOC,EAAM,QAAQA,EAAM,WAAWD,EAAK,MAAM,EAAA,CAClE,QAAQE,CAAE;AAC5B;AAkBA,SAAgBC,EACd,GACA,GACA,GACM;CACN,IAAMC,oBAAU,IAAI,IAAY,GAC1BC,IAAY,CAAC;CACnB,KAAK,IAAMH,KAAMI,GAAK;EACpB,IAAMN,IAAOC,EAAM,IAAIC,CAAY;EACnC,IAAKF,KACD,GAAQ,IAAIE,CAAE,GAClB;QAAK,IAAMK,KAASN,EAAM,eAAe,CAACC,CAAY,CAAC,GAAG,EAAQ,IAAIK,CAAK;GAC3E,EAAI,KAAKC,EAA+C;IACtD;IACA,OAAOT,EAAUE,GAAOC,CAAY;IACpC;GACF,CAAC,CAAC;EALyE;CAM7E;CACA,OAAOG;AACT;AAQA,IAAaI,IAAgD;CAC3D,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAU;CAC9B,OAAO;CAIP,gBAAgB;EACd,MAAM;EACN,KAAK,CAAC,UAAU,WAAW;EAC3B,OAAO,CAAC;GAAE,SAAS;GAAK,OAAO;EAAU,CAAC;CAC5C;CACA,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU;EAAC;EAAS;EAAa;CAAU;CAC3C,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBZ,IAAQY,EAAK,OACbC,IAAWD,EAAK;GACtB,IAAI,CAACD,KAAa,CAACX,GAAO;GAC1B,IAAMK,IAAMM,EAAU,IAAI;GAC1B,IAAIN,EAAI,WAAW,GAAG;GAEtB,IAAMD,IAAMF,EAAeF,GAAOK,GAAK,QAAQ;GAM/C,AAJID,EAAI,SAAS,MACXS,IAAUA,EAAST,GAAK,QAAQ,IAC/BJ,EAAM,WAAWI,GAAK,UAAUU,EAAqBd,GAAOW,EAAU,cAAc,CAAC,IAE5FA,EAAU,IAAI,CAAC,CAAC;EAClB;CACF;CACA,SAASI;AACX"}
@@ -1,15 +1,16 @@
1
- import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
2
- import { nodeDescriptors as t, poseDescriptorOf as n } from "../poseDescriptorDep.js";
3
- import { defaultCommitAdapter as r } from "../defaultCommitAdapter.js";
4
- import { copySelection as i } from "./copySubtree.js";
5
- import { DuplicateIcon as a } from "./icons/editIcons.js";
6
- import { requiresSelection as o } from "./requiresSelection.js";
7
- import { createElement as s } from "react";
1
+ import { composesFrames as e } from "../../../core/scene/composeFrame.js";
2
+ import { translatePoseViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
3
+ import { nodeDescriptors as n, poseDescriptorOf as r } from "../poseDescriptorDep.js";
4
+ import { defaultCommitAdapter as i } from "../defaultCommitAdapter.js";
5
+ import { copySelection as a } from "./copySubtree.js";
6
+ import { DuplicateIcon as o } from "./icons/editIcons.js";
7
+ import { requiresSelection as s } from "./requiresSelection.js";
8
+ import { createElement as c } from "react";
8
9
  //#region src/interactions/actions/defaults/duplicate.ts
9
- var c = 12, l = {
10
+ var l = 12, u = {
10
11
  id: "duplicate",
11
12
  label: "Duplicate",
12
- icon: s(a),
13
+ icon: c(o),
13
14
  group: "edit",
14
15
  defaultBinding: {
15
16
  kind: "key",
@@ -21,23 +22,22 @@ var c = 12, l = {
21
22
  "scene",
22
23
  "selection",
23
24
  "applyOps",
24
- "poseComposition",
25
25
  "poseDescriptor"
26
26
  ],
27
27
  invoker: {
28
28
  timing: "immediate",
29
- run: (a) => {
30
- let o = a.selection, s = a.scene, l = a.applyOps;
31
- if (!o || !s) return;
32
- let u = o.get();
33
- if (u.length === 0) return;
34
- let d = t(s, n(a.poseDescriptor)), f = a.poseComposition === void 0, { ops: p, copies: m } = i(s, u, (t, n, r) => r || f ? e(n.pose, c, c, d(t)) : n.pose, "Duplicate");
35
- p.length !== 0 && (l ? l(p, "Duplicate") : s.applyBatch(p, "Duplicate", r(s, o.adapterMethods)), o.set(m));
29
+ run: (o) => {
30
+ let s = o.selection, c = o.scene, u = o.applyOps;
31
+ if (!s || !c) return;
32
+ let d = s.get();
33
+ if (d.length === 0) return;
34
+ let f = n(c, r(o.poseDescriptor)), p = !e(c.composition), { ops: m, copies: h } = a(c, d, (e, n, r) => r || p ? t(n.pose, l, l, f(e)) : n.pose, "Duplicate");
35
+ m.length !== 0 && (u ? u(m, "Duplicate") : c.applyBatch(m, "Duplicate", i(c, s.adapterMethods)), s.set(h));
36
36
  }
37
37
  },
38
- enabled: o
38
+ enabled: s
39
39
  };
40
40
  //#endregion
41
- export { l as duplicateAction };
41
+ export { u as duplicateAction };
42
42
 
43
43
  //# sourceMappingURL=duplicate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"duplicate.js","names":["DUPLICATE_OFFSET","duplicateAction","createElement","DuplicateIcon","selection","deps","scene","applyOps","ids","descriptorOf","nodeDescriptors","poseDescriptorOf","offsetDescendants","newIds","copySelection","isRoot","translatePoseViaDescriptor","node","id","ops","defaultCommitAdapter","requiresSelection"],"sources":["../../../../src/interactions/actions/defaults/duplicate.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { createElement } from 'react';\nimport { DuplicateIcon } from './icons/editIcons';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { copySelection } from './copySubtree';\nimport { requiresSelection } from './requiresSelection';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor } from '../resize/geometry';\n\n/** Same nudge `sceneToAdapter.getPasteOffset` gives a paste, so duplicate and\n * paste land in the same place rather than disagreeing by a few units. */\nconst DUPLICATE_OFFSET = 12;\n\n/**\n * @experimental\n * Static descriptor for the `duplicate` Action. Copies each selected node —\n * with its subtree, so duplicating a group produces a populated group — offset\n * by a small nudge, as one undoable batch, then selects the copies.\n */\nexport const duplicateAction: Action & { requires: string[] } = {\n id: 'duplicate',\n label: 'Duplicate',\n icon: createElement(DuplicateIcon),\n group: 'edit',\n defaultBinding: { kind: 'key', key: 'd', mods: { mod: true } },\n eligible: { capability: ['edits-page', 'creates-selection'] },\n // `selection` is read by the `enabled` gate as well as the invoker. An\n // undeclared read throws inside the dev-build deps Proxy before the gate can\n // answer, which is how this action spent a while doing nothing at all.\n requires: ['scene', 'selection', 'applyOps', 'poseComposition', 'poseDescriptor'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(deps.poseDescriptor));\n // With a `poseComposition` a child's pose is relative, so offsetting the\n // root carries the subtree and offsetting a child again would double it.\n const offsetDescendants = deps.poseComposition === undefined;\n const { ops, copies: newIds } = copySelection(\n scene,\n ids,\n (id, node, isRoot) => (isRoot || offsetDescendants\n ? translatePoseViaDescriptor(node.pose, DUPLICATE_OFFSET, DUPLICATE_OFFSET, descriptorOf(id))\n : node.pose),\n 'Duplicate',\n );\n\n if (ops.length === 0) return;\n if (applyOps) applyOps(ops, 'Duplicate');\n else scene.applyBatch(ops, 'Duplicate', defaultCommitAdapter(scene, selection.adapterMethods));\n selection.set(newIds);\n },\n },\n enabled: requiresSelection,\n};\n"],"mappings":";;;;;;;;AAWA,IAAMA,IAAmB,IAQZC,IAAmD;CAC9D,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAa;CACjC,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAC7D,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAI5D,UAAU;EAAC;EAAS;EAAa;EAAY;EAAmB;CAAgB;CAChF,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBC,IAAQD,EAAK,OACbE,IAAWF,EAAK;GACtB,IAAI,CAACD,KAAa,CAACE,GAAO;GAC1B,IAAME,IAAMJ,EAAU,IAAI;GAC1B,IAAII,EAAI,WAAW,GAAG;GAEtB,IAAMC,IAAeC,EAAgBJ,GAAOK,EAAiBN,EAAK,cAAc,CAAC,GAG3EO,IAAoBP,EAAK,oBAAoB,KAAA,GAC7C,EAAE,QAAK,QAAQQ,MAAWC,EAC9BR,GACAE,IACC,GAAI,GAAM,MAAYO,KAAUH,IAC7BI,EAA2BC,EAAK,MAAMjB,GAAkBA,GAAkBS,EAAaS,CAAE,CAAC,IAC1FD,EAAK,MACT,WACF;GAEA,AAAIE,EAAI,WAAW,MACfZ,IAAUA,EAASY,GAAK,WAAW,IAClCb,EAAM,WAAWa,GAAK,aAAaC,EAAqBd,GAAOF,EAAU,cAAc,CAAC,GAC7FA,EAAU,IAAIS,CAAM;EACtB;CACF;CACA,SAASQ;AACX"}
1
+ {"version":3,"file":"duplicate.js","names":["DUPLICATE_OFFSET","duplicateAction","createElement","DuplicateIcon","selection","deps","scene","applyOps","ids","descriptorOf","nodeDescriptors","poseDescriptorOf","offsetDescendants","composesFrames","newIds","copySelection","isRoot","translatePoseViaDescriptor","node","id","ops","defaultCommitAdapter","requiresSelection"],"sources":["../../../../src/interactions/actions/defaults/duplicate.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport { composesFrames } from 'core/scene/composePose';\nimport { createElement } from 'react';\nimport { DuplicateIcon } from './icons/editIcons';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { copySelection } from './copySubtree';\nimport { requiresSelection } from './requiresSelection';\nimport { nodeDescriptors, poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor } from '../resize/geometry';\n\n/** Same nudge `sceneToAdapter.getPasteOffset` gives a paste, so duplicate and\n * paste land in the same place rather than disagreeing by a few units. */\nconst DUPLICATE_OFFSET = 12;\n\n/**\n * @experimental\n * Static descriptor for the `duplicate` Action. Copies each selected node —\n * with its subtree, so duplicating a group produces a populated group — offset\n * by a small nudge, as one undoable batch, then selects the copies.\n */\nexport const duplicateAction: Action & { requires: string[] } = {\n id: 'duplicate',\n label: 'Duplicate',\n icon: createElement(DuplicateIcon),\n group: 'edit',\n defaultBinding: { kind: 'key', key: 'd', mods: { mod: true } },\n eligible: { capability: ['edits-page', 'creates-selection'] },\n // `selection` is read by the `enabled` gate as well as the invoker. An\n // undeclared read throws inside the dev-build deps Proxy before the gate can\n // answer, which is how this action spent a while doing nothing at all.\n requires: ['scene', 'selection', 'applyOps', 'poseDescriptor'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const descriptorOf = nodeDescriptors(scene, poseDescriptorOf(deps.poseDescriptor));\n // Under a frame a child's pose is relative, so offsetting the root\n // carries the subtree and offsetting a child again would double it.\n const offsetDescendants = !composesFrames(scene.composition);\n const { ops, copies: newIds } = copySelection(\n scene,\n ids,\n (id, node, isRoot) => (isRoot || offsetDescendants\n ? translatePoseViaDescriptor(node.pose, DUPLICATE_OFFSET, DUPLICATE_OFFSET, descriptorOf(id))\n : node.pose),\n 'Duplicate',\n );\n\n if (ops.length === 0) return;\n if (applyOps) applyOps(ops, 'Duplicate');\n else scene.applyBatch(ops, 'Duplicate', defaultCommitAdapter(scene, selection.adapterMethods));\n selection.set(newIds);\n },\n },\n enabled: requiresSelection,\n};\n"],"mappings":";;;;;;;;;AAYA,IAAMA,IAAmB,IAQZC,IAAmD;CAC9D,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAa;CACjC,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAC7D,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAI5D,UAAU;EAAC;EAAS;EAAa;EAAY;CAAgB;CAC7D,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBC,IAAQD,EAAK,OACbE,IAAWF,EAAK;GACtB,IAAI,CAACD,KAAa,CAACE,GAAO;GAC1B,IAAME,IAAMJ,EAAU,IAAI;GAC1B,IAAII,EAAI,WAAW,GAAG;GAEtB,IAAMC,IAAeC,EAAgBJ,GAAOK,EAAiBN,EAAK,cAAc,CAAC,GAG3EO,IAAoB,CAACC,EAAeP,EAAM,WAAW,GACrD,EAAE,QAAK,QAAQQ,MAAWC,EAC9BT,GACAE,IACC,GAAI,GAAM,MAAYQ,KAAUJ,IAC7BK,EAA2BC,EAAK,MAAMlB,GAAkBA,GAAkBS,EAAaU,CAAE,CAAC,IAC1FD,EAAK,MACT,WACF;GAEA,AAAIE,EAAI,WAAW,MACfb,IAAUA,EAASa,GAAK,WAAW,IAClCd,EAAM,WAAWc,GAAK,aAAaC,EAAqBf,GAAOF,EAAU,cAAc,CAAC,GAC7FA,EAAU,IAAIU,CAAM;EACtB;CACF;CACA,SAASQ;AACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"enterTextEdit.js","names":["enterTextEditAction","sel","deps","id","textEdit"],"sources":["../../../../src/interactions/actions/defaults/enterTextEdit.ts"],"sourcesContent":["/**\n * `enterTextEditAction` — immediate Action descriptor for entering in-place\n * text editing on a selected text node.\n *\n * ## Status: REAL\n *\n * Fires via `useTextTool.bindings` when the user clicks on a\n * selected text node. Calls `deps.textEdit.startEdit(id)` to activate the\n * contenteditable overlay managed by `useTextEdit` / `useSceneTextEdit`.\n *\n * ## No defaultBinding / defaultBinding\n *\n * This action has no ambient key or gesture binding — it fires ONLY via\n * `useTextTool`'s `Tool.bindings` entry:\n *\n * ```ts\n * bindings: [\n * { spec: { kind: 'click', target: 'selected-body' }, actionId: 'enterTextEdit' },\n * ]\n * ```\n *\n * Keeping it binding-free avoids ambient double-fire and scopes the action to\n * the text tool context where `classifyTarget` is already wired.\n *\n * ## Self-guard: only act on text nodes\n *\n * The `'selected-body'` target yields a match for any selected node kind. To\n * avoid entering text-edit mode when the text tool happens to have a non-text\n * node selected, the action self-guards via an optional `isTextNode` predicate\n * on `TextEditDep`:\n *\n * - When `isTextNode` is absent: action fires unconditionally (the binding\n * spec is the real gate — consumers should only bind this action from the\n * text tool).\n * - When `isTextNode(id)` returns `false`: action is a no-op for that node.\n *\n * ### Pre-filtering at dispatch time\n *\n * `classifyTarget` now surfaces node kind, so a binding can pre-filter instead\n * of relying on the self-guard:\n *\n * ```ts\n * { spec: { kind: 'click', target: 'kind:text:selected' }, actionId: 'enterTextEdit' }\n * ```\n *\n * That reads the *routing trait's* kind, so it matches whatever names the\n * consumer registered in `<SceneCanvas routing>` — `'text'` under the kit's\n * inferred default. `isTextNode` stays on `TextEditDep` because it also covers\n * consumers who bind the broader `'selected-body'` target, and because it is\n * the only guard for a consumer who opted out of routing entirely.\n *\n * ## Migration plan for useTextTool\n *\n * When wiring `useTextTool` to `Tool.bindings`:\n *\n * 1. Add to `useTextTool`'s `bindings`:\n * ```ts\n * { spec: { kind: 'click', target: 'selected-body' }, actionId: 'enterTextEdit' }\n * ```\n * 2. Register a `textEdit` dep sourced from the `useTextEdit` / `useSceneTextEdit`\n * return value, plus an `isTextNode` predicate (`isTextData`, or however the\n * consumer identifies text nodes).\n * 3. The existing `hitExisting` gate in `useTextTool`'s click route becomes\n * redundant — remove it in the same pass.\n */\n\nimport type { Action } from '@weasel-js/routing';\n\n// ---------------------------------------------------------------------------\n// TextEditDep\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Static descriptor for the `enterTextEdit` Action.\n *\n * Requires dep-schema entries: `textEdit`, `selection`.\n *\n * No `defaultBinding` / `defaultBinding` — fires only via `Tool.bindings`.\n * Self-guards via `TextEditDep.isTextNode` when provided.\n */\nexport const enterTextEditAction: Action & { requires: string[] } = {\n id: 'enterTextEdit',\n label: 'Enter text edit',\n // No defaultBinding / defaultBinding — fires only via Tool.bindings.\n eligible: { mode: { in: ['normal', 'isolation'] } },\n requires: ['textEdit', 'selection'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const sel = deps.selection?.get() ?? [];\n if (sel.length !== 1) return;\n\n const id = sel[0];\n const textEdit = deps.textEdit;\n if (!textEdit) return;\n\n // Self-guard: skip non-text nodes when the predicate is supplied.\n if (textEdit.isTextNode && !textEdit.isTextNode(id)) return;\n\n textEdit.startEdit(id);\n },\n },\n};\n"],"mappings":";AAqFA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CAEP,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,WAAW,EAAE,EAAE;CAClD,UAAU,CAAC,YAAY,WAAW;CAClC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAMC,EAAK,WAAW,IAAI,KAAK,CAAC;GACtC,IAAID,EAAI,WAAW,GAAG;GAEtB,IAAME,IAAKF,EAAI,IACTG,IAAWF,EAAK;GACtB,AAAKE,MAGD,GAAS,cAAeA,EAAS,WAAWD,CAAE,MAElDC,EAAS,UAAUD,CAAE;EACvB;CACF;AACF"}
1
+ {"version":3,"file":"enterTextEdit.js","names":["enterTextEditAction","sel","deps","id","textEdit"],"sources":["../../../../src/interactions/actions/defaults/enterTextEdit.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\n\n/**\n * @experimental\n * Starts in-place text editing on the single selected node. It has no\n * `defaultBinding`: it fires only via `Tool.bindings`.\n *\n * A `'selected-body'` target matches any selected node kind, so the action\n * skips a node `TextEditDep.isTextNode` rejects. With no `isTextNode` it fires\n * unconditionally, and the binding spec is the only gate; a binding can\n * pre-filter with `target: 'kind:text:selected'` instead.\n */\nexport const enterTextEditAction: Action & { requires: string[] } = {\n id: 'enterTextEdit',\n label: 'Enter text edit',\n eligible: { mode: { in: ['normal', 'isolation'] } },\n requires: ['textEdit', 'selection'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const sel = deps.selection?.get() ?? [];\n if (sel.length !== 1) return;\n\n const id = sel[0];\n const textEdit = deps.textEdit;\n if (!textEdit) return;\n\n // Self-guard: skip non-text nodes when the predicate is supplied.\n if (textEdit.isTextNode && !textEdit.isTextNode(id)) return;\n\n textEdit.startEdit(id);\n },\n },\n};\n"],"mappings":";AAYA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,UAAU,WAAW,EAAE,EAAE;CAClD,UAAU,CAAC,YAAY,WAAW;CAClC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAMC,EAAK,WAAW,IAAI,KAAK,CAAC;GACtC,IAAID,EAAI,WAAW,GAAG;GAEtB,IAAME,IAAKF,EAAI,IACTG,IAAWF,EAAK;GACtB,AAAKE,MAGD,GAAS,cAAeA,EAAS,WAAWD,CAAE,MAElDC,EAAS,UAAUD,CAAE;EACvB;CACF;AACF"}
@@ -1,21 +1,21 @@
1
- import { createTransformOp as e } from "../../../core/ops/transform.js";
2
- import { unionBounds as t } from "../../../core/geometry/unionBounds.js";
3
- import { visualBoundsViaDescriptor as n } from "../../../core/geometry/poseDescriptor.js";
4
- import { UNION_OF_CHILDREN as r, unionOfChildren as i } from "../../../core/scene/kitRegistry.js";
5
- import { createReparentOp as a } from "../../../core/ops/reparent.js";
6
- import { poseDescriptorOf as o } from "../poseDescriptorDep.js";
7
- import { defaultCommitAdapter as s } from "../defaultCommitAdapter.js";
8
- import { scenePoseFrame as c } from "../poseFrame.js";
9
- import { createInsertOp as l } from "../../../core/ops/create.js";
10
- import { GroupIcon as u, UngroupIcon as d } from "./icons/editIcons.js";
11
- import { requiresSelection as f } from "./requiresSelection.js";
1
+ import { unionBounds as e } from "../../../core/geometry/unionBounds.js";
2
+ import { visualBoundsViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
3
+ import { poseDescriptorOf as n } from "../poseDescriptorDep.js";
4
+ import { createReparentOp as r } from "../../../core/ops/reparent.js";
5
+ import { createTransformOp as i } from "../../../core/ops/transform.js";
6
+ import { scenePoseFrame as a } from "../poseFrame.js";
7
+ import { defaultCommitAdapter as o } from "../defaultCommitAdapter.js";
8
+ import { createInsertOp as s } from "../../../core/ops/create.js";
9
+ import { GroupIcon as c, UngroupIcon as l } from "./icons/editIcons.js";
10
+ import { requiresSelection as u } from "./requiresSelection.js";
11
+ import { UNION_OF_CHILDREN as d, unionOfChildren as f } from "../../../core/scene/kitRegistry.js";
12
12
  import { createElement as p } from "react";
13
13
  import { ActionDisabledReason as m } from "@weasel-js/routing";
14
14
  //#region src/interactions/actions/defaults/group.ts
15
15
  var h = {
16
16
  id: "group",
17
17
  label: "Group",
18
- icon: p(u),
18
+ icon: p(c),
19
19
  group: "structure",
20
20
  defaultBinding: {
21
21
  kind: "key",
@@ -27,21 +27,20 @@ var h = {
27
27
  "scene",
28
28
  "selection",
29
29
  "applyOps",
30
- "poseDescriptor",
31
- "poseComposition"
30
+ "poseDescriptor"
32
31
  ],
33
32
  invoker: {
34
33
  timing: "immediate",
35
- run: (u) => {
36
- let d = u.selection, f = u.scene, p = u.applyOps;
37
- if (!d || !f) return;
38
- let m = d.get();
34
+ run: (c) => {
35
+ let l = c.selection, u = c.scene, p = c.applyOps;
36
+ if (!l || !u) return;
37
+ let m = l.get();
39
38
  if (m.length === 0) return;
40
- let h = m.map((e) => f.get(e)).filter((e) => e !== void 0);
39
+ let h = m.map((e) => u.get(e)).filter((e) => e !== void 0);
41
40
  if (h.length === 0 || new Set(h.map((e) => e.layer)).size > 1) return;
42
- let g = h[0].layer, _ = new Set(h.map((e) => e.parent)).size === 1 ? h[0].parent : null, v = o(u.poseDescriptor), y = c(f, u.poseComposition), b = /* @__PURE__ */ new Map();
41
+ let g = h[0].layer, _ = new Set(h.map((e) => e.parent)).size === 1 ? h[0].parent : null, v = n(c.poseDescriptor), y = a(u), b = /* @__PURE__ */ new Map();
43
42
  for (let e of h) b.set(e.id, y.world(e.id));
44
- let x = t([...b.values()].map((e) => n(e, v))), S = x === null ? h[0].pose : v.fromBounds(x, h[0].pose), C = y.localUnder(_, S), w = y.pc.closure === "identity", T = f.registry.derivePose?.[r] ?? i, E = f.mintId(), D = [l({
43
+ let x = e([...b.values()].map((e) => t(e, v))), S = x === null ? h[0].pose : v.fromBounds(x, h[0].pose), C = y.localUnder(_, S), w = y.pc.closure === "identity", T = u.registry.derivePose?.[d] ?? f, E = u.mintId(), D = [s({
45
44
  node: {
46
45
  id: E,
47
46
  kind: "container",
@@ -56,25 +55,25 @@ var h = {
56
55
  },
57
56
  label: "Group"
58
57
  })];
59
- for (let t of h) D.push(a({
60
- id: t.id,
61
- fromParentId: t.parent ?? null,
58
+ for (let e of h) D.push(r({
59
+ id: e.id,
60
+ fromParentId: e.parent ?? null,
62
61
  toParentId: E,
63
62
  label: "Group"
64
- })), !w && D.push(e({
65
- id: t.id,
66
- from: t.pose,
67
- to: y.pc.decompose(S, b.get(t.id)),
63
+ })), !w && D.push(i({
64
+ id: e.id,
65
+ from: e.pose,
66
+ to: y.pc.decompose(S, b.get(e.id)),
68
67
  label: "Group"
69
68
  }));
70
- p ? p(D, "Group") : f.applyBatch(D, "Group", s(f, d.adapterMethods)), d.set([E]);
69
+ p ? p(D, "Group") : u.applyBatch(D, "Group", o(u, l.adapterMethods)), l.set([E]);
71
70
  }
72
71
  },
73
- enabled: f
72
+ enabled: u
74
73
  }, g = {
75
74
  id: "ungroup",
76
75
  label: "Ungroup",
77
- icon: p(d),
76
+ icon: p(l),
78
77
  group: "structure",
79
78
  defaultBinding: {
80
79
  kind: "key",
@@ -85,11 +84,7 @@ var h = {
85
84
  }
86
85
  },
87
86
  eligible: { capability: "edits-page" },
88
- requires: [
89
- "scene",
90
- "selection",
91
- "poseComposition"
92
- ],
87
+ requires: ["scene", "selection"],
93
88
  invoker: {
94
89
  timing: "immediate",
95
90
  run: (e) => {
@@ -99,16 +94,16 @@ var h = {
99
94
  if (r.length === 0) return;
100
95
  let i = r.filter((e) => n.get(e)?.kind === "container");
101
96
  if (i.length === 0) return;
102
- let a = c(n, e.poseComposition), o = a.pc.closure === "identity";
97
+ let o = a(n), s = o.pc.closure === "identity";
103
98
  n.batch("Ungroup", () => {
104
99
  let e = [];
105
100
  for (let t of i) {
106
101
  let r = n.get(t);
107
102
  if (!r || r.kind !== "container") continue;
108
- let i = r.parent ?? null, s = i === null ? n.roots.indexOf(t) : n.childrenOf(i).indexOf(t), c = [...n.childrenOf(t)], l = /* @__PURE__ */ new Map();
109
- if (!o) for (let e of c) l.set(e, a.world(e));
103
+ let i = r.parent ?? null, a = i === null ? n.roots.indexOf(t) : n.childrenOf(i).indexOf(t), c = [...n.childrenOf(t)], l = /* @__PURE__ */ new Map();
104
+ if (!s) for (let e of c) l.set(e, o.world(e));
110
105
  c.forEach((t, r) => {
111
- n.move(t, i, s < 0 ? void 0 : s + r), o || n.setPose(t, a.localUnder(i, l.get(t))), e.push(t);
106
+ n.move(t, i, a < 0 ? void 0 : a + r), s || n.setPose(t, o.localUnder(i, l.get(t))), e.push(t);
112
107
  }), n.remove(t);
113
108
  }
114
109
  t.set(e);
@@ -1 +1 @@
1
- {"version":3,"file":"group.js","names":["groupAction","createElement","GroupIcon","selection","deps","scene","applyOps","ids","nodes","id","n","layer","parent","d","poseDescriptorOf","frame","scenePoseFrame","worlds","node","union","unionBounds","visualBoundsViaDescriptor","p","containerWorldPose","pose","absolutePoses","derive","UNION_OF_CHILDREN","unionOfChildren","containerId","ops","createInsertOp","createReparentOp","createTransformOp","defaultCommitAdapter","requiresSelection","ungroupAction","UngroupIcon","containers","freed","container","baseIndex","children","childId","i","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/group.ts"],"sourcesContent":["import type { Node, NodeId } from 'core/scene/types';\nimport { createElement } from 'react';\nimport { GroupIcon, UngroupIcon } from './icons/editIcons';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { createReparentOp } from 'core/ops/reparent';\nimport { unionBounds } from 'core/geometry/unionBounds';\nimport { unionOfChildren, UNION_OF_CHILDREN } from 'core/scene/kitRegistry';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { visualBoundsViaDescriptor } from '../resize/geometry';\nimport { createTransformOp } from 'core/ops/transform';\nimport { ActionDisabledReason, type Action } from '@weasel-js/routing';\nimport { requiresSelection } from './requiresSelection';\nimport { scenePoseFrame } from '../poseFrame';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/**\n * @experimental\n * Static descriptor for the `group` Action.\n *\n * \"Group\" here means a structural `ContainerNode` — the real group that\n * round-trips to SVG `<g>` — not the legacy membership-list. `run` creates a\n * fresh container and reparents the current selection under it as a single\n * undoable batch.\n *\n * Grouping never moves a member on screen. The container takes the world\n * envelope of its members' ink; each member is then re-expressed in that\n * container's frame, which is a no-op only when the scene composes poses by\n * identity.\n *\n * Under identity the container's pose is also *derived* from its members, so\n * it tracks one that moves later instead of freezing at the moment the group\n * was made. Under any other composition that derivation is circular — the\n * members' poses are expressed in the container's own frame — so the container\n * keeps the authored envelope instead. Making it track its members again needs\n * its own decision; see the group-as-frame design doc.\n */\nexport const groupAction: Action & { requires: string[] } = {\n id: 'group',\n label: 'Group',\n icon: createElement(GroupIcon),\n group: 'structure',\n defaultBinding: { kind: 'key', key: 'g', mods: { mod: true } },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection', 'applyOps', 'poseDescriptor', 'poseComposition'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n\n const ids = selection.get();\n if (ids.length === 0) return;\n\n // Resolve nodes; drop any that have gone missing.\n const nodes = ids\n .map((id) => scene.get(id as NodeId))\n .filter((n): n is NonNullable<typeof n> => n !== undefined);\n if (nodes.length === 0) return;\n\n // Members must share a layer — containers live on a single layer.\n const layers = new Set(nodes.map((n) => n.layer));\n if (layers.size > 1) return;\n const layer = nodes[0]!.layer;\n\n // Nest under the shared parent if the members agree, else at the root.\n const parents = new Set(nodes.map((n) => n.parent));\n const parent = parents.size === 1 ? nodes[0]!.parent : null;\n\n // The container takes the world envelope of its members' ink. The\n // authored pose is only the fallback (an emptied group, a lost registry\n // key); under identity the derived union is what the scene shows.\n const d = poseDescriptorOf(deps.poseDescriptor);\n const frame = scenePoseFrame(scene, deps.poseComposition);\n const worlds = new Map<NodeId, unknown>();\n for (const node of nodes) worlds.set(node.id, frame.world(node.id));\n // Visual, not stored, bounds: a turned member's ink reaches outside its\n // own box, and the container has to cover what is drawn.\n const union = unionBounds([...worlds.values()].map((p) => visualBoundsViaDescriptor(p, d)));\n const containerWorldPose = union === null\n ? nodes[0]!.pose\n : d.fromBounds(union, nodes[0]!.pose);\n const pose = frame.localUnder(parent, containerWorldPose);\n // Under identity the container is an envelope that tracks its members;\n // under a composing strategy it is a frame they are re-expressed in.\n const absolutePoses = frame.pc.closure === 'identity';\n const derive = scene.registry.derivePose?.[UNION_OF_CHILDREN] ?? unionOfChildren;\n\n // Build ops mirroring the old direct mutations, in the same order the\n // `scene.batch('Group', …)` body produced them:\n // 1. insert the fresh container, under an id minted first so the\n // insert op carries a whole node;\n // 2. reparent each selected id under the new container, in selection\n // order, capturing each node's PRE-mutation parent as `from`\n // (the op captures the sibling slot itself, on apply).\n // The container must exist before any child reparents into it, so the\n // insert op is emitted first. A member's pose then follows its reparent,\n // re-expressed in the container's frame so the member does not move.\n const containerId = scene.mintId();\n const ops: Op[] = [\n createInsertOp<Node<unknown, string, unknown>>({\n node: {\n id: containerId,\n kind: 'container',\n layer,\n pose: pose as unknown,\n data: {} as unknown,\n parent: parent ?? null,\n ...(absolutePoses ? { dependsOn: 'children', derivePose: derive } : {}),\n } as Node<unknown, string, unknown>,\n label: 'Group',\n }),\n ];\n for (const node of nodes) {\n ops.push(createReparentOp({\n id: node.id as string,\n fromParentId: (node.parent ?? null) as string | null,\n toParentId: containerId as string,\n label: 'Group',\n }));\n if (absolutePoses) continue;\n ops.push(createTransformOp<unknown>({\n id: node.id as string,\n from: node.pose,\n to: frame.pc.decompose(containerWorldPose, worlds.get(node.id)!),\n label: 'Group',\n }));\n }\n\n // Route the batch through the consumer `applyOps` hook when present (so\n // an app with its own history captures the group as a single undo\n // entry); otherwise commit straight to the scene's own history via\n // `scene.applyBatch`. One applyOps / applyBatch call = one undo entry,\n // matching the prior single `scene.batch('Group', …)`.\n if (applyOps) applyOps(ops, 'Group');\n else scene.applyBatch(ops, 'Group', defaultCommitAdapter(scene, selection.adapterMethods));\n\n // Selection update is selection state, not a scene op — set it after the\n // commit regardless of which path ran (the old code set it inside the\n // batch; it was never an undoable scene mutation).\n selection.set([containerId]);\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Static descriptor for the `ungroup` Action.\n *\n * \"Group\" here means a structural `ContainerNode`. `run` dissolves each\n * selected container by reparenting its children up to the container's own\n * parent (preserving z-order) and removing the now-empty container, as a single\n * undoable batch. Selected non-container nodes are ignored. The freed children\n * become the new selection.\n *\n * A child's pose is expressed in the container's frame, so each one is\n * re-expressed in the frame it lands in and nothing moves on screen.\n */\nexport const ungroupAction: Action & { requires: string[] } = {\n id: 'ungroup',\n label: 'Ungroup',\n icon: createElement(UngroupIcon),\n group: 'structure',\n defaultBinding: { kind: 'key', key: 'g', mods: { mod: true, shift: true } },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection', 'poseComposition'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n if (!selection || !scene) return;\n\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const containers = ids.filter((id) => scene.get(id as NodeId)?.kind === 'container');\n if (containers.length === 0) return;\n\n const frame = scenePoseFrame(scene, deps.poseComposition);\n const absolutePoses = frame.pc.closure === 'identity';\n\n scene.batch('Ungroup', () => {\n const freed: NodeId[] = [];\n for (const containerId of containers) {\n const container = scene.get(containerId as NodeId);\n if (!container || container.kind !== 'container') continue;\n\n const parent = container.parent ?? null;\n const baseIndex =\n parent === null\n ? scene.roots.indexOf(containerId as NodeId)\n : scene.childrenOf(parent).indexOf(containerId as NodeId);\n\n const children = [...scene.childrenOf(containerId as NodeId)];\n // Read every world pose before the first move: the frame resolves\n // through the live scene, and the container is about to leave it.\n const worlds = new Map<NodeId, unknown>();\n if (!absolutePoses) {\n for (const childId of children) worlds.set(childId, frame.world(childId));\n }\n children.forEach((childId, i) => {\n scene.move(childId, parent, baseIndex < 0 ? undefined : baseIndex + i);\n if (!absolutePoses) {\n scene.setPose(childId, frame.localUnder(parent, worlds.get(childId)!) as never);\n }\n freed.push(childId);\n });\n\n scene.remove(containerId as NodeId);\n }\n selection.set(freed);\n });\n },\n },\n enabled: (deps) => {\n const selection = deps?.selection;\n const scene = deps?.scene;\n const any = selection?.get().some((id) => scene?.get(id as NodeId)?.kind === 'container');\n return any ? true : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"group.js","names":["groupAction","createElement","GroupIcon","selection","deps","scene","applyOps","ids","nodes","id","n","layer","parent","d","poseDescriptorOf","frame","scenePoseFrame","worlds","node","union","unionBounds","visualBoundsViaDescriptor","p","containerWorldPose","pose","absolutePoses","derive","UNION_OF_CHILDREN","unionOfChildren","containerId","ops","createInsertOp","createReparentOp","createTransformOp","defaultCommitAdapter","requiresSelection","ungroupAction","UngroupIcon","containers","freed","container","baseIndex","children","childId","i","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/group.ts"],"sourcesContent":["import type { Node, NodeId } from 'core/scene/types';\nimport { createElement } from 'react';\nimport { GroupIcon, UngroupIcon } from './icons/editIcons';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { createReparentOp } from 'core/ops/reparent';\nimport { unionBounds } from 'core/geometry/unionBounds';\nimport { unionOfChildren, UNION_OF_CHILDREN } from 'core/scene/kitRegistry';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { visualBoundsViaDescriptor } from '../resize/geometry';\nimport { createTransformOp } from 'core/ops/transform';\nimport { ActionDisabledReason, type Action } from '@weasel-js/routing';\nimport { requiresSelection } from './requiresSelection';\nimport { scenePoseFrame } from '../poseFrame';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\n/**\n * @experimental\n * Creates a structural `ContainerNode` and reparents the current selection\n * under it as a single undoable batch.\n *\n * Grouping never moves a member on screen. The container takes the world\n * envelope of its members' ink; each member is then re-expressed in that\n * container's frame, which is a no-op only when the scene composes poses by\n * identity.\n *\n * Under identity the container's pose is also *derived* from its members, so\n * it tracks one that moves later. Under any other composition that derivation\n * is circular — the members' poses are expressed in the container's own\n * frame — so the container keeps the authored envelope instead.\n */\nexport const groupAction: Action & { requires: string[] } = {\n id: 'group',\n label: 'Group',\n icon: createElement(GroupIcon),\n group: 'structure',\n defaultBinding: { kind: 'key', key: 'g', mods: { mod: true } },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection', 'applyOps', 'poseDescriptor'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n const applyOps = deps.applyOps;\n if (!selection || !scene) return;\n\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const nodes = ids\n .map((id) => scene.get(id as NodeId))\n .filter((n): n is NonNullable<typeof n> => n !== undefined);\n if (nodes.length === 0) return;\n\n // Members must share a layer — containers live on a single layer.\n const layers = new Set(nodes.map((n) => n.layer));\n if (layers.size > 1) return;\n const layer = nodes[0]!.layer;\n\n // Nest under the shared parent if the members agree, else at the root.\n const parents = new Set(nodes.map((n) => n.parent));\n const parent = parents.size === 1 ? nodes[0]!.parent : null;\n\n // Under identity the authored pose is only the fallback (an emptied\n // group, a lost registry key); the derived union is what the scene shows.\n const d = poseDescriptorOf(deps.poseDescriptor);\n const frame = scenePoseFrame(scene);\n const worlds = new Map<NodeId, unknown>();\n for (const node of nodes) worlds.set(node.id, frame.world(node.id));\n // Visual, not stored, bounds: a turned member's ink reaches outside its\n // own box, and the container has to cover what is drawn.\n const union = unionBounds([...worlds.values()].map((p) => visualBoundsViaDescriptor(p, d)));\n const containerWorldPose = union === null\n ? nodes[0]!.pose\n : d.fromBounds(union, nodes[0]!.pose);\n const pose = frame.localUnder(parent, containerWorldPose);\n const absolutePoses = frame.pc.closure === 'identity';\n const derive = scene.registry.derivePose?.[UNION_OF_CHILDREN] ?? unionOfChildren;\n\n // The container must exist before any child reparents into it, so the\n // insert op is emitted first.\n const containerId = scene.mintId();\n const ops: Op[] = [\n createInsertOp<Node<unknown, string, unknown>>({\n node: {\n id: containerId,\n kind: 'container',\n layer,\n pose: pose as unknown,\n data: {} as unknown,\n parent: parent ?? null,\n ...(absolutePoses ? { dependsOn: 'children', derivePose: derive } : {}),\n } as Node<unknown, string, unknown>,\n label: 'Group',\n }),\n ];\n for (const node of nodes) {\n ops.push(createReparentOp({\n id: node.id as string,\n fromParentId: (node.parent ?? null) as string | null,\n toParentId: containerId as string,\n label: 'Group',\n }));\n if (absolutePoses) continue;\n ops.push(createTransformOp<unknown>({\n id: node.id as string,\n from: node.pose,\n to: frame.pc.decompose(containerWorldPose, worlds.get(node.id)!),\n label: 'Group',\n }));\n }\n\n if (applyOps) applyOps(ops, 'Group');\n else scene.applyBatch(ops, 'Group', defaultCommitAdapter(scene, selection.adapterMethods));\n\n selection.set([containerId]);\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Dissolves each selected container by reparenting its children up to the\n * container's own parent (preserving z-order) and removing the now-empty\n * container, as a single undoable batch. Selected non-container nodes are\n * ignored. The freed children become the new selection, and nothing moves on\n * screen.\n */\nexport const ungroupAction: Action & { requires: string[] } = {\n id: 'ungroup',\n label: 'Ungroup',\n icon: createElement(UngroupIcon),\n group: 'structure',\n defaultBinding: { kind: 'key', key: 'g', mods: { mod: true, shift: true } },\n eligible: { capability: 'edits-page' },\n requires: ['scene', 'selection'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const selection = deps.selection;\n const scene = deps.scene;\n if (!selection || !scene) return;\n\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const containers = ids.filter((id) => scene.get(id as NodeId)?.kind === 'container');\n if (containers.length === 0) return;\n\n const frame = scenePoseFrame(scene);\n const absolutePoses = frame.pc.closure === 'identity';\n\n scene.batch('Ungroup', () => {\n const freed: NodeId[] = [];\n for (const containerId of containers) {\n const container = scene.get(containerId as NodeId);\n if (!container || container.kind !== 'container') continue;\n\n const parent = container.parent ?? null;\n const baseIndex =\n parent === null\n ? scene.roots.indexOf(containerId as NodeId)\n : scene.childrenOf(parent).indexOf(containerId as NodeId);\n\n const children = [...scene.childrenOf(containerId as NodeId)];\n // Read every world pose before the first move: the frame resolves\n // through the live scene, and the container is about to leave it.\n const worlds = new Map<NodeId, unknown>();\n if (!absolutePoses) {\n for (const childId of children) worlds.set(childId, frame.world(childId));\n }\n children.forEach((childId, i) => {\n scene.move(childId, parent, baseIndex < 0 ? undefined : baseIndex + i);\n if (!absolutePoses) {\n scene.setPose(childId, frame.localUnder(parent, worlds.get(childId)!) as never);\n }\n freed.push(childId);\n });\n\n scene.remove(containerId as NodeId);\n }\n selection.set(freed);\n });\n },\n },\n enabled: (deps) => {\n const selection = deps?.selection;\n const scene = deps?.scene;\n const any = selection?.get().some((id) => scene?.get(id as NodeId)?.kind === 'container');\n return any ? true : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":"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"}
@@ -165,7 +165,30 @@ function c() {
165
165
  ]
166
166
  });
167
167
  }
168
+ function l() {
169
+ return /* @__PURE__ */ t("svg", {
170
+ ...n,
171
+ children: [/* @__PURE__ */ e("path", {
172
+ d: "M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z",
173
+ strokeLinejoin: "round"
174
+ }), /* @__PURE__ */ e("circle", {
175
+ cx: "13",
176
+ cy: "10",
177
+ r: "5",
178
+ fill: "currentColor"
179
+ })]
180
+ });
181
+ }
182
+ function u() {
183
+ return /* @__PURE__ */ e("svg", {
184
+ ...n,
185
+ children: /* @__PURE__ */ e("path", {
186
+ d: "M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 1 0 10 6 Z",
187
+ strokeLinejoin: "round"
188
+ })
189
+ });
190
+ }
168
191
  //#endregion
169
- export { c as CropIcon, s as DivideIcon, o as ExcludeIcon, i as IntersectIcon, a as SubtractIcon, r as UnionIcon };
192
+ export { c as CropIcon, s as DivideIcon, o as ExcludeIcon, i as IntersectIcon, u as MergeIcon, a as SubtractIcon, l as TrimIcon, r as UnionIcon };
170
193
 
171
194
  //# sourceMappingURL=booleanIcons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"booleanIcons.js","names":["SVG_BASE","UnionIcon","IntersectIcon","SubtractIcon","ExcludeIcon","DivideIcon","CropIcon"],"sources":["../../../../../src/interactions/actions/defaults/icons/booleanIcons.tsx"],"sourcesContent":["/**\n * Default boolean-op (Pathfinder) icons shipped with `defaultBooleanActions`.\n * Lifted verbatim from `apps/draw`'s `<PathfinderPanel>` so\n * consumers get a working icon set without having to author or import their\n * own. 20x20 viewBox, `currentColor` so theming is via CSS.\n */\nconst SVG_BASE = {\n viewBox: '0 0 20 20',\n width: 20,\n height: 20,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n 'aria-hidden': true,\n};\n\n/**\n * Icon for the union operation: two overlapping circles merged into one filled shape.\n *\n * @experimental\n */\nexport function UnionIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n </svg>\n );\n}\n\n/**\n * Icon for the intersect operation: only the overlap of two circles filled.\n *\n * @experimental\n */\nexport function IntersectIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 0 1 10 14 A 5 5 0 0 1 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the subtract operation: the front circle removed from the back one.\n *\n * @experimental\n */\nexport function SubtractIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the exclude operation: both circles filled except their overlap.\n *\n * @experimental\n */\nexport function ExcludeIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z M 10 6 A 5 5 0 1 1 10 14 A 5 5 0 0 1 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the divide operation: two circles split into their separate regions.\n *\n * @experimental\n */\nexport function DivideIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\n/**\n * Icon for the crop operation: the back shape clipped to the front one.\n *\n * @experimental\n */\nexport function CropIcon() {\n // Back circle clipped to a topmost rect mask — only the portion of the\n // circle inside the rect is filled; the rect is outlined on top.\n return (\n <svg {...SVG_BASE}>\n <defs>\n <clipPath id=\"weasel-default-crop-mask\">\n <rect x=\"9\" y=\"5\" width=\"8\" height=\"10\" />\n </clipPath>\n </defs>\n <circle cx=\"9\" cy=\"10\" r=\"5\" />\n <circle\n cx=\"9\"\n cy=\"10\"\n r=\"5\"\n fill=\"currentColor\"\n stroke=\"none\"\n clipPath=\"url(#weasel-default-crop-mask)\"\n />\n <rect x=\"9\" y=\"5\" width=\"8\" height=\"10\" />\n </svg>\n );\n}\n"],"mappings":";;AAMA,IAAMA,IAAW;CACf,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,aAAa;CACb,eAAe;AACjB;AAOA,SAAgBC,IAAY;CAC1B,OACE,kBAAC,OAAD;EAAK,GAAID;EAAT,UAAA;GACE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;IAAI,MAAK;IAAe,QAAO;GAAQ,CAAA;GAChE,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAI,MAAK;IAAe,QAAO;GAAQ,CAAA;GACjE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAK,CAAA;EAC5B;;AAET;AAOA,SAAgBE,IAAgB;CAC9B,OACE,kBAAC,OAAD;EAAK,GAAIF;EAAT,UAAA;GACE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAK,CAAA;GAC/B,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,QAAO;GACR,CAAA;EACE;;AAET;AAOA,SAAgBG,IAAe;CAC7B,OACE,kBAAC,OAAD;EAAK,GAAIH;EAAT,UAAA;GACE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAK,CAAA;GAC/B,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,QAAO;GACR,CAAA;EACE;;AAET;AAOA,SAAgBI,IAAc;CAC5B,OACE,kBAAC,OAAD;EAAK,GAAIJ;EAAT,UAAA;GACE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAK,CAAA;GAC/B,kBAAC,QAAD;IACE,GAAE;IACF,MAAK;IACL,QAAO;IACP,UAAS;GACV,CAAA;EACE;;AAET;AAOA,SAAgBK,IAAa;CAC3B,OACE,kBAAC,OAAD;EAAK,GAAIL;EAAT,UAAA;GACE,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;GAAK,CAAA;GAC/B,kBAAC,QAAD;IAAM,IAAG;IAAK,IAAG;IAAI,IAAG;IAAK,IAAG;GAAM,CAAA;EACnC;;AAET;AAOA,SAAgBM,IAAW;CAGzB,OACE,kBAAC,OAAD;EAAK,GAAIN;EAAT,UAAA;GACE,kBAAC,QAAD,EAAA,UACE,kBAAC,YAAD;IAAU,IAAG;IACX,UAAA,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAI,QAAO;IAAM,CAAA;GACjC,CAAA,EACN,CAAA;GACN,kBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;GAAK,CAAA;GAC9B,kBAAC,UAAD;IACE,IAAG;IACH,IAAG;IACH,GAAE;IACF,MAAK;IACL,QAAO;IACP,UAAS;GACV,CAAA;GACD,kBAAC,QAAD;IAAM,GAAE;IAAI,GAAE;IAAI,OAAM;IAAI,QAAO;GAAM,CAAA;EACtC;;AAET"}
1
+ {"version":3,"file":"booleanIcons.js","names":["SVG_BASE","UnionIcon","IntersectIcon","SubtractIcon","ExcludeIcon","DivideIcon","CropIcon","TrimIcon","MergeIcon"],"sources":["../../../../../src/interactions/actions/defaults/icons/booleanIcons.tsx"],"sourcesContent":["/**\n * Default boolean-op (Pathfinder) icons shipped with `defaultBooleanActions`.\n * Lifted verbatim from `apps/draw`'s `<PathfinderPanel>` so\n * consumers get a working icon set without having to author or import their\n * own. 20x20 viewBox, `currentColor` so theming is via CSS.\n */\nconst SVG_BASE = {\n viewBox: '0 0 20 20',\n width: 20,\n height: 20,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n 'aria-hidden': true,\n};\n\n/**\n * Icon for the union operation: two overlapping circles merged into one filled shape.\n *\n * @experimental\n */\nexport function UnionIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n </svg>\n );\n}\n\n/**\n * Icon for the intersect operation: only the overlap of two circles filled.\n *\n * @experimental\n */\nexport function IntersectIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 0 1 10 14 A 5 5 0 0 1 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the subtract operation: the front circle removed from the back one.\n *\n * @experimental\n */\nexport function SubtractIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the exclude operation: both circles filled except their overlap.\n *\n * @experimental\n */\nexport function ExcludeIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <path\n d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z M 10 6 A 5 5 0 1 1 10 14 A 5 5 0 0 1 10 6 Z\"\n fill=\"currentColor\"\n stroke=\"none\"\n fillRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * Icon for the divide operation: two circles split into their separate regions.\n *\n * @experimental\n */\nexport function DivideIcon() {\n return (\n <svg {...SVG_BASE}>\n <circle cx=\"7\" cy=\"10\" r=\"5\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" />\n <line x1=\"10\" y1=\"6\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\n/**\n * Icon for the crop operation: the back shape clipped to the front one.\n *\n * @experimental\n */\nexport function CropIcon() {\n // Back circle clipped to a topmost rect mask — only the portion of the\n // circle inside the rect is filled; the rect is outlined on top.\n return (\n <svg {...SVG_BASE}>\n <defs>\n <clipPath id=\"weasel-default-crop-mask\">\n <rect x=\"9\" y=\"5\" width=\"8\" height=\"10\" />\n </clipPath>\n </defs>\n <circle cx=\"9\" cy=\"10\" r=\"5\" />\n <circle\n cx=\"9\"\n cy=\"10\"\n r=\"5\"\n fill=\"currentColor\"\n stroke=\"none\"\n clipPath=\"url(#weasel-default-crop-mask)\"\n />\n <rect x=\"9\" y=\"5\" width=\"8\" height=\"10\" />\n </svg>\n );\n}\n\n/**\n * Icon for the trim operation: the back circle cut back to what the front one\n * leaves showing, the front one whole.\n *\n * @experimental\n */\nexport function TrimIcon() {\n return (\n <svg {...SVG_BASE}>\n <path d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 0 0 10 6 Z\" strokeLinejoin=\"round\" />\n <circle cx=\"13\" cy=\"10\" r=\"5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\n/**\n * Icon for the merge operation: two circles as the one outline they share.\n *\n * @experimental\n */\nexport function MergeIcon() {\n return (\n <svg {...SVG_BASE}>\n <path d=\"M 10 6 A 5 5 0 1 0 10 14 A 5 5 0 1 0 10 6 Z\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n"],"mappings":"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"}
@@ -47,7 +47,45 @@ function r() {
47
47
  })]
48
48
  });
49
49
  }
50
+ function i() {
51
+ return /* @__PURE__ */ t("svg", {
52
+ ...n,
53
+ children: [/* @__PURE__ */ e("path", {
54
+ d: "M4 4 A12 12 0 0 1 16 16 H10 A6 6 0 0 0 4 10 Z",
55
+ strokeLinejoin: "miter"
56
+ }), /* @__PURE__ */ t("g", {
57
+ fill: "currentColor",
58
+ stroke: "none",
59
+ children: [
60
+ /* @__PURE__ */ e("rect", {
61
+ x: "2.5",
62
+ y: "2.5",
63
+ width: "3",
64
+ height: "3"
65
+ }),
66
+ /* @__PURE__ */ e("rect", {
67
+ x: "14.5",
68
+ y: "14.5",
69
+ width: "3",
70
+ height: "3"
71
+ }),
72
+ /* @__PURE__ */ e("rect", {
73
+ x: "8.5",
74
+ y: "14.5",
75
+ width: "3",
76
+ height: "3"
77
+ }),
78
+ /* @__PURE__ */ e("rect", {
79
+ x: "2.5",
80
+ y: "8.5",
81
+ width: "3",
82
+ height: "3"
83
+ })
84
+ ]
85
+ })]
86
+ });
87
+ }
50
88
  //#endregion
51
- export { r as CreateOutlinesIcon };
89
+ export { r as CreateOutlinesIcon, i as OutlineStrokeIcon };
52
90
 
53
91
  //# sourceMappingURL=outlineIcons.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"outlineIcons.js","names":["SVG_BASE","CreateOutlinesIcon"],"sources":["../../../../../src/interactions/actions/defaults/icons/outlineIcons.tsx"],"sourcesContent":["/**\n * Icon for the Create Outlines action, in the register of the Pathfinder icons\n * beside it: 20x20 viewBox, stroked in `currentColor`.\n */\nconst SVG_BASE = {\n viewBox: '0 0 20 20',\n width: 20,\n height: 20,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n 'aria-hidden': true,\n};\n\n/**\n * Create Outlines: a letter T drawn as its outline, with anchor squares on\n * its corners — type turned into editable geometry.\n *\n * @experimental\n */\nexport function CreateOutlinesIcon() {\n return (\n <svg {...SVG_BASE}>\n <path d=\"M3.5 3.5 H16.5 V7.5 H12 V16.5 H8 V7.5 H3.5 Z\" strokeLinejoin=\"miter\" />\n <g fill=\"currentColor\" stroke=\"none\">\n <rect x=\"2\" y=\"2\" width=\"3\" height=\"3\" />\n <rect x=\"15\" y=\"2\" width=\"3\" height=\"3\" />\n <rect x=\"6.5\" y=\"15\" width=\"3\" height=\"3\" />\n <rect x=\"10.5\" y=\"15\" width=\"3\" height=\"3\" />\n </g>\n </svg>\n );\n}\n"],"mappings":";;AAIA,IAAMA,IAAW;CACf,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,aAAa;CACb,eAAe;AACjB;AAQA,SAAgBC,IAAqB;CACnC,OACE,kBAAC,OAAD;EAAK,GAAID;EAAT,UAAA,CACE,kBAAC,QAAD;GAAM,GAAE;GAA+C,gBAAe;EAAS,CAAA,GAC/E,kBAAC,KAAD;GAAG,MAAK;GAAe,QAAO;GAA9B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAI,QAAO;IAAK,CAAA;IACxC,kBAAC,QAAD;KAAM,GAAE;KAAK,GAAE;KAAI,OAAM;KAAI,QAAO;IAAK,CAAA;IACzC,kBAAC,QAAD;KAAM,GAAE;KAAM,GAAE;KAAK,OAAM;KAAI,QAAO;IAAK,CAAA;IAC3C,kBAAC,QAAD;KAAM,GAAE;KAAO,GAAE;KAAK,OAAM;KAAI,QAAO;IAAK,CAAA;GAC3C;EACA,CAAA,CAAA;;AAET"}
1
+ {"version":3,"file":"outlineIcons.js","names":["SVG_BASE","CreateOutlinesIcon","OutlineStrokeIcon"],"sources":["../../../../../src/interactions/actions/defaults/icons/outlineIcons.tsx"],"sourcesContent":["/**\n * Icons for the outline actions, in the register of the Pathfinder icons\n * beside them: 20x20 viewBox, stroked in `currentColor`.\n */\nconst SVG_BASE = {\n viewBox: '0 0 20 20',\n width: 20,\n height: 20,\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.5,\n 'aria-hidden': true,\n};\n\n/**\n * Create Outlines: a letter T drawn as its outline, with anchor squares on\n * its corners — type turned into editable geometry.\n *\n * @experimental\n */\nexport function CreateOutlinesIcon() {\n return (\n <svg {...SVG_BASE}>\n <path d=\"M3.5 3.5 H16.5 V7.5 H12 V16.5 H8 V7.5 H3.5 Z\" strokeLinejoin=\"miter\" />\n <g fill=\"currentColor\" stroke=\"none\">\n <rect x=\"2\" y=\"2\" width=\"3\" height=\"3\" />\n <rect x=\"15\" y=\"2\" width=\"3\" height=\"3\" />\n <rect x=\"6.5\" y=\"15\" width=\"3\" height=\"3\" />\n <rect x=\"10.5\" y=\"15\" width=\"3\" height=\"3\" />\n </g>\n </svg>\n );\n}\n\n/**\n * Outline Stroke: a thick curved stroke drawn as its outline, with anchor\n * squares on its corners.\n *\n * @experimental\n */\nexport function OutlineStrokeIcon() {\n return (\n <svg {...SVG_BASE}>\n <path d=\"M4 4 A12 12 0 0 1 16 16 H10 A6 6 0 0 0 4 10 Z\" strokeLinejoin=\"miter\" />\n <g fill=\"currentColor\" stroke=\"none\">\n <rect x=\"2.5\" y=\"2.5\" width=\"3\" height=\"3\" />\n <rect x=\"14.5\" y=\"14.5\" width=\"3\" height=\"3\" />\n <rect x=\"8.5\" y=\"14.5\" width=\"3\" height=\"3\" />\n <rect x=\"2.5\" y=\"8.5\" width=\"3\" height=\"3\" />\n </g>\n </svg>\n );\n}\n"],"mappings":";;AAIA,IAAMA,IAAW;CACf,SAAS;CACT,OAAO;CACP,QAAQ;CACR,MAAM;CACN,QAAQ;CACR,aAAa;CACb,eAAe;AACjB;AAQA,SAAgBC,IAAqB;CACnC,OACE,kBAAC,OAAD;EAAK,GAAID;EAAT,UAAA,CACE,kBAAC,QAAD;GAAM,GAAE;GAA+C,gBAAe;EAAS,CAAA,GAC/E,kBAAC,KAAD;GAAG,MAAK;GAAe,QAAO;GAA9B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAI,GAAE;KAAI,OAAM;KAAI,QAAO;IAAK,CAAA;IACxC,kBAAC,QAAD;KAAM,GAAE;KAAK,GAAE;KAAI,OAAM;KAAI,QAAO;IAAK,CAAA;IACzC,kBAAC,QAAD;KAAM,GAAE;KAAM,GAAE;KAAK,OAAM;KAAI,QAAO;IAAK,CAAA;IAC3C,kBAAC,QAAD;KAAM,GAAE;KAAO,GAAE;KAAK,OAAM;KAAI,QAAO;IAAK,CAAA;GAC3C;EACA,CAAA,CAAA;;AAET;AAQA,SAAgBE,IAAoB;CAClC,OACE,kBAAC,OAAD;EAAK,GAAIF;EAAT,UAAA,CACE,kBAAC,QAAD;GAAM,GAAE;GAAgD,gBAAe;EAAS,CAAA,GAChF,kBAAC,KAAD;GAAG,MAAK;GAAe,QAAO;GAA9B,UAAA;IACE,kBAAC,QAAD;KAAM,GAAE;KAAM,GAAE;KAAM,OAAM;KAAI,QAAO;IAAK,CAAA;IAC5C,kBAAC,QAAD;KAAM,GAAE;KAAO,GAAE;KAAO,OAAM;KAAI,QAAO;IAAK,CAAA;IAC9C,kBAAC,QAAD;KAAM,GAAE;KAAM,GAAE;KAAO,OAAM;KAAI,QAAO;IAAK,CAAA;IAC7C,kBAAC,QAAD;KAAM,GAAE;KAAM,GAAE;KAAM,OAAM;KAAI,QAAO;IAAK,CAAA;GAC3C;EACA,CAAA,CAAA;;AAET"}
@@ -1,24 +1,25 @@
1
1
  import { defaultCommitAdapter as e } from "../defaultCommitAdapter.js";
2
- import { runIngest as t } from "../../../features/ingestion/contentHandlers.js";
2
+ import { couldClaim as t, runIngest as n } from "../../../features/ingestion/contentHandlers.js";
3
+ import { ActionDisabledReason as r } from "@weasel-js/routing";
3
4
  //#region src/interactions/actions/defaults/ingest.ts
4
- var n = {
5
+ var i = {
5
6
  alt: "optional",
6
7
  ctrl: "optional",
7
8
  meta: "optional",
8
9
  shift: "optional"
9
- }, r = [
10
+ }, a = [
10
11
  "scene",
11
12
  "selection",
12
13
  "insert",
13
14
  "applyOps",
14
15
  "ingestion"
15
16
  ];
16
- function i(n, r, i) {
17
+ function o(t, r, i) {
17
18
  let a = r?.items;
18
19
  if (!a || a.length === 0) return;
19
- let o = n.ingestion, s = n.insert, c = n.scene, l = n.selection;
20
+ let o = t.ingestion, s = t.insert, c = t.scene, l = t.selection;
20
21
  if (!o || !s || !c || !l) return;
21
- let u = n.applyOps, d = {
22
+ let u = t.applyOps, d = {
22
23
  point: typeof r?.worldX == "number" && typeof r?.worldY == "number" ? {
23
24
  x: r.worldX,
24
25
  y: r.worldY
@@ -33,28 +34,31 @@ function i(n, r, i) {
33
34
  resolveSrc: o.resolveSrc,
34
35
  svg: o.svg,
35
36
  clipboard: o.clipboard,
36
- deps: n
37
+ deps: t
37
38
  };
38
- t(a, d, i).catch((e) => console.warn("weasel ingest:", e));
39
+ n(a, d, i).catch((e) => console.warn("weasel ingest:", e));
39
40
  }
40
- var a = {
41
+ function s(e, n) {
42
+ return !e || t(e.items, n) ? !0 : r.NotApplicable;
43
+ }
44
+ var c = {
41
45
  id: "ingest",
42
46
  label: "Insert external content",
43
47
  defaultBinding: [{
44
48
  kind: "drop",
45
- mods: n
49
+ mods: i
46
50
  }, {
47
51
  kind: "paste",
48
- mods: n
52
+ mods: i
49
53
  }],
50
- requires: [...r],
54
+ requires: [...a],
51
55
  invoker: {
52
56
  timing: "immediate",
53
- run: (e, t) => i(e, t)
57
+ run: (e, t) => o(e, t)
54
58
  },
55
- enabled: () => !0
59
+ enabled: (e, t, n) => s(n)
56
60
  };
57
61
  //#endregion
58
- export { n as ANY_INGEST_MODS, r as INGEST_REQUIRES, a as ingestAction, i as ingestFromEvent };
62
+ export { i as ANY_INGEST_MODS, a as INGEST_REQUIRES, s as claimable, c as ingestAction, o as ingestFromEvent };
59
63
 
60
64
  //# sourceMappingURL=ingest.js.map