@weasel-js/core 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1005) hide show
  1. package/CHANGELOG.md +1006 -0
  2. package/README.md +28 -9
  3. package/dist/WeaselProvider.js +15 -0
  4. package/dist/WeaselProvider.js.map +1 -0
  5. package/dist/affordances/composeAffordanceLayer.js +224 -0
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -0
  7. package/dist/affordances/cornerResize.js +69 -0
  8. package/dist/affordances/cornerResize.js.map +1 -0
  9. package/dist/affordances/hitAffordanceRegions.js +138 -0
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -0
  11. package/dist/affordances/pathAnchors.js +66 -0
  12. package/dist/affordances/pathAnchors.js.map +1 -0
  13. package/dist/affordances/rotationHandle.js +103 -0
  14. package/dist/affordances/rotationHandle.js.map +1 -0
  15. package/dist/animation/behaviors/momentum.js +118 -0
  16. package/dist/animation/behaviors/momentum.js.map +1 -0
  17. package/dist/animation/colorHelpers.js +135 -0
  18. package/dist/animation/colorHelpers.js.map +1 -0
  19. package/dist/animation/colorRegistry.js +37 -0
  20. package/dist/animation/colorRegistry.js.map +1 -0
  21. package/dist/animation/index.js +20 -0
  22. package/dist/animation/loop.js +62 -0
  23. package/dist/animation/loop.js.map +1 -0
  24. package/dist/animation/observe.js +23 -0
  25. package/dist/animation/observe.js.map +1 -0
  26. package/dist/animation/poseHelpers.js +50 -0
  27. package/dist/animation/poseHelpers.js.map +1 -0
  28. package/dist/animation/reflow.js +121 -0
  29. package/dist/animation/reflow.js.map +1 -0
  30. package/dist/animation/rig/bindRig.js +74 -0
  31. package/dist/animation/rig/bindRig.js.map +1 -0
  32. package/dist/animation/rig/blendPoses.js +43 -0
  33. package/dist/animation/rig/blendPoses.js.map +1 -0
  34. package/dist/animation/rig/mirrorPose.js +19 -0
  35. package/dist/animation/rig/mirrorPose.js.map +1 -0
  36. package/dist/animation/rig/resolveSkeleton.js +33 -0
  37. package/dist/animation/rig/resolveSkeleton.js.map +1 -0
  38. package/dist/animation/rig/solveIk.js +103 -0
  39. package/dist/animation/rig/solveIk.js.map +1 -0
  40. package/dist/animation/rig/types.js +12 -0
  41. package/dist/animation/rig/types.js.map +1 -0
  42. package/dist/animation/rig/useRig.js +23 -0
  43. package/dist/animation/rig/useRig.js.map +1 -0
  44. package/dist/animation/slew.js +27 -0
  45. package/dist/animation/slew.js.map +1 -0
  46. package/dist/animation/stagger.js +138 -0
  47. package/dist/animation/stagger.js.map +1 -0
  48. package/dist/animation/timeline/booking.js +106 -0
  49. package/dist/animation/timeline/booking.js.map +1 -0
  50. package/dist/animation/timeline/createTimeline.js +116 -0
  51. package/dist/animation/timeline/createTimeline.js.map +1 -0
  52. package/dist/animation/timeline/sampleTrack.js +29 -0
  53. package/dist/animation/timeline/sampleTrack.js.map +1 -0
  54. package/dist/animation/useAnimator.js +329 -0
  55. package/dist/animation/useAnimator.js.map +1 -0
  56. package/dist/animation/wrappers/animateLifecycle.js +40 -0
  57. package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
  58. package/dist/animation/wrappers/animateOnSetPose.js +44 -0
  59. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
  60. package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
  61. package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
  62. package/dist/canvas/Canvas.js +608 -0
  63. package/dist/canvas/Canvas.js.map +1 -0
  64. package/dist/canvas/CanvasView.js +255 -0
  65. package/dist/canvas/CanvasView.js.map +1 -0
  66. package/dist/canvas/CursorCoordsHud.js +75 -0
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -0
  68. package/dist/canvas/DrawCanvas.js +67 -0
  69. package/dist/canvas/DrawCanvas.js.map +1 -0
  70. package/dist/canvas/MinimapCanvas.js +139 -0
  71. package/dist/canvas/MinimapCanvas.js.map +1 -0
  72. package/dist/canvas/ModalityHud.js +66 -0
  73. package/dist/canvas/ModalityHud.js.map +1 -0
  74. package/dist/canvas/NodeShape.js +391 -0
  75. package/dist/canvas/NodeShape.js.map +1 -0
  76. package/dist/canvas/PickHud.js +93 -0
  77. package/dist/canvas/PickHud.js.map +1 -0
  78. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
  79. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
  81. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
  83. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
  84. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
  85. package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
  91. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
  92. package/dist/canvas/SceneCanvas/features.js +97 -0
  93. package/dist/canvas/SceneCanvas/features.js.map +1 -0
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
  96. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
  97. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
  99. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
  101. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
  102. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
  103. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
  104. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
  105. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
  106. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
  107. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
  108. package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
  109. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
  110. package/dist/canvas/SceneCanvas.js +992 -0
  111. package/dist/canvas/SceneCanvas.js.map +1 -0
  112. package/dist/canvas/SceneViewCanvas.js +54 -0
  113. package/dist/canvas/SceneViewCanvas.js.map +1 -0
  114. package/dist/canvas/accentColor.js +9 -0
  115. package/dist/canvas/accentColor.js.map +1 -0
  116. package/dist/canvas/affordanceAt.js +63 -0
  117. package/dist/canvas/affordanceAt.js.map +1 -0
  118. package/dist/canvas/buildSceneTree.js +65 -0
  119. package/dist/canvas/buildSceneTree.js.map +1 -0
  120. package/dist/canvas/canvasRenderer.js +89 -0
  121. package/dist/canvas/canvasRenderer.js.map +1 -0
  122. package/dist/canvas/colorOverrides.js +16 -0
  123. package/dist/canvas/colorOverrides.js.map +1 -0
  124. package/dist/canvas/defaultDrawOne.js +43 -0
  125. package/dist/canvas/defaultDrawOne.js.map +1 -0
  126. package/dist/canvas/deps/areaSelect.js +19 -0
  127. package/dist/canvas/deps/areaSelect.js.map +1 -0
  128. package/dist/canvas/deps/debug.js +9 -0
  129. package/dist/canvas/deps/debug.js.map +1 -0
  130. package/dist/canvas/deps/dispatcher.js +11 -0
  131. package/dist/canvas/deps/dispatcher.js.map +1 -0
  132. package/dist/canvas/deps/editAnchors.js +101 -0
  133. package/dist/canvas/deps/editAnchors.js.map +1 -0
  134. package/dist/canvas/deps/geometryProjection.js +11 -0
  135. package/dist/canvas/deps/geometryProjection.js.map +1 -0
  136. package/dist/canvas/deps/hitTestArea.js +51 -0
  137. package/dist/canvas/deps/hitTestArea.js.map +1 -0
  138. package/dist/canvas/deps/ingestion.js +31 -0
  139. package/dist/canvas/deps/ingestion.js.map +1 -0
  140. package/dist/canvas/deps/insert.js +116 -0
  141. package/dist/canvas/deps/insert.js.map +1 -0
  142. package/dist/canvas/deps/lassoSelect.js +20 -0
  143. package/dist/canvas/deps/lassoSelect.js.map +1 -0
  144. package/dist/canvas/deps/layout.js +34 -0
  145. package/dist/canvas/deps/layout.js.map +1 -0
  146. package/dist/canvas/deps/nodeAtPoint.js +19 -0
  147. package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
  148. package/dist/canvas/deps/poseComposition.js +11 -0
  149. package/dist/canvas/deps/poseComposition.js.map +1 -0
  150. package/dist/canvas/deps/poseDescriptor.js +12 -0
  151. package/dist/canvas/deps/poseDescriptor.js.map +1 -0
  152. package/dist/canvas/deps/resizePolicy.js +35 -0
  153. package/dist/canvas/deps/resizePolicy.js.map +1 -0
  154. package/dist/canvas/deps/slice.js +99 -0
  155. package/dist/canvas/deps/slice.js.map +1 -0
  156. package/dist/canvas/deps/snap.js +11 -0
  157. package/dist/canvas/deps/snap.js.map +1 -0
  158. package/dist/canvas/deps/textEdit.js +21 -0
  159. package/dist/canvas/deps/textEdit.js.map +1 -0
  160. package/dist/canvas/deps/view.js +43 -0
  161. package/dist/canvas/deps/view.js.map +1 -0
  162. package/dist/canvas/derivedPath.js +47 -0
  163. package/dist/canvas/derivedPath.js.map +1 -0
  164. package/dist/canvas/drawEnvelope.js +22 -0
  165. package/dist/canvas/drawEnvelope.js.map +1 -0
  166. package/dist/canvas/getNodeAtPoint.js +18 -0
  167. package/dist/canvas/getNodeAtPoint.js.map +1 -0
  168. package/dist/canvas/hostAnchor.js +29 -0
  169. package/dist/canvas/hostAnchor.js.map +1 -0
  170. package/dist/canvas/hud.module.js +18 -0
  171. package/dist/canvas/hud.module.js.map +1 -0
  172. package/dist/canvas/insertPreviewExtent.js +103 -0
  173. package/dist/canvas/insertPreviewExtent.js.map +1 -0
  174. package/dist/canvas/kitRequirements.js +177 -0
  175. package/dist/canvas/kitRequirements.js.map +1 -0
  176. package/dist/canvas/layerOrder.js +66 -0
  177. package/dist/canvas/layerOrder.js.map +1 -0
  178. package/dist/canvas/layerSlots.js +14 -0
  179. package/dist/canvas/layerSlots.js.map +1 -0
  180. package/dist/canvas/minimapMath.js +80 -0
  181. package/dist/canvas/minimapMath.js.map +1 -0
  182. package/dist/canvas/mountedCanvases.js +20 -0
  183. package/dist/canvas/mountedCanvases.js.map +1 -0
  184. package/dist/canvas/overlayRoleStrokes.js +17 -0
  185. package/dist/canvas/overlayRoleStrokes.js.map +1 -0
  186. package/dist/canvas/paintCull.js +20 -0
  187. package/dist/canvas/paintCull.js.map +1 -0
  188. package/dist/canvas/pickWalk.js +158 -0
  189. package/dist/canvas/pickWalk.js.map +1 -0
  190. package/dist/canvas/planeClips.js +30 -0
  191. package/dist/canvas/planeClips.js.map +1 -0
  192. package/dist/canvas/poseRotation.js +35 -0
  193. package/dist/canvas/poseRotation.js.map +1 -0
  194. package/dist/canvas/rasterToPng.js +21 -0
  195. package/dist/canvas/rasterToPng.js.map +1 -0
  196. package/dist/canvas/renderDebugSnapshot.js +32 -0
  197. package/dist/canvas/renderDebugSnapshot.js.map +1 -0
  198. package/dist/canvas/renderNeeds.js +25 -0
  199. package/dist/canvas/renderNeeds.js.map +1 -0
  200. package/dist/canvas/renderSceneToPixels.js +143 -0
  201. package/dist/canvas/renderSceneToPixels.js.map +1 -0
  202. package/dist/canvas/sceneAdapter.js +270 -0
  203. package/dist/canvas/sceneAdapter.js.map +1 -0
  204. package/dist/canvas/sceneLayerPaint.js +37 -0
  205. package/dist/canvas/sceneLayerPaint.js.map +1 -0
  206. package/dist/canvas/sceneSlotWiring.js +20 -0
  207. package/dist/canvas/sceneSlotWiring.js.map +1 -0
  208. package/dist/canvas/sceneViewRender.js +72 -0
  209. package/dist/canvas/sceneViewRender.js.map +1 -0
  210. package/dist/canvas/slopsDebugLayer.js +61 -0
  211. package/dist/canvas/slopsDebugLayer.js.map +1 -0
  212. package/dist/canvas/surfaceContribution.js +15 -0
  213. package/dist/canvas/surfaceContribution.js.map +1 -0
  214. package/dist/canvas/toolPreview.js +39 -0
  215. package/dist/canvas/toolPreview.js.map +1 -0
  216. package/dist/canvas/useCanvasRenderer.js +11 -0
  217. package/dist/canvas/useCanvasRenderer.js.map +1 -0
  218. package/dist/canvas/useFrameLoop.js +60 -0
  219. package/dist/canvas/useFrameLoop.js.map +1 -0
  220. package/dist/canvas/useHostAnchor.js +71 -0
  221. package/dist/canvas/useHostAnchor.js.map +1 -0
  222. package/dist/canvas/useLateContentRedraw.js +21 -0
  223. package/dist/canvas/useLateContentRedraw.js.map +1 -0
  224. package/dist/canvas/useRedrawOn.js +21 -0
  225. package/dist/canvas/useRedrawOn.js.map +1 -0
  226. package/dist/canvas/useViewHelpers.js +120 -0
  227. package/dist/canvas/useViewHelpers.js.map +1 -0
  228. package/dist/canvas/viewInputs.js +17 -0
  229. package/dist/canvas/viewInputs.js.map +1 -0
  230. package/dist/canvas/viewRegistry.js +61 -0
  231. package/dist/canvas/viewRegistry.js.map +1 -0
  232. package/dist/canvas/wrapNodeOutput.js +14 -0
  233. package/dist/canvas/wrapNodeOutput.js.map +1 -0
  234. package/dist/clipboard.d.ts +10 -5
  235. package/dist/clipboard.js +3 -5
  236. package/dist/clone.d.ts +3 -3
  237. package/dist/clone.js +2 -5
  238. package/dist/core/adapters/arrayAdapter.js +85 -0
  239. package/dist/core/adapters/arrayAdapter.js.map +1 -0
  240. package/dist/core/adapters/useArrayAdapter.js +13 -0
  241. package/dist/core/adapters/useArrayAdapter.js.map +1 -0
  242. package/dist/core/applyOps.js +12 -0
  243. package/dist/core/applyOps.js.map +1 -0
  244. package/dist/core/device/index.js +4 -0
  245. package/dist/core/device/targets.js +17 -0
  246. package/dist/core/device/targets.js.map +1 -0
  247. package/dist/core/device/useDeviceProfile.js +75 -0
  248. package/dist/core/device/useDeviceProfile.js.map +1 -0
  249. package/dist/core/fillInPoseFrame.js +102 -0
  250. package/dist/core/fillInPoseFrame.js.map +1 -0
  251. package/dist/core/geometry/poseDescriptor.js +98 -0
  252. package/dist/core/geometry/poseDescriptor.js.map +1 -0
  253. package/dist/core/geometry/poseRotation.js +58 -0
  254. package/dist/core/geometry/poseRotation.js.map +1 -0
  255. package/dist/core/geometry/regionHit.js +102 -0
  256. package/dist/core/geometry/regionHit.js.map +1 -0
  257. package/dist/core/geometry/unionBounds.js +60 -0
  258. package/dist/core/geometry/unionBounds.js.map +1 -0
  259. package/dist/core/gradient.js +136 -0
  260. package/dist/core/gradient.js.map +1 -0
  261. package/dist/core/isPlainObject.js +11 -0
  262. package/dist/core/isPlainObject.js.map +1 -0
  263. package/dist/core/layers/render.js +150 -0
  264. package/dist/core/layers/render.js.map +1 -0
  265. package/dist/core/markerInset.js +24 -0
  266. package/dist/core/markerInset.js.map +1 -0
  267. package/dist/core/mixed.js +6 -0
  268. package/dist/core/mixed.js.map +1 -0
  269. package/dist/core/ops/arrange.js +31 -0
  270. package/dist/core/ops/arrange.js.map +1 -0
  271. package/dist/core/ops/create.js +32 -0
  272. package/dist/core/ops/create.js.map +1 -0
  273. package/dist/core/ops/createHistory.js +20 -0
  274. package/dist/core/ops/createHistory.js.map +1 -0
  275. package/dist/core/ops/delete.js +89 -0
  276. package/dist/core/ops/delete.js.map +1 -0
  277. package/dist/core/ops/registry.js +17 -0
  278. package/dist/core/ops/registry.js.map +1 -0
  279. package/dist/core/ops/reorder/algorithms.js +55 -0
  280. package/dist/core/ops/reorder/algorithms.js.map +1 -0
  281. package/dist/core/ops/reorder/index.js +140 -0
  282. package/dist/core/ops/reorder/index.js.map +1 -0
  283. package/dist/core/ops/reparent.js +52 -0
  284. package/dist/core/ops/reparent.js.map +1 -0
  285. package/dist/core/ops/select.js +34 -0
  286. package/dist/core/ops/select.js.map +1 -0
  287. package/dist/core/ops/setData.js +34 -0
  288. package/dist/core/ops/setData.js.map +1 -0
  289. package/dist/core/ops/setLayer.js +34 -0
  290. package/dist/core/ops/setLayer.js.map +1 -0
  291. package/dist/core/ops/setLayout.js +31 -0
  292. package/dist/core/ops/setLayout.js.map +1 -0
  293. package/dist/core/ops/setPath.js +57 -0
  294. package/dist/core/ops/setPath.js.map +1 -0
  295. package/dist/core/ops/setText.js +34 -0
  296. package/dist/core/ops/setText.js.map +1 -0
  297. package/dist/core/ops/slot.js +37 -0
  298. package/dist/core/ops/slot.js.map +1 -0
  299. package/dist/core/ops/transform.js +42 -0
  300. package/dist/core/ops/transform.js.map +1 -0
  301. package/dist/core/paintKinds.js +156 -0
  302. package/dist/core/paintKinds.js.map +1 -0
  303. package/dist/core/scene/NodeProperties.js +20 -0
  304. package/dist/core/scene/NodeProperties.js.map +1 -0
  305. package/dist/core/scene/NodeRouting.js +24 -0
  306. package/dist/core/scene/NodeRouting.js.map +1 -0
  307. package/dist/core/scene/arrivals.js +12 -0
  308. package/dist/core/scene/arrivals.js.map +1 -0
  309. package/dist/core/scene/composeFrame.js +29 -0
  310. package/dist/core/scene/composeFrame.js.map +1 -0
  311. package/dist/core/scene/depMemo.js +18 -0
  312. package/dist/core/scene/depMemo.js.map +1 -0
  313. package/dist/core/scene/dependents.js +66 -0
  314. package/dist/core/scene/dependents.js.map +1 -0
  315. package/dist/core/scene/derivedPath.js +31 -0
  316. package/dist/core/scene/derivedPath.js.map +1 -0
  317. package/dist/core/scene/effectivePose.js +78 -0
  318. package/dist/core/scene/effectivePose.js.map +1 -0
  319. package/dist/core/scene/kitRegistry.js +33 -0
  320. package/dist/core/scene/kitRegistry.js.map +1 -0
  321. package/dist/core/scene/layoutPass.js +96 -0
  322. package/dist/core/scene/layoutPass.js.map +1 -0
  323. package/dist/core/scene/nodeFnFields.js +83 -0
  324. package/dist/core/scene/nodeFnFields.js.map +1 -0
  325. package/dist/core/scene/nodeMemo.js +28 -0
  326. package/dist/core/scene/nodeMemo.js.map +1 -0
  327. package/dist/core/scene/poseFeed.js +87 -0
  328. package/dist/core/scene/poseFeed.js.map +1 -0
  329. package/dist/core/scene/poseOverrides.js +52 -0
  330. package/dist/core/scene/poseOverrides.js.map +1 -0
  331. package/dist/core/scene/poseSnapshot.js +54 -0
  332. package/dist/core/scene/poseSnapshot.js.map +1 -0
  333. package/dist/core/scene/scene.js +1271 -0
  334. package/dist/core/scene/scene.js.map +1 -0
  335. package/dist/core/scene/types.js +6 -0
  336. package/dist/core/scene/types.js.map +1 -0
  337. package/dist/core/scene/useScene.js +32 -0
  338. package/dist/core/scene/useScene.js.map +1 -0
  339. package/dist/core/selection/chromeState.js +31 -0
  340. package/dist/core/selection/chromeState.js.map +1 -0
  341. package/dist/core/selection/selectionTarget.js +6 -0
  342. package/dist/core/selection/selectionTarget.js.map +1 -0
  343. package/dist/core/selection/useSelection.js +71 -0
  344. package/dist/core/selection/useSelection.js.map +1 -0
  345. package/dist/core/shapeKinds.js +54 -0
  346. package/dist/core/shapeKinds.js.map +1 -0
  347. package/dist/core/strokeMarkerShapes.js +139 -0
  348. package/dist/core/strokeMarkerShapes.js.map +1 -0
  349. package/dist/core/strokeMarkers.js +28 -0
  350. package/dist/core/strokeMarkers.js.map +1 -0
  351. package/dist/core/stylus/stylus.js +39 -0
  352. package/dist/core/stylus/stylus.js.map +1 -0
  353. package/dist/core/stylus/usePointerStylus.js +51 -0
  354. package/dist/core/stylus/usePointerStylus.js.map +1 -0
  355. package/dist/core/usePaintKinds.js +17 -0
  356. package/dist/core/usePaintKinds.js.map +1 -0
  357. package/dist/core/viewport/clampView.js +24 -0
  358. package/dist/core/viewport/clampView.js.map +1 -0
  359. package/dist/core/viewport/clientToWorld.js +8 -0
  360. package/dist/core/viewport/clientToWorld.js.map +1 -0
  361. package/dist/core/viewport/createVelocityTracker.js +39 -0
  362. package/dist/core/viewport/createVelocityTracker.js.map +1 -0
  363. package/dist/core/viewport/fitToBounds.js +18 -0
  364. package/dist/core/viewport/fitToBounds.js.map +1 -0
  365. package/dist/core/viewport/fitViewToBounds.js +36 -0
  366. package/dist/core/viewport/fitViewToBounds.js.map +1 -0
  367. package/dist/core/viewport/interpolateView.js +34 -0
  368. package/dist/core/viewport/interpolateView.js.map +1 -0
  369. package/dist/core/viewport/meanScale.js +8 -0
  370. package/dist/core/viewport/meanScale.js.map +1 -0
  371. package/dist/core/viewport/parallax.js +111 -0
  372. package/dist/core/viewport/parallax.js.map +1 -0
  373. package/dist/core/viewport/pxExtent.js +42 -0
  374. package/dist/core/viewport/pxExtent.js.map +1 -0
  375. package/dist/core/viewport/sceneNodeClientRect.js +18 -0
  376. package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
  377. package/dist/core/viewport/screenSlop.js +27 -0
  378. package/dist/core/viewport/screenSlop.js.map +1 -0
  379. package/dist/core/viewport/useAutoCenter.js +32 -0
  380. package/dist/core/viewport/useAutoCenter.js.map +1 -0
  381. package/dist/core/viewport/useCanvasSize.js +29 -0
  382. package/dist/core/viewport/useCanvasSize.js.map +1 -0
  383. package/dist/core/viewport/useDecayLoop.js +63 -0
  384. package/dist/core/viewport/useDecayLoop.js.map +1 -0
  385. package/dist/core/viewport/useVelocityTracker.js +10 -0
  386. package/dist/core/viewport/useVelocityTracker.js.map +1 -0
  387. package/dist/core/viewport/useViewAnimation.js +63 -0
  388. package/dist/core/viewport/useViewAnimation.js.map +1 -0
  389. package/dist/core/viewport/view.js +37 -0
  390. package/dist/core/viewport/view.js.map +1 -0
  391. package/dist/core/viewport/viewTransform.js +11 -0
  392. package/dist/core/viewport/viewTransform.js.map +1 -0
  393. package/dist/core/viewport/viewportWorldRect.js +13 -0
  394. package/dist/core/viewport/viewportWorldRect.js.map +1 -0
  395. package/dist/core/viewport/wheelHandler.js +30 -0
  396. package/dist/core/viewport/wheelHandler.js.map +1 -0
  397. package/dist/core/viewport/zoomAt.js +22 -0
  398. package/dist/core/viewport/zoomAt.js.map +1 -0
  399. package/dist/core/viewport/zoomBounds.js +20 -0
  400. package/dist/core/viewport/zoomBounds.js.map +1 -0
  401. package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
  402. package/dist/debug/createDebugOverlayLayer.js +358 -0
  403. package/dist/debug/createDebugOverlayLayer.js.map +1 -0
  404. package/dist/debug/createDebugSink.js +83 -0
  405. package/dist/debug/createDebugSink.js.map +1 -0
  406. package/dist/debug/defaultTheme.js +31 -0
  407. package/dist/debug/defaultTheme.js.map +1 -0
  408. package/dist/debug/flag.js +41 -0
  409. package/dist/debug/flag.js.map +1 -0
  410. package/dist/debug/frameStats.js +16 -0
  411. package/dist/debug/frameStats.js.map +1 -0
  412. package/dist/debug/parseDebugFlags.js +32 -0
  413. package/dist/debug/parseDebugFlags.js.map +1 -0
  414. package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
  415. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
  416. package/dist/features/chrome-caps/conditions.js +36 -0
  417. package/dist/features/chrome-caps/conditions.js.map +1 -0
  418. package/dist/features/chrome-caps/defaults.js +26 -0
  419. package/dist/features/chrome-caps/defaults.js.map +1 -0
  420. package/dist/features/chrome-caps/index.js +7 -0
  421. package/dist/features/chrome-caps/resolve.js +23 -0
  422. package/dist/features/chrome-caps/resolve.js.map +1 -0
  423. package/dist/features/chrome-caps/useHoverTracking.js +27 -0
  424. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
  425. package/dist/features/cursor/paintedCursorLayer.js +60 -0
  426. package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
  427. package/dist/features/focus/gateLayer.js +14 -0
  428. package/dist/features/focus/gateLayer.js.map +1 -0
  429. package/dist/features/focus/useCanvasFocus.js +29 -0
  430. package/dist/features/focus/useCanvasFocus.js.map +1 -0
  431. package/dist/features/groups/children.js +23 -0
  432. package/dist/features/groups/children.js.map +1 -0
  433. package/dist/features/groups/composePose.js +67 -0
  434. package/dist/features/groups/composePose.js.map +1 -0
  435. package/dist/features/groups/nestedHit.js +40 -0
  436. package/dist/features/groups/nestedHit.js.map +1 -0
  437. package/dist/features/groups/unionOfChildren.js +15 -0
  438. package/dist/features/groups/unionOfChildren.js.map +1 -0
  439. package/dist/features/images/imageCache.js +94 -0
  440. package/dist/features/images/imageCache.js.map +1 -0
  441. package/dist/features/ingestion/contentHandlers.js +37 -0
  442. package/dist/features/ingestion/contentHandlers.js.map +1 -0
  443. package/dist/features/ingestion/imageHandler.js +45 -0
  444. package/dist/features/ingestion/imageHandler.js.map +1 -0
  445. package/dist/features/ingestion/index.js +8 -0
  446. package/dist/features/ingestion/openFilePicker.js +15 -0
  447. package/dist/features/ingestion/openFilePicker.js.map +1 -0
  448. package/dist/features/ingestion/registerKitHandlers.js +26 -0
  449. package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
  450. package/dist/features/ingestion/svgHandler.js +58 -0
  451. package/dist/features/ingestion/svgHandler.js.map +1 -0
  452. package/dist/features/ingestion/weaselJsonHandler.js +39 -0
  453. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
  454. package/dist/features/longPress/longPressFeedback.js +96 -0
  455. package/dist/features/longPress/longPressFeedback.js.map +1 -0
  456. package/dist/features/meshPaint/bake.js +79 -0
  457. package/dist/features/meshPaint/bake.js.map +1 -0
  458. package/dist/features/meshPaint/bakeCache.js +59 -0
  459. package/dist/features/meshPaint/bakeCache.js.map +1 -0
  460. package/dist/features/meshPaint/handles.js +86 -0
  461. package/dist/features/meshPaint/handles.js.map +1 -0
  462. package/dist/features/meshPaint/lazyKind.js +1298 -0
  463. package/dist/features/meshPaint/lazyKind.js.map +1 -0
  464. package/dist/features/meshPaint/meshPaint.js +236 -0
  465. package/dist/features/meshPaint/meshPaint.js.map +1 -0
  466. package/dist/features/meshPaint/meshShader.js +6 -0
  467. package/dist/features/meshPaint/meshShader.js.map +1 -0
  468. package/dist/features/meshPaint/register.js +7 -0
  469. package/dist/features/meshPaint/register.js.map +1 -0
  470. package/dist/features/meshPaint/surface.js +110 -0
  471. package/dist/features/meshPaint/surface.js.map +1 -0
  472. package/dist/features/minimap/actions.js +53 -0
  473. package/dist/features/minimap/actions.js.map +1 -0
  474. package/dist/features/minimap/createMinimapContribution.js +96 -0
  475. package/dist/features/minimap/createMinimapContribution.js.map +1 -0
  476. package/dist/features/minimap/layers.js +103 -0
  477. package/dist/features/minimap/layers.js.map +1 -0
  478. package/dist/features/modes/modeLayers.js +113 -0
  479. package/dist/features/modes/modeLayers.js.map +1 -0
  480. package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
  481. package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
  482. package/dist/features/parallax/createParallaxLayer.js +26 -0
  483. package/dist/features/parallax/createParallaxLayer.js.map +1 -0
  484. package/dist/features/parallax/createParallaxPlane.js +26 -0
  485. package/dist/features/parallax/createParallaxPlane.js.map +1 -0
  486. package/dist/features/paths/anchorEdits.js +156 -0
  487. package/dist/features/paths/anchorEdits.js.map +1 -0
  488. package/dist/features/paths/anchors.js +154 -0
  489. package/dist/features/paths/anchors.js.map +1 -0
  490. package/dist/features/paths/booleans.js +2 -0
  491. package/dist/features/paths/index.js +15 -0
  492. package/dist/features/paths/markerCommands.js +116 -0
  493. package/dist/features/paths/markerCommands.js.map +1 -0
  494. package/dist/features/paths/markerSites.js +59 -0
  495. package/dist/features/paths/markerSites.js.map +1 -0
  496. package/dist/features/paths/markers.js +95 -0
  497. package/dist/features/paths/markers.js.map +1 -0
  498. package/dist/features/paths/nearestAnchor.js +36 -0
  499. package/dist/features/paths/nearestAnchor.js.map +1 -0
  500. package/dist/features/paths/originProjection.js +16 -0
  501. package/dist/features/paths/originProjection.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
  504. package/dist/features/paths/pathInWorld.js +41 -0
  505. package/dist/features/paths/pathInWorld.js.map +1 -0
  506. package/dist/features/paths/pathLayer.js +44 -0
  507. package/dist/features/paths/pathLayer.js.map +1 -0
  508. package/dist/features/paths/penPreviewLayer.js +220 -0
  509. package/dist/features/paths/penPreviewLayer.js.map +1 -0
  510. package/dist/features/paths/poseDescriptor.js +44 -0
  511. package/dist/features/paths/poseDescriptor.js.map +1 -0
  512. package/dist/features/paths/tessellate/stroke.js +230 -0
  513. package/dist/features/paths/tessellate/stroke.js.map +1 -0
  514. package/dist/features/patterns/index.js +23 -0
  515. package/dist/features/patterns/index.js.map +1 -0
  516. package/dist/features/patterns/patterns-builtin.js +38 -0
  517. package/dist/features/patterns/patterns-builtin.js.map +1 -0
  518. package/dist/features/patterns/resolveSpec.js +57 -0
  519. package/dist/features/patterns/resolveSpec.js.map +1 -0
  520. package/dist/features/patterns/tileGeometry.js +158 -0
  521. package/dist/features/patterns/tileGeometry.js.map +1 -0
  522. package/dist/features/pointer/PointerContext.js +45 -0
  523. package/dist/features/pointer/PointerContext.js.map +1 -0
  524. package/dist/features/poseRun/usePoseRun.js +70 -0
  525. package/dist/features/poseRun/usePoseRun.js.map +1 -0
  526. package/dist/features/selection/SelectionContext.js +46 -0
  527. package/dist/features/selection/SelectionContext.js.map +1 -0
  528. package/dist/features/selection/overlay.js +442 -0
  529. package/dist/features/selection/overlay.js.map +1 -0
  530. package/dist/features/simulation/createSimulation.js +61 -0
  531. package/dist/features/simulation/createSimulation.js.map +1 -0
  532. package/dist/features/simulation/types.js +6 -0
  533. package/dist/features/simulation/types.js.map +1 -0
  534. package/dist/features/simulation/useSimulation.js +74 -0
  535. package/dist/features/simulation/useSimulation.js.map +1 -0
  536. package/dist/features/text/domRuns.js +258 -0
  537. package/dist/features/text/domRuns.js.map +1 -0
  538. package/dist/features/text/fitTextPose.js +38 -0
  539. package/dist/features/text/fitTextPose.js.map +1 -0
  540. package/dist/features/text/hitTest.js +45 -0
  541. package/dist/features/text/hitTest.js.map +1 -0
  542. package/dist/features/text/renderLabel.js +14 -0
  543. package/dist/features/text/renderLabel.js.map +1 -0
  544. package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
  545. package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
  546. package/dist/features/text/runs/flagRange.js +53 -0
  547. package/dist/features/text/runs/flagRange.js.map +1 -0
  548. package/dist/features/text/runs/rangeStyle.js +135 -0
  549. package/dist/features/text/runs/rangeStyle.js.map +1 -0
  550. package/dist/features/text/textCommand.js +59 -0
  551. package/dist/features/text/textCommand.js.map +1 -0
  552. package/dist/features/text/textLayer.js +35 -0
  553. package/dist/features/text/textLayer.js.map +1 -0
  554. package/dist/features/text/textToPath.js +181 -0
  555. package/dist/features/text/textToPath.js.map +1 -0
  556. package/dist/features/text/useSceneTextEdit.js +138 -0
  557. package/dist/features/text/useSceneTextEdit.js.map +1 -0
  558. package/dist/features/text/useTextEdit.js +465 -0
  559. package/dist/features/text/useTextEdit.js.map +1 -0
  560. package/dist/features/tiling/createTiledLayer.js +63 -0
  561. package/dist/features/tiling/createTiledLayer.js.map +1 -0
  562. package/dist/features/tiling/tiledProject.js +14 -0
  563. package/dist/features/tiling/tiledProject.js.map +1 -0
  564. package/dist/features/viewports/viewResolver.js +59 -0
  565. package/dist/features/viewports/viewResolver.js.map +1 -0
  566. package/dist/features/viewports/viewportLayer.js +58 -0
  567. package/dist/features/viewports/viewportLayer.js.map +1 -0
  568. package/dist/icons/ArrowIcon.js +23 -0
  569. package/dist/icons/ArrowIcon.js.map +1 -0
  570. package/dist/icons/EllipseIcon.js +21 -0
  571. package/dist/icons/EllipseIcon.js.map +1 -0
  572. package/dist/icons/EyedropperIcon.js +49 -0
  573. package/dist/icons/EyedropperIcon.js.map +1 -0
  574. package/dist/icons/HandIcon.js +59 -0
  575. package/dist/icons/HandIcon.js.map +1 -0
  576. package/dist/icons/ImageIcon.js +34 -0
  577. package/dist/icons/ImageIcon.js.map +1 -0
  578. package/dist/icons/LassoIcon.js +22 -0
  579. package/dist/icons/LassoIcon.js.map +1 -0
  580. package/dist/icons/LineIcon.js +22 -0
  581. package/dist/icons/LineIcon.js.map +1 -0
  582. package/dist/icons/PenIcon.js +36 -0
  583. package/dist/icons/PenIcon.js.map +1 -0
  584. package/dist/icons/PencilIcon.js +25 -0
  585. package/dist/icons/PencilIcon.js.map +1 -0
  586. package/dist/icons/PolygonIcon.js +19 -0
  587. package/dist/icons/PolygonIcon.js.map +1 -0
  588. package/dist/icons/RectIcon.js +37 -0
  589. package/dist/icons/RectIcon.js.map +1 -0
  590. package/dist/icons/SelectIcon.js +20 -0
  591. package/dist/icons/SelectIcon.js.map +1 -0
  592. package/dist/icons/StarIcon.js +19 -0
  593. package/dist/icons/StarIcon.js.map +1 -0
  594. package/dist/icons/TextIcon.js +19 -0
  595. package/dist/icons/TextIcon.js.map +1 -0
  596. package/dist/icons/UnknownIcon.js +33 -0
  597. package/dist/icons/UnknownIcon.js.map +1 -0
  598. package/dist/icons/_base.js +12 -0
  599. package/dist/icons/_base.js.map +1 -0
  600. package/dist/index.css +2 -86
  601. package/dist/index.d.ts +2349 -2609
  602. package/dist/index.js +312 -13
  603. package/dist/input/keyState.js +76 -0
  604. package/dist/input/keyState.js.map +1 -0
  605. package/dist/input/useKeyState.js +22 -0
  606. package/dist/input/useKeyState.js.map +1 -0
  607. package/dist/interactions/actions/actionShortcuts.js +32 -0
  608. package/dist/interactions/actions/actionShortcuts.js.map +1 -0
  609. package/dist/interactions/actions/align/align.js +81 -0
  610. package/dist/interactions/actions/align/align.js.map +1 -0
  611. package/dist/interactions/actions/booleans/booleans.js +120 -0
  612. package/dist/interactions/actions/booleans/booleans.js.map +1 -0
  613. package/dist/interactions/actions/booleans/useBooleans.js +20 -0
  614. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
  615. package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
  616. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
  617. package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
  618. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
  619. package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
  620. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
  621. package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
  622. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
  623. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
  624. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
  625. package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
  626. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
  627. package/dist/interactions/actions/defaults/align.js +71 -0
  628. package/dist/interactions/actions/defaults/align.js.map +1 -0
  629. package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
  630. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
  631. package/dist/interactions/actions/defaults/areaSelect.js +75 -0
  632. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
  633. package/dist/interactions/actions/defaults/booleans.js +52 -0
  634. package/dist/interactions/actions/defaults/booleans.js.map +1 -0
  635. package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
  636. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
  637. package/dist/interactions/actions/defaults/clearSelection.js +19 -0
  638. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
  639. package/dist/interactions/actions/defaults/clipboard.js +78 -0
  640. package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
  641. package/dist/interactions/actions/defaults/clone.js +96 -0
  642. package/dist/interactions/actions/defaults/clone.js.map +1 -0
  643. package/dist/interactions/actions/defaults/createOutlines.js +47 -0
  644. package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
  645. package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
  646. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
  647. package/dist/interactions/actions/defaults/delete.js +61 -0
  648. package/dist/interactions/actions/defaults/delete.js.map +1 -0
  649. package/dist/interactions/actions/defaults/distribute.js +66 -0
  650. package/dist/interactions/actions/defaults/distribute.js.map +1 -0
  651. package/dist/interactions/actions/defaults/duplicate.js +83 -0
  652. package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
  653. package/dist/interactions/actions/defaults/editAnchors.js +100 -0
  654. package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
  655. package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
  656. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
  657. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
  658. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
  659. package/dist/interactions/actions/defaults/escape.js +26 -0
  660. package/dist/interactions/actions/defaults/escape.js.map +1 -0
  661. package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
  662. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
  663. package/dist/interactions/actions/defaults/flip.js +119 -0
  664. package/dist/interactions/actions/defaults/flip.js.map +1 -0
  665. package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
  666. package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
  667. package/dist/interactions/actions/defaults/group.js +131 -0
  668. package/dist/interactions/actions/defaults/group.js.map +1 -0
  669. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
  670. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
  671. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
  672. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
  673. package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
  674. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
  675. package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
  676. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
  677. package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
  678. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
  679. package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
  680. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
  681. package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
  682. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
  683. package/dist/interactions/actions/defaults/ingest.js +58 -0
  684. package/dist/interactions/actions/defaults/ingest.js.map +1 -0
  685. package/dist/interactions/actions/defaults/insert.js +288 -0
  686. package/dist/interactions/actions/defaults/insert.js.map +1 -0
  687. package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
  688. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
  689. package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
  690. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
  691. package/dist/interactions/actions/defaults/move.js +656 -0
  692. package/dist/interactions/actions/defaults/move.js.map +1 -0
  693. package/dist/interactions/actions/defaults/nudge.js +110 -0
  694. package/dist/interactions/actions/defaults/nudge.js.map +1 -0
  695. package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
  696. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
  697. package/dist/interactions/actions/defaults/reorder.js +143 -0
  698. package/dist/interactions/actions/defaults/reorder.js.map +1 -0
  699. package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
  700. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
  701. package/dist/interactions/actions/defaults/resize.js +332 -0
  702. package/dist/interactions/actions/defaults/resize.js.map +1 -0
  703. package/dist/interactions/actions/defaults/rotate.js +181 -0
  704. package/dist/interactions/actions/defaults/rotate.js.map +1 -0
  705. package/dist/interactions/actions/defaults/selectAll.js +27 -0
  706. package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
  707. package/dist/interactions/actions/defaults/setFill.js +27 -0
  708. package/dist/interactions/actions/defaults/setFill.js.map +1 -0
  709. package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
  710. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
  711. package/dist/interactions/actions/defaults/setStroke.js +36 -0
  712. package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
  713. package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
  714. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
  715. package/dist/interactions/actions/defaults/slice.js +39 -0
  716. package/dist/interactions/actions/defaults/slice.js.map +1 -0
  717. package/dist/interactions/actions/defaults/sliceOps.js +60 -0
  718. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
  719. package/dist/interactions/actions/defaults/toolActivate.js +35 -0
  720. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
  721. package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
  722. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
  723. package/dist/interactions/actions/defaults/undoRedo.js +51 -0
  724. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
  725. package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
  726. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
  727. package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
  728. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
  729. package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
  730. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
  731. package/dist/interactions/actions/distribute/distribute.js +42 -0
  732. package/dist/interactions/actions/distribute/distribute.js.map +1 -0
  733. package/dist/interactions/actions/distribute/plan.js +29 -0
  734. package/dist/interactions/actions/distribute/plan.js.map +1 -0
  735. package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
  736. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
  737. package/dist/interactions/actions/edit-anchors/handles.js +43 -0
  738. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
  739. package/dist/interactions/actions/flip/helpers.js +35 -0
  740. package/dist/interactions/actions/flip/helpers.js.map +1 -0
  741. package/dist/interactions/actions/geometryProjection.js +18 -0
  742. package/dist/interactions/actions/geometryProjection.js.map +1 -0
  743. package/dist/interactions/actions/gestureLifecycle.js +44 -0
  744. package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
  745. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
  746. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
  747. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
  748. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
  749. package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
  750. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
  751. package/dist/interactions/actions/move/gestureAdapter.js +37 -0
  752. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
  753. package/dist/interactions/actions/outlines/createOutlines.js +84 -0
  754. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
  756. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
  757. package/dist/interactions/actions/planeInput.js +168 -0
  758. package/dist/interactions/actions/planeInput.js.map +1 -0
  759. package/dist/interactions/actions/poseDescriptorDep.js +9 -0
  760. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
  761. package/dist/interactions/actions/poseFrame.js +38 -0
  762. package/dist/interactions/actions/poseFrame.js.map +1 -0
  763. package/dist/interactions/actions/previewOverrides.js +25 -0
  764. package/dist/interactions/actions/previewOverrides.js.map +1 -0
  765. package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
  766. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
  768. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
  769. package/dist/interactions/actions/resize/behaviors/index.js +8 -0
  770. package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
  771. package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
  772. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
  773. package/dist/interactions/actions/resize/cornerHandles.js +72 -0
  774. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
  775. package/dist/interactions/actions/resolveOverlays.js +60 -0
  776. package/dist/interactions/actions/resolveOverlays.js.map +1 -0
  777. package/dist/interactions/actions/resolvePreviews.js +61 -0
  778. package/dist/interactions/actions/resolvePreviews.js.map +1 -0
  779. package/dist/interactions/actions/rotate/geometry.js +46 -0
  780. package/dist/interactions/actions/rotate/geometry.js.map +1 -0
  781. package/dist/interactions/actions/rotate/handle.js +27 -0
  782. package/dist/interactions/actions/rotate/handle.js.map +1 -0
  783. package/dist/interactions/actions/spatialReference.js +42 -0
  784. package/dist/interactions/actions/spatialReference.js.map +1 -0
  785. package/dist/interactions/actions/useStandardActions.js +142 -0
  786. package/dist/interactions/actions/useStandardActions.js.map +1 -0
  787. package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
  788. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
  789. package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
  790. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
  791. package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
  792. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
  793. package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
  794. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
  795. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
  796. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
  797. package/dist/interactions/gestures/shared/originProjection.js +42 -0
  798. package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
  799. package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
  800. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
  801. package/dist/interactions/gestures/shared/snap.js +24 -0
  802. package/dist/interactions/gestures/shared/snap.js.map +1 -0
  803. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
  804. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
  805. package/dist/layout/arrivals.js +36 -0
  806. package/dist/layout/arrivals.js.map +1 -0
  807. package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
  808. package/dist/math.d.ts +4 -5
  809. package/dist/math.js +6 -4
  810. package/dist/mesh.d.ts +268 -0
  811. package/dist/mesh.js +7 -0
  812. package/dist/move.d.ts +7 -48
  813. package/dist/move.js +3 -142
  814. package/dist/originProjection-BSn4xiEy.d.ts +57 -0
  815. package/dist/patterns-builtin.js +3 -3
  816. package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
  817. package/dist/registerProgram-ateHDGjw.d.ts +193 -0
  818. package/dist/renderer/DrawCommand.js +6 -0
  819. package/dist/renderer/DrawCommand.js.map +1 -0
  820. package/dist/renderer/WeaselRenderer.js +328 -0
  821. package/dist/renderer/WeaselRenderer.js.map +1 -0
  822. package/dist/renderer/cache/GLImageCache.js +64 -0
  823. package/dist/renderer/cache/GLImageCache.js.map +1 -0
  824. package/dist/renderer/cache/GLMeshCache.js +102 -0
  825. package/dist/renderer/cache/GLMeshCache.js.map +1 -0
  826. package/dist/renderer/cache/GLTextureCache.js +51 -0
  827. package/dist/renderer/cache/GLTextureCache.js.map +1 -0
  828. package/dist/renderer/cache/GradientRampAtlas.js +82 -0
  829. package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
  830. package/dist/renderer/cache/cache.js +13 -0
  831. package/dist/renderer/cache/cache.js.map +1 -0
  832. package/dist/renderer/cache/markerCommandCache.js +59 -0
  833. package/dist/renderer/cache/markerCommandCache.js.map +1 -0
  834. package/dist/renderer/cache/outlineMeshCache.js +15 -0
  835. package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
  836. package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
  837. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
  838. package/dist/renderer/cache/strokeMeshCache.js +44 -0
  839. package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
  840. package/dist/renderer/cullDrawCommands.js +89 -0
  841. package/dist/renderer/cullDrawCommands.js.map +1 -0
  842. package/dist/renderer/draw.js +1109 -0
  843. package/dist/renderer/draw.js.map +1 -0
  844. package/dist/renderer/drawBatch.js +168 -0
  845. package/dist/renderer/drawBatch.js.map +1 -0
  846. package/dist/renderer/effects/EffectTargets.js +45 -0
  847. package/dist/renderer/effects/EffectTargets.js.map +1 -0
  848. package/dist/renderer/effects/builtins.js +31 -0
  849. package/dist/renderer/effects/builtins.js.map +1 -0
  850. package/dist/renderer/effects/composite.js +9 -0
  851. package/dist/renderer/effects/composite.js.map +1 -0
  852. package/dist/renderer/effects/effectPrelude.js +10 -0
  853. package/dist/renderer/effects/effectPrelude.js.map +1 -0
  854. package/dist/renderer/effects/types.js +10 -0
  855. package/dist/renderer/effects/types.js.map +1 -0
  856. package/dist/renderer/index.js +19 -0
  857. package/dist/renderer/math/color.js +341 -0
  858. package/dist/renderer/math/color.js.map +1 -0
  859. package/dist/renderer/math/mat3.js +71 -0
  860. package/dist/renderer/math/mat3.js.map +1 -0
  861. package/dist/renderer/math/patternSpace.js +22 -0
  862. package/dist/renderer/math/patternSpace.js.map +1 -0
  863. package/dist/renderer/math/viewToMat3.js +19 -0
  864. package/dist/renderer/math/viewToMat3.js.map +1 -0
  865. package/dist/renderer/paintResources.js +18 -0
  866. package/dist/renderer/paintResources.js.map +1 -0
  867. package/dist/renderer/paintScratch.js +37 -0
  868. package/dist/renderer/paintScratch.js.map +1 -0
  869. package/dist/renderer/shaders/ShaderProgram.js +74 -0
  870. package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
  871. package/dist/renderer/shaders/batchFill.js +118 -0
  872. package/dist/renderer/shaders/batchFill.js.map +1 -0
  873. package/dist/renderer/shaders/customPrelude.js +34 -0
  874. package/dist/renderer/shaders/customPrelude.js.map +1 -0
  875. package/dist/renderer/shaders/extractUniformNames.js +184 -0
  876. package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
  877. package/dist/renderer/shaders/glyphPaint.js +61 -0
  878. package/dist/renderer/shaders/glyphPaint.js.map +1 -0
  879. package/dist/renderer/shaders/gradFill.js +30 -0
  880. package/dist/renderer/shaders/gradFill.js.map +1 -0
  881. package/dist/renderer/shaders/imageFill.js +14 -0
  882. package/dist/renderer/shaders/imageFill.js.map +1 -0
  883. package/dist/renderer/shaders/pathFill.js +13 -0
  884. package/dist/renderer/shaders/pathFill.js.map +1 -0
  885. package/dist/renderer/shaders/patternFill.js +24 -0
  886. package/dist/renderer/shaders/patternFill.js.map +1 -0
  887. package/dist/renderer/shaders/registerProgram.js +18 -0
  888. package/dist/renderer/shaders/registerProgram.js.map +1 -0
  889. package/dist/renderer/spriteSheet.js +14 -0
  890. package/dist/renderer/spriteSheet.js.map +1 -0
  891. package/dist/renderer/state/GroupState.js +77 -0
  892. package/dist/renderer/state/GroupState.js.map +1 -0
  893. package/dist/renderer/syntheticItalic.js +6 -0
  894. package/dist/renderer/syntheticItalic.js.map +1 -0
  895. package/dist/renderer/textures/registerTexture.js +14 -0
  896. package/dist/renderer/textures/registerTexture.js.map +1 -0
  897. package/dist/renderer.d.ts +18 -20
  898. package/dist/renderer.js +18 -13
  899. package/dist/resize.d.ts +10 -46
  900. package/dist/resize.js +7 -5
  901. package/dist/routing.d.ts +1 -1
  902. package/dist/routing.js +2 -3
  903. package/dist/scheduling/useVisibleRaf.js +69 -0
  904. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  905. package/dist/test-hook/createTestHook.js +39 -0
  906. package/dist/test-hook/createTestHook.js.map +1 -0
  907. package/dist/test-hook/install.js +12 -0
  908. package/dist/test-hook/install.js.map +1 -0
  909. package/dist/test-seams-fYf6m5pu.d.ts +356 -0
  910. package/dist/test-seams.d.ts +6 -0
  911. package/dist/test-seams.js +3 -0
  912. package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
  913. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
  914. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
  915. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
  916. package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
  917. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
  918. package/dist/tools/builtin/hand/useHandTool.js +31 -0
  919. package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
  920. package/dist/tools/builtin/image/useImageTool.js +41 -0
  921. package/dist/tools/builtin/image/useImageTool.js.map +1 -0
  922. package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
  923. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
  924. package/dist/tools/builtin/line/useLineTool.js +33 -0
  925. package/dist/tools/builtin/line/useLineTool.js.map +1 -0
  926. package/dist/tools/builtin/pen/usePenTool.js +414 -0
  927. package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
  928. package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
  929. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
  930. package/dist/tools/builtin/pickTopMostHit.js +45 -0
  931. package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
  932. package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
  933. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
  934. package/dist/tools/builtin/rect/useRectTool.js +32 -0
  935. package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
  936. package/dist/tools/builtin/select/selectionContributions.js +109 -0
  937. package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
  938. package/dist/tools/builtin/select/useSelectTool.js +162 -0
  939. package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
  940. package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
  941. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
  942. package/dist/tools/builtin/slice/useSliceTool.js +263 -0
  943. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
  944. package/dist/tools/builtin/star/useStarTool.js +82 -0
  945. package/dist/tools/builtin/star/useStarTool.js.map +1 -0
  946. package/dist/tools/builtin/text/useTextTool.js +177 -0
  947. package/dist/tools/builtin/text/useTextTool.js.map +1 -0
  948. package/dist/tools/overlayBinding.js +8 -0
  949. package/dist/tools/overlayBinding.js.map +1 -0
  950. package/dist/tools/prefs.js +47 -0
  951. package/dist/tools/prefs.js.map +1 -0
  952. package/dist/tools/useKeybindings.js +66 -0
  953. package/dist/tools/useKeybindings.js.map +1 -0
  954. package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
  955. package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
  956. package/dist/util/color.js +26 -0
  957. package/dist/util/color.js.map +1 -0
  958. package/dist/util/constrainTo45.js +17 -0
  959. package/dist/util/constrainTo45.js.map +1 -0
  960. package/dist/util/paint.js +72 -0
  961. package/dist/util/paint.js.map +1 -0
  962. package/dist/version.js +6 -0
  963. package/dist/version.js.map +1 -0
  964. package/package.json +31 -18
  965. package/dist/chunk-44EWMJV2.js +0 -128
  966. package/dist/chunk-44EWMJV2.js.map +0 -1
  967. package/dist/chunk-4RJP2N2L.js +0 -143
  968. package/dist/chunk-4RJP2N2L.js.map +0 -1
  969. package/dist/chunk-BJN5ZRIJ.js +0 -167
  970. package/dist/chunk-BJN5ZRIJ.js.map +0 -1
  971. package/dist/chunk-D4AAWR64.js +0 -28
  972. package/dist/chunk-D4AAWR64.js.map +0 -1
  973. package/dist/chunk-DOBSZOPR.js +0 -29
  974. package/dist/chunk-DOBSZOPR.js.map +0 -1
  975. package/dist/chunk-H6N2JSZ3.js +0 -248
  976. package/dist/chunk-H6N2JSZ3.js.map +0 -1
  977. package/dist/chunk-HPFJUUTF.js +0 -167
  978. package/dist/chunk-HPFJUUTF.js.map +0 -1
  979. package/dist/chunk-L5YNZYEG.js +0 -648
  980. package/dist/chunk-L5YNZYEG.js.map +0 -1
  981. package/dist/chunk-MZAIDI6D.js +0 -32492
  982. package/dist/chunk-MZAIDI6D.js.map +0 -1
  983. package/dist/chunk-PNNZSYRD.js +0 -318
  984. package/dist/chunk-PNNZSYRD.js.map +0 -1
  985. package/dist/chunk-RMR4QMM6.js +0 -250
  986. package/dist/chunk-RMR4QMM6.js.map +0 -1
  987. package/dist/clipboard.js.map +0 -1
  988. package/dist/clone.js.map +0 -1
  989. package/dist/grid-BXdz8GF2.d.ts +0 -158
  990. package/dist/index.css.map +0 -1
  991. package/dist/index.js.map +0 -1
  992. package/dist/insert.d.ts +0 -37
  993. package/dist/insert.js +0 -81
  994. package/dist/insert.js.map +0 -1
  995. package/dist/math.js.map +0 -1
  996. package/dist/move.js.map +0 -1
  997. package/dist/options-CzjxFoYZ.d.ts +0 -67
  998. package/dist/path-JEV2c5If.d.ts +0 -48
  999. package/dist/patterns-builtin.js.map +0 -1
  1000. package/dist/renderer.css +0 -86
  1001. package/dist/renderer.css.map +0 -1
  1002. package/dist/renderer.js.map +0 -1
  1003. package/dist/resize.js.map +0 -1
  1004. package/dist/routing.js.map +0 -1
  1005. package/dist/types-D2tTKEU0.d.ts +0 -18
@@ -0,0 +1,78 @@
1
+ import { defaultCommitAdapter as e } from "../defaultCommitAdapter.js";
2
+ import { CopyIcon as t, CutIcon as n, PasteIcon as r } from "./icons/editIcons.js";
3
+ import { requiresSelection as i } from "./requiresSelection.js";
4
+ import { buildDeleteOps as a } from "./delete.js";
5
+ import { createElement as o } from "react";
6
+ import { ActionDisabledReason as s } from "@weasel-js/routing";
7
+ //#region src/interactions/actions/defaults/clipboard.ts
8
+ var c = {
9
+ id: "clipboard.copy",
10
+ label: "Copy",
11
+ icon: o(t),
12
+ group: "clipboard",
13
+ defaultBinding: {
14
+ kind: "key",
15
+ key: "c",
16
+ mods: { mod: !0 }
17
+ },
18
+ eligible: { capability: ["edits-page", "creates-selection"] },
19
+ requires: ["clipboard", "selection"],
20
+ invoker: {
21
+ timing: "immediate",
22
+ run: (e) => {
23
+ e.clipboard?.copy();
24
+ }
25
+ },
26
+ enabled: i
27
+ }, l = {
28
+ id: "clipboard.cut",
29
+ label: "Cut",
30
+ icon: o(n),
31
+ group: "clipboard",
32
+ defaultBinding: {
33
+ kind: "key",
34
+ key: "x",
35
+ mods: { mod: !0 }
36
+ },
37
+ eligible: { capability: "edits-page" },
38
+ requires: [
39
+ "clipboard",
40
+ "scene",
41
+ "selection",
42
+ "applyOps"
43
+ ],
44
+ invoker: {
45
+ timing: "immediate",
46
+ run: (t) => {
47
+ let n = t.clipboard, r = t.selection, i = t.scene, o = t.applyOps;
48
+ if (!n || !r || !i) return;
49
+ let s = r.get();
50
+ if (s.length === 0) return;
51
+ n.copy();
52
+ let c = a(i, s, "Cut");
53
+ c.length > 0 && (o ? o(c, "Cut") : i.applyBatch(c, "Cut", e(i, r.adapterMethods))), r.set([]);
54
+ }
55
+ },
56
+ enabled: i
57
+ }, u = {
58
+ id: "clipboard.paste",
59
+ label: "Paste",
60
+ icon: o(r),
61
+ group: "clipboard",
62
+ eligible: { capability: "edits-page" },
63
+ requires: ["clipboard"],
64
+ invoker: {
65
+ timing: "immediate",
66
+ run: (e) => {
67
+ e.clipboard?.paste();
68
+ }
69
+ },
70
+ enabled: (e) => {
71
+ let t = e?.clipboard;
72
+ return t && !t.isEmpty() ? !0 : s.NotApplicable;
73
+ }
74
+ };
75
+ //#endregion
76
+ export { c as clipboardCopyAction, l as clipboardCutAction, u as clipboardPasteAction };
77
+
78
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","names":["clipboardCopyAction","createElement","CopyIcon","requiresSelection","clipboardCutAction","CutIcon","clipboard","deps","selection","scene","applyOps","ids","ops","buildDeleteOps","defaultCommitAdapter","clipboardPasteAction","PasteIcon","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/clipboard.ts"],"sourcesContent":["import type { Scene } from 'core/scene/types';\nimport { createElement } from 'react';\nimport { CopyIcon, CutIcon, PasteIcon } from './icons/editIcons';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Op } from 'core/ops/types';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { ActionDisabledReason, type Action } from '@weasel-js/routing';\nimport type { ClipboardDep } from '../depSchema';\nimport { buildDeleteOps } from './delete';\nimport { requiresSelection } from './requiresSelection';\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.copy` Action (Cmd/Ctrl+C).\n */\nexport const clipboardCopyAction: Action & { requires: string[] } = {\n id: 'clipboard.copy',\n label: 'Copy',\n icon: createElement(CopyIcon),\n group: 'clipboard',\n defaultBinding: { kind: 'key', key: 'c', mods: { mod: true } },\n // Same gate as `duplicate`: a mode that can neither edit the page nor own a\n // selection has nothing to copy. Notably excludes `text-edit`, where Cmd+C\n // must stay the browser's own copy of the caret range.\n eligible: { capability: ['edits-page', 'creates-selection'] },\n // `selection` is read by the `enabled` gate, not the invoker — the\n // dispatcher builds deps for both, and an undeclared read is undefined.\n requires: ['clipboard', 'selection'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n (deps.clipboard as ClipboardDep | undefined)?.copy();\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.cut` Action (Cmd/Ctrl+X) — copy, then\n * the same batched delete `deleteAction` performs, as one undo entry.\n */\nexport const clipboardCutAction: Action & { requires: string[] } = {\n id: 'clipboard.cut',\n label: 'Cut',\n icon: createElement(CutIcon),\n group: 'clipboard',\n defaultBinding: { kind: 'key', key: 'x', mods: { mod: true } },\n eligible: { capability: 'edits-page' },\n requires: ['clipboard', 'scene', 'selection', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const clipboard = deps.clipboard as ClipboardDep | undefined;\n const selection = deps.selection as SelectionApi | undefined;\n const scene = deps.scene as Scene<unknown, string, unknown> | undefined;\n const applyOps = deps.applyOps as ((ops: Op[], label: string) => void) | undefined;\n if (!clipboard || !selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n // Snapshot before removal — `snapshotSelection` reads live nodes.\n clipboard.copy();\n\n const ops = buildDeleteOps(scene, ids, 'Cut');\n if (ops.length > 0) {\n if (applyOps) applyOps(ops, 'Cut');\n else scene.applyBatch(ops, 'Cut', defaultCommitAdapter(scene, selection.adapterMethods));\n }\n selection.set([]);\n },\n },\n enabled: requiresSelection,\n};\n\n/**\n * @experimental\n * Static descriptor for the `clipboard.paste` Action — what a Paste button or\n * menu item triggers. It has no key binding: Cmd/Ctrl+V already arrives as a\n * DOM `paste` event, which the dispatcher routes to `ingest`, and a binding\n * here would fire alongside it and paste twice.\n */\nexport const clipboardPasteAction: Action & { requires: string[] } = {\n id: 'clipboard.paste',\n label: 'Paste',\n icon: createElement(PasteIcon),\n group: 'clipboard',\n eligible: { capability: 'edits-page' },\n requires: ['clipboard'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n (deps.clipboard as ClipboardDep | undefined)?.paste();\n },\n },\n enabled: (deps) => {\n const clipboard = deps?.clipboard as ClipboardDep | undefined;\n return clipboard && !clipboard.isEmpty() ? true : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":";;;;;;;AAeA,IAAaA,IAAuD;CAClE,IAAI;CACJ,OAAO;CACP,MAAMC,EAAcC,CAAQ;CAC5B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAI7D,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAG5D,UAAU,CAAC,aAAa,WAAW;CACnC,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAM,WAAwC,KAAK;EACrD;CACF;CACA,SAASC;AACX,GAOaC,IAAsD;CACjE,IAAI;CACJ,OAAO;CACP,MAAMH,EAAcI,CAAO;CAC3B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM,EAAE,KAAK,GAAK;CAAE;CAC7D,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU;EAAC;EAAa;EAAS;EAAa;CAAU;CACxD,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMC,IAAYC,EAAK,WACjBC,IAAYD,EAAK,WACjBE,IAAQF,EAAK,OACbG,IAAWH,EAAK;GACtB,IAAI,CAACD,KAAa,CAACE,KAAa,CAACC,GAAO;GACxC,IAAME,IAAMH,EAAU,IAAI;GAC1B,IAAIG,EAAI,WAAW,GAAG;GAGtB,EAAU,KAAK;GAEf,IAAMC,IAAMC,EAAeJ,GAAOE,GAAK,KAAK;GAK5C,AAJIC,EAAI,SAAS,MACXF,IAAUA,EAASE,GAAK,KAAK,IAC5BH,EAAM,WAAWG,GAAK,OAAOE,EAAqBL,GAAOD,EAAU,cAAc,CAAC,IAEzFA,EAAU,IAAI,CAAC,CAAC;EAClB;CACF;CACA,SAASL;AACX,GASaY,IAAwD;CACnE,IAAI;CACJ,OAAO;CACP,MAAMd,EAAce,CAAS;CAC7B,OAAO;CACP,UAAU,EAAE,YAAY,aAAa;CACrC,UAAU,CAAC,WAAW;CACtB,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,EAAM,WAAwC,MAAM;EACtD;CACF;CACA,UAAU,MAAS;EACjB,IAAMV,IAAYC,GAAM;EACxB,OAAOD,KAAa,CAACA,EAAU,QAAQ,IAAI,KAAOW,EAAqB;CACzE;AACF"}
@@ -0,0 +1,96 @@
1
+ import { translatePoseViaDescriptor as e } from "../../../core/geometry/poseDescriptor.js";
2
+ import { poseDescriptorOf as t } from "../poseDescriptorDep.js";
3
+ import { inPlane as n, selectionLayer as r } from "../planeInput.js";
4
+ import { defaultCommitAdapter as i } from "../defaultCommitAdapter.js";
5
+ import { scenePoseFrame as a } from "../poseFrame.js";
6
+ import { createInsertOp as o } from "../../../core/ops/create.js";
7
+ import { freshNodeId as s } from "./freshNodeId.js";
8
+ //#region src/interactions/actions/defaults/clone.ts
9
+ var c = n({
10
+ id: "clone",
11
+ label: "Clone",
12
+ cursor: "copy",
13
+ activeCursor: "copy",
14
+ eligible: { capability: ["edits-page", "creates-selection"] },
15
+ requires: [
16
+ "selection",
17
+ "scene",
18
+ "applyOps",
19
+ "poseDescriptor",
20
+ "poseComposition"
21
+ ],
22
+ invoker: {
23
+ timing: "ongoing",
24
+ start(n, r) {
25
+ let c = n.deps.selection, l = n.deps.scene, u = n.deps.applyOps;
26
+ if (!c || !l) return {};
27
+ let d = c.get();
28
+ if (d.length === 0) return {};
29
+ let f = a(l, n.deps.poseComposition), p = /* @__PURE__ */ new Map();
30
+ for (let e of d) l.get(e) !== void 0 && p.set(e, f.world(e));
31
+ if (p.size === 0) return {};
32
+ let m = {
33
+ ids: d,
34
+ scene: l,
35
+ descriptor: t(n.deps.poseDescriptor),
36
+ frame: f,
37
+ originPoses: p,
38
+ currentDelta: {
39
+ dx: 0,
40
+ dy: 0
41
+ },
42
+ previews: /* @__PURE__ */ new Map(),
43
+ applyOps: u
44
+ };
45
+ return {
46
+ kind: "clone",
47
+ previewHidesSource: !1,
48
+ onMove(t) {
49
+ if (!t.drag) return;
50
+ m.currentDelta = {
51
+ dx: t.drag.delta.x,
52
+ dy: t.drag.delta.y
53
+ }, m.previews.clear();
54
+ let { dx: n, dy: r } = m.currentDelta;
55
+ if (n !== 0 || r !== 0) for (let [t, i] of m.originPoses) m.previews.set(t, m.frame.local(t, e(i, n, r, m.descriptor)));
56
+ },
57
+ onEnd(t, n) {
58
+ if (n === "cancel") {
59
+ m.previews.clear();
60
+ return;
61
+ }
62
+ let { dx: r, dy: a } = m.currentDelta;
63
+ if (r === 0 && a === 0) {
64
+ m.previews.clear();
65
+ return;
66
+ }
67
+ let l = [];
68
+ for (let t of m.ids) {
69
+ let n = m.originPoses.get(t), i = m.scene.get(t);
70
+ if (n === void 0 || !i) continue;
71
+ let c = m.frame.local(t, e(n, r, a, m.descriptor)), u = {
72
+ id: s(),
73
+ kind: i.kind,
74
+ layer: i.layer,
75
+ pose: c,
76
+ data: i.data,
77
+ parent: i.parent ?? null
78
+ };
79
+ l.push(o({
80
+ node: u,
81
+ label: "Clone"
82
+ }));
83
+ }
84
+ l.length > 0 && (m.applyOps ? m.applyOps(l, "Clone") : m.scene.applyBatch(l, "Clone", i(m.scene, c.adapterMethods))), m.previews.clear();
85
+ },
86
+ previewIds: () => m.previews.keys(),
87
+ previewPose: (e) => m.previews.get(e) ?? null
88
+ };
89
+ }
90
+ },
91
+ enabled: () => !0
92
+ }, r);
93
+ //#endregion
94
+ export { c as cloneAction };
95
+
96
+ //# sourceMappingURL=clone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clone.js","names":["cloneAction","inPlane","selection","ctx","scene","applyOps","ids","frame","scenePoseFrame","originPoses","id","scratch","poseDescriptorOf","moveCtx","dx","dy","origin","translatePoseViaDescriptor","reason","ops","originNode","newPose","node","freshNodeId","createInsertOp","defaultCommitAdapter","selectionLayer"],"sources":["../../../../src/interactions/actions/defaults/clone.ts"],"sourcesContent":["/**\n * `cloneAction` — ongoing Action descriptor for alt-drag clone.\n *\n * ## Status: REAL (scene-direct, no overlay)\n *\n * Implements the core clone-by-drag logic via insert ops committed through\n * `scene.applyBatch`:\n * - `start`: validates selection + scene; captures origin poses for all\n * selected nodes. The alt-modifier check that activates cloning in\n * `useClone` (via `CloneBehavior.activates`) is intentionally NOT applied\n * here — the descriptor fires when the dispatcher routes to it; modifier\n * discrimination is a dispatcher concern (Phase 12 TODO for alt-gating).\n * - `onMove`: tracks current drag delta in scratch (no scene writes).\n * - `onEnd('commit')`: emits one insert op per selected node (translated\n * pose) and commits them as a single batch — via the consumer `applyOps`\n * hook when present, else `scene.applyBatch(ops, 'Clone', ...)`. One\n * undo entry for the whole batch.\n * - `onEnd('cancel')`: no-op (scene never mutated during drag).\n *\n * ## What this does NOT wire (vs `useClone`)\n *\n * - Modifier gate: `useClone` only activates when `CloneBehavior.activates(mods)`\n * returns true (typically alt-held). The descriptor lacks that gate — it runs\n * whenever the dispatcher routes `clone`. Proper alt-gating requires a modifier-\n * discriminant in the dispatcher (Phase 12 TODO).\n * - Overlay: `useClone` renders a ghost via `setOverlay / clearOverlay`. The\n * descriptor has no overlay surface (deferred to Phase 7 overlay system).\n * - `expandIds`: group expansion is omitted; only leaf poses are cloned.\n * - Custom `CloneBehavior.onEnd` ops (e.g. `cloneByAltDrag`): the descriptor\n * uses a simpler `scene.add` path that does not delegate to behavior `onEnd`.\n * Behavior-pipeline cloning waits for a later phase.\n *\n * ## Pose generics\n *\n * Poses are translated through the `poseDescriptor` dep, as `moveAction` does.\n */\n\nimport type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport type { Node, Scene, NodeId } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { freshNodeId } from './freshNodeId';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from '../resize/geometry';\nimport { scenePoseFrame, type PoseFrame } from '../poseFrame';\nimport { inPlane, selectionLayer } from '../planeInput';\n\n// ---------------------------------------------------------------------------\n// Internal scratch\n// ---------------------------------------------------------------------------\n\ninterface CloneScratch {\n ids: NodeId[];\n scene: Scene<unknown, string, unknown>;\n descriptor: PoseDescriptor<unknown>;\n /** World reads and local writes over the scene's composition strategy. */\n frame: PoseFrame<unknown>;\n /** Origin poses captured at drag start, in world — the frame the drag\n * delta is expressed in. The copy keeps its source's parent, so each\n * translated result is stored back in that same frame. */\n originPoses: Map<NodeId, unknown>;\n /** Running drag delta — updated each onMove, applied once at commit. */\n currentDelta: { dx: number; dy: number };\n /** Preview poses keyed by ORIGINAL node id (the clone targets don't have\n * scene ids yet; the preview-ghost layer paints the originals' silhouette\n * at the translated pose — original stays visible at its committed home,\n * ghost appears at the drag target). */\n previews: Map<NodeId, unknown>;\n /** Optional consumer commit hook captured at gesture start. When present,\n * the insert ops route 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// Descriptor\n// ---------------------------------------------------------------------------\n\n/**\n * @experimental\n * Static descriptor for the `clone` Action.\n *\n * Requires dep-schema entries: `selection`, `scene`.\n *\n * Clones selected nodes into new scene nodes translated by the drag delta.\n * Commits insert ops via `scene.applyBatch(ops, 'Clone', ...)` (or the\n * consumer `applyOps` hook) for a single undo entry.\n *\n * @see useClone — the React hook this descriptor partially mirrors.\n */\nexport const cloneAction: Action & { requires: string[] } = inPlane({\n id: 'clone',\n label: 'Clone',\n // No default binding: a bare `{ kind: 'drag' }` would clone a non-empty\n // selection on any drag no tool claimed. Alt-drag on a body binds it\n // (`selectionMoveBindings`, the `move` preset).\n // The platform's duplicate cursor, and the whole reason this field is\n // modifier-aware: the select tool binds clone behind `mods: { alt: true }`,\n // so the pump predicts it — and shows this — only while Alt is down.\n cursor: 'copy',\n activeCursor: 'copy',\n eligible: { capability: ['edits-page', 'creates-selection'] },\n requires: ['selection', 'scene', 'applyOps', 'poseDescriptor', 'poseComposition'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, _opts): OngoingHandle {\n const selection = ctx.deps.selection as SelectionApi | undefined;\n const scene = ctx.deps.scene as Scene<unknown, string, unknown> | undefined;\n const applyOps = ctx.deps.applyOps as ((ops: Op[], label: string) => void) | undefined;\n\n if (!selection || !scene) return {};\n\n const ids = selection.get() as NodeId[];\n if (ids.length === 0) return {};\n\n // Capture origin poses once at drag start.\n const frame = scenePoseFrame(scene, ctx.deps.poseComposition);\n const originPoses = new Map<NodeId, unknown>();\n for (const id of ids) {\n if (scene.get(id) !== undefined) originPoses.set(id, frame.world(id));\n }\n\n if (originPoses.size === 0) return {};\n\n const scratch: CloneScratch = {\n ids,\n scene,\n descriptor: poseDescriptorOf(ctx.deps.poseDescriptor),\n frame,\n originPoses,\n currentDelta: { dx: 0, dy: 0 },\n previews: new Map<NodeId, unknown>(),\n applyOps,\n };\n\n return {\n kind: 'clone',\n // Clone: source stays visible at its committed pose; the ghost\n // (rendered via previewIds/previewPose below) appears at the\n // drag target. Opt out of the default \"hide source\" behavior\n // move/resize/rotate use.\n previewHidesSource: false,\n onMove(moveCtx: InvocationCtx): void {\n if (!moveCtx.drag) return;\n scratch.currentDelta = {\n dx: moveCtx.drag.delta.x,\n dy: moveCtx.drag.delta.y,\n };\n // Preview: paint each original's silhouette at the translated pose.\n // The original stays at its committed location (we don't hide it);\n // the ghost overlay shows where the new copy will land on commit.\n scratch.previews.clear();\n const { dx, dy } = scratch.currentDelta;\n if (dx === 0 && dy === 0) return;\n for (const [id, origin] of scratch.originPoses) {\n scratch.previews.set(\n id,\n scratch.frame.local(id, translatePoseViaDescriptor(origin, dx, dy, scratch.descriptor)),\n );\n }\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') {\n scratch.previews.clear();\n return;\n }\n const { dx, dy } = scratch.currentDelta;\n // Zero-delta drag — no clone.\n if (dx === 0 && dy === 0) {\n scratch.previews.clear();\n return;\n }\n\n // Build one insert op per clone target — same nodes/values the old\n // direct `scene.add` loop produced (kind/layer/data/parent preserved,\n // pose translated by the drag delta), then route the batch through the\n // consumer `applyOps` hook when present (so an app with its own history\n // captures the clone as a single undo entry); otherwise commit straight\n // to the scene's own history. One applyOps / applyBatch call =\n // one undo entry, matching the prior single `scene.batch('Clone', …)`.\n const ops: Op[] = [];\n for (const id of scratch.ids) {\n const origin = scratch.originPoses.get(id);\n const originNode = scratch.scene.get(id);\n if (origin === undefined || !originNode) continue;\n const newPose = scratch.frame.local(\n id,\n translatePoseViaDescriptor(origin, dx, dy, scratch.descriptor),\n );\n // The old `scene.add` (no explicit id) minted a random id; we\n // pre-generate one so the insert op carries a full node. Id value\n // was never observable, so behavior is preserved.\n const node = {\n id: freshNodeId(),\n kind: originNode.kind,\n layer: originNode.layer,\n pose: newPose,\n data: originNode.data,\n parent: originNode.parent ?? null,\n } as Node<unknown, string, unknown>;\n ops.push(createInsertOp<Node<unknown, string, unknown>>({ node, label: 'Clone' }));\n }\n if (ops.length > 0) {\n if (scratch.applyOps) scratch.applyOps(ops, 'Clone');\n else scratch.scene.applyBatch(ops, 'Clone', defaultCommitAdapter(scratch.scene, selection.adapterMethods));\n }\n scratch.previews.clear();\n },\n previewIds: () => scratch.previews.keys(),\n previewPose: (id: string) => scratch.previews.get(id as NodeId) ?? null,\n };\n },\n },\n enabled: () => true,\n}, selectionLayer);\n"],"mappings":";;;;;;;;AA6FA,IAAaA,IAA+CC,EAAQ;CAClE,IAAI;CACJ,OAAO;CAOP,QAAQ;CACR,cAAc;CACd,UAAU,EAAE,YAAY,CAAC,cAAc,mBAAmB,EAAE;CAC5D,UAAU;EAAC;EAAa;EAAS;EAAY;EAAkB;CAAiB;CAChF,SAAS;EACP,QAAQ;EACR,MAAM,GAAoB,GAAsB;GAC9C,IAAMC,IAAYC,EAAI,KAAK,WACrBC,IAAQD,EAAI,KAAK,OACjBE,IAAWF,EAAI,KAAK;GAE1B,IAAI,CAACD,KAAa,CAACE,GAAO,OAAO,CAAC;GAElC,IAAME,IAAMJ,EAAU,IAAI;GAC1B,IAAII,EAAI,WAAW,GAAG,OAAO,CAAC;GAG9B,IAAMC,IAAQC,EAAeJ,GAAOD,EAAI,KAAK,eAAe,GACtDM,oBAAc,IAAI,IAAqB;GAC7C,KAAK,IAAMC,KAAMJ,GACf,AAAIF,EAAM,IAAIM,CAAE,MAAM,KAAA,KAAWD,EAAY,IAAIC,GAAIH,EAAM,MAAMG,CAAE,CAAC;GAGtE,IAAID,EAAY,SAAS,GAAG,OAAO,CAAC;GAEpC,IAAME,IAAwB;IAC5B;IACA;IACA,YAAYC,EAAiBT,EAAI,KAAK,cAAc;IACpD;IACA;IACA,cAAc;KAAE,IAAI;KAAG,IAAI;IAAE;IAC7B,0BAAU,IAAI,IAAqB;IACnC;GACF;GAEA,OAAO;IACL,MAAM;IAKN,oBAAoB;IACpB,OAAO,GAA8B;KACnC,IAAI,CAACU,EAAQ,MAAM;KAQnB,AAPA,EAAQ,eAAe;MACrB,IAAIA,EAAQ,KAAK,MAAM;MACvB,IAAIA,EAAQ,KAAK,MAAM;KACzB,GAIAF,EAAQ,SAAS,MAAM;KACvB,IAAM,EAAE,OAAI,UAAOA,EAAQ;KAC3B,IAAIG,MAAO,KAAKC,MAAO,GACvB,KAAK,IAAM,CAACL,GAAIM,MAAWL,EAAQ,aACjC,EAAQ,SAAS,IACfD,GACAC,EAAQ,MAAM,MAAMD,GAAIO,EAA2BD,GAAQF,GAAIC,GAAIJ,EAAQ,UAAU,CAAC,CACxF;IAEJ;IACA,MAAM,GAAwB,GAAmC;KAC/D,IAAIO,MAAW,UAAU;MACvB,EAAQ,SAAS,MAAM;MACvB;KACF;KACA,IAAM,EAAE,OAAI,UAAOP,EAAQ;KAE3B,IAAIG,MAAO,KAAKC,MAAO,GAAG;MACxB,EAAQ,SAAS,MAAM;MACvB;KACF;KASA,IAAMI,IAAY,CAAC;KACnB,KAAK,IAAMT,KAAMC,EAAQ,KAAK;MAC5B,IAAMK,IAASL,EAAQ,YAAY,IAAID,CAAE,GACnCU,IAAaT,EAAQ,MAAM,IAAID,CAAE;MACvC,IAAIM,MAAW,KAAA,KAAa,CAACI,GAAY;MACzC,IAAMC,IAAUV,EAAQ,MAAM,MAC5BD,GACAO,EAA2BD,GAAQF,GAAIC,GAAIJ,EAAQ,UAAU,CAC/D,GAIMW,IAAO;OACX,IAAIC,EAAY;OAChB,MAAMH,EAAW;OACjB,OAAOA,EAAW;OAClB,MAAMC;OACN,MAAMD,EAAW;OACjB,QAAQA,EAAW,UAAU;MAC/B;MACA,EAAI,KAAKI,EAA+C;OAAE;OAAM,OAAO;MAAQ,CAAC,CAAC;KACnF;KAKA,AAJIL,EAAI,SAAS,MACXR,EAAQ,WAAUA,EAAQ,SAASQ,GAAK,OAAO,IAC9CR,EAAQ,MAAM,WAAWQ,GAAK,SAASM,EAAqBd,EAAQ,OAAOT,EAAU,cAAc,CAAC,IAE3GS,EAAQ,SAAS,MAAM;IACzB;IACA,kBAAkBA,EAAQ,SAAS,KAAK;IACxC,cAAc,MAAeA,EAAQ,SAAS,IAAID,CAAY,KAAK;GACrE;EACF;CACF;CACA,eAAe;AACjB,GAAGgB,CAAc"}
@@ -0,0 +1,47 @@
1
+ import { loadTextOutlines as e } from "../../../features/text/textToPath.js";
2
+ import { applyCreateOutlines as t } from "../outlines/createOutlines.js";
3
+ import { CreateOutlinesIcon as n } from "./icons/outlineIcons.js";
4
+ import { ActionDisabledReason as r } from "@weasel-js/routing";
5
+ import { jsx as i } from "react/jsx-runtime";
6
+ //#region src/interactions/actions/defaults/createOutlines.tsx
7
+ async function a(n) {
8
+ let r = t(n);
9
+ if (r.kind === "failed" && r.error.reason === "outlines-loading") {
10
+ let i = [...n.getSelection()].map((e) => n.getTextSource(e)).filter((e) => e !== void 0);
11
+ await Promise.all(i.map((t) => e(t.data))), r = t(n);
12
+ }
13
+ return r.kind === "failed" && console.warn(`[createOutlines] ${r.error.message}`), r;
14
+ }
15
+ var o = {
16
+ id: "createOutlines",
17
+ label: "Create Outlines",
18
+ icon: /* @__PURE__ */ i(n, {}),
19
+ group: "text",
20
+ defaultBinding: {
21
+ kind: "key",
22
+ key: "o",
23
+ mods: {
24
+ mod: !0,
25
+ shift: !0
26
+ }
27
+ },
28
+ eligible: { capability: "creates-shapes" },
29
+ requires: ["selection", "createOutlinesAdapter"],
30
+ invoker: {
31
+ timing: "immediate",
32
+ run: (e) => {
33
+ let t = e.createOutlinesAdapter;
34
+ t && a(t);
35
+ }
36
+ },
37
+ enabled: (e) => {
38
+ let t = (e?.selection)?.get() ?? [];
39
+ if (t.length === 0) return r.SelectionRequired;
40
+ let n = e?.createOutlinesAdapter;
41
+ return n && t.some((e) => n.getTextSource(e) !== void 0) ? !0 : r.NotApplicable;
42
+ }
43
+ };
44
+ //#endregion
45
+ export { o as createOutlinesAction, a as runCreateOutlines };
46
+
47
+ //# sourceMappingURL=createOutlines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createOutlines.js","names":["runCreateOutlines","result","applyCreateOutlines","adapter","texts","id","t","loadTextOutlines","createOutlinesAction","CreateOutlinesIcon","deps","ids","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/defaults/createOutlines.tsx"],"sourcesContent":["import type { Action, ImmediateInvoker } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { NodeId } from 'core/scene/types';\nimport { loadTextOutlines, type TextNodeSource } from 'features/text/textToPath';\nimport {\n applyCreateOutlines, type CreateOutlinesAdapter, type CreateOutlinesResult,\n} from '../outlines/createOutlines';\nimport { CreateOutlinesIcon } from './icons/outlineIcons';\n\n/**\n * {@link applyCreateOutlines}, waiting first for any face whose outlines are\n * registered but not yet loaded — a face is parsed on first use, so the first\n * conversion in a session would otherwise fail. Warns with the reason when\n * the selection still cannot be converted.\n */\nexport async function runCreateOutlines(adapter: CreateOutlinesAdapter): Promise<CreateOutlinesResult> {\n let result = applyCreateOutlines(adapter);\n if (result.kind === 'failed' && result.error.reason === 'outlines-loading') {\n const texts = [...adapter.getSelection()]\n .map((id) => adapter.getTextSource(id as NodeId))\n .filter((t): t is TextNodeSource => t !== undefined);\n await Promise.all(texts.map((t) => loadTextOutlines(t.data)));\n result = applyCreateOutlines(adapter);\n }\n if (result.kind === 'failed') console.warn(`[createOutlines] ${result.error.message}`);\n return result;\n}\n\n/**\n * @experimental Static descriptor for Create Outlines: replace the selected\n * text nodes with path nodes carrying their glyph outlines. Reads the\n * `createOutlinesAdapter` dep, published with `useCreateOutlinesAdapter`.\n */\nexport const createOutlinesAction: Action = {\n id: 'createOutlines',\n label: 'Create Outlines',\n icon: <CreateOutlinesIcon />,\n group: 'text',\n defaultBinding: { kind: 'key', key: 'o', mods: { mod: true, shift: true } },\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'createOutlinesAdapter'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const adapter = deps.createOutlinesAdapter as CreateOutlinesAdapter | undefined;\n if (adapter) void runCreateOutlines(adapter);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => {\n const ids = (deps?.selection as SelectionApi | undefined)?.get() ?? [];\n if (ids.length === 0) return ActionDisabledReason.SelectionRequired;\n const adapter = deps?.createOutlinesAdapter as CreateOutlinesAdapter | undefined;\n return adapter && ids.some((id) => adapter.getTextSource(id) !== undefined)\n ? true\n : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":";;;;;;AAgBA,eAAsBA,EAAkB,GAA+D;CACrG,IAAIC,IAASC,EAAoBC,CAAO;CACxC,IAAIF,EAAO,SAAS,YAAYA,EAAO,MAAM,WAAW,oBAAoB;EAC1E,IAAMG,IAAQ,CAAC,GAAGD,EAAQ,aAAa,CAAC,CAAC,CACtC,KAAK,MAAOA,EAAQ,cAAcE,CAAY,CAAC,CAAC,CAChD,QAAQ,MAA2BC,MAAM,KAAA,CAAS;EAErD,AADA,MAAM,QAAQ,IAAIF,EAAM,KAAK,MAAMG,EAAiB,EAAE,IAAI,CAAC,CAAC,GAC5D,IAASL,EAAoBC,CAAO;CACtC;CAEA,OADIF,EAAO,SAAS,YAAU,QAAQ,KAAK,oBAAoBA,EAAO,MAAM,SAAS,GAC9EA;AACT;AAOA,IAAaO,IAA+B;CAC1C,IAAI;CACJ,OAAO;CACP,MAAM,kBAACC,GAAD,CAAqB,CAAA;CAC3B,OAAO;CACP,gBAAgB;EAAE,MAAM;EAAO,KAAK;EAAK,MAAM;GAAE,KAAK;GAAM,OAAO;EAAK;CAAE;CAC1E,UAAU,EAAE,YAAY,iBAAiB;CACzC,UAAU,CAAC,aAAa,uBAAuB;CAC/C,SAAS;EACP,QAAQ;EACR,MAAM,MAAS;GACb,IAAMN,IAAUO,EAAK;GACrB,AAAIP,KAASH,EAAuBG,CAAO;EAC7C;CACF;CACA,UAAU,MAAS;EACjB,IAAMQ,KAAOD,GAAM,UAAA,EAAwC,IAAI,KAAK,CAAC;EACrE,IAAIC,EAAI,WAAW,GAAG,OAAOC,EAAqB;EAClD,IAAMT,IAAUO,GAAM;EACtB,OAAOP,KAAWQ,EAAI,MAAM,MAAOR,EAAQ,cAAcE,CAAE,MAAM,KAAA,CAAS,IACtE,KACAO,EAAqB;CAC3B;AACF"}
@@ -0,0 +1,85 @@
1
+ import { createSetDataOp as e } from "../../../core/ops/setData.js";
2
+ import { defaultCommitAdapter as t } from "../defaultCommitAdapter.js";
3
+ import { ActionDisabledReason as n } from "@weasel-js/routing";
4
+ //#region src/interactions/actions/defaults/createPaintAction.ts
5
+ function r(r) {
6
+ let i = (e) => {
7
+ e.previews.clear();
8
+ for (let t of e.ids) {
9
+ let n = e.startData.get(t), i = r.merge(n?.[r.dataKey], e.state);
10
+ e.previews.set(t, {
11
+ ...n ?? {},
12
+ [r.dataKey]: i
13
+ });
14
+ }
15
+ };
16
+ return {
17
+ id: r.id,
18
+ label: r.label,
19
+ eligible: { capability: "applies-fill" },
20
+ requires: [
21
+ "selection",
22
+ "scene",
23
+ "applyOps"
24
+ ],
25
+ invoker: {
26
+ timing: "ongoing",
27
+ start(n, a) {
28
+ let o = n.deps.selection, s = n.deps.scene, c = n.deps.applyOps;
29
+ if (!o || !s) return {};
30
+ let l = o.get();
31
+ if (l.length === 0) return {};
32
+ let u = a?.params, d = ((e) => n.params?.[e] ?? u?.[e]), f = /* @__PURE__ */ new Map();
33
+ for (let e of l) {
34
+ let t = s.get(e);
35
+ t && f.set(e, { ...t.data });
36
+ }
37
+ let p = {
38
+ ids: l,
39
+ scene: s,
40
+ startData: f,
41
+ state: r.initialState(d),
42
+ previews: /* @__PURE__ */ new Map(),
43
+ applyOps: c
44
+ };
45
+ return i(p), {
46
+ onMove(e) {
47
+ let t = r.readParams(p.state, e.params);
48
+ t !== null && (p.state = t, i(p));
49
+ },
50
+ onEnd(n, i) {
51
+ if (i === "cancel") {
52
+ p.previews.clear();
53
+ return;
54
+ }
55
+ let a = [];
56
+ for (let t of p.ids) {
57
+ let n = r.merge(p.startData.get(t)?.[r.dataKey], p.state), i = p.scene.get(t);
58
+ if (!i) continue;
59
+ let o = { ...i.data }, s = {
60
+ ...o,
61
+ [r.dataKey]: n
62
+ };
63
+ a.push(e({
64
+ id: t,
65
+ from: o,
66
+ to: s
67
+ }));
68
+ }
69
+ a.length > 0 && (p.applyOps ? p.applyOps(a, r.label) : p.scene.applyBatch(a, r.label, t(p.scene, o.adapterMethods))), p.previews.clear();
70
+ },
71
+ previewIds: () => p.previews.keys(),
72
+ previewData: (e) => p.previews.get(e) ?? null
73
+ };
74
+ }
75
+ },
76
+ enabled: (e) => {
77
+ let t = e?.selection;
78
+ return !t || t.get().length === 0 ? n.SelectionRequired : !0;
79
+ }
80
+ };
81
+ }
82
+ //#endregion
83
+ export { r as createPaintAction };
84
+
85
+ //# sourceMappingURL=createPaintAction.js.map
@@ -0,0 +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 { SelectionApi } from 'core/selection/useSelection';\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 as SelectionApi | undefined;\n const scene = ctx.deps.scene as Scene<Data, string, unknown> | undefined;\n const applyOps = ctx.deps.applyOps as ((ops: Op[], label: string) => void) | undefined;\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 as SelectionApi | undefined;\n if (!sel || (sel.get() as unknown[]).length === 0) {\n return ActionDisabledReason.SelectionRequired;\n }\n return true;\n },\n };\n}\n"],"mappings":";;;;AAuEA,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"}
@@ -0,0 +1,61 @@
1
+ import { defaultCommitAdapter as e } from "../defaultCommitAdapter.js";
2
+ import { createDeleteOp as t } from "../../../core/ops/delete.js";
3
+ import { DeleteIcon as n } from "./icons/actionGlyphIcons.js";
4
+ import { requiresSelection as r } from "./requiresSelection.js";
5
+ import { createElement as i } from "react";
6
+ //#region src/interactions/actions/defaults/delete.ts
7
+ function a(e, t) {
8
+ let n = e.get(t);
9
+ return (n?.parent == null ? e.roots : e.childrenOf(n.parent)).indexOf(t);
10
+ }
11
+ function o(e, n, r) {
12
+ let i = /* @__PURE__ */ new Set(), o = [];
13
+ for (let s of n) {
14
+ let n = e.get(s);
15
+ if (n && !i.has(s)) {
16
+ for (let t of e.removalClosure([s])) i.add(t);
17
+ o.push(t({
18
+ node: n,
19
+ index: a(e, s),
20
+ label: r
21
+ }));
22
+ }
23
+ }
24
+ return o;
25
+ }
26
+ var s = {
27
+ id: "delete",
28
+ label: "Delete",
29
+ icon: i(n),
30
+ group: "edit",
31
+ defaultBinding: {
32
+ kind: "key",
33
+ key: ["Delete", "Backspace"],
34
+ phase: [{
35
+ channel: "*",
36
+ phase: "initial"
37
+ }]
38
+ },
39
+ eligible: { capability: "edits-page" },
40
+ requires: [
41
+ "scene",
42
+ "selection",
43
+ "applyOps"
44
+ ],
45
+ invoker: {
46
+ timing: "immediate",
47
+ run: (t) => {
48
+ let n = t.selection, r = t.scene, i = t.applyOps;
49
+ if (!n || !r) return;
50
+ let a = n.get();
51
+ if (a.length === 0) return;
52
+ let s = o(r, a, "Delete");
53
+ s.length > 0 && (i ? i(s, "Delete") : r.applyBatch(s, "Delete", e(r, n.adapterMethods))), n.set([]);
54
+ }
55
+ },
56
+ enabled: r
57
+ };
58
+ //#endregion
59
+ export { o as buildDeleteOps, s as deleteAction };
60
+
61
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +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 { SelectionApi } from 'core/selection/useSelection';\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 as SelectionApi | undefined;\n const scene = deps.scene as Scene<unknown, string, unknown> | undefined;\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 as ((ops: Op[], label: string) => void) | undefined;\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":";;;;;;AAaA,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"}
@@ -0,0 +1,66 @@
1
+ import { translatePoseViaDescriptor as e, visualBoundsViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
2
+ import { poseDescriptorOf as n } from "../poseDescriptorDep.js";
3
+ import { scenePoseFrame as r } from "../poseFrame.js";
4
+ import { planDistribute as i } from "../distribute/plan.js";
5
+ import { DistributeHorizontalIcon as a, DistributeVerticalIcon as o } from "./icons/distributeIcons.js";
6
+ import { ActionDisabledReason as s } from "@weasel-js/routing";
7
+ import { jsx as c } from "react/jsx-runtime";
8
+ //#region src/interactions/actions/defaults/distribute.tsx
9
+ var l = {
10
+ x: "distribute.horizontal",
11
+ y: "distribute.vertical"
12
+ }, u = {
13
+ x: "Distribute Horizontally",
14
+ y: "Distribute Vertically"
15
+ }, d = {
16
+ x: /* @__PURE__ */ c(a, {}),
17
+ y: /* @__PURE__ */ c(o, {})
18
+ };
19
+ function f(n, a, o, s, c, l) {
20
+ let u = n.get();
21
+ if (u.length < 3) return;
22
+ let d = r(a, l), f = u.map((e) => {
23
+ let n = d.world(e);
24
+ return {
25
+ id: e,
26
+ pose: n,
27
+ b: t(n, c)
28
+ };
29
+ }), p = i(f.map((e) => e.b), o, s);
30
+ a.batch("Distribute", () => {
31
+ for (let t = 0; t < f.length; t++) {
32
+ let n = f[t], r = p[t] - (o === "x" ? n.b.x : n.b.y);
33
+ if (r === 0) continue;
34
+ let i = o === "x" ? r : 0, s = o === "y" ? r : 0, l = e(n.pose, i, s, c);
35
+ a.setPose(n.id, d.local(n.id, l));
36
+ }
37
+ });
38
+ }
39
+ function p(e) {
40
+ return {
41
+ id: l[e],
42
+ label: u[e],
43
+ icon: d[e],
44
+ group: "distribute",
45
+ eligible: { capability: "transforms-selection" },
46
+ requires: [
47
+ "selection",
48
+ "scene",
49
+ "poseDescriptor",
50
+ "poseComposition"
51
+ ],
52
+ invoker: {
53
+ timing: "immediate",
54
+ run: (t, r) => {
55
+ let i = t.selection, a = t.scene;
56
+ i && a && f(i, a, e, r?.mode ?? "centers", n(t.poseDescriptor), t.poseComposition);
57
+ }
58
+ },
59
+ enabled: (e) => ((e?.selection)?.get().length ?? 0) >= 3 || s.SelectionRequired
60
+ };
61
+ }
62
+ var m = p("x"), h = p("y");
63
+ //#endregion
64
+ export { m as distributeHorizontalAction, h as distributeVerticalAction };
65
+
66
+ //# sourceMappingURL=distribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"distribute.js","names":["ID_FOR","LABEL_FOR","ICON_FOR","DistributeHorizontalIcon","DistributeVerticalIcon","distributeSelection","ids","selection","frame","scenePoseFrame","scene","poseComposition","items","pose","id","visualBoundsViaDescriptor","geom","targets","planDistribute","it","axis","mode","i","delta","dx","dy","to","translatePoseViaDescriptor","makeDistributeAction","deps","params","poseDescriptorOf","ActionDisabledReason","distributeHorizontalAction","distributeVerticalAction"],"sources":["../../../../src/interactions/actions/defaults/distribute.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { Scene } from 'core/scene/types';\nimport type { PoseDescriptor } from '../resize/geometry';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, visualBoundsViaDescriptor } from '../align/align';\nimport type { DistributeAxis, DistributeMode } from '../distribute/distribute';\nimport { planDistribute } from '../distribute/plan';\nimport { scenePoseFrame } from '../poseFrame';\nimport type { Action } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { ImmediateInvoker } from '@weasel-js/routing';\nimport { DistributeHorizontalIcon, DistributeVerticalIcon } from './icons/distributeIcons';\n\nconst ID_FOR: Record<DistributeAxis, string> = { x: 'distribute.horizontal', y: 'distribute.vertical' };\nconst LABEL_FOR: Record<DistributeAxis, string> = { x: 'Distribute Horizontally', y: 'Distribute Vertically' };\nconst ICON_FOR: Record<DistributeAxis, ReactNode> = {\n x: <DistributeHorizontalIcon />,\n y: <DistributeVerticalIcon />,\n};\n\n// ---------------------------------------------------------------------------\n// Shared helper for descriptor invokers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply a distribute operation to the current selection via the Scene API.\n * Reads poses through the `poseDescriptor` dep; `mode` comes from the\n * binding's `params.mode`.\n *\n * The span being divided is a world span, so the bounds are read and\n * translated in world and each result is stored back in its own parent's\n * frame.\n */\nfunction distributeSelection(\n selection: SelectionApi,\n scene: Scene<unknown, string, unknown>,\n axis: DistributeAxis,\n mode: DistributeMode,\n geom: PoseDescriptor<unknown>,\n poseComposition: unknown,\n): void {\n const ids = selection.get();\n if (ids.length < 3) return;\n const frame = scenePoseFrame(scene, poseComposition);\n\n const items = ids.map((id) => {\n const pose = frame.world(id);\n return { id, pose, b: visualBoundsViaDescriptor(pose, geom) };\n });\n const targets = planDistribute(items.map((it) => it.b), axis, mode);\n\n scene.batch('Distribute', () => {\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n const delta = targets[i] - (axis === 'x' ? it.b.x : it.b.y);\n if (delta === 0) continue;\n const dx = axis === 'x' ? delta : 0;\n const dy = axis === 'y' ? delta : 0;\n const to = translatePoseViaDescriptor(it.pose, dx, dy, geom);\n scene.setPose(it.id, frame.local(it.id, to));\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Static descriptors\n// ---------------------------------------------------------------------------\n\nfunction makeDistributeAction(axis: DistributeAxis): Action {\n return {\n id: ID_FOR[axis],\n label: LABEL_FOR[axis],\n icon: ICON_FOR[axis],\n group: 'distribute',\n eligible: { capability: 'transforms-selection' },\n requires: ['selection', 'scene', 'poseDescriptor', 'poseComposition'],\n // No default keybindings. Wire bindings explicitly via the actions registry.\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const selection = deps.selection as SelectionApi | undefined;\n const scene = deps.scene as Scene<unknown, string, unknown> | undefined;\n if (!selection || !scene) return;\n const mode = (params?.mode as DistributeMode | undefined) ?? 'centers';\n distributeSelection(selection, scene, axis, mode, poseDescriptorOf(deps.poseDescriptor), deps.poseComposition);\n },\n } satisfies ImmediateInvoker,\n // Deps-aware, matching `distributeSelection`'s own `ids.length < 3` guard:\n // a constant disabled reason greys the entry out forever (see\n // `requiresSelection`).\n enabled: (deps) => {\n const selection = deps?.selection as SelectionApi | undefined;\n const count = selection?.get().length ?? 0;\n return count >= 3 ? true : ActionDisabledReason.SelectionRequired;\n },\n };\n}\n\n/** @experimental Static descriptor for distribute-horizontal. */\nexport const distributeHorizontalAction = makeDistributeAction('x');\n/** @experimental Static descriptor for distribute-vertical. */\nexport const distributeVerticalAction = makeDistributeAction('y');\n\n"],"mappings":";;;;;;;;AAcA,IAAMA,IAAyC;CAAE,GAAG;CAAyB,GAAG;AAAsB,GAChGC,IAA4C;CAAE,GAAG;CAA2B,GAAG;AAAwB,GACvGC,IAA8C;CAClD,GAAG,kBAACC,GAAD,CAA2B,CAAA;CAC9B,GAAG,kBAACC,GAAD,CAAyB,CAAA;AAC9B;AAeA,SAASC,EACP,GACA,GACA,GACA,GACA,GACA,GACM;CACN,IAAMC,IAAMC,EAAU,IAAI;CAC1B,IAAID,EAAI,SAAS,GAAG;CACpB,IAAME,IAAQC,EAAeC,GAAOC,CAAe,GAE7CC,IAAQN,EAAI,KAAK,MAAO;EAC5B,IAAMO,IAAOL,EAAM,MAAMM,CAAE;EAC3B,OAAO;GAAE;GAAI;GAAM,GAAGC,EAA0BF,GAAMG,CAAI;EAAE;CAC9D,CAAC,GACKC,IAAUC,EAAeN,EAAM,KAAK,MAAOO,EAAG,CAAC,GAAGC,GAAMC,CAAI;CAElE,EAAM,MAAM,oBAAoB;EAC9B,KAAK,IAAIC,IAAI,GAAGA,IAAIV,EAAM,QAAQ,KAAK;GACrC,IAAMO,IAAKP,EAAMU,IACXC,IAAQN,EAAQK,MAAMF,MAAS,MAAMD,EAAG,EAAE,IAAIA,EAAG,EAAE;GACzD,IAAII,MAAU,GAAG;GACjB,IAAMC,IAAKJ,MAAS,MAAMG,IAAQ,GAC5BE,IAAKL,MAAS,MAAMG,IAAQ,GAC5BG,IAAKC,EAA2BR,EAAG,MAAMK,GAAIC,GAAIT,CAAI;GAC3D,EAAM,QAAQG,EAAG,IAAIX,EAAM,MAAMW,EAAG,IAAIO,CAAE,CAAC;EAC7C;CACF,CAAC;AACH;AAMA,SAASE,EAAqB,GAA8B;CAC1D,OAAO;EACL,IAAI5B,EAAOoB;EACX,OAAOnB,EAAUmB;EACjB,MAAMlB,EAASkB;EACf,OAAO;EACP,UAAU,EAAE,YAAY,uBAAuB;EAC/C,UAAU;GAAC;GAAa;GAAS;GAAkB;EAAiB;EAEpE,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMb,IAAYsB,EAAK,WACjBnB,IAAQmB,EAAK;IACnB,AAAKtB,KAAcG,KAEnBL,EAAoBE,GAAWG,GAAOU,GADxBU,GAAQ,QAAuC,WACXC,EAAiBF,EAAK,cAAc,GAAGA,EAAK,eAAe;GAC/G;EACF;EAIA,UAAU,QACUA,GAAM,UAAA,EACC,IAAI,CAAC,CAAC,UAAU,MACzB,KAAWG,EAAqB;CAEpD;AACF;AAGA,IAAaC,IAA6BL,EAAqB,GAAG,GAErDM,IAA6BN,EAAqB,GAAG"}
@@ -0,0 +1,83 @@
1
+ import { asNodeId as e } from "../../../core/scene/types.js";
2
+ import { translatePoseViaDescriptor as t } from "../../../core/geometry/poseDescriptor.js";
3
+ import { poseDescriptorOf as n } from "../poseDescriptorDep.js";
4
+ import { defaultCommitAdapter as r } from "../defaultCommitAdapter.js";
5
+ import { createInsertOp as i } from "../../../core/ops/create.js";
6
+ import { freshNodeId as a } from "./freshNodeId.js";
7
+ import { DuplicateIcon as o } from "./icons/editIcons.js";
8
+ import { requiresSelection as s } from "./requiresSelection.js";
9
+ import { createElement as c } from "react";
10
+ //#region src/interactions/actions/defaults/duplicate.ts
11
+ var l = 12;
12
+ function u(e, t, n) {
13
+ let r = e.get(t)?.parent ?? null;
14
+ for (; r != null;) {
15
+ if (n.has(r)) return !0;
16
+ r = e.get(r)?.parent ?? null;
17
+ }
18
+ return !1;
19
+ }
20
+ function d(e, n, r, o, s, c, l) {
21
+ let u = e.get(n);
22
+ if (!u) return null;
23
+ let f = a(), p = {
24
+ ...u,
25
+ id: f,
26
+ pose: t(u.pose, o.dx, o.dy, l),
27
+ parent: r
28
+ };
29
+ c.push(i({
30
+ node: p,
31
+ label: "Duplicate"
32
+ }));
33
+ let m = s ? o : {
34
+ dx: 0,
35
+ dy: 0
36
+ };
37
+ for (let t of e.childrenOf(n)) d(e, t, f, m, s, c, l);
38
+ return f;
39
+ }
40
+ var f = {
41
+ id: "duplicate",
42
+ label: "Duplicate",
43
+ icon: c(o),
44
+ group: "edit",
45
+ defaultBinding: {
46
+ kind: "key",
47
+ key: "d",
48
+ mods: { mod: !0 }
49
+ },
50
+ eligible: { capability: ["edits-page", "creates-selection"] },
51
+ requires: [
52
+ "scene",
53
+ "selection",
54
+ "applyOps",
55
+ "poseComposition",
56
+ "poseDescriptor"
57
+ ],
58
+ invoker: {
59
+ timing: "immediate",
60
+ run: (t) => {
61
+ let i = t.selection, a = t.scene, o = t.applyOps;
62
+ if (!i || !a) return;
63
+ let s = i.get();
64
+ if (s.length === 0) return;
65
+ let c = new Set(s), f = n(t.poseDescriptor), p = {
66
+ dx: l,
67
+ dy: l
68
+ }, m = [], h = [];
69
+ for (let n of s) {
70
+ let r = e(n), i = a.get(r);
71
+ if (!i || u(a, r, c)) continue;
72
+ let o = d(a, r, i.parent ?? null, p, t.poseComposition === void 0, m, f);
73
+ o && h.push(o);
74
+ }
75
+ m.length !== 0 && (o ? o(m, "Duplicate") : a.applyBatch(m, "Duplicate", r(a, i.adapterMethods)), i.set(h));
76
+ }
77
+ },
78
+ enabled: s
79
+ };
80
+ //#endregion
81
+ export { f as duplicateAction };
82
+
83
+ //# sourceMappingURL=duplicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate.js","names":["DUPLICATE_OFFSET","hasSelectedAncestor","parent","scene","id","set","copySubtree","node","newId","freshNodeId","copy","translatePoseViaDescriptor","offset","d","createInsertOp","childOffset","offsetDescendants","child","ops","duplicateAction","createElement","DuplicateIcon","selection","deps","applyOps","ids","descriptor","poseDescriptorOf","newIds","nid","asNodeId","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 type { Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { Op } from 'core/ops/types';\nimport { createInsertOp } from 'core/ops/create';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\nimport { freshNodeId } from './freshNodeId';\nimport { requiresSelection } from './requiresSelection';\nimport { poseDescriptorOf } from '../poseDescriptorDep';\nimport { translatePoseViaDescriptor, type PoseDescriptor } 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/** True when any ancestor of `id` is also in `set` — that ancestor's copy\n * already brings this node along, so duplicating it again would double it. */\nfunction hasSelectedAncestor(\n scene: Scene<unknown, string, unknown>,\n id: NodeId,\n set: ReadonlySet<string>,\n): boolean {\n let parent = scene.get(id)?.parent ?? null;\n while (parent != null) {\n if (set.has(parent)) return true;\n parent = scene.get(parent)?.parent ?? null;\n }\n return false;\n}\n\n/**\n * Copy `id`'s whole subtree, appending one insert op per node in pre-order so\n * a parent always exists before its children are inserted. Returns the new\n * root's id.\n *\n * `offsetDescendants` is false for local-pose consumers (those that registered\n * a `poseComposition`): a child's pose is relative there, so offsetting the\n * root already carries the subtree, and offsetting again would double it. With\n * the default absolute poses every node stores world coords and every one\n * moves.\n */\nfunction copySubtree(\n scene: Scene<unknown, string, unknown>,\n id: NodeId,\n parent: NodeId | null,\n offset: { dx: number; dy: number },\n offsetDescendants: boolean,\n ops: Op[],\n d: PoseDescriptor<unknown>,\n): NodeId | null {\n const node = scene.get(id);\n if (!node) return null;\n const newId = freshNodeId();\n const copy = {\n ...node,\n id: newId,\n pose: translatePoseViaDescriptor(node.pose, offset.dx, offset.dy, d),\n parent,\n } as Node<unknown, string, unknown>;\n ops.push(createInsertOp<Node<unknown, string, unknown>>({ node: copy, label: 'Duplicate' }));\n const childOffset = offsetDescendants ? offset : { dx: 0, dy: 0 };\n for (const child of scene.childrenOf(id)) {\n copySubtree(scene, child, newId, childOffset, offsetDescendants, ops, d);\n }\n return newId;\n}\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 as SelectionApi | undefined;\n const scene = deps.scene as Scene<unknown, string, unknown> | undefined;\n const applyOps = deps.applyOps as ((ops: Op[], label: string) => void) | undefined;\n if (!selection || !scene) return;\n const ids = selection.get();\n if (ids.length === 0) return;\n\n const set = new Set<string>(ids);\n const descriptor = poseDescriptorOf(deps.poseDescriptor);\n const offset = { dx: DUPLICATE_OFFSET, dy: DUPLICATE_OFFSET };\n const ops: Op[] = [];\n const newIds: NodeId[] = [];\n for (const id of ids) {\n const nid = asNodeId(id);\n const node = scene.get(nid);\n if (!node) continue;\n if (hasSelectedAncestor(scene, nid, set)) continue;\n const newId = copySubtree(scene, nid, node.parent ?? null, offset, deps.poseComposition === undefined, ops, descriptor);\n if (newId) newIds.push(newId);\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":";;;;;;;;;;AAgBA,IAAMA,IAAmB;AAIzB,SAASC,EACP,GACA,GACA,GACS;CACT,IAAIC,IAASC,EAAM,IAAIC,CAAE,CAAC,EAAE,UAAU;CACtC,OAAOF,KAAU,OAAM;EACrB,IAAIG,EAAI,IAAIH,CAAM,GAAG,OAAO;EAC5B,IAASC,EAAM,IAAID,CAAM,CAAC,EAAE,UAAU;CACxC;CACA,OAAO;AACT;AAaA,SAASI,EACP,GACA,GACA,GACA,GACA,GACA,GACA,GACe;CACf,IAAMC,IAAOJ,EAAM,IAAIC,CAAE;CACzB,IAAI,CAACG,GAAM,OAAO;CAClB,IAAMC,IAAQC,EAAY,GACpBC,IAAO;EACX,GAAGH;EACH,IAAIC;EACJ,MAAMG,EAA2BJ,EAAK,MAAMK,EAAO,IAAIA,EAAO,IAAIC,CAAC;EACnE;CACF;CACA,EAAI,KAAKC,EAA+C;EAAE,MAAMJ;EAAM,OAAO;CAAY,CAAC,CAAC;CAC3F,IAAMK,IAAcC,IAAoBJ,IAAS;EAAE,IAAI;EAAG,IAAI;CAAE;CAChE,KAAK,IAAMK,KAASd,EAAM,WAAWC,CAAE,GACrC,EAAYD,GAAOc,GAAOT,GAAOO,GAAaC,GAAmBE,GAAKL,CAAC;CAEzE,OAAOL;AACT;AAQA,IAAaW,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,WACjBpB,IAAQoB,EAAK,OACbC,IAAWD,EAAK;GACtB,IAAI,CAACD,KAAa,CAACnB,GAAO;GAC1B,IAAMsB,IAAMH,EAAU,IAAI;GAC1B,IAAIG,EAAI,WAAW,GAAG;GAEtB,IAAMpB,IAAM,IAAI,IAAYoB,CAAG,GACzBC,IAAaC,EAAiBJ,EAAK,cAAc,GACjDX,IAAS;IAAE,IAAIZ;IAAkB,IAAIA;GAAiB,GACtDkB,IAAY,CAAC,GACbU,IAAmB,CAAC;GAC1B,KAAK,IAAMxB,KAAMqB,GAAK;IACpB,IAAMI,IAAMC,EAAS1B,CAAE,GACjBG,IAAOJ,EAAM,IAAI0B,CAAG;IAE1B,IADI,CAACtB,KACDN,EAAoBE,GAAO0B,GAAKxB,CAAG,GAAG;IAC1C,IAAMG,IAAQF,EAAYH,GAAO0B,GAAKtB,EAAK,UAAU,MAAMK,GAAQW,EAAK,oBAAoB,KAAA,GAAWL,GAAKQ,CAAU;IACtH,AAAIlB,KAAOoB,EAAO,KAAKpB,CAAK;GAC9B;GAEA,AAAIU,EAAI,WAAW,MACfM,IAAUA,EAASN,GAAK,WAAW,IAClCf,EAAM,WAAWe,GAAK,aAAaa,EAAqB5B,GAAOmB,EAAU,cAAc,CAAC,GAC7FA,EAAU,IAAIM,CAAM;EACtB;CACF;CACA,SAASI;AACX"}