@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,81 @@
1
+ import { IDENTITY_POSE_COMPOSITION as e } from "../../../core/scene/composeFrame.js";
2
+ import { createTransformOp as t } from "../../../core/ops/transform.js";
3
+ import { unionAABB as n } from "../../../core/geometry/unionBounds.js";
4
+ import { RECT_POSE_DESCRIPTOR as r, translatePoseViaDescriptor as i, visualBoundsViaDescriptor as a } from "../../../core/geometry/poseDescriptor.js";
5
+ import { poseFrame as o } from "../poseFrame.js";
6
+ import { dispatchApplyBatch as s } from "../../../core/applyOps.js";
7
+ import { usePointerContext as c } from "../../../features/pointer/PointerContext.js";
8
+ import { resolveSpatialReference as l } from "../spatialReference.js";
9
+ import { useCallback as u } from "react";
10
+ import { useLatest as d } from "@weasel-js/react";
11
+ //#region src/interactions/actions/align/align.ts
12
+ function f(e, t, r) {
13
+ return t === void 0 || t === "union" ? e.length < 2 ? null : n([...e]) : e.length === 0 ? null : l(t, r);
14
+ }
15
+ function p(e, t, n) {
16
+ switch (n) {
17
+ case "left": return {
18
+ dx: t.x - e.x,
19
+ dy: 0
20
+ };
21
+ case "right": return {
22
+ dx: t.x + t.width - (e.x + e.width),
23
+ dy: 0
24
+ };
25
+ case "top": return {
26
+ dx: 0,
27
+ dy: t.y - e.y
28
+ };
29
+ case "bottom": return {
30
+ dx: 0,
31
+ dy: t.y + t.height - (e.y + e.height)
32
+ };
33
+ case "center-x": return {
34
+ dx: t.x + t.width / 2 - (e.x + e.width / 2),
35
+ dy: 0
36
+ };
37
+ case "center-y": return {
38
+ dx: 0,
39
+ dy: t.y + t.height / 2 - (e.y + e.height / 2)
40
+ };
41
+ }
42
+ }
43
+ function m(n, l = {}) {
44
+ let m = d(n), h = d(l), g = c(), _ = d(g);
45
+ return { align: u((n, c) => {
46
+ let l = m.current, u = h.current, d = l.getSelection(), g = u.geometry ?? r, v = o({
47
+ getPose: (e) => l.getPose(e),
48
+ getParent: (e) => l.getParent?.(e) ?? null
49
+ }, u.composition ?? e), y = d.map((e) => v.world(e)), b = y.map((e) => a(e, g)), x = f(b, c, {
50
+ pointer: () => {
51
+ let e = _.current?.get();
52
+ return e ? {
53
+ x: e.worldX,
54
+ y: e.worldY
55
+ } : null;
56
+ },
57
+ nodeBounds: (e) => a(v.world(e), g)
58
+ });
59
+ if (x === null) return;
60
+ let S = [];
61
+ for (let e = 0; e < d.length; e++) {
62
+ let { dx: r, dy: a } = p(b[e], x, n);
63
+ if (r === 0 && a === 0) continue;
64
+ let o = i(y[e], r, a, g);
65
+ S.push(t({
66
+ id: d[e],
67
+ from: l.getPose(d[e]),
68
+ to: v.local(d[e], o)
69
+ }));
70
+ }
71
+ S.length !== 0 && s(l, S, u.label ?? "Align");
72
+ }, [
73
+ m,
74
+ h,
75
+ _
76
+ ]) };
77
+ }
78
+ //#endregion
79
+ export { p as alignDeltaFor, f as alignTargetBounds, i as translatePoseViaDescriptor, m as useAlign, a as visualBoundsViaDescriptor };
80
+
81
+ //# sourceMappingURL=align.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"align.js","names":["alignTargetBounds","to","bounds","unionAABB","resolveSpatialReference","src","alignDeltaFor","edge","u","b","useAlign","adapterRef","useLatest","adapter","optsRef","options","pointer","usePointerContext","pointerRef","useCallback","a","o","sel","geom","RECT_POSE_DESCRIPTOR","frame","poseFrame","id","IDENTITY_POSE_COMPOSITION","poses","visualBoundsViaDescriptor","p","target","ops","i","dx","dy","translatePoseViaDescriptor","createTransformOp","dispatchApplyBatch"],"sources":["../../../../src/interactions/actions/align/align.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport type { NodeId } from 'core/scene/types';\nimport { RECT_POSE_DESCRIPTOR, type PoseDescriptor } from '../resize/geometry';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport { poseFrame } from '../poseFrame';\nimport { IDENTITY_POSE_COMPOSITION, type PoseComposition } from 'features/groups/composePose';\nimport { usePointerContext } from 'features/pointer/PointerContext';\nimport { resolveSpatialReference, type SpatialReference, type SpatialReferenceSources } from '../spatialReference';\n\nexport { visualBoundsViaDescriptor, translatePoseViaDescriptor } from '../resize/geometry';\nimport { visualBoundsViaDescriptor, translatePoseViaDescriptor } from '../resize/geometry';\n\n/** Edge or center the selection should align to within the reference's\n * bounds (rotated members contribute their ink extent). */\nexport type AlignEdge = 'left' | 'right' | 'top' | 'bottom' | 'center-x' | 'center-y';\n\n/** @experimental What the selection aligns to: `'union'` — the selection's\n * own visual union AABB, the default — or a {@link SpatialReference}. */\nexport type AlignReference = 'union' | SpatialReference;\n\n/** @experimental The bounds each member of `bounds` aligns to under `to`, or\n * `null` when there is nothing to align: a union of fewer than two members,\n * an empty selection, or a reference that names nothing right now. */\nexport function alignTargetBounds(\n bounds: readonly Bounds[],\n to: AlignReference | undefined,\n src: SpatialReferenceSources,\n): Bounds | null {\n if (to === undefined || to === 'union') return bounds.length < 2 ? null : unionAABB([...bounds]);\n if (bounds.length === 0) return null;\n return resolveSpatialReference(to, src);\n}\n\n/** Adapter for `useAlign`. */\nexport interface AlignAdapter<TPose> {\n getSelection(): NodeId[];\n /** The pose as stored — local to the node's parent. */\n getPose(id: NodeId): TPose;\n /** The parent chain, for a scene whose container poses define a frame.\n * Omit it (or leave `composition` unset) for an absolute-pose scene. */\n getParent?(id: NodeId): NodeId | null;\n applyOps?(ops: Op[], label?: string): void;\n}\n\n/** Options for `useAlign`. */\nexport interface UseAlignOptions<TPose> {\n /** Projection between `TPose` and bounds. Defaults to `RECT_POSE_DESCRIPTOR`\n * for `{x,y,width,height}` poses. Pass `pathPoseDescriptor` for `Path`\n * poses so polygon coords translate correctly. */\n geometry?: PoseDescriptor<TPose>;\n /** Label passed to applyOps. Default 'Align'. */\n label?: string;\n /** How local poses fold up to world. Default IDENTITY, where the two are\n * the same value and the alignment runs entirely in stored coordinates. */\n composition?: PoseComposition<TPose>;\n}\n\n/** Return shape of `useAlign`. */\nexport interface UseAlignReturn {\n /** Imperative trigger. `to` defaults to `'union'`, which needs two items;\n * any other reference aligns a single item too. `'pointer'` reads the\n * surrounding `<PointerContextProvider>`. */\n align(edge: AlignEdge, to?: AlignReference): void;\n}\n\n/** Compute the (dx, dy) translation that moves AABB `b` so that the requested\n * `edge`/center matches the corresponding feature of the union AABB `u`. */\nexport function alignDeltaFor(b: Bounds, u: Bounds, edge: AlignEdge): { dx: number; dy: number } {\n switch (edge) {\n case 'left': return { dx: u.x - b.x, dy: 0 };\n case 'right': return { dx: (u.x + u.width) - (b.x + b.width), dy: 0 };\n case 'top': return { dx: 0, dy: u.y - b.y };\n case 'bottom': return { dx: 0, dy: (u.y + u.height) - (b.y + b.height) };\n case 'center-x': return { dx: (u.x + u.width / 2) - (b.x + b.width / 2), dy: 0 };\n case 'center-y': return { dx: 0, dy: (u.y + u.height / 2) - (b.y + b.height / 2) };\n }\n}\n\n/** Align the current selection to a shared edge or center of the selection's\n * union AABB, or of another reference. Single batch — one undo step.\n *\n * The edge is a world edge: bounds are measured and translated in world, and\n * each result is stored back in its own parent's frame. */\nexport function useAlign<TPose>(\n adapter: AlignAdapter<TPose>,\n options: UseAlignOptions<TPose> = {},\n): UseAlignReturn {\n const adapterRef = useLatest(adapter);\n const optsRef = useLatest(options);\n const pointer = usePointerContext();\n const pointerRef = useLatest(pointer);\n\n const align = useCallback((edge: AlignEdge, to?: AlignReference): void => {\n const a = adapterRef.current;\n const o = optsRef.current;\n const sel = a.getSelection();\n const geom =\n o.geometry ??\n (RECT_POSE_DESCRIPTOR as unknown as PoseDescriptor<TPose>);\n const frame = poseFrame<TPose>(\n {\n getPose: (id) => a.getPose(id as NodeId),\n getParent: (id) => (a.getParent?.(id as NodeId) ?? null) as string | null,\n },\n o.composition ?? (IDENTITY_POSE_COMPOSITION as PoseComposition<TPose>),\n );\n const poses = sel.map((id) => frame.world(id));\n const bounds = poses.map((p) => visualBoundsViaDescriptor(p, geom));\n const target = alignTargetBounds(bounds, to, {\n pointer: () => {\n const p = pointerRef.current?.get();\n return p ? { x: p.worldX, y: p.worldY } : null;\n },\n nodeBounds: (id) => visualBoundsViaDescriptor(frame.world(id), geom),\n });\n if (target === null) return;\n const ops: Op[] = [];\n for (let i = 0; i < sel.length; i++) {\n const { dx, dy } = alignDeltaFor(bounds[i], target, edge);\n if (dx === 0 && dy === 0) continue;\n const to = translatePoseViaDescriptor(poses[i], dx, dy, geom);\n ops.push(createTransformOp<TPose>({\n id: sel[i],\n from: a.getPose(sel[i]),\n to: frame.local(sel[i], to),\n }));\n }\n if (ops.length === 0) return;\n dispatchApplyBatch(a, ops, o.label ?? 'Align');\n }, [adapterRef, optsRef, pointerRef]);\n\n return { align };\n}\n"],"mappings":";;;;;;;;;;;AA4BA,SAAgBA,EACd,GACA,GACA,GACe;CAGf,OAFIC,MAAO,KAAA,KAAaA,MAAO,UAAgBC,EAAO,SAAS,IAAI,OAAOC,EAAU,CAAC,GAAGD,CAAM,CAAC,IAC3FA,EAAO,WAAW,IAAU,OACzBE,EAAwBH,GAAII,CAAG;AACxC;AAoCA,SAAgBC,EAAc,GAAW,GAAW,GAA6C;CAC/F,QAAQC,GAAR;EACE,KAAK,QAAY,OAAO;GAAE,IAAIC,EAAE,IAAIC,EAAE;GAAG,IAAI;EAAE;EAC/C,KAAK,SAAY,OAAO;GAAE,IAAKD,EAAE,IAAIA,EAAE,SAAUC,EAAE,IAAIA,EAAE;GAAQ,IAAI;EAAE;EACvE,KAAK,OAAY,OAAO;GAAE,IAAI;GAAG,IAAID,EAAE,IAAIC,EAAE;EAAE;EAC/C,KAAK,UAAY,OAAO;GAAE,IAAI;GAAG,IAAKD,EAAE,IAAIA,EAAE,UAAWC,EAAE,IAAIA,EAAE;EAAQ;EACzE,KAAK,YAAY,OAAO;GAAE,IAAKD,EAAE,IAAIA,EAAE,QAAQ,KAAMC,EAAE,IAAIA,EAAE,QAAQ;GAAI,IAAI;EAAE;EAC/E,KAAK,YAAY,OAAO;GAAE,IAAI;GAAG,IAAKD,EAAE,IAAIA,EAAE,SAAS,KAAMC,EAAE,IAAIA,EAAE,SAAS;EAAG;CACnF;AACF;AAOA,SAAgBC,EACd,GACA,IAAkC,CAAC,GACnB;CAChB,IAAMC,IAAaC,EAAUC,CAAO,GAC9BC,IAAUF,EAAUG,CAAO,GAC3BC,IAAUC,EAAkB,GAC5BC,IAAaN,EAAUI,CAAO;CAyCpC,OAAO,EAAE,OAvCKG,GAAa,GAAiB,MAA8B;EACxE,IAAMC,IAAIT,EAAW,SACfU,IAAIP,EAAQ,SACZQ,IAAMF,EAAE,aAAa,GACrBG,IACJF,EAAE,YACDG,GACGC,IAAQC,EACZ;GACE,UAAU,MAAON,EAAE,QAAQO,CAAY;GACvC,YAAY,MAAQP,EAAE,YAAYO,CAAY,KAAK;EACrD,GACAN,EAAE,eAAgBO,CACpB,GACMC,IAAQP,EAAI,KAAK,MAAOG,EAAM,MAAME,CAAE,CAAC,GACvCzB,IAAS2B,EAAM,KAAK,MAAMC,EAA0BC,GAAGR,CAAI,CAAC,GAC5DS,IAAShC,EAAkBE,GAAQD,GAAI;GAC3C,eAAe;IACb,IAAM8B,IAAIb,EAAW,SAAS,IAAI;IAClC,OAAOa,IAAI;KAAE,GAAGA,EAAE;KAAQ,GAAGA,EAAE;IAAO,IAAI;GAC5C;GACA,aAAa,MAAOD,EAA0BL,EAAM,MAAME,CAAE,GAAGJ,CAAI;EACrE,CAAC;EACD,IAAIS,MAAW,MAAM;EACrB,IAAMC,IAAY,CAAC;EACnB,KAAK,IAAIC,IAAI,GAAGA,IAAIZ,EAAI,QAAQ,KAAK;GACnC,IAAM,EAAE,OAAI,UAAOhB,EAAcJ,EAAOgC,IAAIF,GAAQzB,CAAI;GACxD,IAAI4B,MAAO,KAAKC,MAAO,GAAG;GAC1B,IAAMnC,IAAKoC,EAA2BR,EAAMK,IAAIC,GAAIC,GAAIb,CAAI;GAC5D,EAAI,KAAKe,EAAyB;IAChC,IAAIhB,EAAIY;IACR,MAAMd,EAAE,QAAQE,EAAIY,EAAE;IACtB,IAAIT,EAAM,MAAMH,EAAIY,IAAIjC,CAAE;GAC5B,CAAC,CAAC;EACJ;EACA,AAAIgC,EAAI,WAAW,KACnBM,EAAmBnB,GAAGa,GAAKZ,EAAE,SAAS,OAAO;CAC/C,GAAG;EAACV;EAAYG;EAASI;CAAU,CAE1B,EAAM;AACjB"}
@@ -0,0 +1,120 @@
1
+ import { locateChild as e } from "../../../core/ops/slot.js";
2
+ import { createDeleteOp as t } from "../../../core/ops/delete.js";
3
+ import { createInsertOp as n } from "../../../core/ops/create.js";
4
+ import { dispatchApplyBatch as r } from "../../../core/applyOps.js";
5
+ import { createSetSelectionOp as i } from "../../../core/ops/select.js";
6
+ import { createMoveToIndexOp as a } from "../../../core/ops/reorder/index.js";
7
+ import { pathCrop as o, pathDivide as s, pathExclude as c, pathIntersect as l, pathSubtract as u, pathUnion as d } from "../../../features/paths/booleans.js";
8
+ import { TextOutlinesError as f, textToPath as p } from "../../../features/text/textToPath.js";
9
+ //#region src/interactions/actions/booleans/booleans.ts
10
+ function m(e, t) {
11
+ let n = e.getWorldPath(t);
12
+ if (n) return n;
13
+ let r = e.getTextSource?.(t);
14
+ if (!r) return;
15
+ let i = p(r.data, r.pose);
16
+ return i.commands.length > 0 ? i : void 0;
17
+ }
18
+ var h = {
19
+ union: "Union",
20
+ intersect: "Intersect",
21
+ subtract: "Subtract",
22
+ exclude: "Exclude",
23
+ divide: "Divide",
24
+ crop: "Crop"
25
+ };
26
+ function g(e) {
27
+ return e.commands.length === 0;
28
+ }
29
+ function _(p, _) {
30
+ let v = [...p.getSelection()], y = (t) => p.getZOrder ? p.getZOrder(t) : e(p, t) ?? void 0, b;
31
+ try {
32
+ b = v.map((e) => ({
33
+ id: e,
34
+ path: m(p, e)
35
+ }));
36
+ } catch (e) {
37
+ if (e instanceof f) return {
38
+ kind: "failed",
39
+ reason: "text-outlines",
40
+ error: e
41
+ };
42
+ throw e;
43
+ }
44
+ let x = b.filter((e) => e.path != null).sort((e, t) => p.compareZ(e.id, t.id));
45
+ if (x.length === 0) return {
46
+ kind: "noop",
47
+ reason: "no-paths"
48
+ };
49
+ if (_ === "subtract" && x.length < 2) return {
50
+ kind: "noop",
51
+ reason: "too-few-for-subtract"
52
+ };
53
+ if (x.length < 2) return {
54
+ kind: "noop",
55
+ reason: "no-paths"
56
+ };
57
+ let S = x.map((e) => e.path), C;
58
+ switch (_) {
59
+ case "union":
60
+ C = [d(...S)];
61
+ break;
62
+ case "intersect":
63
+ C = [l(...S)];
64
+ break;
65
+ case "exclude":
66
+ C = [c(...S)];
67
+ break;
68
+ case "subtract": {
69
+ let e = S[0], t = S.length === 2 ? S[1] : d(...S.slice(1));
70
+ C = [u(e, t)];
71
+ break;
72
+ }
73
+ case "divide":
74
+ C = s(...S);
75
+ break;
76
+ case "crop": C = o(...S);
77
+ }
78
+ if (C = C.filter((e) => !g(e)), C.length === 0) return {
79
+ kind: "noop",
80
+ reason: "empty-result"
81
+ };
82
+ let w = x[x.length - 1].id, T = y(w), E = T?.index;
83
+ if (T) {
84
+ let e = 0;
85
+ for (let t = 0; t < x.length - 1; t++) {
86
+ let n = y(x[t].id);
87
+ n && n.parentId === T.parentId && n.index < T.index && e++;
88
+ }
89
+ E = T.index - e;
90
+ }
91
+ let D = C.map((e) => p.createPathNode(e, _, w)), O = [], k = [];
92
+ for (let e of x) {
93
+ let t = p.getNode?.(e.id) ?? { id: e.id }, n = y(e.id)?.index ?? -1;
94
+ k.push({
95
+ node: t,
96
+ index: n
97
+ });
98
+ }
99
+ k.sort((e, t) => t.index - e.index);
100
+ for (let { node: e, index: n } of k) O.push(t({
101
+ node: e,
102
+ index: n
103
+ }));
104
+ for (let e of D) O.push(n({ node: e }));
105
+ return T && E !== void 0 && O.push(a({
106
+ ids: D.map((e) => e.id),
107
+ parentId: T.parentId,
108
+ index: E
109
+ })), O.push(i({
110
+ from: v,
111
+ to: D.map((e) => e.id)
112
+ })), r(p, O, h[_]), {
113
+ kind: "applied",
114
+ resultIds: D.map((e) => e.id)
115
+ };
116
+ }
117
+ //#endregion
118
+ export { _ as applyBooleanOp };
119
+
120
+ //# sourceMappingURL=booleans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booleans.js","names":["operandPath","path","adapter","id","text","glyphs","textToPath","LABEL","isEmpty","p","applyBooleanOp","sel","zOrder","locateChild","resolved","err","TextOutlinesError","entries","a","b","op","paths","results","pathUnion","pathIntersect","pathExclude","back","front","pathSubtract","pathDivide","pathCrop","topmostId","topAnchor","targetIndex","shift","i","z","newNodes","ops","captured","node","index","createDeleteOp","n","createInsertOp","createMoveToIndexOp","createSetSelectionOp","dispatchApplyBatch"],"sources":["../../../../src/interactions/actions/booleans/booleans.ts"],"sourcesContent":["/**\n * Pure action core for path boolean operations. Resolves the current\n * selection into z-ordered paths, runs the chosen op, and dispatches a\n * single batch of `Op`s (delete sources + insert results + set selection).\n *\n * The hook (`useBooleans`) wraps this with React glue; testing here is\n * trivial because the function takes a plain adapter.\n */\nimport {\n pathUnion,\n pathIntersect,\n pathSubtract,\n pathExclude,\n pathDivide,\n pathCrop,\n} from 'features/paths/booleans';\nimport type { Path, PolygonPath } from '@weasel-js/geom';\nimport { createInsertOp } from 'core/ops/create';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { createMoveToIndexOp } from 'core/ops/reorder';\nimport { createSetSelectionOp } from 'core/ops/select';\nimport { locateChild } from 'core/ops/slot';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId } from 'core/scene/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport { textToPath, TextOutlinesError, type TextNodeSource } from 'features/text/textToPath';\n\n/** Boolean op identifiers — five Pathfinder primaries plus Crop. */\nexport type BooleanOp = 'union' | 'intersect' | 'subtract' | 'exclude' | 'divide' | 'crop';\n\n/**\n * z-position descriptor for a path node. `parentId` is the direct parent\n * (or `null` for a top-level node); `index` is the position within that\n * parent's child order — never a global render index.\n */\n/** @internal */\nexport interface BooleanZOrder {\n parentId: string | null;\n index: number;\n}\n\n/** Adapter the hook and the pure core both consume. */\nexport interface BooleansAdapter {\n getSelection(): readonly NodeId[] | readonly string[];\n getWorldPath(id: NodeId): Path | undefined;\n /**\n * Optional: the text node behind `id`, for an id `getWorldPath` has no path\n * for. Its glyph outlines (`textToPath`) become the operand, so text can be\n * cut, united or intersected like any shape.\n */\n getTextSource?(id: NodeId): TextNodeSource | undefined;\n compareZ(a: NodeId, b: NodeId): number;\n /**\n * Mint a new node from a boolean-op result `Path`. `producedBy` names the\n * op that synthesized it — adapters that store provenance (e.g. for a\n * layer-panel icon) record it; others ignore the arg. `sourceId` is the\n * topmost source, whose slot the result takes: give the node that source's\n * parent, or the kit's reorder cannot find it there.\n */\n createPathNode(path: Path, producedBy: BooleanOp, sourceId: NodeId): { id: string };\n /**\n * Optional: return the full object for an id, used by the delete ops so\n * their `invert` (an insert) can restore the complete object on undo.\n * If omitted, a `{ id }` stub is captured — undo will reinstate the id\n * but consumers reading other fields (path, fill, etc.) will see them as\n * undefined. Mirrors `DeleteAdapter.getNode`; should be provided whenever\n * undo over boolean ops is expected to be lossless.\n */\n getNode?(id: NodeId): { id: string } | undefined | null;\n /**\n * Optional: the reorder contract. With `getChildren` (and `getParent`, or\n * every node reads as top-level) the kit reads each source's slot among its\n * siblings, and with `setChildOrder` as well it moves the result into the\n * topmost source's slot. Without them the result lands wherever\n * `insertNode` defaults to. `defaultCommitAdapter` supplies all three.\n */\n getParent?(id: string): string | null;\n getChildren?(parentId: string | null): readonly string[];\n setChildOrder?(parentId: string | null, ids: string[]): void;\n /**\n * Optional override for the slot the kit otherwise reads through\n * `getParent` / `getChildren`: `id`'s parent and its index in that\n * parent's child order.\n *\n * @deprecated Supply `getParent` and `getChildren` instead, and the kit\n * derives this.\n */\n getZOrder?(id: NodeId): BooleanZOrder | undefined;\n applyOps?(ops: Op[], label?: string): void;\n setSelection?(ids: NodeId[]): void;\n insertNode?(node: { id: string }): void;\n removeNode?(id: string): void;\n}\n\n/** Outcome reported back to callers (lets the hook surface no-op signals). */\nexport type BooleanOpResult =\n | { kind: 'applied'; resultIds: string[] }\n | { kind: 'noop'; reason: 'no-paths' | 'too-few-for-subtract' | 'empty-result' }\n /** A text operand had no outline geometry. Nothing was changed: an op that\n * quietly dropped the operand would commit a different shape than asked. */\n | { kind: 'failed'; reason: 'text-outlines'; error: TextOutlinesError };\n\nfunction operandPath(adapter: BooleansAdapter, id: NodeId): Path | undefined {\n const path = adapter.getWorldPath(id);\n if (path) return path;\n const text = adapter.getTextSource?.(id);\n if (!text) return undefined;\n // Blank text has no geometry, and is no more an operand than a group is.\n const glyphs = textToPath(text.data, text.pose);\n return glyphs.commands.length > 0 ? glyphs : undefined;\n}\n\nconst LABEL: Record<BooleanOp, string> = {\n union: 'Union',\n intersect: 'Intersect',\n subtract: 'Subtract',\n exclude: 'Exclude',\n divide: 'Divide',\n crop: 'Crop',\n};\n\nfunction isEmpty(p: PolygonPath): boolean {\n return p.commands.length === 0;\n}\n\n/**\n * Run one Boolean operation over the selected paths and commit the result as a\n * single undoable batch.\n *\n * Operands are ordered back-to-front, which is what makes `subtract` mean\n * \"everything in front removed from the backmost shape\". Returns without\n * mutating anything when the selection holds no paths, or too few for the\n * requested operation.\n */\nexport function applyBooleanOp(\n adapter: BooleansAdapter,\n op: BooleanOp,\n): BooleanOpResult {\n const sel = [...adapter.getSelection()] as NodeId[];\n const zOrder = (id: NodeId): BooleanZOrder | undefined =>\n adapter.getZOrder ? adapter.getZOrder(id) : locateChild(adapter, id) ?? undefined;\n // Resolve path nodes only, sorted ascending by `compareZ` so paths[0] is\n // the bottommost (back) member. `subtract` relies on this: it computes\n // `back − union(rest)`, which is Illustrator's \"Minus Front.\" Keep this\n // convention in sync if compareZ semantics ever flip.\n let resolved: { id: NodeId; path: Path | undefined }[];\n try {\n resolved = sel.map((id) => ({ id, path: operandPath(adapter, id) }));\n } catch (err) {\n if (err instanceof TextOutlinesError) return { kind: 'failed', reason: 'text-outlines', error: err };\n throw err;\n }\n const entries = resolved\n .filter((e): e is { id: NodeId; path: Path } => e.path != null)\n .sort((a, b) => adapter.compareZ(a.id, b.id));\n\n if (entries.length === 0) return { kind: 'noop', reason: 'no-paths' };\n if (op === 'subtract' && entries.length < 2) {\n return { kind: 'noop', reason: 'too-few-for-subtract' };\n }\n if (entries.length < 2) return { kind: 'noop', reason: 'no-paths' };\n\n const paths = entries.map((e) => e.path);\n let results: PolygonPath[];\n\n switch (op) {\n case 'union': results = [pathUnion(...paths)]; break;\n case 'intersect': results = [pathIntersect(...paths)]; break;\n case 'exclude': results = [pathExclude(...paths)]; break;\n case 'subtract': {\n // Illustrator \"Minus Front\": back − union(everything in front).\n const back = paths[0];\n const front = paths.length === 2 ? paths[1] : pathUnion(...paths.slice(1));\n results = [pathSubtract(back, front)];\n break;\n }\n case 'divide': {\n results = pathDivide(...paths);\n break;\n }\n case 'crop': {\n // Illustrator \"Crop\": clip every source-below-top to the topmost\n // path; topmost is consumed as the mask. `paths` is back-to-front\n // ascending, so the topmost source is `paths[paths.length-1]`.\n results = pathCrop(...paths);\n break;\n }\n }\n\n results = results.filter((p) => !isEmpty(p));\n if (results.length === 0) return { kind: 'noop', reason: 'empty-result' };\n\n // Capture the topmost source's z-slot before we mutate the scene. The\n // topmost source is the last entry (entries are back-to-front ascending).\n // We adjust for selected members that sit below the topmost in the same\n // parent — their deletions collapse the parent's child list before the\n // reorder runs, so the visual slot the topmost occupied lives at a lower\n // index after the deletes. Members in a different parent don't affect\n // this parent's indexing.\n const topmostId = entries[entries.length - 1].id;\n const topAnchor = zOrder(topmostId);\n let targetIndex = topAnchor?.index;\n if (topAnchor) {\n let shift = 0;\n for (let i = 0; i < entries.length - 1; i++) {\n const z = zOrder(entries[i].id);\n if (z && z.parentId === topAnchor.parentId && z.index < topAnchor.index) {\n shift++;\n }\n }\n targetIndex = topAnchor.index - shift;\n }\n\n const newNodes = results.map((p) => adapter.createPathNode(p, op, topmostId));\n const ops: Op[] = [];\n const captured: { node: { id: string }; index: number }[] = [];\n for (const e of entries) {\n // Capture the full node so the delete's `invert()` (an insert) restores\n // every field on undo. Fallback to a `{ id }` stub matches the legacy\n // behavior for adapters that haven't opted in yet. Index comes from\n // the same slot read used for anchoring; -1 when the adapter doesn't\n // expose order.\n const node = adapter.getNode?.(e.id) ?? { id: e.id };\n const index = zOrder(e.id)?.index ?? -1;\n captured.push({ node, index });\n }\n // Order by index DESC so reverse-then-invert (history's undo path)\n // re-inserts ASC — each splice lands on a correctly-sized array\n // instead of clamping high indices to a still-growing length.\n captured.sort((a, b) => b.index - a.index);\n for (const { node, index } of captured) ops.push(createDeleteOp({ node, index }));\n for (const n of newNodes) ops.push(createInsertOp({ node: n }));\n if (topAnchor && targetIndex !== undefined) {\n // After the deletes, the topmost source's index is no longer occupied;\n // moving the new nodes to the adjusted index drops them into that slot.\n // For divide (N outputs), they form a contiguous block in input order\n // starting at the target index.\n ops.push(createMoveToIndexOp({\n ids: newNodes.map((n) => n.id),\n parentId: topAnchor.parentId,\n index: targetIndex,\n }));\n }\n ops.push(createSetSelectionOp({\n from: sel,\n to: newNodes.map((n) => n.id as NodeId),\n }));\n dispatchApplyBatch(adapter, ops, LABEL[op]);\n\n return { kind: 'applied', resultIds: newNodes.map((n) => n.id) };\n}\n"],"mappings":";;;;;;;;;AAsGA,SAASA,EAAY,GAA0B,GAA8B;CAC3E,IAAMC,IAAOC,EAAQ,aAAaC,CAAE;CACpC,IAAIF,GAAM,OAAOA;CACjB,IAAMG,IAAOF,EAAQ,gBAAgBC,CAAE;CACvC,IAAI,CAACC,GAAM;CAEX,IAAMC,IAASC,EAAWF,EAAK,MAAMA,EAAK,IAAI;CAC9C,OAAOC,EAAO,SAAS,SAAS,IAAIA,IAAS,KAAA;AAC/C;AAEA,IAAME,IAAmC;CACvC,OAAO;CACP,WAAW;CACX,UAAU;CACV,SAAS;CACT,QAAQ;CACR,MAAM;AACR;AAEA,SAASC,EAAQ,GAAyB;CACxC,OAAOC,EAAE,SAAS,WAAW;AAC/B;AAWA,SAAgBC,EACd,GACA,GACiB;CACjB,IAAMC,IAAM,CAAC,GAAGT,EAAQ,aAAa,CAAC,GAChCU,KAAU,MACdV,EAAQ,YAAYA,EAAQ,UAAUC,CAAE,IAAIU,EAAYX,GAASC,CAAE,KAAK,KAAA,GAKtEW;CACJ,IAAI;EACF,IAAWH,EAAI,KAAK,OAAQ;GAAE;GAAI,MAAMX,EAAYE,GAASC,CAAE;EAAE,EAAE;CACrE,SAASY,GAAK;EACZ,IAAIA,aAAeC,GAAmB,OAAO;GAAE,MAAM;GAAU,QAAQ;GAAiB,OAAOD;EAAI;EACnG,MAAMA;CACR;CACA,IAAME,IAAUH,EACb,QAAQ,MAAuC,EAAE,QAAQ,IAAI,CAAC,CAC9D,MAAM,GAAG,MAAMZ,EAAQ,SAASgB,EAAE,IAAIC,EAAE,EAAE,CAAC;CAE9C,IAAIF,EAAQ,WAAW,GAAG,OAAO;EAAE,MAAM;EAAQ,QAAQ;CAAW;CACpE,IAAIG,MAAO,cAAcH,EAAQ,SAAS,GACxC,OAAO;EAAE,MAAM;EAAQ,QAAQ;CAAuB;CAExD,IAAIA,EAAQ,SAAS,GAAG,OAAO;EAAE,MAAM;EAAQ,QAAQ;CAAW;CAElE,IAAMI,IAAQJ,EAAQ,KAAK,MAAM,EAAE,IAAI,GACnCK;CAEJ,QAAQF,GAAR;EACE,KAAK;GAAa,IAAU,CAACG,EAAU,GAAGF,CAAK,CAAC;GAAG;EACnD,KAAK;GAAa,IAAU,CAACG,EAAc,GAAGH,CAAK,CAAC;GAAG;EACvD,KAAK;GAAa,IAAU,CAACI,EAAY,GAAGJ,CAAK,CAAC;GAAG;EACrD,KAAK,YAAY;GAEf,IAAMK,IAAOL,EAAM,IACbM,IAAQN,EAAM,WAAW,IAAIA,EAAM,KAAKE,EAAU,GAAGF,EAAM,MAAM,CAAC,CAAC;GACzE,IAAU,CAACO,EAAaF,GAAMC,CAAK,CAAC;GACpC;EACF;EACA,KAAK;GACH,IAAUE,EAAW,GAAGR,CAAK;GAC7B;EAEF,KAAK,QAIH,IAAUS,EAAS,GAAGT,CAAK;CAG/B;CAGA,IADA,IAAUC,EAAQ,QAAQ,MAAM,CAACd,EAAQC,CAAC,CAAC,GACvCa,EAAQ,WAAW,GAAG,OAAO;EAAE,MAAM;EAAQ,QAAQ;CAAe;CASxE,IAAMS,IAAYd,EAAQA,EAAQ,SAAS,EAAE,CAAC,IACxCe,IAAYpB,EAAOmB,CAAS,GAC9BE,IAAcD,GAAW;CAC7B,IAAIA,GAAW;EACb,IAAIE,IAAQ;EACZ,KAAK,IAAIC,IAAI,GAAGA,IAAIlB,EAAQ,SAAS,GAAG,KAAK;GAC3C,IAAMmB,IAAIxB,EAAOK,EAAQkB,EAAE,CAAC,EAAE;GAC9B,AAAIC,KAAKA,EAAE,aAAaJ,EAAU,YAAYI,EAAE,QAAQJ,EAAU,SAChE;EAEJ;EACA,IAAcA,EAAU,QAAQE;CAClC;CAEA,IAAMG,IAAWf,EAAQ,KAAK,MAAMpB,EAAQ,eAAeO,GAAGW,GAAIW,CAAS,CAAC,GACtEO,IAAY,CAAC,GACbC,IAAsD,CAAC;CAC7D,KAAK,IAAM,KAAKtB,GAAS;EAMvB,IAAMuB,IAAOtC,EAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,GAC7CuC,IAAQ7B,EAAO,EAAE,EAAE,CAAC,EAAE,SAAS;EACrC,EAAS,KAAK;GAAE;GAAM;EAAM,CAAC;CAC/B;CAIA,EAAS,MAAM,GAAG,MAAMO,EAAE,QAAQD,EAAE,KAAK;CACzC,KAAK,IAAM,EAAE,SAAM,cAAWqB,GAAU,EAAI,KAAKG,EAAe;EAAE;EAAM;CAAM,CAAC,CAAC;CAChF,KAAK,IAAMC,KAAKN,GAAU,EAAI,KAAKO,EAAe,EAAE,MAAMD,EAAE,CAAC,CAAC;CAkB9D,OAjBIX,KAAaC,MAAgB,KAAA,KAK/BK,EAAI,KAAKO,EAAoB;EAC3B,KAAKR,EAAS,KAAK,MAAMM,EAAE,EAAE;EAC7B,UAAUX,EAAU;EACpB,OAAOC;CACT,CAAC,CAAC,GAEJK,EAAI,KAAKQ,EAAqB;EAC5B,MAAMnC;EACN,IAAI0B,EAAS,KAAK,MAAMM,EAAE,EAAY;CACxC,CAAC,CAAC,GACFI,EAAmB7C,GAASoC,GAAK/B,EAAMa,EAAG,GAEnC;EAAE,MAAM;EAAW,WAAWiB,EAAS,KAAK,MAAMM,EAAE,EAAE;CAAE;AACjE"}
@@ -0,0 +1,20 @@
1
+ import { applyBooleanOp as e } from "./booleans.js";
2
+ import { useCallback as t } from "react";
3
+ import { useLatest as n } from "@weasel-js/react";
4
+ function r(r, i = {}) {
5
+ let a = n(r), o = t((t) => {
6
+ e(a.current, t);
7
+ }, [a]);
8
+ return {
9
+ union: t(() => o("union"), [o]),
10
+ intersect: t(() => o("intersect"), [o]),
11
+ subtract: t(() => o("subtract"), [o]),
12
+ exclude: t(() => o("exclude"), [o]),
13
+ divide: t(() => o("divide"), [o]),
14
+ crop: t(() => o("crop"), [o])
15
+ };
16
+ }
17
+ //#endregion
18
+ export { r as useBooleans };
19
+
20
+ //# sourceMappingURL=useBooleans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBooleans.js","names":["useBooleans","adapterRef","useLatest","adapter","run","useCallback","op"],"sources":["../../../../src/interactions/actions/booleans/useBooleans.ts"],"sourcesContent":["/**\n * `useBooleans` — selection-driven Boolean ops on path layers.\n *\n * Returns six imperative callables (`union` / `intersect` / `subtract` /\n * `exclude` / `divide` / `crop`). Each reads the current selection,\n * performs the op in world space, and dispatches a single batch through\n * the adapter's `applyOps` (one undo step).\n *\n * Adapter shape: see `BooleansAdapter` in `./booleans.ts`. Consumers\n * supply how to read selection, fetch the world-space `Path` for an id,\n * compare ids by stacking order, and mint a node from a result `Path`.\n *\n * No-ops are silent in production; in dev, `subtract` with < 2 selected\n * paths emits a `console.warn`.\n */\nimport { useCallback } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { applyBooleanOp, type BooleansAdapter, type BooleanOp } from './booleans';\n\n/** The six Boolean path operations, each acting on the current selection and\n * committing as one undo step. */\nexport interface UseBooleansReturn {\n union(): void;\n intersect(): void;\n subtract(): void;\n exclude(): void;\n divide(): void;\n crop(): void;\n}\n\n/** Options for `useBooleans`. */\nexport interface UseBooleansOptions {\n /** No-op. Retained for source-compatibility; auto-registration is now\n * handled by `useStandardActions` via the Pathfinder descriptors. */\n enableActions?: boolean;\n}\n\nconst isDev = typeof import.meta !== 'undefined'\n && (import.meta as { env?: { DEV?: boolean } }).env?.DEV;\n\n/** Bind the Boolean path operations to an adapter that knows how to read the\n * selection, fetch world-space paths and mint result nodes. */\nexport function useBooleans(\n adapter: BooleansAdapter,\n _options: UseBooleansOptions = {},\n): UseBooleansReturn {\n const adapterRef = useLatest(adapter);\n\n const run = useCallback((op: BooleanOp) => {\n const result = applyBooleanOp(adapterRef.current, op);\n if (isDev && result.kind === 'noop' && result.reason === 'too-few-for-subtract') {\n console.warn('[useBooleans] subtract requires at least 2 selected paths');\n }\n }, [adapterRef]);\n\n return {\n union: useCallback(() => run('union'), [run]),\n intersect: useCallback(() => run('intersect'), [run]),\n subtract: useCallback(() => run('subtract'), [run]),\n exclude: useCallback(() => run('exclude'), [run]),\n divide: useCallback(() => run('divide'), [run]),\n crop: useCallback(() => run('crop'), [run]),\n };\n}\n"],"mappings":";;;AA0CA,SAAgBA,EACd,GACA,IAA+B,CAAC,GACb;CACnB,IAAMC,IAAaC,EAAUC,CAAO,GAE9BC,IAAMC,GAAa,MAAkB;EAC1B,EAAeJ,EAAW,SAASK,CAAE;CAItD,GAAG,CAACL,CAAU,CAAC;CAEf,OAAO;EACL,OAAOI,QAAkBD,EAAI,OAAO,GAAG,CAACA,CAAG,CAAC;EAC5C,WAAWC,QAAkBD,EAAI,WAAW,GAAG,CAACA,CAAG,CAAC;EACpD,UAAUC,QAAkBD,EAAI,UAAU,GAAG,CAACA,CAAG,CAAC;EAClD,SAASC,QAAkBD,EAAI,SAAS,GAAG,CAACA,CAAG,CAAC;EAChD,QAAQC,QAAkBD,EAAI,QAAQ,GAAG,CAACA,CAAG,CAAC;EAC9C,MAAMC,QAAkBD,EAAI,MAAM,GAAG,CAACA,CAAG,CAAC;CAC5C;AACF"}
@@ -0,0 +1,9 @@
1
+ import { useDepSource as e } from "@weasel-js/routing/react";
2
+ //#region src/interactions/actions/booleans/useBooleansAdapter.ts
3
+ function t(t) {
4
+ e("booleansAdapter", () => t);
5
+ }
6
+ //#endregion
7
+ export { t as useBooleansAdapter };
8
+
9
+ //# sourceMappingURL=useBooleansAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBooleansAdapter.js","names":["useBooleansAdapter","adapter"],"sources":["../../../../src/interactions/actions/booleans/useBooleansAdapter.ts"],"sourcesContent":["/**\n * `useBooleansAdapter` — publishes a `BooleansAdapter` to the surrounding\n * `<DepRegistryProvider>` (typically inside `<SceneCanvas>`).\n *\n * The Pathfinder action descriptors (`pathfinderUnionAction`, etc., registered\n * by `useStandardActions`) read this dep both in their `enabled` predicate\n * (via `deps.booleansAdapter` — actually they read selection; the adapter is\n * read by the invoker) and in their immediate invoker. Consumers construct an\n * adapter that bridges to their scene's data shape and call this hook to make\n * the kit's Pathfinder strip operational.\n *\n * No-op when no `<DepRegistryProvider>` is in scope — mirrors the silent-\n * no-op contract of `useDepSource`.\n */\nimport { useDepSource } from '@weasel-js/routing/react';\nimport type { BooleansAdapter } from './booleans';\n\n/** Publish a Boolean-ops adapter so the built-in Pathfinder actions can run.\n * Silently does nothing outside a `<DepRegistryProvider>`. */\nexport function useBooleansAdapter(adapter: BooleansAdapter): void {\n useDepSource('booleansAdapter', () => adapter);\n}\n"],"mappings":";;AAmBA,SAAgBA,EAAmB,GAAgC;CACjE,EAAa,yBAAyBC,CAAO;AAC/C"}
@@ -0,0 +1,94 @@
1
+ import { dispatchApplyBatch as e } from "../../../core/applyOps.js";
2
+ import { usePointerContext as t } from "../../../features/pointer/PointerContext.js";
3
+ import { dwarn as n } from "../../../debug/flag.js";
4
+ import { materializePaste as r } from "./materializePaste.js";
5
+ import { WEASEL_CLIPBOARD_MIME as i, buildWeaselClipboardText as a } from "./wireFormat.js";
6
+ import { useCallback as o, useRef as s } from "react";
7
+ import { useLatest as c } from "@weasel-js/react";
8
+ //#region src/interactions/actions/clipboard/clipboardOps.ts
9
+ var l = { items: [] };
10
+ function u(i, a) {
11
+ let { getSelection: u, onPaste: f, pasteLabel: m = "Paste", getDropPoint: h, produceFlavors: g, jsonReplacer: _ } = a, v = t(), y = h ?? v?.getDropPoint, b = s(l), x = c(i), S = c({
12
+ getSelection: u,
13
+ onPaste: f,
14
+ pasteLabel: m,
15
+ getDropPoint: y,
16
+ produceFlavors: g,
17
+ jsonReplacer: _
18
+ });
19
+ return {
20
+ copy: o(() => {
21
+ let e = S.current.getSelection();
22
+ if (e.length === 0) return;
23
+ let t = x.current.snapshotSelection;
24
+ if (!t) return;
25
+ b.current = t(e);
26
+ let r = null;
27
+ try {
28
+ r = S.current.produceFlavors?.(b.current) ?? d(b.current, S.current.jsonReplacer);
29
+ } catch (e) {
30
+ n("clipboard", `flavor producer threw — skipping OS write: ${String(e)}`);
31
+ }
32
+ r && p(r);
33
+ }, [x, S]),
34
+ paste: o(() => {
35
+ let t = b.current;
36
+ if (t.items.length === 0) return;
37
+ let n = x.current, i = r(n, t, {
38
+ currentSelection: S.current.getSelection(),
39
+ dropPoint: S.current.getDropPoint?.()
40
+ });
41
+ i && (e(n, i.ops, S.current.pasteLabel), b.current = { items: i.created }, S.current.onPaste?.(i.newIds));
42
+ }, [x, S]),
43
+ isEmpty: o(() => b.current.items.length === 0, [])
44
+ };
45
+ }
46
+ function d(e, t) {
47
+ let n = a(e.items, t);
48
+ return {
49
+ [i]: n,
50
+ "text/plain": n
51
+ };
52
+ }
53
+ var f = /* @__PURE__ */ new Set([
54
+ "text/plain",
55
+ "text/html",
56
+ "image/png"
57
+ ]);
58
+ async function p(e) {
59
+ let t = Object.entries(e);
60
+ if (t.length === 0) return;
61
+ let r = typeof navigator < "u" ? navigator.clipboard : void 0;
62
+ if (!r?.write || typeof ClipboardItem > "u") return;
63
+ let i = /* @__PURE__ */ new Set();
64
+ for (let [e, n] of t) typeof n != "string" && n.catch(() => {
65
+ i.add(e);
66
+ });
67
+ let a = (e) => f.has(e) ? e : `web ${e}`, o = (e) => new ClipboardItem(Object.fromEntries(e.map(([e, t]) => {
68
+ let n = a(e), r = (e) => new Blob([e], { type: n });
69
+ if (typeof t == "string") return [n, r(t)];
70
+ let i = t.then(r);
71
+ return i.catch(() => {}), [n, i];
72
+ }))), s = async (e) => {
73
+ let t = e;
74
+ for (;;) try {
75
+ return await r.write([o(t)]), null;
76
+ } catch (e) {
77
+ let n = t.filter(([e]) => !i.has(e));
78
+ if (n.length === t.length || n.length === 0) return e;
79
+ t = n;
80
+ }
81
+ };
82
+ if (await s(t) === null) return;
83
+ let c = t.filter(([e]) => f.has(e) && !i.has(e));
84
+ if (c.length === 0) {
85
+ n("clipboard", "OS write failed; no standard flavors to fall back to");
86
+ return;
87
+ }
88
+ let l = await s(c);
89
+ l !== null && n("clipboard", `OS clipboard write failed twice — copy stays in-memory only: ${String(l)}`);
90
+ }
91
+ //#endregion
92
+ export { u as useClipboardOps, p as writeOsClipboard };
93
+
94
+ //# sourceMappingURL=clipboardOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboardOps.js","names":["EMPTY","useClipboardOps","options","pointerCtx","usePointerContext","effectiveGetDropPoint","getDropPoint","clipboardRef","useRef","adapterRef","useLatest","adapter","optsRef","useCallback","ids","snap","flavors","defaultFlavors","err","writeOsClipboard","cb","a","result","materializePaste","dispatchApplyBatch","text","buildWeaselClipboardText","snapshot","replacer","WEASEL_CLIPBOARD_MIME","WELL_KNOWN_CLIPBOARD_MIMES","entries","rejected","mime","wireMime","toItem","fs","wire","blob","t","promised","writeLive","live","next","standard","dwarn"],"sources":["../../../../src/interactions/actions/clipboard/clipboardOps.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { NodeId } from 'core/scene/types';\nimport { dispatchApplyBatch } from 'core/applyOps';\nimport type { InsertAdapter } from 'core/adapters/types';\nimport type { ClipboardSnapshot } from './types';\nimport { usePointerContext } from 'features/pointer/PointerContext';\nimport { dwarn } from 'debug/flag';\nimport { materializePaste } from './materializePaste';\nimport { WEASEL_CLIPBOARD_MIME, buildWeaselClipboardText } from './wireFormat';\n\ntype Replacer = (key: string, value: unknown) => unknown;\n\n/** Options for `useClipboardOps`. */\nexport interface UseClipboardOpsOptions {\n /** How the hook reads \"current selection\" for copy. The kit doesn't assume\n * a global selection store; each consumer wires this. */\n getSelection: () => NodeId[];\n /** Called after a successful paste with the ids of the newly inserted objects. */\n onPaste?: (newIds: NodeId[]) => void;\n /** Label for the history entry produced by paste. Default 'Paste'. */\n pasteLabel?: string;\n /** Pulled once per paste() call. When non-null, threaded to commitPaste\n * as `ctx.dropPoint`; adapters typically use it as the cluster origin\n * (ignoring `offset`). When null/undefined, the hook falls back to the\n * existing cascade-offset behavior. */\n getDropPoint?: () => { worldX: number; worldY: number } | null;\n /** Produce the OS-clipboard flavor map for a copied snapshot. Keys are MIME\n * types, values the serialized payload. The kit default emits\n * `application/x-weasel-clipboard+json` plus `text/plain` carrying the\n * same JSON. Apps override to add richer flavors (e.g. real SVG) or to\n * replace the text flavor. Return an empty object to skip the OS write\n * entirely. A value may be a promise — an SVG flavor waiting on\n * `warmSvg`, say: the write is still issued inside the copy gesture and\n * the clipboard takes the text when it resolves. The producer itself runs\n * synchronously, so it reads the selection as it stood at the copy. */\n produceFlavors?: (snapshot: ClipboardSnapshot) => ClipboardFlavors;\n /** Replacer for the kit-default JSON flavor (typed arrays etc.). Ignored\n * when `produceFlavors` is supplied. */\n jsonReplacer?: Replacer;\n}\n\n/** MIME type to payload, as `produceFlavors` returns it. */\nexport type ClipboardFlavors = Record<string, string | Promise<string>>;\n\n/** Return shape of `useClipboardOps`: imperative `copy`, `paste`, and `isEmpty` functions. */\nexport interface UseClipboardOpsReturn {\n copy(): void;\n paste(): void;\n isEmpty(): boolean;\n}\n\nconst EMPTY: ClipboardSnapshot = { items: [] };\n\n/** In-memory copy/paste of selections via `InsertAdapter.snapshotSelection` / `commitPaste`. */\nexport function useClipboardOps<TNode extends { id: string }>(\n adapter: InsertAdapter<TNode>,\n options: UseClipboardOpsOptions,\n): UseClipboardOpsReturn {\n const { getSelection, onPaste, pasteLabel = 'Paste', getDropPoint, produceFlavors, jsonReplacer } = options;\n // Fall back to the ambient pointer context (auto-published by SceneCanvas)\n // when the caller didn't supply an explicit `getDropPoint`. Null context\n // (no provider in scope) and no caller-supplied thunk together mean\n // \"no drop point\" — paste uses the cascade offset instead.\n const pointerCtx = usePointerContext();\n const effectiveGetDropPoint = getDropPoint ?? pointerCtx?.getDropPoint;\n const clipboardRef = useRef<ClipboardSnapshot>(EMPTY);\n // Keep callbacks stable across renders.\n const adapterRef = useLatest(adapter);\n const optsRef = useLatest({\n getSelection, onPaste, pasteLabel, getDropPoint: effectiveGetDropPoint, produceFlavors, jsonReplacer,\n });\n\n const copy = useCallback(() => {\n const ids = optsRef.current.getSelection();\n if (ids.length === 0) return;\n const snap = adapterRef.current.snapshotSelection;\n if (!snap) return;\n clipboardRef.current = snap(ids);\n // Best-effort OS write. Never blocks or throws — the in-memory ref is\n // already set, and OS clipboard support varies (custom formats are\n // Chromium-only via the \"web \" prefix; jsdom/non-secure contexts have\n // no API at all). The flavor producer itself is untrusted consumer code\n // (`produceFlavors`), so guard its call too — a throwing producer must\n // not break `copy()`, it just skips the OS write.\n let flavors: ClipboardFlavors | null = null;\n try {\n flavors = optsRef.current.produceFlavors?.(clipboardRef.current)\n ?? defaultFlavors(clipboardRef.current, optsRef.current.jsonReplacer);\n } catch (err) {\n dwarn('clipboard', `flavor producer threw — skipping OS write: ${String(err)}`);\n }\n if (flavors) void writeOsClipboard(flavors);\n }, [adapterRef, optsRef]);\n\n const paste = useCallback(() => {\n const cb = clipboardRef.current;\n if (cb.items.length === 0) return;\n const a = adapterRef.current;\n const result = materializePaste(a, cb, {\n currentSelection: optsRef.current.getSelection(),\n dropPoint: optsRef.current.getDropPoint?.(),\n });\n if (!result) return;\n dispatchApplyBatch(a, result.ops, optsRef.current.pasteLabel);\n // Use the just-created objects as the next cascade source. Re-snapshotting\n // via `adapter.snapshotSelection(newIds)` would read adapter state, but\n // React-state adapters haven't flushed yet — `itemsRef.current` still\n // points at the pre-insert array, so the snapshot would come back empty\n // and the next paste would no-op.\n clipboardRef.current = { items: result.created };\n optsRef.current.onPaste?.(result.newIds as NodeId[]);\n }, [adapterRef, optsRef]);\n\n const isEmpty = useCallback(() => clipboardRef.current.items.length === 0, []);\n\n return { copy, paste, isEmpty };\n}\n\nfunction defaultFlavors(snapshot: ClipboardSnapshot, replacer?: Replacer): ClipboardFlavors {\n const text = buildWeaselClipboardText(snapshot.items, replacer);\n return { [WEASEL_CLIPBOARD_MIME]: text, 'text/plain': text };\n}\n\n/** MIME types the async Clipboard API accepts unprefixed. Every other type\n * (including our own custom MIME, and app-supplied flavors like\n * `image/svg+xml`) must carry Chromium's `web ` prefix or `ClipboardItem`'s\n * constructor throws. */\nconst WELL_KNOWN_CLIPBOARD_MIMES = new Set(['text/plain', 'text/html', 'image/png']);\n\n/** Degradation ladder: full map (every non-well-known MIME web-prefixed) →\n * the same minus any promised flavor that rejected → well-known-only → give\n * up with a dwarn. Chromium writes nothing when one flavor rejects, so a\n * rejection costs only that flavor, never the clipboard's previous content\n * half-overwritten.\n * @internal test seam — exported so unit tests can await the fire-and-forget\n * write directly; tests should still exercise this at least once through\n * the public `copy()` (see clipboardOps.test.tsx). */\nexport async function writeOsClipboard(flavors: ClipboardFlavors): Promise<void> {\n const entries = Object.entries(flavors);\n if (entries.length === 0) return;\n const cb = typeof navigator !== 'undefined' ? navigator.clipboard : undefined;\n if (!cb?.write || typeof ClipboardItem === 'undefined') return;\n const rejected = new Set<string>();\n for (const [mime, text] of entries) {\n if (typeof text !== 'string') text.catch(() => { rejected.add(mime); });\n }\n const wireMime = (mime: string) => (WELL_KNOWN_CLIPBOARD_MIMES.has(mime) ? mime : `web ${mime}`);\n const toItem = (fs: Flavor[]) => new ClipboardItem(Object.fromEntries(\n fs.map(([mime, text]) => {\n const wire = wireMime(mime);\n const blob = (t: string) => new Blob([t], { type: wire });\n if (typeof text === 'string') return [wire, blob(text)];\n const promised = text.then(blob);\n // Chromium leaves a ClipboardItem's rejected promise unhandled.\n promised.catch(() => {});\n return [wire, promised];\n }),\n ));\n // Writes `fs`, dropping flavors whose promise rejected and retrying the\n // rest. Returns the last error, or null once a write lands.\n const writeLive = async (fs: Flavor[]): Promise<unknown> => {\n let live = fs;\n for (;;) {\n try {\n await cb.write([toItem(live)]);\n return null;\n } catch (err) {\n const next = live.filter(([mime]) => !rejected.has(mime));\n if (next.length === live.length || next.length === 0) return err;\n live = next;\n }\n }\n };\n if (await writeLive(entries) === null) return;\n const standard = entries.filter(([mime]) => WELL_KNOWN_CLIPBOARD_MIMES.has(mime) && !rejected.has(mime));\n if (standard.length === 0) { dwarn('clipboard', 'OS write failed; no standard flavors to fall back to'); return; }\n const err = await writeLive(standard);\n if (err !== null) dwarn('clipboard', `OS clipboard write failed twice — copy stays in-memory only: ${String(err)}`);\n}\n\ntype Flavor = [mime: string, text: string | Promise<string>];\n"],"mappings":";;;;;;;;AAoDA,IAAMA,IAA2B,EAAE,OAAO,CAAC,EAAE;AAG7C,SAAgBC,EACd,GACA,GACuB;CACvB,IAAM,EAAE,iBAAc,YAAS,gBAAa,SAAS,iBAAc,mBAAgB,oBAAiBC,GAK9FC,IAAaC,EAAkB,GAC/BC,IAAwBC,KAAgBH,GAAY,cACpDI,IAAeC,EAA0BR,CAAK,GAE9CS,IAAaC,EAAUC,CAAO,GAC9BC,IAAUF,EAAU;EACxB;EAAc;EAAS;EAAY,cAAcL;EAAuB;EAAgB;CAC1F,CAAC;CA6CD,OAAO;EAAE,MA3CIQ,QAAkB;GAC7B,IAAMC,IAAMF,EAAQ,QAAQ,aAAa;GACzC,IAAIE,EAAI,WAAW,GAAG;GACtB,IAAMC,IAAON,EAAW,QAAQ;GAChC,IAAI,CAACM,GAAM;GACX,EAAa,UAAUA,EAAKD,CAAG;GAO/B,IAAIE,IAAmC;GACvC,IAAI;IACF,IAAUJ,EAAQ,QAAQ,iBAAiBL,EAAa,OAAO,KAC1DU,EAAeV,EAAa,SAASK,EAAQ,QAAQ,YAAY;GACxE,SAASM,GAAK;IACZ,EAAM,aAAa,8CAA8C,OAAOA,CAAG,GAAG;GAChF;GACA,AAAIF,KAASG,EAAsBH,CAAO;EAC5C,GAAG,CAACP,GAAYG,CAAO,CAuBd;EAAM,OArBDC,QAAkB;GAC9B,IAAMO,IAAKb,EAAa;GACxB,IAAIa,EAAG,MAAM,WAAW,GAAG;GAC3B,IAAMC,IAAIZ,EAAW,SACfa,IAASC,EAAiBF,GAAGD,GAAI;IACrC,kBAAkBR,EAAQ,QAAQ,aAAa;IAC/C,WAAWA,EAAQ,QAAQ,eAAe;GAC5C,CAAC;GACD,AAAKU,MACLE,EAAmBH,GAAGC,EAAO,KAAKV,EAAQ,QAAQ,UAAU,GAM5D,EAAa,UAAU,EAAE,OAAOU,EAAO,QAAQ,GAC/CV,EAAQ,QAAQ,UAAUU,EAAO,MAAkB;EACrD,GAAG,CAACb,GAAYG,CAAO,CAIR;EAAO,SAFNC,QAAkBN,EAAa,QAAQ,MAAM,WAAW,GAAG,CAAC,CAEtD;CAAQ;AAChC;AAEA,SAASU,EAAe,GAA6B,GAAuC;CAC1F,IAAMQ,IAAOC,EAAyBC,EAAS,OAAOC,CAAQ;CAC9D,OAAO;GAAGC,IAAwBJ;EAAM,cAAcA;CAAK;AAC7D;AAMA,IAAMK,oBAA6B,IAAI,IAAI;CAAC;CAAc;CAAa;AAAW,CAAC;AAUnF,eAAsBX,EAAiB,GAA0C;CAC/E,IAAMY,IAAU,OAAO,QAAQf,CAAO;CACtC,IAAIe,EAAQ,WAAW,GAAG;CAC1B,IAAMX,IAAK,OAAO,YAAc,MAAc,UAAU,YAAY,KAAA;CACpE,IAAI,CAACA,GAAI,SAAS,OAAO,gBAAkB,KAAa;CACxD,IAAMY,oBAAW,IAAI,IAAY;CACjC,KAAK,IAAM,CAACC,GAAMR,MAASM,GACzB,AAAI,OAAON,KAAS,YAAUA,EAAK,YAAY;EAAE,EAAS,IAAIQ,CAAI;CAAG,CAAC;CAExE,IAAMC,KAAY,MAAkBJ,EAA2B,IAAIG,CAAI,IAAIA,IAAO,OAAOA,KACnFE,KAAU,MAAiB,IAAI,cAAc,OAAO,YACxDC,EAAG,KAAK,CAACH,GAAMR,OAAU;EACvB,IAAMY,IAAOH,EAASD,CAAI,GACpBK,KAAQ,MAAc,IAAI,KAAK,CAACC,CAAC,GAAG,EAAE,MAAMF,EAAK,CAAC;EACxD,IAAI,OAAOZ,KAAS,UAAU,OAAO,CAACY,GAAMC,EAAKb,CAAI,CAAC;EACtD,IAAMe,IAAWf,EAAK,KAAKa,CAAI;EAG/B,OADAE,EAAS,YAAY,CAAC,CAAC,GAChB,CAACH,GAAMG,CAAQ;CACxB,CAAC,CACH,CAAC,GAGKC,IAAY,OAAO,MAAmC;EAC1D,IAAIC,IAAON;EACX,SACE,IAAI;GAEF,OADA,MAAMhB,EAAG,MAAM,CAACe,EAAOO,CAAI,CAAC,CAAC,GACtB;EACT,SAASxB,GAAK;GACZ,IAAMyB,IAAOD,EAAK,QAAQ,CAACT,OAAU,CAACD,EAAS,IAAIC,CAAI,CAAC;GACxD,IAAIU,EAAK,WAAWD,EAAK,UAAUC,EAAK,WAAW,GAAG,OAAOzB;GAC7D,IAAOyB;EACT;CAEJ;CACA,IAAI,MAAMF,EAAUV,CAAO,MAAM,MAAM;CACvC,IAAMa,IAAWb,EAAQ,QAAQ,CAACE,OAAUH,EAA2B,IAAIG,CAAI,KAAK,CAACD,EAAS,IAAIC,CAAI,CAAC;CACvG,IAAIW,EAAS,WAAW,GAAG;EAAE,EAAM,aAAa,sDAAsD;EAAG;CAAQ;CACjH,IAAM1B,IAAM,MAAMuB,EAAUG,CAAQ;CACpC,AAAI1B,MAAQ,QAAM2B,EAAM,aAAa,gEAAgE,OAAO3B,CAAG,GAAG;AACpH"}
@@ -0,0 +1,25 @@
1
+ import { createInsertOp as e } from "../../../core/ops/create.js";
2
+ import { createSetSelectionOp as t } from "../../../core/ops/select.js";
3
+ //#region src/interactions/actions/clipboard/materializePaste.ts
4
+ function n(n, r, i) {
5
+ let a = n.commitPaste;
6
+ if (!a) return null;
7
+ let o = n.getPasteOffset?.(r) ?? {
8
+ dx: 0,
9
+ dy: 0
10
+ }, s = i.dropPoint == null ? void 0 : { dropPoint: i.dropPoint }, c = a.call(n, r, o, s);
11
+ if (c.length === 0) return null;
12
+ let l = c.map((e) => e.id);
13
+ return {
14
+ ops: [...c.map((t) => e({ node: t })), t({
15
+ from: i.currentSelection,
16
+ to: l
17
+ })],
18
+ newIds: l,
19
+ created: c
20
+ };
21
+ }
22
+ //#endregion
23
+ export { n as materializePaste };
24
+
25
+ //# sourceMappingURL=materializePaste.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"materializePaste.js","names":["materializePaste","commitPaste","adapter","offset","snapshot","ctx","opts","created","newIds","o","createInsertOp","createSetSelectionOp"],"sources":["../../../../src/interactions/actions/clipboard/materializePaste.ts"],"sourcesContent":["/**\n * Shared paste materialization — the one place the paste recipe lives:\n * offset policy → `commitPaste` → the op batch (InsertOps parents-first +\n * a SetSelectionOp). Both `useClipboardOps.paste` (in-memory paste) and the\n * kit weasel-JSON content handler (OS-clipboard paste) dispatch exactly this\n * batch, so the two arrival paths stay indistinguishable in history.\n *\n * Pure: no dispatching here — callers own how the ops are applied\n * (`dispatchApplyBatch` vs `IngestCtx.applyOps`) and any post-paste\n * bookkeeping (the hook's cascade re-snapshot, the handler's selection set).\n */\nimport { createInsertOp } from 'core/ops/create';\nimport { createSetSelectionOp } from 'core/ops/select';\nimport type { Op } from 'core/ops/types';\nimport type { NodeId } from 'core/scene/types';\nimport type { ClipboardSnapshot, InsertAdapter } from 'core/adapters/types';\n\n/** Shared paste materialization: offset policy → commitPaste → the op batch\n * both the in-memory paste and the OS-paste handler dispatch. Returns null\n * when the adapter can't paste or nothing was created. */\nexport function materializePaste<TNode extends { id: string }>(\n adapter: InsertAdapter<TNode>,\n snapshot: ClipboardSnapshot,\n opts: {\n currentSelection: string[];\n dropPoint?: { worldX: number; worldY: number } | null;\n },\n): { ops: Op[]; newIds: string[]; created: TNode[] } | null {\n const commitPaste = adapter.commitPaste;\n if (!commitPaste) return null;\n const offset = adapter.getPasteOffset?.(snapshot) ?? { dx: 0, dy: 0 };\n const ctx = opts.dropPoint != null ? { dropPoint: opts.dropPoint } : undefined;\n const created = commitPaste.call(adapter, snapshot, offset, ctx);\n if (created.length === 0) return null;\n const newIds = created.map((o) => o.id);\n const ops: Op[] = [\n ...created.map((o) => createInsertOp({ node: o })),\n createSetSelectionOp({ from: opts.currentSelection as NodeId[], to: newIds as NodeId[] }),\n ];\n return { ops, newIds, created };\n}\n"],"mappings":";;;AAoBA,SAAgBA,EACd,GACA,GACA,GAI0D;CAC1D,IAAMC,IAAcC,EAAQ;CAC5B,IAAI,CAACD,GAAa,OAAO;CACzB,IAAME,IAASD,EAAQ,iBAAiBE,CAAQ,KAAK;EAAE,IAAI;EAAG,IAAI;CAAE,GAC9DC,IAAMC,EAAK,aAAa,OAAuC,KAAA,IAAhC,EAAE,WAAWA,EAAK,UAAU,GAC3DC,IAAUN,EAAY,KAAKC,GAASE,GAAUD,GAAQE,CAAG;CAC/D,IAAIE,EAAQ,WAAW,GAAG,OAAO;CACjC,IAAMC,IAASD,EAAQ,KAAK,MAAME,EAAE,EAAE;CAKtC,OAAO;EAAE,KAAA,CAHP,GAAGF,EAAQ,KAAK,MAAMG,EAAe,EAAE,MAAMD,EAAE,CAAC,CAAC,GACjDE,EAAqB;GAAE,MAAML,EAAK;GAA8B,IAAIE;EAAmB,CAAC,CAEjF;EAAK;EAAQ;CAAQ;AAChC"}
@@ -0,0 +1,43 @@
1
+ import { dwarn as e } from "../../../debug/flag.js";
2
+ //#region src/interactions/actions/clipboard/wireFormat.ts
3
+ var t = "application/x-weasel-clipboard+json", n = `web ${t}`;
4
+ function r(e, t) {
5
+ return JSON.stringify({
6
+ weaselClipboard: 1,
7
+ nodes: e
8
+ }, t);
9
+ }
10
+ function i(e) {
11
+ if (!e.includes("\"weaselClipboard\"")) return !1;
12
+ try {
13
+ let t = JSON.parse(e);
14
+ return !!t && t.weaselClipboard === 1;
15
+ } catch {
16
+ return !1;
17
+ }
18
+ }
19
+ var a = /<svg(?:\s[^>]*)?>/i;
20
+ function o(t, n) {
21
+ let r = a.exec(t);
22
+ if (!r) return e("clipboard", "embedWeaselMetadataInSvg: no <svg ...> open tag found — returning input unchanged"), t;
23
+ let i = `<![CDATA[${n.replaceAll("]]>", "]]]]><![CDATA[>")}]]>`, o = r.index + r[0].length;
24
+ return `${t.slice(0, o)}<metadata>${i}</metadata>${t.slice(o)}`;
25
+ }
26
+ function s(e) {
27
+ let t = /<metadata(?:\s[^>]*)?>([\s\S]*?)<\/metadata>/i.exec(e);
28
+ if (!t) return null;
29
+ let n = t[1], r = n.includes("<![CDATA[") ? Array.from(n.matchAll(/<!\[CDATA\[([\s\S]*?)\]\]>/g), (e) => e[1]).join("") : n;
30
+ return i(r) ? r : null;
31
+ }
32
+ function c(t, n) {
33
+ try {
34
+ let e = JSON.parse(t, n);
35
+ return !e || e.weaselClipboard !== 1 || !Array.isArray(e.nodes) ? null : e.nodes;
36
+ } catch (t) {
37
+ return e("clipboard", `weasel payload failed to parse: ${String(t)}`), null;
38
+ }
39
+ }
40
+ //#endregion
41
+ export { t as WEASEL_CLIPBOARD_MIME, n as WEASEL_CLIPBOARD_MIME_WEB, r as buildWeaselClipboardText, o as embedWeaselMetadataInSvg, s as extractWeaselClipboardFromSvg, c as parseWeaselClipboardText, i as sniffWeaselClipboardText };
42
+
43
+ //# sourceMappingURL=wireFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wireFormat.js","names":["WEASEL_CLIPBOARD_MIME","WEASEL_CLIPBOARD_MIME_WEB","buildWeaselClipboardText","items","replacer","sniffWeaselClipboardText","text","parsed","SVG_OPEN_TAG","embedWeaselMetadataInSvg","open","svgText","dwarn","cdata","payloadText","at","extractWeaselClipboardFromSvg","block","inner","payload","m","parseWeaselClipboardText","reviver","err"],"sources":["../../../../src/interactions/actions/clipboard/wireFormat.ts"],"sourcesContent":["import { dwarn } from 'debug/flag';\n\n/** MIME type the kit writes its full-fidelity clipboard payload under, so a\n * copy/paste between two weasel canvases round-trips scene nodes rather than\n * the SVG or text flavors other apps read. */\nexport const WEASEL_CLIPBOARD_MIME = 'application/x-weasel-clipboard+json';\n/** Chromium's async-clipboard spelling for custom formats. */\nexport const WEASEL_CLIPBOARD_MIME_WEB = `web ${WEASEL_CLIPBOARD_MIME}`;\n\ninterface WeaselClipboardPayload { weaselClipboard: 1; nodes: unknown[] }\n\ntype Replacer = (key: string, value: unknown) => unknown;\ntype Reviver = (key: string, value: unknown) => unknown;\n\n/** Serialize snapshot items into the versioned wire text.\n *\n * Function-valued fields (e.g. a container's `clipFromPose`) are dropped by\n * JSON serialization — OS-pasted clip containers arrive unclipped.\n * Consumers who need clips to survive the OS round-trip can translate\n * function ↔ registry key in their `jsonReplacer`/reviver pair (the\n * scene-serialization `clipFromPoseKey` precedent). */\nexport function buildWeaselClipboardText(items: unknown[], replacer?: Replacer): string {\n const payload: WeaselClipboardPayload = { weaselClipboard: 1, nodes: items };\n return JSON.stringify(payload, replacer as Parameters<typeof JSON.stringify>[1]);\n}\n\n/** Cheap check: could this text be a weasel clipboard payload? Substring\n * pre-check, then a guarded parse + marker/version test. */\nexport function sniffWeaselClipboardText(text: string): boolean {\n if (!text.includes('\"weaselClipboard\"')) return false;\n try {\n const parsed = JSON.parse(text) as Partial<WeaselClipboardPayload> | null;\n return !!parsed && parsed.weaselClipboard === 1;\n } catch {\n return false;\n }\n}\n\n// Opening `<svg ...>` tag of a serialized document. `[^>]*` is safe for OUR\n// serializer's output (attribute values are XML-escaped, so no raw `>` can\n// appear inside the tag) — see embedWeaselMetadataInSvg's contract note.\nconst SVG_OPEN_TAG = /<svg(?:\\s[^>]*)?>/i;\n\n/**\n * Embed a weasel clipboard payload in an SVG document as a `<metadata>`\n * child of the root — legal SVG 1.1, ignored by external tools — so one\n * `text/plain` flavor serves both audiences: external tools parse the SVG,\n * weasel extracts the JSON for full fidelity on draw→draw DOM paste.\n *\n * The payload rides in CDATA so JSON's `<` / `&` need no entity escaping; a\n * literal `]]>` inside the payload is split across CDATA sections\n * (`]]]]><![CDATA[>`), which {@link extractWeaselClipboardFromSvg} rejoins.\n *\n * Intended for OUR serializer's output only (`serializeSvg` — single\n * `<svg ...>` open tag, XML-escaped attributes). When no open tag is found\n * the input is returned unchanged with a debug warning.\n */\nexport function embedWeaselMetadataInSvg(svgText: string, payloadText: string): string {\n const open = SVG_OPEN_TAG.exec(svgText);\n if (!open) {\n dwarn('clipboard', 'embedWeaselMetadataInSvg: no <svg ...> open tag found — returning input unchanged');\n return svgText;\n }\n const cdata = `<![CDATA[${payloadText.replaceAll(']]>', ']]]]><![CDATA[>')}]]>`;\n const at = open.index + open[0].length;\n return `${svgText.slice(0, at)}<metadata>${cdata}</metadata>${svgText.slice(at)}`;\n}\n\n/**\n * Recover an embedded weasel clipboard payload from SVG text: read the first\n * `<metadata>` block, rejoin its CDATA sections (concatenation restores the\n * `]]>` split by {@link embedWeaselMetadataInSvg}; plain non-CDATA content\n * passes through as-is), and return the payload text iff it sniffs as the\n * weasel wire format — else null (external/non-weasel metadata declines).\n *\n * A text scan, not an XML parse — the payload is small and ours.\n */\nexport function extractWeaselClipboardFromSvg(svgText: string): string | null {\n const block = /<metadata(?:\\s[^>]*)?>([\\s\\S]*?)<\\/metadata>/i.exec(svgText);\n if (!block) return null;\n const inner = block[1];\n const payload = inner.includes('<![CDATA[')\n ? Array.from(inner.matchAll(/<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>/g), (m) => m[1]).join('')\n : inner;\n return sniffWeaselClipboardText(payload) ? payload : null;\n}\n\n/** Parse wire text to snapshot items, or null when malformed/mismatched\n * (callers decline to the next content handler). */\nexport function parseWeaselClipboardText(text: string, reviver?: Reviver): unknown[] | null {\n try {\n const parsed = JSON.parse(text, reviver as Parameters<typeof JSON.parse>[1]) as\n Partial<WeaselClipboardPayload> | null;\n if (!parsed || parsed.weaselClipboard !== 1 || !Array.isArray(parsed.nodes)) return null;\n return parsed.nodes;\n } catch (err) {\n dwarn('clipboard', `weasel payload failed to parse: ${String(err)}`);\n return null;\n }\n}\n"],"mappings":";;AAKA,IAAaA,IAAwB,uCAExBC,IAA4B,OAAOD;AAchD,SAAgBE,EAAyB,GAAkB,GAA6B;CAEtF,OAAO,KAAK,UAAU;EADoB,iBAAiB;EAAG,OAAOC;CAC/C,GAASC,CAAgD;AACjF;AAIA,SAAgBC,EAAyB,GAAuB;CAC9D,IAAI,CAACC,EAAK,SAAS,qBAAmB,GAAG,OAAO;CAChD,IAAI;EACF,IAAMC,IAAS,KAAK,MAAMD,CAAI;EAC9B,OAAO,CAAC,CAACC,KAAUA,EAAO,oBAAoB;CAChD,QAAQ;EACN,OAAO;CACT;AACF;AAKA,IAAMC,IAAe;AAgBrB,SAAgBC,EAAyB,GAAiB,GAA6B;CACrF,IAAMC,IAAOF,EAAa,KAAKG,CAAO;CACtC,IAAI,CAACD,GAEH,OADAE,EAAM,aAAa,mFAAmF,GAC/FD;CAET,IAAME,IAAQ,YAAYC,EAAY,WAAW,OAAO,iBAAiB,EAAE,MACrEC,IAAKL,EAAK,QAAQA,EAAK,EAAE,CAAC;CAChC,OAAO,GAAGC,EAAQ,MAAM,GAAGI,CAAE,EAAE,YAAYF,EAAM,aAAaF,EAAQ,MAAMI,CAAE;AAChF;AAWA,SAAgBC,EAA8B,GAAgC;CAC5E,IAAMC,IAAQ,gDAAgD,KAAKN,CAAO;CAC1E,IAAI,CAACM,GAAO,OAAO;CACnB,IAAMC,IAAQD,EAAM,IACdE,IAAUD,EAAM,SAAS,WAAW,IACtC,MAAM,KAAKA,EAAM,SAAS,6BAA6B,IAAI,MAAME,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,IAC9EF;CACJ,OAAOb,EAAyBc,CAAO,IAAIA,IAAU;AACvD;AAIA,SAAgBE,EAAyB,GAAc,GAAqC;CAC1F,IAAI;EACF,IAAMd,IAAS,KAAK,MAAMD,GAAMgB,CAA2C;EAG3E,OADI,CAACf,KAAUA,EAAO,oBAAoB,KAAK,CAAC,MAAM,QAAQA,EAAO,KAAK,IAAU,OAC7EA,EAAO;CAChB,SAASgB,GAAK;EAEZ,OADAX,EAAM,aAAa,mCAAmC,OAAOW,CAAG,GAAG,GAC5D;CACT;AACF"}
@@ -0,0 +1,26 @@
1
+ import { createInsertOp as e } from "../../../../core/ops/create.js";
2
+ import { createSetSelectionOp as t } from "../../../../core/ops/select.js";
3
+ //#region src/interactions/actions/clone/behaviors/cloneByAltDrag.ts
4
+ function n() {
5
+ return {
6
+ id: "cloneByAltDrag",
7
+ activates: (e) => e.alt === !0,
8
+ onEnd(n, r) {
9
+ if (!r.adapter.snapshotSelection || !r.adapter.commitPaste) return [];
10
+ let i = r.adapter.snapshotSelection(n.ids), a = r.adapter.commitPaste(i, n.offset, { dropPoint: {
11
+ worldX: n.worldX,
12
+ worldY: n.worldY
13
+ } });
14
+ if (a.length === 0) return [];
15
+ let o = a.map((e) => e.id), s = r.adapter.getSelection?.() ?? [];
16
+ return [...a.map((t) => e({ node: t })), t({
17
+ from: s,
18
+ to: o
19
+ })];
20
+ }
21
+ };
22
+ }
23
+ //#endregion
24
+ export { n as cloneByAltDrag };
25
+
26
+ //# sourceMappingURL=cloneByAltDrag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloneByAltDrag.js","names":["cloneByAltDrag","mods","ctx","snap","pose","created","newIds","o","from","createInsertOp","createSetSelectionOp"],"sources":["../../../../../src/interactions/actions/clone/behaviors/cloneByAltDrag.ts"],"sourcesContent":["import { createInsertOp } from 'core/ops/create';\nimport { createSetSelectionOp } from 'core/ops/select';\nimport type { NodeId } from 'core/scene/types';\nimport type { CloneBehavior } from '../../../gestures/types';\n\n/** Clone-on-alt-drag behavior for `useClone`; activates when Alt/Option is held at drag start. */\nexport function cloneByAltDrag(): CloneBehavior {\n return {\n id: 'cloneByAltDrag',\n activates: (mods) => mods.alt === true,\n onEnd(pose, ctx) {\n if (!ctx.adapter.snapshotSelection || !ctx.adapter.commitPaste) return [];\n const snap = ctx.adapter.snapshotSelection(pose.ids);\n const created = ctx.adapter.commitPaste(snap, pose.offset, {\n dropPoint: { worldX: pose.worldX, worldY: pose.worldY },\n });\n if (created.length === 0) return [];\n const newIds = created.map((o: { id: string }) => o.id);\n const from = ctx.adapter.getSelection?.() ?? [];\n return [\n ...created.map((o) => createInsertOp({ node: o })),\n createSetSelectionOp({ from: from as NodeId[], to: newIds as NodeId[] }),\n ];\n },\n };\n}\n"],"mappings":";;;AAMA,SAAgBA,IAAgC;CAC9C,OAAO;EACL,IAAI;EACJ,YAAY,MAASC,EAAK,QAAQ;EAClC,MAAM,GAAM,GAAK;GACf,IAAI,CAACC,EAAI,QAAQ,qBAAqB,CAACA,EAAI,QAAQ,aAAa,OAAO,CAAC;GACxE,IAAMC,IAAOD,EAAI,QAAQ,kBAAkBE,EAAK,GAAG,GAC7CC,IAAUH,EAAI,QAAQ,YAAYC,GAAMC,EAAK,QAAQ,EACzD,WAAW;IAAE,QAAQA,EAAK;IAAQ,QAAQA,EAAK;GAAO,EACxD,CAAC;GACD,IAAIC,EAAQ,WAAW,GAAG,OAAO,CAAC;GAClC,IAAMC,IAASD,EAAQ,KAAK,MAAsBE,EAAE,EAAE,GAChDC,IAAON,EAAI,QAAQ,eAAe,KAAK,CAAC;GAC9C,OAAO,CACL,GAAGG,EAAQ,KAAK,MAAMI,EAAe,EAAE,MAAMF,EAAE,CAAC,CAAC,GACjDG,EAAqB;IAAQ;IAAkB,IAAIJ;GAAmB,CAAC,CACzE;EACF;CACF;AACF"}
@@ -0,0 +1,42 @@
1
+ import { documentPose as e } from "../../core/scene/effectivePose.js";
2
+ import { asNodeId as t } from "../../core/scene/types.js";
3
+ import { fnFieldsOfNode as n } from "../../core/scene/nodeFnFields.js";
4
+ //#region src/interactions/actions/defaultCommitAdapter.ts
5
+ function r(r, i) {
6
+ return {
7
+ getNode: (e) => r.get(t(e)),
8
+ getNodes: () => [...r.renderOrderNodes()],
9
+ getPose: (n) => e(r, r.get(t(n))),
10
+ getSelection: () => [...i ? i.getSelection() : r.getSelection()],
11
+ setSelection: (e) => {
12
+ i ? i.setSelection(e.map(t)) : r.setSelection(e.map(t));
13
+ },
14
+ getParent: (e) => r.get(t(e))?.parent ?? null,
15
+ getRemovalClosure: (e) => [...r.removalClosure(e.map(t))],
16
+ getChildren: (e) => e === null ? [...r.roots] : [...r.childrenOf(t(e))],
17
+ setChildOrder: (e, n) => {
18
+ for (let i = 0; i < n.length; i++) (e === null ? r.roots : r.childrenOf(t(e)))[i] !== n[i] && r.reorder(t(n[i]), i);
19
+ },
20
+ setPose: (e, n) => r.setPose(t(e), n),
21
+ setParent: (e, n) => r.move(t(e), n == null ? null : t(n)),
22
+ setData: (e, n) => r.update(t(e), { data: n }),
23
+ setLayer: (e, n) => r.setLayer(t(e), n),
24
+ setLayout: (e, n) => r.setLayout(t(e), n),
25
+ removeNode: (e) => r.remove(t(e)),
26
+ insertNode: (e, t) => r.add({
27
+ kind: e.kind,
28
+ layer: e.layer,
29
+ pose: e.pose,
30
+ data: e.data,
31
+ id: e.id,
32
+ ...e.parent == null ? {} : { parent: e.parent },
33
+ ...t === void 0 ? {} : { index: t },
34
+ ...e.dependsOn === void 0 ? {} : { dependsOn: e.dependsOn },
35
+ ...n(e)
36
+ })
37
+ };
38
+ }
39
+ //#endregion
40
+ export { r as defaultCommitAdapter };
41
+
42
+ //# sourceMappingURL=defaultCommitAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultCommitAdapter.js","names":["defaultCommitAdapter","scene","asNodeId","id","documentPose","selection","ids","parentId","orderedIds","pose","layer","layout","node","index","fnFieldsOfNode"],"sources":["../../../src/interactions/actions/defaultCommitAdapter.ts"],"sourcesContent":["/**\n * Shared scene-backed commit adapter for default actions.\n *\n * Default actions route data/layer/pose/parent mutations through the\n * consumer's `applyOps` commit hook when one is present; when it isn't, they\n * fall back to applying the committed ops directly against the scene through\n * this adapter. It carries the scene-backed op-apply methods (`setPose` /\n * `setParent` / `setData` / `setLayer` / `setLayout` / `removeNode` /\n * `insertNode` / `setChildOrder`) plus the read-side queries (`getNode` / `getNodes` /\n * `getPose` / `getParent` / `getChildren` / `getSelection`) and\n * `setSelection`. Known exclusions from the op factory roster — surfaces the\n * scene doesn't own: `setPath` and `setText`.\n *\n * Lives in `interactions/actions/` (not `canvas/sceneAdapter.ts`) so default\n * actions never import from `canvas/` — that back-edge would create an\n * `interactions → canvas → interactions` cycle. Mirrors `moveGestureAdapter`,\n * widened to all op-apply methods.\n */\nimport { fnFieldsOfNode } from 'core/scene/nodeFnFields';\nimport { documentPose } from 'core/scene/effectivePose';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport type { LayoutStrategy } from '../../layout/types';\n\n/** Build the adapter the default actions commit through when the consumer\n * supplies no `applyOps` hook of its own — it applies ops straight to the\n * scene. Path and text ops are not covered; those surfaces belong to their\n * own owners.\n *\n * Pass `selection` (a `SelectionApi`'s `adapterMethods`) and selection reads\n * and writes go through it rather than the scene, so a canvas that gates its\n * selection — `selectable={false}` — gates what these batches select too. */\nexport function defaultCommitAdapter<TPose>(\n scene: Scene<unknown, string, TPose>,\n selection?: SelectionApi['adapterMethods'],\n) {\n return {\n getNode: (id: string) => scene.get(asNodeId(id)),\n getNodes: () => {\n return [...scene.renderOrderNodes()] as Node<unknown, string, TPose>[];\n },\n getPose: (id: string) => documentPose(scene, scene.get(asNodeId(id))!),\n getSelection: (): string[] => [...(selection ? selection.getSelection() : scene.getSelection())],\n setSelection: (ids: string[]) => {\n if (selection) selection.setSelection(ids.map(asNodeId));\n else scene.setSelection(ids.map(asNodeId));\n },\n getParent: (id: string) => (scene.get(asNodeId(id))?.parent ?? null) as string | null,\n getRemovalClosure: (ids: readonly string[]): string[] =>\n [...scene.removalClosure(ids.map(asNodeId))],\n getChildren: (parentId: string | null): string[] =>\n (parentId === null\n ? [...scene.roots]\n : [...scene.childrenOf(asNodeId(parentId))]) as string[],\n // Re-stamp each slot whose occupant changed. `scene.reorder` mutates the\n // live sibling list in place, so re-read it each iteration and skip slots\n // already holding the desired id (an earlier reorder may have shifted a\n // later id into place). One enclosing batch is provided by the caller\n // (`scene.applyBatch` / consumer `applyOps`), so no batch here.\n setChildOrder: (parentId: string | null, orderedIds: string[]): void => {\n for (let i = 0; i < orderedIds.length; i++) {\n const current = parentId === null\n ? (scene.roots as readonly NodeId[])\n : (scene.childrenOf(asNodeId(parentId)) as readonly NodeId[]);\n if ((current[i] as string) === orderedIds[i]) continue;\n scene.reorder(asNodeId(orderedIds[i]), i);\n }\n },\n setPose: (id: string, pose: TPose) => scene.setPose(asNodeId(id), pose),\n setParent: (id: string, parentId: string | null) =>\n scene.move(asNodeId(id), parentId == null ? null : asNodeId(parentId)),\n setData: (id: string, data: unknown) => scene.update(asNodeId(id), { data } as never),\n setLayer: (id: string, layer: string) => scene.setLayer(asNodeId(id), layer as never),\n setLayout: (id: string, layout: LayoutStrategy<TPose> | string | null) =>\n scene.setLayout(asNodeId(id), layout),\n removeNode: (id: string) => scene.remove(asNodeId(id)),\n insertNode: (node: Node<unknown, string, TPose>, index?: number) =>\n scene.add({\n kind: node.kind,\n layer: node.layer,\n pose: node.pose,\n data: node.data,\n id: node.id,\n ...(node.parent != null ? { parent: node.parent } : {}),\n // Sibling-index passthrough: undo of a delete (or a boolean op's\n // source removal) re-inserts at the recorded z-order slot instead\n // of appending at the end.\n ...(index !== undefined ? { index } : {}),\n ...(node.dependsOn !== undefined ? { dependsOn: node.dependsOn } : {}),\n ...fnFieldsOfNode(node),\n }),\n };\n}\n"],"mappings":";;;;AAiCA,SAAgBA,EACd,GACA,GACA;CACA,OAAO;EACL,UAAU,MAAeC,EAAM,IAAIC,EAASC,CAAE,CAAC;EAC/C,gBACS,CAAC,GAAGF,EAAM,iBAAiB,CAAC;EAErC,UAAU,MAAeG,EAAaH,GAAOA,EAAM,IAAIC,EAASC,CAAE,CAAC,CAAE;EACrE,oBAA8B,CAAC,GAAIE,IAAYA,EAAU,aAAa,IAAIJ,EAAM,aAAa,CAAE;EAC/F,eAAe,MAAkB;GAC/B,AAAII,IAAWA,EAAU,aAAaC,EAAI,IAAIJ,CAAQ,CAAC,IAClDD,EAAM,aAAaK,EAAI,IAAIJ,CAAQ,CAAC;EAC3C;EACA,YAAY,MAAgBD,EAAM,IAAIC,EAASC,CAAE,CAAC,CAAC,EAAE,UAAU;EAC/D,oBAAoB,MAClB,CAAC,GAAGF,EAAM,eAAeK,EAAI,IAAIJ,CAAQ,CAAC,CAAC;EAC7C,cAAc,MACXK,MAAa,OACV,CAAC,GAAGN,EAAM,KAAK,IACf,CAAC,GAAGA,EAAM,WAAWC,EAASK,CAAQ,CAAC,CAAC;EAM9C,gBAAgB,GAAyB,MAA+B;GACtE,KAAK,IAAI,IAAI,GAAG,IAAIC,EAAW,QAAQ,KAIrC,CAHgBD,MAAa,OACxBN,EAAM,QACNA,EAAM,WAAWC,EAASK,CAAQ,CAAC,EAAA,CAC3B,OAAkBC,EAAW,MAC1CP,EAAM,QAAQC,EAASM,EAAW,EAAE,GAAG,CAAC;EAE5C;EACA,UAAU,GAAY,MAAgBP,EAAM,QAAQC,EAASC,CAAE,GAAGM,CAAI;EACtE,YAAY,GAAY,MACtBR,EAAM,KAAKC,EAASC,CAAE,GAAGI,KAAY,OAAO,OAAOL,EAASK,CAAQ,CAAC;EACvE,UAAU,GAAY,MAAkBN,EAAM,OAAOC,EAASC,CAAE,GAAG,EAAE,QAAK,CAAU;EACpF,WAAW,GAAY,MAAkBF,EAAM,SAASC,EAASC,CAAE,GAAGO,CAAc;EACpF,YAAY,GAAY,MACtBT,EAAM,UAAUC,EAASC,CAAE,GAAGQ,CAAM;EACtC,aAAa,MAAeV,EAAM,OAAOC,EAASC,CAAE,CAAC;EACrD,aAAa,GAAoC,MAC/CF,EAAM,IAAI;GACR,MAAMW,EAAK;GACX,OAAOA,EAAK;GACZ,MAAMA,EAAK;GACX,MAAMA,EAAK;GACX,IAAIA,EAAK;GACT,GAAIA,EAAK,UAAU,OAAiC,CAAC,IAA3B,EAAE,QAAQA,EAAK,OAAO;GAIhD,GAAIC,MAAU,KAAA,IAAwB,CAAC,IAAb,EAAE,SAAM;GAClC,GAAID,EAAK,cAAc,KAAA,IAA4C,CAAC,IAAjC,EAAE,WAAWA,EAAK,UAAU;GAC/D,GAAGE,EAAeF,CAAI;EACxB,CAAC;CACL;AACF"}