@weasel-js/core 1.10.1 → 1.11.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 (1501) hide show
  1. package/CHANGELOG.md +1014 -0
  2. package/README.md +16 -15
  3. package/dist/WeaselProvider.js +25 -9
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +217 -140
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +92 -50
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +147 -84
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js +140 -65
  12. package/dist/affordances/pathAnchors.js.map +1 -1
  13. package/dist/affordances/rotateCursor.js +10 -4
  14. package/dist/affordances/rotateCursor.js.map +1 -1
  15. package/dist/affordances/rotationHandle.js +83 -60
  16. package/dist/affordances/rotationHandle.js.map +1 -1
  17. package/dist/animation/behaviors/coast.js +20 -14
  18. package/dist/animation/behaviors/coast.js.map +1 -1
  19. package/dist/animation/behaviors/coastByWrite.js +98 -70
  20. package/dist/animation/behaviors/coastByWrite.js.map +1 -1
  21. package/dist/animation/behaviors/coastOnTargets.js +115 -67
  22. package/dist/animation/behaviors/coastOnTargets.js.map +1 -1
  23. package/dist/animation/behaviors/momentum.js +88 -53
  24. package/dist/animation/behaviors/momentum.js.map +1 -1
  25. package/dist/animation/clipTargets.js +14 -7
  26. package/dist/animation/clipTargets.js.map +1 -1
  27. package/dist/animation/departures.js +116 -0
  28. package/dist/animation/departures.js.map +1 -0
  29. package/dist/animation/index.js +18 -15
  30. package/dist/animation/poseHelpers.js +147 -107
  31. package/dist/animation/poseHelpers.js.map +1 -1
  32. package/dist/animation/poseTarget.js +158 -85
  33. package/dist/animation/poseTarget.js.map +1 -1
  34. package/dist/animation/poseTransition.js +64 -0
  35. package/dist/animation/poseTransition.js.map +1 -0
  36. package/dist/animation/reflow.js +208 -120
  37. package/dist/animation/reflow.js.map +1 -1
  38. package/dist/animation/rewind.js +76 -45
  39. package/dist/animation/rewind.js.map +1 -1
  40. package/dist/animation/rig/bindRig.js +135 -82
  41. package/dist/animation/rig/bindRig.js.map +1 -1
  42. package/dist/animation/rig/rigNode.js +120 -75
  43. package/dist/animation/rig/rigNode.js.map +1 -1
  44. package/dist/animation/rig/rigSeat.js +61 -41
  45. package/dist/animation/rig/rigSeat.js.map +1 -1
  46. package/dist/animation/rig/skinBinding.js +57 -45
  47. package/dist/animation/rig/skinBinding.js.map +1 -1
  48. package/dist/animation/rig/useRig.js +44 -30
  49. package/dist/animation/rig/useRig.js.map +1 -1
  50. package/dist/animation/wrappers/animateLifecycle.js +51 -35
  51. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  52. package/dist/animation/wrappers/animateOnSetPose.js +55 -32
  53. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  54. package/dist/animation/wrappers/instantPose.js +13 -8
  55. package/dist/animation/wrappers/instantPose.js.map +1 -1
  56. package/dist/animation/writtenPoseTarget.js +44 -22
  57. package/dist/animation/writtenPoseTarget.js.map +1 -1
  58. package/dist/{autoPoseDescriptor-DHg5KqaJ.d.ts → autoPoseDescriptor-CZ1eXbzY.d.ts} +1 -1
  59. package/dist/barrel/canvas.js +45 -32
  60. package/dist/barrel/chrome.js +19 -16
  61. package/dist/barrel/icons.js +6 -0
  62. package/dist/barrel/input.js +19 -18
  63. package/dist/barrel/interactions.js +41 -39
  64. package/dist/barrel/paint.js +12 -11
  65. package/dist/barrel/paths.js +39 -13
  66. package/dist/barrel/renderer.js +25 -14
  67. package/dist/barrel/routing.js +64 -58
  68. package/dist/barrel/scene.js +51 -37
  69. package/dist/barrel/text.js +10 -9
  70. package/dist/barrel/viewport.js +48 -45
  71. package/dist/canvas/Canvas.js +191 -306
  72. package/dist/canvas/Canvas.js.map +1 -1
  73. package/dist/canvas/CanvasView.js +273 -199
  74. package/dist/canvas/CanvasView.js.map +1 -1
  75. package/dist/canvas/CursorCoordsHud.js +103 -64
  76. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  77. package/dist/canvas/DrawCanvas.js +68 -41
  78. package/dist/canvas/DrawCanvas.js.map +1 -1
  79. package/dist/canvas/LeanSceneCanvas.js +23 -0
  80. package/dist/canvas/LeanSceneCanvas.js.map +1 -0
  81. package/dist/canvas/ModalityHud.js +58 -43
  82. package/dist/canvas/ModalityHud.js.map +1 -1
  83. package/dist/canvas/NodeShape.js +137 -60
  84. package/dist/canvas/NodeShape.js.map +1 -1
  85. package/dist/canvas/PickHud.js +77 -59
  86. package/dist/canvas/PickHud.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +9 -6
  88. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -1
  89. package/dist/canvas/SceneCanvas/CanvasKitProviders.js +25 -0
  90. package/dist/canvas/SceneCanvas/CanvasKitProviders.js.map +1 -0
  91. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -6
  92. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/DevHuds.js +47 -32
  94. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -1
  95. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +72 -37
  96. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  97. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +124 -0
  98. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -0
  99. package/dist/canvas/SceneCanvas/brushOverlay.js +36 -0
  100. package/dist/canvas/SceneCanvas/brushOverlay.js.map +1 -0
  101. package/dist/canvas/SceneCanvas/builtinToolSets.js +30 -0
  102. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -0
  103. package/dist/canvas/SceneCanvas/canvasPassThrough.js +73 -0
  104. package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +54 -32
  106. package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -1
  107. package/dist/canvas/SceneCanvas/coordTrace.js +26 -30
  108. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  109. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +323 -159
  110. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  111. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +39 -13
  112. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  113. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +83 -47
  114. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/features.js +123 -106
  116. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  117. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +80 -62
  118. package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -1
  119. package/dist/canvas/SceneCanvas/mergeLayers.js +43 -0
  120. package/dist/canvas/SceneCanvas/mergeLayers.js.map +1 -0
  121. package/dist/canvas/SceneCanvas/namedPresets.js +56 -0
  122. package/dist/canvas/SceneCanvas/namedPresets.js.map +1 -0
  123. package/dist/canvas/SceneCanvas/poseGeometry.js +66 -31
  124. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  125. package/dist/canvas/SceneCanvas/poseRegistrars.js +18 -8
  126. package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -1
  127. package/dist/canvas/SceneCanvas/presets/arrange.js +27 -0
  128. package/dist/canvas/SceneCanvas/presets/arrange.js.map +1 -0
  129. package/dist/canvas/SceneCanvas/presets/chrome.js +14 -0
  130. package/dist/canvas/SceneCanvas/presets/chrome.js.map +1 -0
  131. package/dist/canvas/SceneCanvas/presets/edit.js +59 -0
  132. package/dist/canvas/SceneCanvas/presets/edit.js.map +1 -0
  133. package/dist/canvas/SceneCanvas/presets/ingest.js +13 -0
  134. package/dist/canvas/SceneCanvas/presets/ingest.js.map +1 -0
  135. package/dist/canvas/SceneCanvas/presets/paths.js +67 -0
  136. package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -0
  137. package/dist/canvas/SceneCanvas/presets/select.js +19 -0
  138. package/dist/canvas/SceneCanvas/presets/select.js.map +1 -0
  139. package/dist/canvas/SceneCanvas/presets/toolDriven.js +20 -0
  140. package/dist/canvas/SceneCanvas/presets/toolDriven.js.map +1 -0
  141. package/dist/canvas/SceneCanvas/presets/transform.js +41 -0
  142. package/dist/canvas/SceneCanvas/presets/transform.js.map +1 -0
  143. package/dist/canvas/SceneCanvas/presets/view.js +14 -0
  144. package/dist/canvas/SceneCanvas/presets/view.js.map +1 -0
  145. package/dist/canvas/SceneCanvas/props.js +9 -35
  146. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  147. package/dist/canvas/SceneCanvas/scenePointQuery.js +43 -35
  148. package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -1
  149. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +22 -15
  150. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
  151. package/dist/canvas/SceneCanvas/toolRegistry.js +34 -15
  152. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
  153. package/dist/canvas/SceneCanvas/useActionTunings.js +14 -11
  154. package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -1
  155. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +59 -36
  156. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  157. package/dist/canvas/SceneCanvas/useBakedScene.js +17 -0
  158. package/dist/canvas/SceneCanvas/useBakedScene.js.map +1 -0
  159. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +47 -23
  160. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  161. package/dist/canvas/SceneCanvas/useBuiltinTools.js +22 -14
  162. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
  163. package/dist/canvas/SceneCanvas/useCanvasCamera.js +53 -38
  164. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -1
  165. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +93 -0
  166. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js.map +1 -0
  167. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +24 -14
  168. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -1
  169. package/dist/canvas/SceneCanvas/useCanvasSelection.js +35 -12
  170. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
  171. package/dist/canvas/SceneCanvas/useCanvasTools.js +112 -53
  172. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
  173. package/dist/canvas/SceneCanvas/useChromeAffordances.js +31 -0
  174. package/dist/canvas/SceneCanvas/useChromeAffordances.js.map +1 -0
  175. package/dist/canvas/SceneCanvas/useContributionRoles.js +107 -56
  176. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
  177. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +64 -0
  178. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js.map +1 -0
  179. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +104 -71
  180. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  181. package/dist/canvas/SceneCanvas/useHeldModifiers.js +21 -14
  182. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -1
  183. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +21 -19
  184. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -1
  185. package/dist/canvas/SceneCanvas/useNodeKinds.js +28 -19
  186. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -1
  187. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +91 -59
  188. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  189. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +62 -35
  190. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -1
  191. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +121 -50
  192. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
  193. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +30 -0
  194. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js.map +1 -0
  195. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +38 -0
  196. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -0
  197. package/dist/canvas/SceneCanvas/useSceneChrome.js +99 -44
  198. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  199. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +165 -0
  200. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -0
  201. package/dist/canvas/SceneCanvas/useScenePicking.js +68 -0
  202. package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -0
  203. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +28 -17
  204. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -1
  205. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +160 -80
  206. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  207. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +38 -26
  208. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -1
  209. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +107 -0
  210. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -0
  211. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +40 -27
  212. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -1
  213. package/dist/canvas/SceneCanvas/useSurfaceRouting.js +29 -0
  214. package/dist/canvas/SceneCanvas/useSurfaceRouting.js.map +1 -0
  215. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js +44 -0
  216. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js.map +1 -0
  217. package/dist/canvas/SceneCanvas/useToolKeybindings.js +28 -0
  218. package/dist/canvas/SceneCanvas/useToolKeybindings.js.map +1 -0
  219. package/dist/canvas/SceneCanvas/useViewportActions.js +52 -28
  220. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  221. package/dist/canvas/SceneCanvas/worldPointAt.js +10 -4
  222. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
  223. package/dist/canvas/SceneCanvas.js +276 -312
  224. package/dist/canvas/SceneCanvas.js.map +1 -1
  225. package/dist/canvas/SceneViewCanvas.js +68 -42
  226. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  227. package/dist/canvas/SurfaceCanvas.js +38 -33
  228. package/dist/canvas/SurfaceCanvas.js.map +1 -1
  229. package/dist/canvas/accentColor.js +8 -5
  230. package/dist/canvas/accentColor.js.map +1 -1
  231. package/dist/canvas/adapterDerivedPath.js +33 -18
  232. package/dist/canvas/adapterDerivedPath.js.map +1 -1
  233. package/dist/canvas/adapterPickSource.js +49 -23
  234. package/dist/canvas/adapterPickSource.js.map +1 -1
  235. package/dist/canvas/affordanceAt.js +106 -50
  236. package/dist/canvas/affordanceAt.js.map +1 -1
  237. package/dist/canvas/buildSceneLayer.js +111 -80
  238. package/dist/canvas/buildSceneLayer.js.map +1 -1
  239. package/dist/canvas/buildSceneTree.js +101 -59
  240. package/dist/canvas/buildSceneTree.js.map +1 -1
  241. package/dist/canvas/canvasRenderer.js +161 -72
  242. package/dist/canvas/canvasRenderer.js.map +1 -1
  243. package/dist/canvas/colorOverrides.js +18 -10
  244. package/dist/canvas/colorOverrides.js.map +1 -1
  245. package/dist/canvas/contextAttributes.js +14 -0
  246. package/dist/canvas/contextAttributes.js.map +1 -0
  247. package/dist/canvas/copiesAbove.js +24 -14
  248. package/dist/canvas/copiesAbove.js.map +1 -1
  249. package/dist/canvas/defaultDrawOne.js +55 -31
  250. package/dist/canvas/defaultDrawOne.js.map +1 -1
  251. package/dist/canvas/deps/areaSelect.js +30 -12
  252. package/dist/canvas/deps/areaSelect.js.map +1 -1
  253. package/dist/canvas/deps/booleans.js +104 -0
  254. package/dist/canvas/deps/booleans.js.map +1 -0
  255. package/dist/canvas/deps/changes.js +17 -9
  256. package/dist/canvas/deps/changes.js.map +1 -1
  257. package/dist/canvas/deps/debug.js +12 -5
  258. package/dist/canvas/deps/debug.js.map +1 -1
  259. package/dist/canvas/deps/dispatchSources.js +27 -0
  260. package/dist/canvas/deps/dispatchSources.js.map +1 -0
  261. package/dist/canvas/deps/dispatcher.js +18 -7
  262. package/dist/canvas/deps/dispatcher.js.map +1 -1
  263. package/dist/canvas/deps/editAnchors.js +150 -64
  264. package/dist/canvas/deps/editAnchors.js.map +1 -1
  265. package/dist/canvas/deps/geometryProjection.js +13 -7
  266. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  267. package/dist/canvas/deps/hitTestArea.js +78 -53
  268. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  269. package/dist/canvas/deps/ingestion.js +18 -13
  270. package/dist/canvas/deps/ingestion.js.map +1 -1
  271. package/dist/canvas/deps/insert.js +178 -116
  272. package/dist/canvas/deps/insert.js.map +1 -1
  273. package/dist/canvas/deps/kitSettings.js +16 -0
  274. package/dist/canvas/deps/kitSettings.js.map +1 -0
  275. package/dist/canvas/deps/lassoSelect.js +25 -13
  276. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  277. package/dist/canvas/deps/layout.js +32 -20
  278. package/dist/canvas/deps/layout.js.map +1 -1
  279. package/dist/canvas/deps/nodeAtPoint.js +28 -14
  280. package/dist/canvas/deps/nodeAtPoint.js.map +1 -1
  281. package/dist/canvas/deps/pathEditCommits.js +193 -0
  282. package/dist/canvas/deps/pathEditCommits.js.map +1 -0
  283. package/dist/canvas/deps/pathLeaf.js +66 -0
  284. package/dist/canvas/deps/pathLeaf.js.map +1 -0
  285. package/dist/canvas/deps/pathLeafDeps.js +13 -0
  286. package/dist/canvas/deps/pathLeafDeps.js.map +1 -0
  287. package/dist/canvas/deps/poseDescriptor.js +10 -8
  288. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  289. package/dist/canvas/deps/previewPaths.js +44 -0
  290. package/dist/canvas/deps/previewPaths.js.map +1 -0
  291. package/dist/canvas/deps/resizePolicy.js +32 -25
  292. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  293. package/dist/canvas/deps/slice.js +73 -87
  294. package/dist/canvas/deps/slice.js.map +1 -1
  295. package/dist/canvas/deps/snap.js +61 -7
  296. package/dist/canvas/deps/snap.js.map +1 -1
  297. package/dist/canvas/deps/surface.js +30 -0
  298. package/dist/canvas/deps/surface.js.map +1 -0
  299. package/dist/canvas/deps/textEdit.js +21 -13
  300. package/dist/canvas/deps/textEdit.js.map +1 -1
  301. package/dist/canvas/deps/transformFollowers.js +20 -0
  302. package/dist/canvas/deps/transformFollowers.js.map +1 -0
  303. package/dist/canvas/deps/view.js +46 -34
  304. package/dist/canvas/deps/view.js.map +1 -1
  305. package/dist/canvas/derivedPath.js +173 -70
  306. package/dist/canvas/derivedPath.js.map +1 -1
  307. package/dist/canvas/doubleClickTarget.js +20 -0
  308. package/dist/canvas/doubleClickTarget.js.map +1 -0
  309. package/dist/canvas/drawEnvelope.js +26 -17
  310. package/dist/canvas/drawEnvelope.js.map +1 -1
  311. package/dist/canvas/drawnBounds.js +142 -0
  312. package/dist/canvas/drawnBounds.js.map +1 -0
  313. package/dist/canvas/getNodeAtPoint.js +11 -8
  314. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  315. package/dist/canvas/hostAnchor.js +35 -18
  316. package/dist/canvas/hostAnchor.js.map +1 -1
  317. package/dist/canvas/hud.module.js +25 -14
  318. package/dist/canvas/hud.module.js.map +1 -1
  319. package/dist/canvas/insertPreviewExtent.js +82 -61
  320. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  321. package/dist/canvas/kitRequirements.js +154 -115
  322. package/dist/canvas/kitRequirements.js.map +1 -1
  323. package/dist/canvas/layerHover.js +28 -0
  324. package/dist/canvas/layerHover.js.map +1 -0
  325. package/dist/canvas/layerOrder.js +107 -57
  326. package/dist/canvas/layerOrder.js.map +1 -1
  327. package/dist/canvas/layerSlots.js +16 -9
  328. package/dist/canvas/layerSlots.js.map +1 -1
  329. package/dist/canvas/mountedCanvases.js +23 -13
  330. package/dist/canvas/mountedCanvases.js.map +1 -1
  331. package/dist/canvas/nodeShapes/derivedPainter.js +73 -25
  332. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  333. package/dist/canvas/nodeShapes/imagePainter.js +69 -53
  334. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  335. package/dist/canvas/nodeShapes/measurePainter.js +58 -0
  336. package/dist/canvas/nodeShapes/measurePainter.js.map +1 -0
  337. package/dist/canvas/nodeShapes/memo.js +16 -5
  338. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  339. package/dist/canvas/nodeShapes/nodePaint.js +125 -46
  340. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  341. package/dist/canvas/nodeShapes/pathPainter.js +42 -27
  342. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  343. package/dist/canvas/nodeShapes/poseBox.js +20 -13
  344. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  345. package/dist/canvas/nodeShapes/rectFallbackPainter.js +26 -22
  346. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  347. package/dist/canvas/nodeShapes/shapePainter.js +67 -46
  348. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  349. package/dist/canvas/nodeShapes/strokedBounds.js +177 -0
  350. package/dist/canvas/nodeShapes/strokedBounds.js.map +1 -0
  351. package/dist/canvas/nodeShapes/textPainter.js +170 -37
  352. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  353. package/dist/canvas/overChildren.js +29 -18
  354. package/dist/canvas/overChildren.js.map +1 -1
  355. package/dist/canvas/overlayRoleStrokes.js +32 -3
  356. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  357. package/dist/canvas/paintCull.js +24 -12
  358. package/dist/canvas/paintCull.js.map +1 -1
  359. package/dist/canvas/paintedCursorLayer.js +59 -35
  360. package/dist/canvas/paintedCursorLayer.js.map +1 -1
  361. package/dist/canvas/pathOverlay.js +83 -0
  362. package/dist/canvas/pathOverlay.js.map +1 -0
  363. package/dist/canvas/pickReach.js +34 -17
  364. package/dist/canvas/pickReach.js.map +1 -1
  365. package/dist/canvas/pickWalk.js +151 -102
  366. package/dist/canvas/pickWalk.js.map +1 -1
  367. package/dist/canvas/planeClips.js +39 -22
  368. package/dist/canvas/planeClips.js.map +1 -1
  369. package/dist/canvas/poseCascade.js +51 -27
  370. package/dist/canvas/poseCascade.js.map +1 -1
  371. package/dist/canvas/poseRotation.js +24 -14
  372. package/dist/canvas/poseRotation.js.map +1 -1
  373. package/dist/canvas/rasterReadback.js +23 -15
  374. package/dist/canvas/rasterReadback.js.map +1 -1
  375. package/dist/canvas/rasterToPng.js +21 -15
  376. package/dist/canvas/rasterToPng.js.map +1 -1
  377. package/dist/canvas/renderDebugSnapshot.js +37 -19
  378. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  379. package/dist/canvas/renderNeeds.js +33 -18
  380. package/dist/canvas/renderNeeds.js.map +1 -1
  381. package/dist/canvas/renderSceneToPixels.js +203 -87
  382. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  383. package/dist/canvas/sceneAdapter.js +96 -75
  384. package/dist/canvas/sceneAdapter.js.map +1 -1
  385. package/dist/canvas/sceneClipboard.js +141 -92
  386. package/dist/canvas/sceneClipboard.js.map +1 -1
  387. package/dist/canvas/sceneLayerPaint.js +56 -27
  388. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  389. package/dist/canvas/sceneSlotWiring.js +24 -14
  390. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  391. package/dist/canvas/sceneViewRender.js +85 -49
  392. package/dist/canvas/sceneViewRender.js.map +1 -1
  393. package/dist/canvas/slopsDebugLayer.js +58 -49
  394. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  395. package/dist/canvas/surfaceContribution.js +22 -10
  396. package/dist/canvas/surfaceContribution.js.map +1 -1
  397. package/dist/canvas/useCanvasElements.js +31 -0
  398. package/dist/canvas/useCanvasElements.js.map +1 -0
  399. package/dist/canvas/useCanvasHandle.js +69 -0
  400. package/dist/canvas/useCanvasHandle.js.map +1 -0
  401. package/dist/canvas/useCanvasPaint.js +92 -0
  402. package/dist/canvas/useCanvasPaint.js.map +1 -0
  403. package/dist/canvas/useCanvasRenderer.js +45 -23
  404. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  405. package/dist/canvas/useCanvasSurface.js +41 -23
  406. package/dist/canvas/useCanvasSurface.js.map +1 -1
  407. package/dist/canvas/useCanvasView.js +80 -48
  408. package/dist/canvas/useCanvasView.js.map +1 -1
  409. package/dist/canvas/useClientToWorld.js +27 -0
  410. package/dist/canvas/useClientToWorld.js.map +1 -0
  411. package/dist/canvas/useExtraLayers.js +45 -0
  412. package/dist/canvas/useExtraLayers.js.map +1 -0
  413. package/dist/canvas/useFrameLoop.js +109 -49
  414. package/dist/canvas/useFrameLoop.js.map +1 -1
  415. package/dist/canvas/useHitObserver.js +22 -15
  416. package/dist/canvas/useHitObserver.js.map +1 -1
  417. package/dist/canvas/useHostAnchor.js +83 -53
  418. package/dist/canvas/useHostAnchor.js.map +1 -1
  419. package/dist/canvas/useInFlightBounds.js +52 -0
  420. package/dist/canvas/useInFlightBounds.js.map +1 -0
  421. package/dist/canvas/useLateContentRedraw.js +21 -14
  422. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  423. package/dist/canvas/useLayerStack.js +72 -0
  424. package/dist/canvas/useLayerStack.js.map +1 -0
  425. package/dist/canvas/usePaintedCursor.js +28 -0
  426. package/dist/canvas/usePaintedCursor.js.map +1 -0
  427. package/dist/canvas/useRedrawOn.js +24 -14
  428. package/dist/canvas/useRedrawOn.js.map +1 -1
  429. package/dist/canvas/useSceneAdapter.js +21 -16
  430. package/dist/canvas/useSceneAdapter.js.map +1 -1
  431. package/dist/canvas/useSceneLayerList.js +15 -7
  432. package/dist/canvas/useSceneLayerList.js.map +1 -1
  433. package/dist/canvas/useSurfaceInput.js +46 -27
  434. package/dist/canvas/useSurfaceInput.js.map +1 -1
  435. package/dist/canvas/useSurfaceSize.js +43 -0
  436. package/dist/canvas/useSurfaceSize.js.map +1 -0
  437. package/dist/canvas/useToolCursor.js +30 -21
  438. package/dist/canvas/useToolCursor.js.map +1 -1
  439. package/dist/canvas/useViewHelpers.js +110 -61
  440. package/dist/canvas/useViewHelpers.js.map +1 -1
  441. package/dist/canvas/useViewLayerGate.js +29 -0
  442. package/dist/canvas/useViewLayerGate.js.map +1 -0
  443. package/dist/canvas/useViewNesting.js +104 -0
  444. package/dist/canvas/useViewNesting.js.map +1 -0
  445. package/dist/canvas/useViewRegistrySurface.js +44 -0
  446. package/dist/canvas/useViewRegistrySurface.js.map +1 -0
  447. package/dist/canvas/viewInputs.js +14 -11
  448. package/dist/canvas/viewInputs.js.map +1 -1
  449. package/dist/canvas/viewRegistry.js +140 -42
  450. package/dist/canvas/viewRegistry.js.map +1 -1
  451. package/dist/canvas/watchElementMove.js +71 -33
  452. package/dist/canvas/watchElementMove.js.map +1 -1
  453. package/dist/canvas/wrapNodeOutput.js +20 -13
  454. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  455. package/dist/clipboard.d.ts +9 -4
  456. package/dist/clipboard.js +4 -3
  457. package/dist/{clone-C0eADtS0.d.ts → clone-C3e0OTuF.d.ts} +27 -73
  458. package/dist/clone.d.ts +7 -5
  459. package/dist/core/adapters/testing/rootsTree.js +17 -0
  460. package/dist/core/adapters/testing/rootsTree.js.map +1 -0
  461. package/dist/core/applyOps.js +23 -7
  462. package/dist/core/applyOps.js.map +1 -1
  463. package/dist/core/device/index.js +6 -5
  464. package/dist/core/device/targets.js +29 -8
  465. package/dist/core/device/targets.js.map +1 -1
  466. package/dist/core/device/useDeviceProfile.js +86 -52
  467. package/dist/core/device/useDeviceProfile.js.map +1 -1
  468. package/dist/core/device/useTargetBasePx.js +23 -0
  469. package/dist/core/device/useTargetBasePx.js.map +1 -0
  470. package/dist/core/device/watchDevicePixelRatio.js +27 -10
  471. package/dist/core/device/watchDevicePixelRatio.js.map +1 -1
  472. package/dist/core/geometry/autoPoseDescriptor.js +38 -24
  473. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -1
  474. package/dist/core/geometry/inkExtents.js +60 -0
  475. package/dist/core/geometry/inkExtents.js.map +1 -0
  476. package/dist/core/geometry/pathPoseDescriptor.js +101 -76
  477. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -1
  478. package/dist/core/geometry/poseDescriptor.js +199 -136
  479. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  480. package/dist/core/geometry/regionHit.js +127 -79
  481. package/dist/core/geometry/regionHit.js.map +1 -1
  482. package/dist/core/geometry/targetFrame.js +84 -60
  483. package/dist/core/geometry/targetFrame.js.map +1 -1
  484. package/dist/core/geometry/unionBounds.js +103 -48
  485. package/dist/core/geometry/unionBounds.js.map +1 -1
  486. package/dist/core/isPlainObject.js +3 -2
  487. package/dist/core/layers/backgroundFill.js +23 -15
  488. package/dist/core/layers/backgroundFill.js.map +1 -1
  489. package/dist/core/layers/children.js +16 -13
  490. package/dist/core/layers/children.js.map +1 -1
  491. package/dist/core/layers/gateLayer.js +24 -9
  492. package/dist/core/layers/gateLayer.js.map +1 -1
  493. package/dist/core/layers/layerGroup.js +42 -29
  494. package/dist/core/layers/layerGroup.js.map +1 -1
  495. package/dist/core/layers/redrawSource.js +15 -0
  496. package/dist/core/layers/redrawSource.js.map +1 -0
  497. package/dist/core/layers/render.js +183 -93
  498. package/dist/core/layers/render.js.map +1 -1
  499. package/dist/core/layers/retain.js +38 -0
  500. package/dist/core/layers/retain.js.map +1 -0
  501. package/dist/core/ops/arrange.js +30 -19
  502. package/dist/core/ops/arrange.js.map +1 -1
  503. package/dist/core/ops/create.js +32 -23
  504. package/dist/core/ops/create.js.map +1 -1
  505. package/dist/core/ops/createHistory.js +23 -14
  506. package/dist/core/ops/createHistory.js.map +1 -1
  507. package/dist/core/ops/delete.js +80 -53
  508. package/dist/core/ops/delete.js.map +1 -1
  509. package/dist/core/ops/nodeFlags.js +44 -0
  510. package/dist/core/ops/nodeFlags.js.map +1 -0
  511. package/dist/core/ops/registry.js +26 -11
  512. package/dist/core/ops/registry.js.map +1 -1
  513. package/dist/core/ops/reorder/algorithms.js +62 -38
  514. package/dist/core/ops/reorder/algorithms.js.map +1 -1
  515. package/dist/core/ops/reorder/index.js +124 -84
  516. package/dist/core/ops/reorder/index.js.map +1 -1
  517. package/dist/core/ops/reorder/setChildOrder.js +32 -23
  518. package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
  519. package/dist/core/ops/reparent.js +63 -37
  520. package/dist/core/ops/reparent.js.map +1 -1
  521. package/dist/core/ops/select.js +23 -20
  522. package/dist/core/ops/select.js.map +1 -1
  523. package/dist/core/ops/setData.js +23 -21
  524. package/dist/core/ops/setData.js.map +1 -1
  525. package/dist/core/ops/setDependsOn.js +37 -0
  526. package/dist/core/ops/setDependsOn.js.map +1 -0
  527. package/dist/core/ops/setLayer.js +26 -21
  528. package/dist/core/ops/setLayer.js.map +1 -1
  529. package/dist/core/ops/setLayout.js +27 -18
  530. package/dist/core/ops/setLayout.js.map +1 -1
  531. package/dist/core/ops/setPath.js +60 -41
  532. package/dist/core/ops/setPath.js.map +1 -1
  533. package/dist/core/ops/setText.js +26 -21
  534. package/dist/core/ops/setText.js.map +1 -1
  535. package/dist/core/ops/slot.js +36 -22
  536. package/dist/core/ops/slot.js.map +1 -1
  537. package/dist/core/ops/transform.js +35 -28
  538. package/dist/core/ops/transform.js.map +1 -1
  539. package/dist/core/ops/writtenBy.js +53 -0
  540. package/dist/core/ops/writtenBy.js.map +1 -0
  541. package/dist/core/pages/fitViewToPage.js +24 -11
  542. package/dist/core/pages/fitViewToPage.js.map +1 -1
  543. package/dist/core/pages/pageEdits.js +164 -0
  544. package/dist/core/pages/pageEdits.js.map +1 -0
  545. package/dist/core/pages/pages.js +102 -42
  546. package/dist/core/pages/pages.js.map +1 -1
  547. package/dist/core/pages/pagesLayer.js +19 -13
  548. package/dist/core/pages/pagesLayer.js.map +1 -1
  549. package/dist/core/paint/meshKind.js +16 -11
  550. package/dist/core/paint/meshKind.js.map +1 -1
  551. package/dist/core/paint/meshKindLazy.js +1 -1
  552. package/dist/core/paint/meshKindLazy.js.map +1 -1
  553. package/dist/core/paint/paintKindEntry.js +13 -4
  554. package/dist/core/paint/paintKindEntry.js.map +1 -1
  555. package/dist/core/paint/paintKinds.js +149 -88
  556. package/dist/core/paint/paintKinds.js.map +1 -1
  557. package/dist/core/paint/registerMesh.js +6 -4
  558. package/dist/core/paint/registerMesh.js.map +1 -1
  559. package/dist/core/scene/NodeProperties.js +15 -10
  560. package/dist/core/scene/NodeProperties.js.map +1 -1
  561. package/dist/core/scene/NodeRouting.js +22 -13
  562. package/dist/core/scene/NodeRouting.js.map +1 -1
  563. package/dist/core/scene/annotation.js +28 -0
  564. package/dist/core/scene/annotation.js.map +1 -0
  565. package/dist/core/scene/appliedLog.js +31 -23
  566. package/dist/core/scene/appliedLog.js.map +1 -1
  567. package/dist/core/scene/arrivalWindow.js +120 -75
  568. package/dist/core/scene/arrivalWindow.js.map +1 -1
  569. package/dist/core/scene/arrivals.js +17 -6
  570. package/dist/core/scene/arrivals.js.map +1 -1
  571. package/dist/core/scene/boundOps.js +42 -23
  572. package/dist/core/scene/boundOps.js.map +1 -1
  573. package/dist/core/scene/carryDescendants.js +51 -0
  574. package/dist/core/scene/carryDescendants.js.map +1 -0
  575. package/dist/core/scene/composeFrame.js +51 -21
  576. package/dist/core/scene/composeFrame.js.map +1 -1
  577. package/dist/core/scene/composePose.js +114 -62
  578. package/dist/core/scene/composePose.js.map +1 -1
  579. package/dist/core/scene/depFrame.js +94 -0
  580. package/dist/core/scene/depFrame.js.map +1 -0
  581. package/dist/core/scene/depMemo.js +44 -19
  582. package/dist/core/scene/depMemo.js.map +1 -1
  583. package/dist/core/scene/dependents.js +73 -45
  584. package/dist/core/scene/dependents.js.map +1 -1
  585. package/dist/core/scene/derivedParts.js +58 -0
  586. package/dist/core/scene/derivedParts.js.map +1 -0
  587. package/dist/core/scene/derivedPath.js +52 -22
  588. package/dist/core/scene/derivedPath.js.map +1 -1
  589. package/dist/core/scene/docValues.js +57 -0
  590. package/dist/core/scene/docValues.js.map +1 -0
  591. package/dist/core/scene/editMode.js +11 -11
  592. package/dist/core/scene/editMode.js.map +1 -1
  593. package/dist/core/scene/editPass.js +111 -0
  594. package/dist/core/scene/editPass.js.map +1 -0
  595. package/dist/core/scene/effectivePose.js +173 -51
  596. package/dist/core/scene/effectivePose.js.map +1 -1
  597. package/dist/core/scene/fieldEdits.js +98 -75
  598. package/dist/core/scene/fieldEdits.js.map +1 -1
  599. package/dist/core/scene/historyFacade.js +127 -87
  600. package/dist/core/scene/historyFacade.js.map +1 -1
  601. package/dist/core/scene/historyForm.js +7 -3
  602. package/dist/core/scene/historyForm.js.map +1 -1
  603. package/dist/core/scene/kitOps.js +203 -131
  604. package/dist/core/scene/kitOps.js.map +1 -1
  605. package/dist/core/scene/kitRegistry.js +49 -22
  606. package/dist/core/scene/kitRegistry.js.map +1 -1
  607. package/dist/core/scene/layerStack.js +123 -92
  608. package/dist/core/scene/layerStack.js.map +1 -1
  609. package/dist/core/scene/layoutPass.js +143 -72
  610. package/dist/core/scene/layoutPass.js.map +1 -1
  611. package/dist/core/scene/lockGuard.js +32 -24
  612. package/dist/core/scene/lockGuard.js.map +1 -1
  613. package/dist/core/scene/minSize.js +17 -0
  614. package/dist/core/scene/minSize.js.map +1 -0
  615. package/dist/core/scene/nestedHit.js +45 -31
  616. package/dist/core/scene/nestedHit.js.map +1 -1
  617. package/dist/core/scene/nodeFlags.js +43 -0
  618. package/dist/core/scene/nodeFlags.js.map +1 -0
  619. package/dist/core/scene/nodeFnFields.js +58 -41
  620. package/dist/core/scene/nodeFnFields.js.map +1 -1
  621. package/dist/core/scene/nodeGates.js +58 -0
  622. package/dist/core/scene/nodeGates.js.map +1 -0
  623. package/dist/core/scene/nodeMemo.js +92 -40
  624. package/dist/core/scene/nodeMemo.js.map +1 -1
  625. package/dist/core/scene/nodeStore.js +179 -99
  626. package/dist/core/scene/nodeStore.js.map +1 -1
  627. package/dist/core/scene/notifier.js +30 -19
  628. package/dist/core/scene/notifier.js.map +1 -1
  629. package/dist/core/scene/opTable.js +42 -36
  630. package/dist/core/scene/opTable.js.map +1 -1
  631. package/dist/core/scene/outerOps.js +49 -43
  632. package/dist/core/scene/outerOps.js.map +1 -1
  633. package/dist/core/scene/pathEffects/blend.js +80 -0
  634. package/dist/core/scene/pathEffects/blend.js.map +1 -0
  635. package/dist/core/scene/pathEffects/derive.js +112 -0
  636. package/dist/core/scene/pathEffects/derive.js.map +1 -0
  637. package/dist/core/scene/pathEffects/effects.js +40 -0
  638. package/dist/core/scene/pathEffects/effects.js.map +1 -0
  639. package/dist/core/scene/poseFeed.js +95 -60
  640. package/dist/core/scene/poseFeed.js.map +1 -1
  641. package/dist/core/scene/poseHold.js +33 -24
  642. package/dist/core/scene/poseHold.js.map +1 -1
  643. package/dist/core/scene/poseOverrides.js +86 -49
  644. package/dist/core/scene/poseOverrides.js.map +1 -1
  645. package/dist/core/scene/poseRemovals.js +58 -0
  646. package/dist/core/scene/poseRemovals.js.map +1 -0
  647. package/dist/core/scene/poseSnapshot.js +62 -41
  648. package/dist/core/scene/poseSnapshot.js.map +1 -1
  649. package/dist/core/scene/poseWrites.js +151 -0
  650. package/dist/core/scene/poseWrites.js.map +1 -0
  651. package/dist/core/scene/reconcileSpecs.js +63 -34
  652. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  653. package/dist/core/scene/recorder.js +99 -57
  654. package/dist/core/scene/recorder.js.map +1 -1
  655. package/dist/core/scene/renderOrder.js +105 -59
  656. package/dist/core/scene/renderOrder.js.map +1 -1
  657. package/dist/core/scene/scene.js +139 -80
  658. package/dist/core/scene/scene.js.map +1 -1
  659. package/dist/core/scene/sceneChanges.js +13 -0
  660. package/dist/core/scene/sceneChanges.js.map +1 -0
  661. package/dist/core/scene/sceneEdits.js +69 -49
  662. package/dist/core/scene/sceneEdits.js.map +1 -1
  663. package/dist/core/scene/sceneMutators.js +45 -36
  664. package/dist/core/scene/sceneMutators.js.map +1 -1
  665. package/dist/core/scene/scenePoseAdapter.js +13 -9
  666. package/dist/core/scene/scenePoseAdapter.js.map +1 -1
  667. package/dist/core/scene/sceneRecording.js +106 -73
  668. package/dist/core/scene/sceneRecording.js.map +1 -1
  669. package/dist/core/scene/sceneSelection.js +26 -16
  670. package/dist/core/scene/sceneSelection.js.map +1 -1
  671. package/dist/core/scene/sceneState.js +61 -37
  672. package/dist/core/scene/sceneState.js.map +1 -1
  673. package/dist/core/scene/serialization.js +89 -50
  674. package/dist/core/scene/serialization.js.map +1 -1
  675. package/dist/core/scene/staleReplay.js +35 -26
  676. package/dist/core/scene/staleReplay.js.map +1 -1
  677. package/dist/core/scene/statedFields.js +10 -5
  678. package/dist/core/scene/statedFields.js.map +1 -1
  679. package/dist/core/scene/treeEdits.js +129 -98
  680. package/dist/core/scene/treeEdits.js.map +1 -1
  681. package/dist/core/scene/treeOrder.js +13 -8
  682. package/dist/core/scene/treeOrder.js.map +1 -1
  683. package/dist/core/scene/treeReads.js +25 -16
  684. package/dist/core/scene/treeReads.js.map +1 -1
  685. package/dist/core/scene/types.js +4 -3
  686. package/dist/core/scene/types.js.map +1 -1
  687. package/dist/core/scene/unionOfChildren.js +20 -10
  688. package/dist/core/scene/unionOfChildren.js.map +1 -1
  689. package/dist/core/scene/unitScopes.js +33 -8
  690. package/dist/core/scene/unitScopes.js.map +1 -1
  691. package/dist/core/scene/useScene.js +32 -24
  692. package/dist/core/scene/useScene.js.map +1 -1
  693. package/dist/core/selection/chromeState.js +41 -17
  694. package/dist/core/selection/chromeState.js.map +1 -1
  695. package/dist/core/selection/readOnlySelection.js +39 -24
  696. package/dist/core/selection/readOnlySelection.js.map +1 -1
  697. package/dist/core/selection/selectionTarget.js +14 -3
  698. package/dist/core/selection/selectionTarget.js.map +1 -1
  699. package/dist/core/selection/usePublishSceneSelection.js +20 -19
  700. package/dist/core/selection/usePublishSceneSelection.js.map +1 -1
  701. package/dist/core/selection/useSelection.js +90 -57
  702. package/dist/core/selection/useSelection.js.map +1 -1
  703. package/dist/core/shapeKinds.js +57 -28
  704. package/dist/core/shapeKinds.js.map +1 -1
  705. package/dist/core/stableStringify.js +5 -4
  706. package/dist/core/stableStringify.js.map +1 -1
  707. package/dist/core/stylus/stylus.js +49 -25
  708. package/dist/core/stylus/stylus.js.map +1 -1
  709. package/dist/core/stylus/usePointerStylus.js +61 -34
  710. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  711. package/dist/core/usePaintKinds.js +21 -11
  712. package/dist/core/usePaintKinds.js.map +1 -1
  713. package/dist/core/viewport/clampView.js +31 -15
  714. package/dist/core/viewport/clampView.js.map +1 -1
  715. package/dist/core/viewport/clientToWorld.js +15 -4
  716. package/dist/core/viewport/clientToWorld.js.map +1 -1
  717. package/dist/core/viewport/createVelocityTracker.js +23 -19
  718. package/dist/core/viewport/createVelocityTracker.js.map +1 -1
  719. package/dist/core/viewport/fitToBounds.js +28 -11
  720. package/dist/core/viewport/fitToBounds.js.map +1 -1
  721. package/dist/core/viewport/fitViewToBounds.js +45 -19
  722. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  723. package/dist/core/viewport/interpolateView.js +40 -20
  724. package/dist/core/viewport/interpolateView.js.map +1 -1
  725. package/dist/core/viewport/parallax.js +89 -56
  726. package/dist/core/viewport/parallax.js.map +1 -1
  727. package/dist/core/viewport/sceneNodeClientRect.js +21 -12
  728. package/dist/core/viewport/sceneNodeClientRect.js.map +1 -1
  729. package/dist/core/viewport/screenSlop.js +40 -17
  730. package/dist/core/viewport/screenSlop.js.map +1 -1
  731. package/dist/core/viewport/useAutoCenter.js +36 -22
  732. package/dist/core/viewport/useAutoCenter.js.map +1 -1
  733. package/dist/core/viewport/useCanvasSize.js +43 -22
  734. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  735. package/dist/core/viewport/useDecayLoop.js +120 -48
  736. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  737. package/dist/core/viewport/useNodeOverlayFrame.js +93 -58
  738. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -1
  739. package/dist/core/viewport/useVelocityTracker.js +9 -6
  740. package/dist/core/viewport/useVelocityTracker.js.map +1 -1
  741. package/dist/core/viewport/useViewAnimation.js +143 -84
  742. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  743. package/dist/core/viewport/view.js +48 -24
  744. package/dist/core/viewport/view.js.map +1 -1
  745. package/dist/core/viewport/viewTransform.js +8 -6
  746. package/dist/core/viewport/viewTransform.js.map +1 -1
  747. package/dist/core/viewport/viewportWorldRect.js +15 -7
  748. package/dist/core/viewport/viewportWorldRect.js.map +1 -1
  749. package/dist/core/viewport/wheelHandler.js +31 -20
  750. package/dist/core/viewport/wheelHandler.js.map +1 -1
  751. package/dist/core/viewport/zoomAt.js +47 -19
  752. package/dist/core/viewport/zoomAt.js.map +1 -1
  753. package/dist/core/viewport/zoomBounds.js +33 -17
  754. package/dist/core/viewport/zoomBounds.js.map +1 -1
  755. package/dist/cornerHandles-BHuoMs1o.d.ts +169 -0
  756. package/dist/debug/createDebugOverlayLayer.js +251 -258
  757. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  758. package/dist/debug/createDebugSink.js +69 -47
  759. package/dist/debug/createDebugSink.js.map +1 -1
  760. package/dist/debug/defaultTheme.js +20 -6
  761. package/dist/debug/defaultTheme.js.map +1 -1
  762. package/dist/debug/features.js +17 -0
  763. package/dist/debug/features.js.map +1 -0
  764. package/dist/debug/flag.js +3 -2
  765. package/dist/debug/frameStats.js +11 -9
  766. package/dist/debug/frameStats.js.map +1 -1
  767. package/dist/debug/overlayPanels.js +117 -0
  768. package/dist/debug/overlayPanels.js.map +1 -0
  769. package/dist/debug/parseDebugFlags.js +26 -27
  770. package/dist/debug/parseDebugFlags.js.map +1 -1
  771. package/dist/debug/useDebugSink.js +52 -33
  772. package/dist/debug/useDebugSink.js.map +1 -1
  773. package/dist/depSchema-BpZNOv7q.d.ts +2803 -0
  774. package/dist/devtools/handlers.js +112 -0
  775. package/dist/devtools/handlers.js.map +1 -0
  776. package/dist/devtools/history.js +71 -0
  777. package/dist/devtools/history.js.map +1 -0
  778. package/dist/devtools/hook.js +74 -0
  779. package/dist/devtools/hook.js.map +1 -0
  780. package/dist/devtools/label.js +25 -0
  781. package/dist/devtools/label.js.map +1 -0
  782. package/dist/devtools/notices.js +58 -0
  783. package/dist/devtools/notices.js.map +1 -0
  784. package/dist/devtools/protocol.js +7 -0
  785. package/dist/devtools/protocol.js.map +1 -0
  786. package/dist/devtools/registry.js +90 -0
  787. package/dist/devtools/registry.js.map +1 -0
  788. package/dist/devtools/root.js +80 -0
  789. package/dist/devtools/root.js.map +1 -0
  790. package/dist/devtools/serialize.js +86 -0
  791. package/dist/devtools/serialize.js.map +1 -0
  792. package/dist/devtools/session.js +111 -0
  793. package/dist/devtools/session.js.map +1 -0
  794. package/dist/devtools/transport.js +67 -0
  795. package/dist/devtools/transport.js.map +1 -0
  796. package/dist/devtools/useDevtoolsRoot.js +81 -0
  797. package/dist/devtools/useDevtoolsRoot.js.map +1 -0
  798. package/dist/devtools-protocol.d.ts +435 -0
  799. package/dist/devtools-protocol.js +7 -0
  800. package/dist/devtools.d.ts +8 -0
  801. package/dist/devtools.js +12 -0
  802. package/dist/devtools.js.map +1 -0
  803. package/dist/features/chrome-caps/buildChromeCtx.js +12 -10
  804. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  805. package/dist/features/chrome-caps/conditions.js +103 -25
  806. package/dist/features/chrome-caps/conditions.js.map +1 -1
  807. package/dist/features/chrome-caps/defaults.js +18 -10
  808. package/dist/features/chrome-caps/defaults.js.map +1 -1
  809. package/dist/features/chrome-caps/index.js +8 -7
  810. package/dist/features/chrome-caps/resolve.js +28 -16
  811. package/dist/features/chrome-caps/resolve.js.map +1 -1
  812. package/dist/features/chrome-caps/useChromeCaps.js +52 -44
  813. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -1
  814. package/dist/features/chrome-caps/useHoverTracking.js +58 -26
  815. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  816. package/dist/features/ingestion/contentHandlers.js +105 -36
  817. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  818. package/dist/features/ingestion/imageHandler.js +49 -29
  819. package/dist/features/ingestion/imageHandler.js.map +1 -1
  820. package/dist/features/ingestion/openFilePicker.js +27 -9
  821. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  822. package/dist/features/ingestion/placement.js +20 -11
  823. package/dist/features/ingestion/placement.js.map +1 -1
  824. package/dist/features/ingestion/registerKitHandlers.js +35 -18
  825. package/dist/features/ingestion/registerKitHandlers.js.map +1 -1
  826. package/dist/features/ingestion/svgHandler.js +60 -34
  827. package/dist/features/ingestion/svgHandler.js.map +1 -1
  828. package/dist/features/ingestion/textHandler.js +37 -16
  829. package/dist/features/ingestion/textHandler.js.map +1 -1
  830. package/dist/features/ingestion/useCanvasIngestion.js +57 -39
  831. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -1
  832. package/dist/features/ingestion/weaselJsonHandler.js +38 -28
  833. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  834. package/dist/features/longPress/longPressFeedback.js +110 -81
  835. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  836. package/dist/features/measure/actionIds.js +22 -0
  837. package/dist/features/measure/actionIds.js.map +1 -0
  838. package/dist/features/measure/measureCommands.js +180 -0
  839. package/dist/features/measure/measureCommands.js.map +1 -0
  840. package/dist/features/measure/measureContribution.js +57 -0
  841. package/dist/features/measure/measureContribution.js.map +1 -0
  842. package/dist/features/measure/measureEdits.js +82 -0
  843. package/dist/features/measure/measureEdits.js.map +1 -0
  844. package/dist/features/measure/measureGestures.js +185 -0
  845. package/dist/features/measure/measureGestures.js.map +1 -0
  846. package/dist/features/measure/measureHit.js +80 -0
  847. package/dist/features/measure/measureHit.js.map +1 -0
  848. package/dist/features/measure/measureLayer.js +86 -0
  849. package/dist/features/measure/measureLayer.js.map +1 -0
  850. package/dist/features/measure/measurement.js +79 -0
  851. package/dist/features/measure/measurement.js.map +1 -0
  852. package/dist/features/measure/measurements.js +41 -0
  853. package/dist/features/measure/measurements.js.map +1 -0
  854. package/dist/features/modes/modeLayers.js +81 -55
  855. package/dist/features/modes/modeLayers.js.map +1 -1
  856. package/dist/features/modes/modeTriggers.js +66 -0
  857. package/dist/features/modes/modeTriggers.js.map +1 -0
  858. package/dist/features/pathEffects/index.js +35 -0
  859. package/dist/features/pathEffects/index.js.map +1 -0
  860. package/dist/features/pathEffects/readSource.js +46 -0
  861. package/dist/features/pathEffects/readSource.js.map +1 -0
  862. package/dist/features/paths/anchorData.js +65 -0
  863. package/dist/features/paths/anchorData.js.map +1 -0
  864. package/dist/features/paths/anchorMarkers.js +137 -0
  865. package/dist/features/paths/anchorMarkers.js.map +1 -0
  866. package/dist/features/paths/editablePath.js +149 -46
  867. package/dist/features/paths/editablePath.js.map +1 -1
  868. package/dist/features/paths/index.js +12 -9
  869. package/dist/features/paths/originProjection.js +16 -9
  870. package/dist/features/paths/originProjection.js.map +1 -1
  871. package/dist/features/paths/pathEditExtension.js +26 -0
  872. package/dist/features/paths/pathEditExtension.js.map +1 -0
  873. package/dist/features/paths/pathEditState.js +107 -26
  874. package/dist/features/paths/pathEditState.js.map +1 -1
  875. package/dist/features/paths/pathEditingOverlayLayer.js +58 -110
  876. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  877. package/dist/features/paths/pathLayer.js +79 -29
  878. package/dist/features/paths/pathLayer.js.map +1 -1
  879. package/dist/features/paths/pathRepresentation.js +27 -0
  880. package/dist/features/paths/pathRepresentation.js.map +1 -0
  881. package/dist/features/paths/pathSnap/glyphs.js +39 -0
  882. package/dist/features/paths/pathSnap/glyphs.js.map +1 -0
  883. package/dist/features/paths/pathSnap/pathSnapSource.js +82 -0
  884. package/dist/features/paths/pathSnap/pathSnapSource.js.map +1 -0
  885. package/dist/features/paths/pathSnap/sceneIndex.js +85 -0
  886. package/dist/features/paths/pathSnap/sceneIndex.js.map +1 -0
  887. package/dist/features/paths/pathSnap/snapGeometry.js +47 -0
  888. package/dist/features/paths/pathSnap/snapGeometry.js.map +1 -0
  889. package/dist/features/paths/penPreviewLayer.js +135 -102
  890. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  891. package/dist/features/paths/shapeGenerator.js +112 -60
  892. package/dist/features/paths/shapeGenerator.js.map +1 -1
  893. package/dist/features/paths/strokeOutline.js +15 -0
  894. package/dist/features/paths/strokeOutline.js.map +1 -0
  895. package/dist/features/paths/useAnchorFields.js +35 -0
  896. package/dist/features/paths/useAnchorFields.js.map +1 -0
  897. package/dist/features/paths/usePathEdit.js +58 -28
  898. package/dist/features/paths/usePathEdit.js.map +1 -1
  899. package/dist/features/poseRun/usePoseRun.js +110 -43
  900. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  901. package/dist/features/selection/handleCommands.js +116 -0
  902. package/dist/features/selection/handleCommands.js.map +1 -0
  903. package/dist/features/selection/overlay.js +288 -328
  904. package/dist/features/selection/overlay.js.map +1 -1
  905. package/dist/features/selection/selectionPose.js +112 -0
  906. package/dist/features/selection/selectionPose.js.map +1 -0
  907. package/dist/features/snap/angle2d.js +158 -0
  908. package/dist/features/snap/angle2d.js.map +1 -0
  909. package/dist/features/snap/debugCandidates.js +27 -0
  910. package/dist/features/snap/debugCandidates.js.map +1 -0
  911. package/dist/features/snap/gather.js +79 -0
  912. package/dist/features/snap/gather.js.map +1 -0
  913. package/dist/features/snap/inputSubspace.js +46 -0
  914. package/dist/features/snap/inputSubspace.js.map +1 -0
  915. package/dist/features/snap/lazySession.js +17 -0
  916. package/dist/features/snap/lazySession.js.map +1 -0
  917. package/dist/features/snap/marks.js +29 -0
  918. package/dist/features/snap/marks.js.map +1 -0
  919. package/dist/features/snap/outcomeStore.js +25 -0
  920. package/dist/features/snap/outcomeStore.js.map +1 -0
  921. package/dist/features/snap/pointSnap.js +48 -0
  922. package/dist/features/snap/pointSnap.js.map +1 -0
  923. package/dist/features/snap/probes2d.js +99 -0
  924. package/dist/features/snap/probes2d.js.map +1 -0
  925. package/dist/features/snap/readoutDraw.js +93 -0
  926. package/dist/features/snap/readoutDraw.js.map +1 -0
  927. package/dist/features/snap/readoutLayer.js +49 -0
  928. package/dist/features/snap/readoutLayer.js.map +1 -0
  929. package/dist/features/snap/registry.js +27 -0
  930. package/dist/features/snap/registry.js.map +1 -0
  931. package/dist/features/snap/resizeBox.js +137 -0
  932. package/dist/features/snap/resizeBox.js.map +1 -0
  933. package/dist/features/snap/roles.js +32 -0
  934. package/dist/features/snap/roles.js.map +1 -0
  935. package/dist/features/snap/rotationSource.js +47 -0
  936. package/dist/features/snap/rotationSource.js.map +1 -0
  937. package/dist/features/snap/sceneReads.js +45 -0
  938. package/dist/features/snap/sceneReads.js.map +1 -0
  939. package/dist/features/snap/sceneSession2d.js +81 -0
  940. package/dist/features/snap/sceneSession2d.js.map +1 -0
  941. package/dist/features/snap/screen.js +23 -0
  942. package/dist/features/snap/screen.js.map +1 -0
  943. package/dist/features/snap/session2d.js +143 -0
  944. package/dist/features/snap/session2d.js.map +1 -0
  945. package/dist/features/snap/spanSnap.js +80 -0
  946. package/dist/features/snap/spanSnap.js.map +1 -0
  947. package/dist/features/snap/stepAngles.js +15 -0
  948. package/dist/features/snap/stepAngles.js.map +1 -0
  949. package/dist/features/text/editingDrawOne.js +32 -0
  950. package/dist/features/text/editingDrawOne.js.map +1 -0
  951. package/dist/features/text/index.js +7 -6
  952. package/dist/features/text/textHitAt.js +51 -0
  953. package/dist/features/text/textHitAt.js.map +1 -0
  954. package/dist/features/text/textLayer.js +21 -27
  955. package/dist/features/text/textLayer.js.map +1 -1
  956. package/dist/features/text/useSceneTextEdit.js +190 -128
  957. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  958. package/dist/features/viewports/viewResolver.js +48 -39
  959. package/dist/features/viewports/viewResolver.js.map +1 -1
  960. package/dist/features/viewports/viewportLayer.js +60 -29
  961. package/dist/features/viewports/viewportLayer.js.map +1 -1
  962. package/dist/iconRegistry/IconRegistryProvider.js +73 -0
  963. package/dist/iconRegistry/IconRegistryProvider.js.map +1 -0
  964. package/dist/iconRegistry/useIconGlyph.js +14 -0
  965. package/dist/iconRegistry/useIconGlyph.js.map +1 -0
  966. package/dist/iconRegistry/useIconVariant.js +29 -0
  967. package/dist/iconRegistry/useIconVariant.js.map +1 -0
  968. package/dist/icons.d.ts +6 -0
  969. package/dist/icons.js +3 -0
  970. package/dist/icons.table.js +13 -0
  971. package/dist/icons.table.js.map +1 -0
  972. package/dist/icons.table.json +546 -0
  973. package/dist/icons2.table.js +9 -0
  974. package/dist/icons2.table.js.map +1 -0
  975. package/dist/index.d.ts +4856 -5666
  976. package/dist/index.js +346 -285
  977. package/dist/input/keyState.js +118 -54
  978. package/dist/input/keyState.js.map +1 -1
  979. package/dist/input/useKeyModifiers.js +13 -7
  980. package/dist/input/useKeyModifiers.js.map +1 -1
  981. package/dist/input/useKeyState.js +23 -16
  982. package/dist/input/useKeyState.js.map +1 -1
  983. package/dist/interactions/actions/align/action.js +78 -45
  984. package/dist/interactions/actions/align/action.js.map +1 -1
  985. package/dist/interactions/actions/align/align.js +86 -48
  986. package/dist/interactions/actions/align/align.js.map +1 -1
  987. package/dist/interactions/actions/booleans/action.js +73 -33
  988. package/dist/interactions/actions/booleans/action.js.map +1 -1
  989. package/dist/interactions/actions/booleans/booleans.js +77 -70
  990. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  991. package/dist/interactions/actions/booleans/commit.js +49 -0
  992. package/dist/interactions/actions/booleans/commit.js.map +1 -0
  993. package/dist/interactions/actions/booleans/custom.js +48 -0
  994. package/dist/interactions/actions/booleans/custom.js.map +1 -0
  995. package/dist/interactions/actions/booleans/operands.js +43 -32
  996. package/dist/interactions/actions/booleans/operands.js.map +1 -1
  997. package/dist/interactions/actions/booleans/pieces.js +29 -23
  998. package/dist/interactions/actions/booleans/pieces.js.map +1 -1
  999. package/dist/interactions/actions/booleans/placement.js +30 -17
  1000. package/dist/interactions/actions/booleans/placement.js.map +1 -1
  1001. package/dist/interactions/actions/booleans/useBooleans.js +30 -17
  1002. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  1003. package/dist/interactions/actions/booleans/useBooleansAdapter.js +8 -5
  1004. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  1005. package/dist/interactions/actions/clipboard/action.js +81 -40
  1006. package/dist/interactions/actions/clipboard/action.js.map +1 -1
  1007. package/dist/interactions/actions/clipboard/clipboardOps.js +100 -72
  1008. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  1009. package/dist/interactions/actions/clipboard/materializePaste.js +38 -19
  1010. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
  1011. package/dist/interactions/actions/clipboard/wireFormat.js +66 -28
  1012. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  1013. package/dist/interactions/actions/clone/action.js +102 -70
  1014. package/dist/interactions/actions/clone/action.js.map +1 -1
  1015. package/dist/interactions/actions/clone/behaviors.js +55 -38
  1016. package/dist/interactions/actions/clone/behaviors.js.map +1 -1
  1017. package/dist/interactions/actions/defaultCommitAdapter.js +32 -10
  1018. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  1019. package/dist/interactions/actions/defaults/anchorEditing.js +252 -111
  1020. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  1021. package/dist/interactions/actions/defaults/anchorFields.js +54 -0
  1022. package/dist/interactions/actions/defaults/anchorFields.js.map +1 -0
  1023. package/dist/interactions/actions/defaults/anchorHandles.js +31 -27
  1024. package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -1
  1025. package/dist/interactions/actions/defaults/anchorJoin.js +55 -37
  1026. package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -1
  1027. package/dist/interactions/actions/defaults/areaSelect.js +56 -40
  1028. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  1029. package/dist/interactions/actions/defaults/bendSegment.js +67 -31
  1030. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  1031. package/dist/interactions/actions/defaults/cancelGesture.js +12 -5
  1032. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  1033. package/dist/interactions/actions/defaults/clearSelection.js +22 -7
  1034. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  1035. package/dist/interactions/actions/defaults/contextMenu.js +149 -0
  1036. package/dist/interactions/actions/defaults/contextMenu.js.map +1 -0
  1037. package/dist/interactions/actions/defaults/copySubtree.js +43 -29
  1038. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -1
  1039. package/dist/interactions/actions/defaults/createPaintAction.js +79 -54
  1040. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  1041. package/dist/interactions/actions/defaults/delete.js +92 -55
  1042. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  1043. package/dist/interactions/actions/defaults/duplicate.js +60 -32
  1044. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  1045. package/dist/interactions/actions/defaults/enterPathEdit.js +22 -18
  1046. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  1047. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -8
  1048. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  1049. package/dist/interactions/actions/defaults/escape.js +16 -7
  1050. package/dist/interactions/actions/defaults/escape.js.map +1 -1
  1051. package/dist/interactions/actions/defaults/exitPathEdit.js +6 -6
  1052. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -1
  1053. package/dist/interactions/actions/defaults/group.js +122 -73
  1054. package/dist/interactions/actions/defaults/group.js.map +1 -1
  1055. package/dist/interactions/actions/defaults/ingest.js +58 -39
  1056. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  1057. package/dist/interactions/actions/defaults/insertPathAnchor.js +43 -22
  1058. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  1059. package/dist/interactions/actions/defaults/nudge.js +57 -55
  1060. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  1061. package/dist/interactions/actions/defaults/nudgeSteps.js +17 -12
  1062. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
  1063. package/dist/interactions/actions/defaults/pathEditMarks.js +60 -0
  1064. package/dist/interactions/actions/defaults/pathEditMarks.js.map +1 -0
  1065. package/dist/interactions/actions/defaults/pathEditTools.js +57 -0
  1066. package/dist/interactions/actions/defaults/pathEditTools.js.map +1 -0
  1067. package/dist/interactions/actions/defaults/pinchZoom.js +55 -39
  1068. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  1069. package/dist/interactions/actions/defaults/reorder.js +71 -40
  1070. package/dist/interactions/actions/defaults/reorder.js.map +1 -1
  1071. package/dist/interactions/actions/defaults/requiresSelection.js +13 -6
  1072. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  1073. package/dist/interactions/actions/defaults/segmentUnder.js +24 -16
  1074. package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -1
  1075. package/dist/interactions/actions/defaults/selectAll.js +21 -7
  1076. package/dist/interactions/actions/defaults/selectAll.js.map +1 -1
  1077. package/dist/interactions/actions/defaults/setFill.js +37 -21
  1078. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  1079. package/dist/interactions/actions/defaults/setFillOpacity.js +19 -10
  1080. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  1081. package/dist/interactions/actions/defaults/setStroke.js +46 -25
  1082. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  1083. package/dist/interactions/actions/defaults/setStrokeOpacity.js +19 -11
  1084. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -1
  1085. package/dist/interactions/actions/defaults/slice.js +42 -17
  1086. package/dist/interactions/actions/defaults/slice.js.map +1 -1
  1087. package/dist/interactions/actions/defaults/sliceOps.js +63 -42
  1088. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  1089. package/dist/interactions/actions/defaults/toolActivate.js +34 -16
  1090. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  1091. package/dist/interactions/actions/defaults/toolResetToDefault.js +29 -10
  1092. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  1093. package/dist/interactions/actions/defaults/undoRedo.js +26 -20
  1094. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -1
  1095. package/dist/interactions/actions/defaults/viewportDragPan.js +91 -58
  1096. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  1097. package/dist/interactions/actions/defaults/viewportWheelPan.js +42 -23
  1098. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  1099. package/dist/interactions/actions/defaults/viewportZoom.js +107 -59
  1100. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  1101. package/dist/interactions/actions/distribute/action.js +64 -39
  1102. package/dist/interactions/actions/distribute/action.js.map +1 -1
  1103. package/dist/interactions/actions/distribute/distribute.js +53 -34
  1104. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  1105. package/dist/interactions/actions/distribute/plan.js +40 -22
  1106. package/dist/interactions/actions/distribute/plan.js.map +1 -1
  1107. package/dist/interactions/actions/drawnBoxes.js +32 -0
  1108. package/dist/interactions/actions/drawnBoxes.js.map +1 -0
  1109. package/dist/interactions/actions/edit-anchors/action.js +245 -72
  1110. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  1111. package/dist/interactions/actions/edit-anchors/extensionDrags.js +50 -0
  1112. package/dist/interactions/actions/edit-anchors/extensionDrags.js.map +1 -0
  1113. package/dist/interactions/actions/edit-anchors/geometry.js +74 -47
  1114. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  1115. package/dist/interactions/actions/edit-anchors/handleDrag.js +101 -0
  1116. package/dist/interactions/actions/edit-anchors/handleDrag.js.map +1 -0
  1117. package/dist/interactions/actions/edit-anchors/handles.js +41 -27
  1118. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -1
  1119. package/dist/interactions/actions/edit-anchors/params.js +12 -0
  1120. package/dist/interactions/actions/edit-anchors/params.js.map +1 -0
  1121. package/dist/interactions/actions/edit-anchors/preview.js +93 -18
  1122. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
  1123. package/dist/interactions/actions/edit-anchors/symmetry.js +12 -7
  1124. package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -1
  1125. package/dist/interactions/actions/flip/action.js +121 -61
  1126. package/dist/interactions/actions/flip/action.js.map +1 -1
  1127. package/dist/interactions/actions/flip/helpers.js +69 -36
  1128. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  1129. package/dist/interactions/actions/geometryProjection.js +17 -12
  1130. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  1131. package/dist/interactions/actions/gestureFrames.js +20 -11
  1132. package/dist/interactions/actions/gestureFrames.js.map +1 -1
  1133. package/dist/interactions/actions/gestureLifecycle.js +96 -48
  1134. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  1135. package/dist/interactions/actions/hitSelection.js +6 -4
  1136. package/dist/interactions/actions/hitSelection.js.map +1 -1
  1137. package/dist/interactions/actions/insert/action.js +70 -42
  1138. package/dist/interactions/actions/insert/action.js.map +1 -1
  1139. package/dist/interactions/actions/insert/commit.js +44 -22
  1140. package/dist/interactions/actions/insert/commit.js.map +1 -1
  1141. package/dist/interactions/actions/insert/extras.js +60 -38
  1142. package/dist/interactions/actions/insert/extras.js.map +1 -1
  1143. package/dist/interactions/actions/insert/frame.js +58 -39
  1144. package/dist/interactions/actions/insert/frame.js.map +1 -1
  1145. package/dist/interactions/actions/insert/geometry.js +29 -25
  1146. package/dist/interactions/actions/insert/geometry.js.map +1 -1
  1147. package/dist/interactions/actions/insert/parent.js +11 -0
  1148. package/dist/interactions/actions/insert/parent.js.map +1 -0
  1149. package/dist/interactions/actions/insert/placeAction.js +113 -0
  1150. package/dist/interactions/actions/insert/placeAction.js.map +1 -0
  1151. package/dist/interactions/actions/insert/repositionAction.js +26 -11
  1152. package/dist/interactions/actions/insert/repositionAction.js.map +1 -1
  1153. package/dist/interactions/actions/insert/rotateAction.js +19 -8
  1154. package/dist/interactions/actions/insert/rotateAction.js.map +1 -1
  1155. package/dist/interactions/actions/insert/session.js +61 -41
  1156. package/dist/interactions/actions/insert/session.js.map +1 -1
  1157. package/dist/interactions/actions/insert/shape.js +83 -25
  1158. package/dist/interactions/actions/insert/shape.js.map +1 -1
  1159. package/dist/interactions/actions/lasso-select/action.js +160 -100
  1160. package/dist/interactions/actions/lasso-select/action.js.map +1 -1
  1161. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +44 -25
  1162. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
  1163. package/dist/interactions/actions/move/action.js +91 -52
  1164. package/dist/interactions/actions/move/action.js.map +1 -1
  1165. package/dist/interactions/actions/move/behaviors/layoutDrop.js +55 -36
  1166. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
  1167. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +20 -10
  1168. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -1
  1169. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +40 -24
  1170. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
  1171. package/dist/interactions/actions/move/behaviors/snapToContainer.js +102 -64
  1172. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  1173. package/dist/interactions/actions/move/capture.js +103 -78
  1174. package/dist/interactions/actions/move/capture.js.map +1 -1
  1175. package/dist/interactions/actions/move/commit/index.js +41 -34
  1176. package/dist/interactions/actions/move/commit/index.js.map +1 -1
  1177. package/dist/interactions/actions/move/commit/layoutDrop.js +43 -32
  1178. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -1
  1179. package/dist/interactions/actions/move/commit/layoutRelease.js +97 -77
  1180. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -1
  1181. package/dist/interactions/actions/move/commit/rebase.js +16 -13
  1182. package/dist/interactions/actions/move/commit/rebase.js.map +1 -1
  1183. package/dist/interactions/actions/move/commit/reparent.js +89 -57
  1184. package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
  1185. package/dist/interactions/actions/move/delta.js +58 -36
  1186. package/dist/interactions/actions/move/delta.js.map +1 -1
  1187. package/dist/interactions/actions/move/frame.js +66 -35
  1188. package/dist/interactions/actions/move/frame.js.map +1 -1
  1189. package/dist/interactions/actions/move/gestureAdapter.js +30 -20
  1190. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  1191. package/dist/interactions/actions/move/landedDescendants.js +43 -25
  1192. package/dist/interactions/actions/move/landedDescendants.js.map +1 -1
  1193. package/dist/interactions/actions/move/layout/container.js +93 -72
  1194. package/dist/interactions/actions/move/layout/container.js.map +1 -1
  1195. package/dist/interactions/actions/move/layout/dragged.js +61 -39
  1196. package/dist/interactions/actions/move/layout/dragged.js.map +1 -1
  1197. package/dist/interactions/actions/move/layout/dropPass.js +153 -94
  1198. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
  1199. package/dist/interactions/actions/move/layout/exits.js +58 -30
  1200. package/dist/interactions/actions/move/layout/exits.js.map +1 -1
  1201. package/dist/interactions/actions/move/layout/glide.js +55 -34
  1202. package/dist/interactions/actions/move/layout/glide.js.map +1 -1
  1203. package/dist/interactions/actions/move/session.js +96 -56
  1204. package/dist/interactions/actions/move/session.js.map +1 -1
  1205. package/dist/interactions/actions/move/translate.js +37 -51
  1206. package/dist/interactions/actions/move/translate.js.map +1 -1
  1207. package/dist/interactions/actions/moveNodes.js +87 -0
  1208. package/dist/interactions/actions/moveNodes.js.map +1 -0
  1209. package/dist/interactions/actions/outlines/createOutlines.js +28 -20
  1210. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  1211. package/dist/interactions/actions/outlines/createOutlinesAction.js +43 -31
  1212. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -1
  1213. package/dist/interactions/actions/outlines/outlineStroke.js +68 -45
  1214. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -1
  1215. package/dist/interactions/actions/outlines/outlineStrokeAction.js +24 -19
  1216. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -1
  1217. package/dist/interactions/actions/outlines/replaceWithPaths.js +57 -42
  1218. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -1
  1219. package/dist/interactions/actions/outlines/strokeRegion.js +37 -22
  1220. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -1
  1221. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +8 -5
  1222. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -1
  1223. package/dist/interactions/actions/pathCommands/cutJoin.js +119 -72
  1224. package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -1
  1225. package/dist/interactions/actions/pathCommands/livePathEdit.js +74 -40
  1226. package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -1
  1227. package/dist/interactions/actions/pathCommands/pathNodes.js +91 -82
  1228. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -1
  1229. package/dist/interactions/actions/pathCommands/simplifyOffset.js +52 -28
  1230. package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -1
  1231. package/dist/interactions/actions/pathGestureTags.js +29 -0
  1232. package/dist/interactions/actions/pathGestureTags.js.map +1 -0
  1233. package/dist/interactions/actions/planeInput.js +198 -123
  1234. package/dist/interactions/actions/planeInput.js.map +1 -1
  1235. package/dist/interactions/actions/pointerState.js +12 -7
  1236. package/dist/interactions/actions/pointerState.js.map +1 -1
  1237. package/dist/interactions/actions/poseDescriptorDep.js +24 -14
  1238. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  1239. package/dist/interactions/actions/poseFrame.js +45 -28
  1240. package/dist/interactions/actions/poseFrame.js.map +1 -1
  1241. package/dist/interactions/actions/resize/action.js +103 -63
  1242. package/dist/interactions/actions/resize/action.js.map +1 -1
  1243. package/dist/interactions/actions/resize/aspect.js +44 -0
  1244. package/dist/interactions/actions/resize/aspect.js.map +1 -0
  1245. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +38 -13
  1246. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -1
  1247. package/dist/interactions/actions/resize/boxFrame.js +15 -11
  1248. package/dist/interactions/actions/resize/boxFrame.js.map +1 -1
  1249. package/dist/interactions/actions/resize/capture.js +105 -62
  1250. package/dist/interactions/actions/resize/capture.js.map +1 -1
  1251. package/dist/interactions/actions/resize/commit.js +76 -56
  1252. package/dist/interactions/actions/resize/commit.js.map +1 -1
  1253. package/dist/interactions/actions/resize/cornerHandles.js +154 -17
  1254. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -1
  1255. package/dist/interactions/actions/resize/frame.js +133 -66
  1256. package/dist/interactions/actions/resize/frame.js.map +1 -1
  1257. package/dist/interactions/actions/resize/minimum.js +35 -0
  1258. package/dist/interactions/actions/resize/minimum.js.map +1 -0
  1259. package/dist/interactions/actions/resize/replay.js +40 -30
  1260. package/dist/interactions/actions/resize/replay.js.map +1 -1
  1261. package/dist/interactions/actions/resize/ruleBounds.js +8 -5
  1262. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -1
  1263. package/dist/interactions/actions/resize/session.js +97 -50
  1264. package/dist/interactions/actions/resize/session.js.map +1 -1
  1265. package/dist/interactions/actions/resolveOverlays.js +48 -33
  1266. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  1267. package/dist/interactions/actions/resolvePreviews.js +63 -46
  1268. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  1269. package/dist/interactions/actions/rotate/action.js +71 -42
  1270. package/dist/interactions/actions/rotate/action.js.map +1 -1
  1271. package/dist/interactions/actions/rotate/commit.js +40 -31
  1272. package/dist/interactions/actions/rotate/commit.js.map +1 -1
  1273. package/dist/interactions/actions/rotate/frame.js +75 -47
  1274. package/dist/interactions/actions/rotate/frame.js.map +1 -1
  1275. package/dist/interactions/actions/rotate/geometry.js +36 -24
  1276. package/dist/interactions/actions/rotate/geometry.js.map +1 -1
  1277. package/dist/interactions/actions/rotate/handle.js +28 -15
  1278. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  1279. package/dist/interactions/actions/rotate/replay.js +22 -18
  1280. package/dist/interactions/actions/rotate/replay.js.map +1 -1
  1281. package/dist/interactions/actions/rotate/session.js +117 -76
  1282. package/dist/interactions/actions/rotate/session.js.map +1 -1
  1283. package/dist/interactions/actions/selectionSubtree.js +135 -53
  1284. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  1285. package/dist/interactions/actions/spatialReference.js +33 -26
  1286. package/dist/interactions/actions/spatialReference.js.map +1 -1
  1287. package/dist/interactions/actions/testUtils.js +53 -0
  1288. package/dist/interactions/actions/testUtils.js.map +1 -0
  1289. package/dist/interactions/actions/transform-again/action.js +49 -35
  1290. package/dist/interactions/actions/transform-again/action.js.map +1 -1
  1291. package/dist/interactions/actions/transform-again/memory.js +32 -21
  1292. package/dist/interactions/actions/transform-again/memory.js.map +1 -1
  1293. package/dist/interactions/actions/transformFinish.js +106 -0
  1294. package/dist/interactions/actions/transformFinish.js.map +1 -0
  1295. package/dist/interactions/actions/useActionSet.js +83 -0
  1296. package/dist/interactions/actions/useActionSet.js.map +1 -0
  1297. package/dist/interactions/actions/useStandardActions.js +23 -165
  1298. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  1299. package/dist/interactions/gestures/dragGesture/dragGesture.js +109 -68
  1300. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
  1301. package/dist/interactions/gestures/dragGesture/dragPointOf.js +17 -10
  1302. package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -1
  1303. package/dist/interactions/gestures/dragRadial/dragRadial.js +129 -93
  1304. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -1
  1305. package/dist/interactions/gestures/dragRect/dragRect.js +155 -111
  1306. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -1
  1307. package/dist/interactions/gestures/handleDrag/handleDrag.js +52 -30
  1308. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
  1309. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +168 -97
  1310. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  1311. package/dist/interactions/gestures/shared/originProjection.js +32 -25
  1312. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  1313. package/dist/interactions/gestures/shared/screenTolerance.js +26 -17
  1314. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  1315. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +39 -21
  1316. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
  1317. package/dist/kitSettingsSchema.js +76 -0
  1318. package/dist/kitSettingsSchema.js.map +1 -0
  1319. package/dist/{math-CYUjoyyU.d.ts → math-CrJULaZI.d.ts} +5 -6
  1320. package/dist/math.d.ts +4 -5
  1321. package/dist/math.js +7 -6
  1322. package/dist/mesh.js +3 -2
  1323. package/dist/move.d.ts +9 -7
  1324. package/dist/move.js +4 -3
  1325. package/dist/{originProjection-CoNVpITV.d.ts → options-DBxEryYq.d.ts} +4 -27
  1326. package/dist/originProjection-gY0jb4Wb.d.ts +24 -0
  1327. package/dist/patterns-builtin.js +3 -2
  1328. package/dist/{poseDescriptor-Bqk-11Rl.d.ts → poseDescriptor-DN2yfnq_.d.ts} +7 -7
  1329. package/dist/renderer.d.ts +1 -1
  1330. package/dist/renderer.js +3 -2
  1331. package/dist/resize.d.ts +11 -28
  1332. package/dist/resize.js +6 -7
  1333. package/dist/routing.d.ts +1 -1
  1334. package/dist/routing.js +3 -2
  1335. package/dist/style.css +88 -1
  1336. package/dist/test-hook/createTestHook.js +23 -20
  1337. package/dist/test-hook/createTestHook.js.map +1 -1
  1338. package/dist/test-hook/install.js +32 -13
  1339. package/dist/test-hook/install.js.map +1 -1
  1340. package/dist/test-hook/useTestHook.js +23 -16
  1341. package/dist/test-hook/useTestHook.js.map +1 -1
  1342. package/dist/test-seams.d.ts +168 -1
  1343. package/dist/test-seams.js +8 -3
  1344. package/dist/tools/builtin/ellipse/useEllipseTool.js +22 -17
  1345. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  1346. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +44 -28
  1347. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  1348. package/dist/tools/builtin/hand/dragPanContribution.js +12 -7
  1349. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -1
  1350. package/dist/tools/builtin/hand/useHandTool.js +21 -13
  1351. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  1352. package/dist/tools/builtin/image/useImageTool.js +28 -19
  1353. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  1354. package/dist/tools/builtin/lasso/useLassoTool.js +48 -36
  1355. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  1356. package/dist/tools/builtin/line/useLineTool.js +24 -17
  1357. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  1358. package/dist/tools/builtin/measure/useMeasureTool.js +84 -0
  1359. package/dist/tools/builtin/measure/useMeasureTool.js.map +1 -0
  1360. package/dist/tools/builtin/pen/penHandle.js +58 -0
  1361. package/dist/tools/builtin/pen/penHandle.js.map +1 -0
  1362. package/dist/tools/builtin/pen/usePenTool.js +461 -303
  1363. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  1364. package/dist/tools/builtin/pencil/usePencilTool.js +20 -15
  1365. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  1366. package/dist/tools/builtin/pickTopMostHit.js +51 -31
  1367. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  1368. package/dist/tools/builtin/polygon/usePolygonTool.js +45 -28
  1369. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  1370. package/dist/tools/builtin/rect/useRectTool.js +24 -16
  1371. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  1372. package/dist/tools/builtin/select/adapterPointQuery.js +47 -30
  1373. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -1
  1374. package/dist/tools/builtin/select/selectionContributions.js +94 -56
  1375. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  1376. package/dist/tools/builtin/select/useSelectTool.js +155 -108
  1377. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  1378. package/dist/tools/builtin/shared/insertToolOptions.js +5 -4
  1379. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -1
  1380. package/dist/tools/builtin/shared/pointerFollower.js +15 -8
  1381. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  1382. package/dist/tools/builtin/slice/useSliceTool.js +148 -101
  1383. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  1384. package/dist/tools/builtin/star/useStarTool.js +48 -31
  1385. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  1386. package/dist/tools/builtin/sticky/stickyNode.js +49 -0
  1387. package/dist/tools/builtin/sticky/stickyNode.js.map +1 -0
  1388. package/dist/tools/builtin/sticky/useStickyTool.js +86 -0
  1389. package/dist/tools/builtin/sticky/useStickyTool.js.map +1 -0
  1390. package/dist/tools/builtin/text/useTextTool.js +59 -34
  1391. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  1392. package/dist/tools/index.js +26 -0
  1393. package/dist/tools/overlayBinding.js +7 -5
  1394. package/dist/tools/overlayBinding.js.map +1 -1
  1395. package/dist/tools/useKeybindings.js +62 -46
  1396. package/dist/tools/useKeybindings.js.map +1 -1
  1397. package/dist/{types-DBbbCy0i.d.ts → types-7puAuVD2.d.ts} +5 -264
  1398. package/dist/types-BN9hbdMI.d.ts +184 -0
  1399. package/dist/types-CniVctmk.d.ts +949 -0
  1400. package/dist/types-oFeQ5VjV.d.ts +264 -0
  1401. package/dist/util/color.js +39 -18
  1402. package/dist/util/color.js.map +1 -1
  1403. package/dist/util/paint.js +93 -38
  1404. package/dist/util/paint.js.map +1 -1
  1405. package/dist/version.js +11 -3
  1406. package/dist/version.js.map +1 -1
  1407. package/package.json +46 -24
  1408. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +0 -126
  1409. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +0 -1
  1410. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +0 -55
  1411. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +0 -1
  1412. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +0 -16
  1413. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +0 -1
  1414. package/dist/canvas/SceneCanvas/isDev.js +0 -12
  1415. package/dist/canvas/SceneCanvas/isDev.js.map +0 -1
  1416. package/dist/canvas/SceneCanvas/useViewLayerGate.js +0 -20
  1417. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +0 -1
  1418. package/dist/cornerHandles-BSKbyuvQ.d.ts +0 -104
  1419. package/dist/icons/ArrowIcon.js +0 -23
  1420. package/dist/icons/ArrowIcon.js.map +0 -1
  1421. package/dist/icons/EllipseIcon.js +0 -21
  1422. package/dist/icons/EllipseIcon.js.map +0 -1
  1423. package/dist/icons/EyedropperIcon.js +0 -49
  1424. package/dist/icons/EyedropperIcon.js.map +0 -1
  1425. package/dist/icons/HandIcon.js +0 -59
  1426. package/dist/icons/HandIcon.js.map +0 -1
  1427. package/dist/icons/ImageIcon.js +0 -34
  1428. package/dist/icons/ImageIcon.js.map +0 -1
  1429. package/dist/icons/LassoIcon.js +0 -22
  1430. package/dist/icons/LassoIcon.js.map +0 -1
  1431. package/dist/icons/LineIcon.js +0 -22
  1432. package/dist/icons/LineIcon.js.map +0 -1
  1433. package/dist/icons/PenIcon.js +0 -36
  1434. package/dist/icons/PenIcon.js.map +0 -1
  1435. package/dist/icons/PencilIcon.js +0 -25
  1436. package/dist/icons/PencilIcon.js.map +0 -1
  1437. package/dist/icons/PolygonIcon.js +0 -19
  1438. package/dist/icons/PolygonIcon.js.map +0 -1
  1439. package/dist/icons/RectIcon.js +0 -37
  1440. package/dist/icons/RectIcon.js.map +0 -1
  1441. package/dist/icons/SelectIcon.js +0 -20
  1442. package/dist/icons/SelectIcon.js.map +0 -1
  1443. package/dist/icons/SliceIcon.js +0 -24
  1444. package/dist/icons/SliceIcon.js.map +0 -1
  1445. package/dist/icons/StarIcon.js +0 -19
  1446. package/dist/icons/StarIcon.js.map +0 -1
  1447. package/dist/icons/TextIcon.js +0 -19
  1448. package/dist/icons/TextIcon.js.map +0 -1
  1449. package/dist/icons/UnknownIcon.js +0 -33
  1450. package/dist/icons/UnknownIcon.js.map +0 -1
  1451. package/dist/icons/_base.js +0 -12
  1452. package/dist/icons/_base.js.map +0 -1
  1453. package/dist/interactions/actions/actionShortcuts.js +0 -32
  1454. package/dist/interactions/actions/actionShortcuts.js.map +0 -1
  1455. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +0 -40
  1456. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +0 -1
  1457. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +0 -10
  1458. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +0 -1
  1459. package/dist/interactions/actions/defaults/icons/alignIcons.js +0 -173
  1460. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +0 -1
  1461. package/dist/interactions/actions/defaults/icons/anchorIcons.js +0 -75
  1462. package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +0 -1
  1463. package/dist/interactions/actions/defaults/icons/booleanIcons.js +0 -194
  1464. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +0 -1
  1465. package/dist/interactions/actions/defaults/icons/distributeIcons.js +0 -63
  1466. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +0 -1
  1467. package/dist/interactions/actions/defaults/icons/editIcons.js +0 -307
  1468. package/dist/interactions/actions/defaults/icons/editIcons.js.map +0 -1
  1469. package/dist/interactions/actions/defaults/icons/outlineIcons.js +0 -91
  1470. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +0 -1
  1471. package/dist/interactions/actions/resize/behaviors/index.js +0 -8
  1472. package/dist/interactions/actions/resize/behaviors/index.js.map +0 -1
  1473. package/dist/interactions/actions/resize/behaviors/lockAspect.js +0 -24
  1474. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +0 -1
  1475. package/dist/interactions/actions/resize/pointSnap.js +0 -111
  1476. package/dist/interactions/actions/resize/pointSnap.js.map +0 -1
  1477. package/dist/interactions/actions/rotate/behaviors/index.js +0 -7
  1478. package/dist/interactions/actions/rotate/behaviors/index.js.map +0 -1
  1479. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +0 -12
  1480. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +0 -1
  1481. package/dist/interactions/gestures/shared/snap.js +0 -24
  1482. package/dist/interactions/gestures/shared/snap.js.map +0 -1
  1483. package/dist/test-seams-D0pyV3pR.d.ts +0 -149
  1484. package/dist/tools/builtin/bone/boneActions.js +0 -130
  1485. package/dist/tools/builtin/bone/boneActions.js.map +0 -1
  1486. package/dist/tools/builtin/bone/boneOverlay.js +0 -58
  1487. package/dist/tools/builtin/bone/boneOverlay.js.map +0 -1
  1488. package/dist/tools/builtin/bone/placedRig.js +0 -24
  1489. package/dist/tools/builtin/bone/placedRig.js.map +0 -1
  1490. package/dist/tools/builtin/bone/rigEditState.js +0 -21
  1491. package/dist/tools/builtin/bone/rigEditState.js.map +0 -1
  1492. package/dist/tools/builtin/bone/useBoneTool.js +0 -98
  1493. package/dist/tools/builtin/bone/useBoneTool.js.map +0 -1
  1494. package/dist/tools/builtin/weight/useWeightTool.js +0 -77
  1495. package/dist/tools/builtin/weight/useWeightTool.js.map +0 -1
  1496. package/dist/tools/builtin/weight/weightActions.js +0 -112
  1497. package/dist/tools/builtin/weight/weightActions.js.map +0 -1
  1498. package/dist/tools/builtin/weight/weightOverlay.js +0 -61
  1499. package/dist/tools/builtin/weight/weightOverlay.js.map +0 -1
  1500. package/dist/util/constrainTo45.js +0 -17
  1501. package/dist/util/constrainTo45.js.map +0 -1
@@ -1,92 +1,113 @@
1
- import { composeWorldPose as e, composesFrames as t, frameAtOrAbove as n } from "../core/scene/composeFrame.js";
2
- import { definesFrame as r, effectivePose as i } from "../core/scene/effectivePose.js";
3
- import { poseDescriptorForNode as a, translatePoseViaDescriptor as o, visualBoundsViaDescriptor as s } from "../core/geometry/poseDescriptor.js";
4
- import { AUTO_POSE_DESCRIPTOR as c } from "../core/geometry/autoPoseDescriptor.js";
5
- import { asNodeId as l } from "../core/scene/types.js";
6
- import { sceneMutators as u } from "../core/scene/sceneMutators.js";
7
- import { applyOpsTo as d } from "../core/applyOps.js";
8
- import { hitTestArea as f, hitTestLassoPolygon as p, regionPickOptions as m } from "./deps/hitTestArea.js";
9
- import { scenePoseTarget as h } from "../animation/poseTarget.js";
10
- import { cascadingSetPose as g, containerCascade as _ } from "./poseCascade.js";
11
- import { pasteSceneSnapshot as v, snapshotSceneSelection as y } from "./sceneClipboard.js";
1
+ import { composeWorldPose, composesFrames, frameAtOrAbove } from "../core/scene/composeFrame.js";
2
+ import { definesFrame, effectivePose } from "../core/scene/effectivePose.js";
3
+ import { poseDescriptorForNode, translatePoseViaDescriptor, visualBoundsViaDescriptor } from "../core/geometry/poseDescriptor.js";
4
+ import { AUTO_POSE_DESCRIPTOR } from "../core/geometry/autoPoseDescriptor.js";
5
+ import { asNodeId } from "../core/scene/types.js";
6
+ import { nodeGates } from "../core/scene/nodeGates.js";
7
+ import { sceneMutators } from "../core/scene/sceneMutators.js";
8
+ import { applyOpsTo } from "../core/applyOps.js";
9
+ import { hitTestArea, hitTestLassoPolygon, regionPickOptions } from "./deps/hitTestArea.js";
10
+ import { scenePoseTarget } from "../animation/poseTarget.js";
11
+ import { cascadingSetPose, containerCascade } from "./poseCascade.js";
12
+ import { pasteSceneSnapshot, snapshotSceneSelection } from "./sceneClipboard.js";
13
+
12
14
  //#region src/canvas/sceneAdapter.ts
13
- function b(b, x = {}) {
14
- let S = () => {
15
- let e = /* @__PURE__ */ new Set();
16
- for (let t of b.layers) t.visible && e.add(t.id);
17
- return e;
18
- }, C = x.selection, w = C?.getSelection ?? C?.get ?? (() => []), T = C?.setSelection ?? C?.set ?? (() => {}), E = x.poseDescriptor ?? c, D = (e, t) => s(e, a(E, t)), O = (e, t, n, r) => o(e, t, n, r === void 0 ? E : a(E, r)), k = b.composition, A = t(k), j = {}, M = (e) => e ? {
19
- ...j,
20
- ...m(e, void 0)
21
- } : j, N = A ? null : { setPose: g(b, E) }, P = {
22
- scene: b,
23
- composes: A,
24
- worldPoseOf: (e) => F.getWorldPose(e),
25
- frameAtOrAbove: (e) => n(F, e),
26
- poseBounds: D,
27
- translate: O
28
- }, F = {
29
- ...u(b),
15
+ /** Derive the adapter for a scene. Reads go straight to the scene; writes are
16
+ * ops applied through its history, so anything done through the adapter is
17
+ * undoable.
18
+ *
19
+ * Moving a container carries its contents either way the scene composes
20
+ * poses. Under a frame (`scene.composition`) the one pose written moves them.
21
+ * Under the absolute-pose model `setPose` on a container translates every
22
+ * descendant by the same delta, and a batch that poses descendants too undoes
23
+ * exactly only when it goes through this adapter's `applyOps`. */
24
+ function sceneToAdapter(scene, options = {}) {
25
+ const sel = options.selection;
26
+ const getSelection = sel?.getSelection ?? sel?.get ?? (() => []);
27
+ const setSelection = sel?.setSelection ?? sel?.set ?? (() => {});
28
+ const d = options.poseDescriptor ?? AUTO_POSE_DESCRIPTOR;
29
+ const poseBounds = (p, node) => visualBoundsViaDescriptor(p, poseDescriptorForNode(d, node));
30
+ const translate = (p, dx, dy, node) => translatePoseViaDescriptor(p, dx, dy, node === void 0 ? d : poseDescriptorForNode(d, node));
31
+ const composition = scene.composition;
32
+ const composes = composesFrames(composition);
33
+ const pickOpts = {};
34
+ const pickOptsFor = (view) => view ? {
35
+ ...pickOpts,
36
+ ...regionPickOptions(view, void 0)
37
+ } : pickOpts;
38
+ const cascade = composes ? null : { setPose: cascadingSetPose(scene, d) };
39
+ const clipboardEnv = {
40
+ scene,
41
+ composes,
42
+ worldPoseOf: (id) => adapter.getWorldPose(id),
43
+ frameAtOrAbove: (id) => frameAtOrAbove(adapter, id),
44
+ poseBounds,
45
+ translate
46
+ };
47
+ const adapter = {
48
+ ...sceneMutators(scene),
30
49
  getNodes() {
31
- let e = S(), t = [];
32
- for (let n of b.renderOrderNodes()) e.has(n.layer) && t.push(n);
33
- return t;
50
+ const gates = nodeGates(scene);
51
+ return scene.renderOrderNodes().filter((n) => !gates.hidden(n.id));
34
52
  },
35
- getPose(e) {
36
- let t = l(e), n = b.get(t);
37
- if (!n) throw Error(`sceneToAdapter: unknown node "${e}"`);
38
- return i(b, n);
53
+ getPose(id) {
54
+ const nid = asNodeId(id);
55
+ const n = scene.get(nid);
56
+ if (!n) throw new Error(`sceneToAdapter: unknown node "${id}"`);
57
+ return effectivePose(scene, n);
39
58
  },
40
- definesFrame(e) {
41
- let t = b.get(l(e));
42
- return t === void 0 || r(t);
59
+ definesFrame(id) {
60
+ const n = scene.get(asNodeId(id));
61
+ return n === void 0 || definesFrame(n);
43
62
  },
44
- getWorldPose(t) {
45
- return A ? e(F, t, k.compose) : F.getPose(t);
63
+ getWorldPose(id) {
64
+ if (!composes) return adapter.getPose(id);
65
+ return composeWorldPose(adapter, id, composition.compose);
46
66
  },
47
- ...A ? { composePose: k.compose } : {},
48
- ...N ? { setPose: (e, t) => N.setPose(l(e), t) } : {},
49
- poseTarget(e, t) {
50
- if (N === null || b.get(l(e))?.kind !== "container") return h(b, e, t ?? E);
51
- let n = _(b, l(e), E, (t) => F.setPose(e, t));
52
- return h(b, e, t ?? E, n);
67
+ ...composes ? { composePose: composition.compose } : {},
68
+ ...cascade ? { setPose: (id, pose) => cascade.setPose(asNodeId(id), pose) } : {},
69
+ poseTarget(id, descriptor) {
70
+ if (cascade === null || scene.get(asNodeId(id))?.kind !== "container") return scenePoseTarget(scene, id, descriptor ?? d);
71
+ const carried = containerCascade(scene, asNodeId(id), d, (pose) => adapter.setPose(id, pose));
72
+ return scenePoseTarget(scene, id, descriptor ?? d, carried);
53
73
  },
54
- getLayers: () => b.layers.map((e) => ({
55
- id: e.id,
56
- visible: e.visible,
57
- parallax: e.parallax
74
+ getLayers: () => scene.layers.map((l) => ({
75
+ id: l.id,
76
+ visible: l.visible,
77
+ parallax: l.parallax
58
78
  })),
59
- subscribeLayers: (e) => b.subscribe(e),
60
- getLayout: (e) => b.layoutOf(l(e)),
61
- applyOps(e, t) {
62
- t === void 0 ? d(this, e) : b.applyBatch(e, t, this);
79
+ subscribeLayers: (listener) => scene.subscribe(listener),
80
+ getLayout: (id) => scene.layoutOf(asNodeId(id)),
81
+ applyOps(ops, label) {
82
+ if (label !== void 0) scene.applyBatch(ops, label, this);
83
+ else applyOpsTo(this, ops);
63
84
  },
64
- getSelection: w,
65
- setSelection: T,
66
- hitTestArea(e, t) {
67
- return f(b, e, M(t), E, { includeContainers: !0 });
85
+ getSelection,
86
+ setSelection,
87
+ hitTestArea(rect, view) {
88
+ return hitTestArea(scene, rect, pickOptsFor(view), d, { includeContainers: true });
68
89
  },
69
- hitTestLasso(e, t, n) {
70
- return p(b, e, t, M(n), E, { includeContainers: !0 });
90
+ hitTestLasso(polygon, mode, view) {
91
+ return hitTestLassoPolygon(scene, polygon, mode, pickOptsFor(view), d, { includeContainers: true });
71
92
  },
72
- ...x.commitInsert ? { commitInsert: (e) => {
73
- let t = x.commitInsert(e);
74
- if (!t) return null;
75
- let n = x.insertLayer ?? "default";
93
+ ...options.commitInsert ? { commitInsert: (bounds) => {
94
+ const created = options.commitInsert(bounds);
95
+ if (!created) return null;
96
+ const layer = options.insertLayer ?? "default";
76
97
  return {
77
98
  kind: "leaf",
78
- id: t.id === void 0 ? b.mintId() : l(t.id),
79
- layer: n,
80
- pose: t.pose,
81
- data: t.data,
99
+ id: created.id === void 0 ? scene.mintId() : asNodeId(created.id),
100
+ layer,
101
+ pose: created.pose,
102
+ data: created.data,
82
103
  parent: null
83
104
  };
84
105
  } } : {},
85
- snapshotSelection(e) {
86
- return y(P, e);
106
+ snapshotSelection(ids) {
107
+ return snapshotSceneSelection(clipboardEnv, ids);
87
108
  },
88
- commitPaste(e, t, n) {
89
- return v(P, e, t, n);
109
+ commitPaste(clipboard, offset, ctx) {
110
+ return pasteSceneSnapshot(clipboardEnv, clipboard, offset, ctx);
90
111
  },
91
112
  getPasteOffset() {
92
113
  return {
@@ -95,9 +116,9 @@ function b(b, x = {}) {
95
116
  };
96
117
  }
97
118
  };
98
- return F;
119
+ return adapter;
99
120
  }
100
- //#endregion
101
- export { b as sceneToAdapter };
102
121
 
122
+ //#endregion
123
+ export { sceneToAdapter };
103
124
  //# sourceMappingURL=sceneAdapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sceneAdapter.js","names":["sceneToAdapter","visibleLayers","out","layer","scene","sel","options","getSelection","setSelection","d","AUTO_POSE_DESCRIPTOR","poseBounds","visualBoundsViaDescriptor","p","poseDescriptorForNode","node","translate","translatePoseViaDescriptor","dx","dy","composition","composes","composesFrames","pickOpts","pickOptsFor","view","regionPickOptions","cascade","cascadingSetPose","clipboardEnv","adapter","id","frameAtOrAbove","sceneMutators","visible","nid","asNodeId","effectivePose","n","definesFrame","composeWorldPose","pose","scenePoseTarget","descriptor","carried","containerCascade","l","listener","label","applyOpsTo","ops","hitTestArea","rect","hitTestLassoPolygon","polygon","mode","created","bounds","snapshotSceneSelection","ids","pasteSceneSnapshot","clipboard","offset","ctx"],"sources":["../../src/canvas/sceneAdapter.ts"],"sourcesContent":["/**\n * Synthesize a `<Canvas>`-compatible adapter from a `Scene` primitive.\n * `getPose` / `setPose` return / write **local** coordinates (relative to\n * parent); world composition is the renderer's job via `composeWorldPose`.\n */\nimport type {\n AreaSelectAdapter,\n ClipboardSnapshot,\n InsertAdapter,\n PasteCtx,\n LassoHitMode,\n LassoSelectAdapter,\n RegionPickView,\n LayerEnumerableAdapter,\n MoveAdapter,\n ResizeAdapter,\n RotateAdapter,\n} from 'core/adapters/types';\nimport type { LayoutStrategy } from '../layout/types';\nimport type { Op } from 'core/ops/types';\nimport type { Node, Scene } from 'core/scene/types';\nimport { definesFrame, effectivePose } from 'core/scene/effectivePose';\nimport { sceneMutators } from 'core/scene/sceneMutators';\nimport { asNodeId } from 'core/scene/types';\nimport { applyOpsTo } from 'core/applyOps';\nimport { hitTestArea, hitTestLassoPolygon, regionPickOptions } from 'canvas/deps/hitTestArea';\nimport type { ScenePickSourceOptions } from 'canvas/pickWalk';\nimport {\n poseDescriptorForNode,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n type PoseDescriptor,\n} from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport { composesFrames, composeWorldPose, frameAtOrAbove } from 'core/scene/composePose';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\nimport { scenePoseTarget } from '../animation/poseTarget';\nimport { cascadingSetPose, containerCascade } from './poseCascade';\nimport { pasteSceneSnapshot, snapshotSceneSelection, type SceneClipboardEnv } from './sceneClipboard';\n\n/** Minimal selection contract `sceneToAdapter` needs to wire `getSelection` /\n * `setSelection`. Matches `useSelection().adapterMethods` plus an imperative\n * read; pass `useSelection()` itself or `selection.adapterMethods`. */\nexport interface SceneAdapterSelection {\n get?(): string[];\n set?(ids: string[]): void;\n getSelection?(): string[];\n setSelection?(ids: string[]): void;\n}\n\n/** Sibling z-order surface used by reorder ops. Inlined here (rather than\n * pulled from `core/ops/reorder` to avoid import cycles); the `null` parent\n * channel addresses the root sibling list. */\n/** @internal */\ninterface ReorderAdapter {\n getChildren(parentId: string | null): string[];\n setChildOrder(parentId: string | null, ids: string[]): void;\n}\n\n/** Everything the interaction layer can ask of a scene, as one type: the\n * move, resize, rotate, selection, layer and reorder contracts combined.\n * `<SceneCanvas>` synthesizes one of these, which is why most consumers never\n * touch an adapter directly. */\nexport type SceneCanvasAdapter<TData, TLayer extends string, TPose> =\n & MoveAdapter<Node<TData, TLayer, TPose>, TPose>\n & ResizeAdapter<Node<TData, TLayer, TPose>, TPose>\n & RotateAdapter<Node<TData, TLayer, TPose>, TPose>\n & AreaSelectAdapter\n & LassoSelectAdapter\n & LayerEnumerableAdapter<TLayer>\n & ReorderAdapter\n & Partial<InsertAdapter<Node<TData, TLayer, TPose>>>\n // Optional on the underlying adapter contracts, but unconditionally\n // provided by a scene-backed adapter.\n & {\n getParent(id: string): string | null;\n getLayers: NonNullable<LayerEnumerableAdapter<TLayer>['getLayers']>;\n /** The node's pose with every ancestor's frame folded in. Equal to\n * `getPose` unless the scene composes poses. */\n getWorldPose(id: string): TPose;\n /** Whether `id`'s pose is a frame its children are expressed in — see\n * `definesFrame`. */\n definesFrame(id: string): boolean;\n /** Present only when a composing strategy is configured; the render\n * walk feature-detects it. */\n composePose?(parent: TPose, child: TPose): TPose;\n getSelection(): string[];\n setSelection(ids: string[]): void;\n insertNode(node: Node<TData, TLayer, TPose>, index?: number): void;\n removeNode(id: string): void;\n /** Replace a node's `data` — what a `setData` op writes through. */\n setData(id: string, data: TData): void;\n /** Swap a container's layout — what a `setLayout` op writes through. */\n setLayout(id: string, layout: LayoutStrategy<TPose> | string | null): void;\n /** Move a node to another layer — what a `setLayer` op writes through. */\n setLayer(id: string, layer: TLayer): void;\n getRemovalClosure(ids: readonly string[]): string[];\n applyOps(ops: Op[], label?: string): void;\n snapshotSelection(ids: string[]): ClipboardSnapshot;\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n ): Node<TData, TLayer, TPose>[];\n getPasteOffset(clipboard: ClipboardSnapshot): { dx: number; dy: number };\n };\n\n/** Optional extras for the synthesized adapter. Pass `commitInsert` to wire\n * the insert gesture into a Scene-owned canvas; the returned object becomes\n * a leaf on the layer named by `layer` (default `'default'`). */\nexport interface SceneToAdapterOptions<TData, TLayer extends string, TPose> {\n /** Factory for new objects. Returning `null` aborts the insert. */\n commitInsert?: (bounds: Bounds) => {\n pose: TPose;\n data: TData;\n id?: string;\n } | null;\n /** Layer to place inserted nodes on. Defaults to the trivial-form layer. */\n insertLayer?: TLayer;\n /** Selection source: the result of `useSelection()` (or its\n * `adapterMethods`). When omitted, `getSelection` returns `[]` and\n * `setSelection` is a noop, so the marquee gesture updates nothing. */\n selection?: SceneAdapterSelection;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\n/** Derive the adapter for a scene. Reads go straight to the scene; writes are\n * ops applied through its history, so anything done through the adapter is\n * undoable.\n *\n * Moving a container carries its contents either way the scene composes\n * poses. Under a frame (`scene.composition`) the one pose written moves them.\n * Under the absolute-pose model `setPose` on a container translates every\n * descendant by the same delta, and a batch that poses descendants too undoes\n * exactly only when it goes through this adapter's `applyOps`. */\nexport function sceneToAdapter<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n options: SceneToAdapterOptions<TData, TLayer, TPose> = {},\n): SceneCanvasAdapter<TData, TLayer, TPose> {\n const visibleLayers = (): Set<TLayer> => {\n const out = new Set<TLayer>();\n for (const layer of scene.layers) {\n if (layer.visible) out.add(layer.id);\n }\n return out;\n };\n\n const sel = options.selection;\n const getSelection = sel?.getSelection ?? sel?.get ?? (() => [] as string[]);\n const setSelection = sel?.setSelection ?? sel?.set ?? (() => {});\n const d = (options.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const poseBounds = (p: TPose, node: unknown): Bounds =>\n visualBoundsViaDescriptor(p, poseDescriptorForNode(d, node));\n const translate = (p: TPose, dx: number, dy: number, node?: unknown): TPose =>\n translatePoseViaDescriptor(\n p, dx, dy, node === undefined ? d : poseDescriptorForNode(d, node),\n );\n\n const composition = scene.composition;\n const composes = composesFrames(composition);\n const pickOpts: ScenePickSourceOptions<unknown> = {};\n // The asking view's layer gate and camera, over the adapter's own options.\n const pickOptsFor = (view: RegionPickView | undefined): ScenePickSourceOptions<unknown> =>\n (view ? { ...pickOpts, ...regionPickOptions(view, undefined) } : pickOpts);\n\n const cascade = composes ? null : { setPose: cascadingSetPose(scene, d) };\n\n const clipboardEnv: SceneClipboardEnv<TData, TLayer, TPose> = {\n scene,\n composes,\n worldPoseOf: (id) => adapter.getWorldPose(id),\n frameAtOrAbove: (id) => frameAtOrAbove(adapter, id),\n poseBounds,\n translate,\n };\n\n const adapter: SceneCanvasAdapter<TData, TLayer, TPose> = {\n ...sceneMutators(scene),\n // What is shown, where the mutators' other users read the document:\n // visible layers only, and the effective pose.\n getNodes() {\n const visible = visibleLayers();\n const out: Node<TData, TLayer, TPose>[] = [];\n for (const n of scene.renderOrderNodes()) {\n if (visible.has(n.layer)) out.push(n);\n }\n return out;\n },\n getPose(id) {\n const nid = asNodeId(id);\n const n = scene.get(nid);\n if (!n) throw new Error(`sceneToAdapter: unknown node \"${id}\"`);\n return effectivePose(scene, n);\n },\n definesFrame(id) {\n const n = scene.get(asNodeId(id));\n return n === undefined || definesFrame(n);\n },\n getWorldPose(id) {\n if (!composes) return adapter.getPose(id);\n return composeWorldPose(adapter, id, composition.compose);\n },\n // Only present when it would do something: the render walk skips the fold\n // entirely when this is absent, which is the absolute-pose path.\n ...(composes ? { composePose: composition.compose } : {}),\n ...(cascade ? { setPose: (id: string, pose: TPose) => cascade.setPose(asNodeId(id), pose) } : {}),\n poseTarget(id, descriptor) {\n if (cascade === null || scene.get(asNodeId(id))?.kind !== 'container') {\n return scenePoseTarget(scene, id, descriptor ?? d);\n }\n // Its descendants hold poses of their own: a commit moves them, and they are shown beside it.\n const carried = containerCascade(scene, asNodeId(id), d, (pose) => adapter.setPose(id, pose));\n return scenePoseTarget(scene, id, descriptor ?? d, carried);\n },\n getLayers: () => scene.layers.map((l) => ({ id: l.id, visible: l.visible, parallax: l.parallax })),\n subscribeLayers: (listener) => scene.subscribe(listener),\n getLayout: (id) => scene.layoutOf(asNodeId(id)),\n // With a label the ops are one batch checkpoint; without one they are\n // applied transiently, with no checkpoint (the AreaSelectAdapter contract).\n applyOps(ops: Op[], label?: string) {\n if (label !== undefined) {\n scene.applyBatch(ops, label, this);\n } else {\n applyOpsTo(this, ops);\n }\n },\n getSelection,\n setSelection,\n // The live marquee's and lasso's own hit-tests. Containers come back:\n // this adapter's consumer has nothing to fold children into them.\n hitTestArea(rect: Bounds, view?: RegionPickView) {\n return hitTestArea(\n scene,\n rect,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n hitTestLasso(polygon, mode: LassoHitMode, view?: RegionPickView) {\n return hitTestLassoPolygon(\n scene,\n polygon,\n mode,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n // A pure factory: it constructs a Node spec but does NOT touch the scene.\n // The `InsertOp` → `adapter.insertNode` → `scene.add` path is the sole\n // insertion path. Calling `scene.add` here too would double-insert, and\n // the second add throws on id collision.\n ...(options.commitInsert\n ? {\n commitInsert: (bounds: { x: number; y: number; width: number; height: number }) => {\n const created = options.commitInsert!(bounds);\n if (!created) return null;\n const layer = (options.insertLayer ?? ('default' as TLayer));\n const id = created.id === undefined ? scene.mintId() : asNodeId(created.id);\n return {\n kind: 'leaf',\n id,\n layer,\n pose: created.pose,\n data: created.data,\n parent: null,\n } as Node<TData, TLayer, TPose>;\n },\n }\n : {}),\n // Clipboard seam (`useClipboardOps` / the paste ingestion path).\n snapshotSelection(ids: string[]): ClipboardSnapshot {\n return snapshotSceneSelection(clipboardEnv, ids);\n },\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n ): Node<TData, TLayer, TPose>[] {\n return pasteSceneSnapshot(clipboardEnv, clipboard, offset, ctx);\n },\n // Constant cascade: the hook re-snapshots the just-created items, so\n // repeated pastes stack +12/+12 each time.\n getPasteOffset(): { dx: number; dy: number } {\n return { dx: 12, dy: 12 };\n },\n };\n\n return adapter;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sceneAdapter.js","names":[],"sources":["../../src/canvas/sceneAdapter.ts"],"sourcesContent":["/**\n * Synthesize a `<Canvas>`-compatible adapter from a `Scene` primitive.\n * `getPose` / `setPose` return / write **local** coordinates (relative to\n * parent); world composition is the renderer's job via `composeWorldPose`.\n */\nimport type {\n AreaSelectAdapter,\n ClipboardSnapshot,\n InsertAdapter,\n PasteCtx,\n LassoHitMode,\n LassoSelectAdapter,\n RegionPickView,\n LayerEnumerableAdapter,\n MoveAdapter,\n ResizeAdapter,\n RotateAdapter,\n} from 'core/adapters/types';\nimport type { LayoutStrategy } from '../layout/types';\nimport type { Op } from 'core/ops/types';\nimport type { Node, Scene } from 'core/scene/types';\nimport { definesFrame, effectivePose } from 'core/scene/effectivePose';\nimport { sceneMutators } from 'core/scene/sceneMutators';\nimport { asNodeId } from 'core/scene/types';\nimport { nodeGates } from 'core/scene/nodeGates';\nimport { applyOpsTo } from 'core/applyOps';\nimport { hitTestArea, hitTestLassoPolygon, regionPickOptions } from 'canvas/deps/hitTestArea';\nimport type { ScenePickSourceOptions } from 'canvas/pickWalk';\nimport {\n poseDescriptorForNode,\n translatePoseViaDescriptor,\n visualBoundsViaDescriptor,\n type PoseDescriptor,\n} from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport { composesFrames, composeWorldPose, frameAtOrAbove } from 'core/scene/composePose';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\nimport { scenePoseTarget } from '../animation/poseTarget';\nimport { cascadingSetPose, containerCascade } from './poseCascade';\nimport { pasteSceneSnapshot, snapshotSceneSelection, type SceneClipboardEnv } from './sceneClipboard';\n\n/** Minimal selection contract `sceneToAdapter` needs to wire `getSelection` /\n * `setSelection`. Matches `useSelection().adapterMethods` plus an imperative\n * read; pass `useSelection()` itself or `selection.adapterMethods`. */\nexport interface SceneAdapterSelection {\n get?(): string[];\n set?(ids: string[]): void;\n getSelection?(): string[];\n setSelection?(ids: string[]): void;\n}\n\n/** Sibling z-order surface used by reorder ops. Inlined here (rather than\n * pulled from `core/ops/reorder` to avoid import cycles); the `null` parent\n * channel addresses the root sibling list. */\n/** @internal */\ninterface ReorderAdapter {\n getChildren(parentId: string | null): string[];\n setChildOrder(parentId: string | null, ids: string[]): void;\n}\n\n/** Everything the interaction layer can ask of a scene, as one type: the\n * move, resize, rotate, selection, layer and reorder contracts combined.\n * `<SceneCanvas>` synthesizes one of these, which is why most consumers never\n * touch an adapter directly. */\nexport type SceneCanvasAdapter<TData, TLayer extends string, TPose> =\n & MoveAdapter<Node<TData, TLayer, TPose>, TPose>\n & ResizeAdapter<Node<TData, TLayer, TPose>, TPose>\n & RotateAdapter<Node<TData, TLayer, TPose>, TPose>\n & AreaSelectAdapter\n & LassoSelectAdapter\n & LayerEnumerableAdapter<TLayer>\n & ReorderAdapter\n & Partial<InsertAdapter<Node<TData, TLayer, TPose>>>\n // Optional on the underlying adapter contracts, but unconditionally\n // provided by a scene-backed adapter.\n & {\n getParent(id: string): string | null;\n getLayers: NonNullable<LayerEnumerableAdapter<TLayer>['getLayers']>;\n /** The node's pose with every ancestor's frame folded in. Equal to\n * `getPose` unless the scene composes poses. */\n getWorldPose(id: string): TPose;\n /** Whether `id`'s pose is a frame its children are expressed in — see\n * `definesFrame`. */\n definesFrame(id: string): boolean;\n /** Present only when a composing strategy is configured; the render\n * walk feature-detects it. */\n composePose?(parent: TPose, child: TPose): TPose;\n getSelection(): string[];\n setSelection(ids: string[]): void;\n insertNode(node: Node<TData, TLayer, TPose>, index?: number): void;\n removeNode(id: string): void;\n /** Replace a node's `data` — what a `setData` op writes through. */\n setData(id: string, data: TData): void;\n /** Swap a container's layout — what a `setLayout` op writes through. */\n setLayout(id: string, layout: LayoutStrategy<TPose> | string | null): void;\n /** Move a node to another layer — what a `setLayer` op writes through. */\n setLayer(id: string, layer: TLayer): void;\n /** Retarget a derived node's sources — what a `setDependsOn` op writes through. */\n setDependsOn(id: string, dependsOn: readonly string[] | 'children' | undefined): void;\n /** Hide or show a node — what a `setHidden` op writes through. */\n setHidden(id: string, hidden: boolean): void;\n /** Lock or unlock a node — what a `setLocked` op writes through. */\n setLocked(id: string, locked: boolean): void;\n getRemovalClosure(ids: readonly string[]): string[];\n applyOps(ops: Op[], label?: string): void;\n snapshotSelection(ids: string[]): ClipboardSnapshot;\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n ): Node<TData, TLayer, TPose>[];\n getPasteOffset(clipboard: ClipboardSnapshot): { dx: number; dy: number };\n };\n\n/** Optional extras for the synthesized adapter. Pass `commitInsert` to wire\n * the insert gesture into a Scene-owned canvas; the returned object becomes\n * a leaf on the layer named by `layer` (default `'default'`). */\nexport interface SceneToAdapterOptions<TData, TLayer extends string, TPose> {\n /** Factory for new objects. Returning `null` aborts the insert. */\n commitInsert?: (bounds: Bounds) => {\n pose: TPose;\n data: TData;\n id?: string;\n } | null;\n /** Layer to place inserted nodes on. Defaults to the trivial-form layer. */\n insertLayer?: TLayer;\n /** Selection source: the result of `useSelection()` (or its\n * `adapterMethods`). When omitted, `getSelection` returns `[]` and\n * `setSelection` is a noop, so the marquee gesture updates nothing. */\n selection?: SceneAdapterSelection;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n}\n\n/** Derive the adapter for a scene. Reads go straight to the scene; writes are\n * ops applied through its history, so anything done through the adapter is\n * undoable.\n *\n * Moving a container carries its contents either way the scene composes\n * poses. Under a frame (`scene.composition`) the one pose written moves them.\n * Under the absolute-pose model `setPose` on a container translates every\n * descendant by the same delta, and a batch that poses descendants too undoes\n * exactly only when it goes through this adapter's `applyOps`. */\nexport function sceneToAdapter<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n options: SceneToAdapterOptions<TData, TLayer, TPose> = {},\n): SceneCanvasAdapter<TData, TLayer, TPose> {\n const sel = options.selection;\n const getSelection = sel?.getSelection ?? sel?.get ?? (() => [] as string[]);\n const setSelection = sel?.setSelection ?? sel?.set ?? (() => {});\n const d = (options.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const poseBounds = (p: TPose, node: unknown): Bounds =>\n visualBoundsViaDescriptor(p, poseDescriptorForNode(d, node));\n const translate = (p: TPose, dx: number, dy: number, node?: unknown): TPose =>\n translatePoseViaDescriptor(\n p, dx, dy, node === undefined ? d : poseDescriptorForNode(d, node),\n );\n\n const composition = scene.composition;\n const composes = composesFrames(composition);\n const pickOpts: ScenePickSourceOptions<unknown> = {};\n // The asking view's layer gate and camera, over the adapter's own options.\n const pickOptsFor = (view: RegionPickView | undefined): ScenePickSourceOptions<unknown> =>\n (view ? { ...pickOpts, ...regionPickOptions(view, undefined) } : pickOpts);\n\n const cascade = composes ? null : { setPose: cascadingSetPose(scene, d) };\n\n const clipboardEnv: SceneClipboardEnv<TData, TLayer, TPose> = {\n scene,\n composes,\n worldPoseOf: (id) => adapter.getWorldPose(id),\n frameAtOrAbove: (id) => frameAtOrAbove(adapter, id),\n poseBounds,\n translate,\n };\n\n const adapter: SceneCanvasAdapter<TData, TLayer, TPose> = {\n ...sceneMutators(scene),\n // What is shown, where the mutators' other users read the document:\n // the nodes not hidden, and the effective pose.\n getNodes() {\n const gates = nodeGates(scene);\n return scene.renderOrderNodes().filter((n) => !gates.hidden(n.id));\n },\n getPose(id) {\n const nid = asNodeId(id);\n const n = scene.get(nid);\n if (!n) throw new Error(`sceneToAdapter: unknown node \"${id}\"`);\n return effectivePose(scene, n);\n },\n definesFrame(id) {\n const n = scene.get(asNodeId(id));\n return n === undefined || definesFrame(n);\n },\n getWorldPose(id) {\n if (!composes) return adapter.getPose(id);\n return composeWorldPose(adapter, id, composition.compose);\n },\n // Only present when it would do something: the render walk skips the fold\n // entirely when this is absent, which is the absolute-pose path.\n ...(composes ? { composePose: composition.compose } : {}),\n ...(cascade ? { setPose: (id: string, pose: TPose) => cascade.setPose(asNodeId(id), pose) } : {}),\n poseTarget(id, descriptor) {\n if (cascade === null || scene.get(asNodeId(id))?.kind !== 'container') {\n return scenePoseTarget(scene, id, descriptor ?? d);\n }\n // Its descendants hold poses of their own: a commit moves them, and they are shown beside it.\n const carried = containerCascade(scene, asNodeId(id), d, (pose) => adapter.setPose(id, pose));\n return scenePoseTarget(scene, id, descriptor ?? d, carried);\n },\n getLayers: () => scene.layers.map((l) => ({ id: l.id, visible: l.visible, parallax: l.parallax })),\n subscribeLayers: (listener) => scene.subscribe(listener),\n getLayout: (id) => scene.layoutOf(asNodeId(id)),\n // With a label the ops are one batch checkpoint; without one they are\n // applied transiently, with no checkpoint (the AreaSelectAdapter contract).\n applyOps(ops: Op[], label?: string) {\n if (label !== undefined) {\n scene.applyBatch(ops, label, this);\n } else {\n applyOpsTo(this, ops);\n }\n },\n getSelection,\n setSelection,\n // The live marquee's and lasso's own hit-tests. Containers come back:\n // this adapter's consumer has nothing to fold children into them.\n hitTestArea(rect: Bounds, view?: RegionPickView) {\n return hitTestArea(\n scene,\n rect,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n hitTestLasso(polygon, mode: LassoHitMode, view?: RegionPickView) {\n return hitTestLassoPolygon(\n scene,\n polygon,\n mode,\n pickOptsFor(view),\n d as PoseDescriptor<unknown>,\n { includeContainers: true },\n );\n },\n // A pure factory: it constructs a Node spec but does NOT touch the scene.\n // The `InsertOp` → `adapter.insertNode` → `scene.add` path is the sole\n // insertion path. Calling `scene.add` here too would double-insert, and\n // the second add throws on id collision.\n ...(options.commitInsert\n ? {\n commitInsert: (bounds: { x: number; y: number; width: number; height: number }) => {\n const created = options.commitInsert!(bounds);\n if (!created) return null;\n const layer = (options.insertLayer ?? ('default' as TLayer));\n const id = created.id === undefined ? scene.mintId() : asNodeId(created.id);\n return {\n kind: 'leaf',\n id,\n layer,\n pose: created.pose,\n data: created.data,\n parent: null,\n } as Node<TData, TLayer, TPose>;\n },\n }\n : {}),\n // Clipboard seam (`useClipboardOps` / the paste ingestion path).\n snapshotSelection(ids: string[]): ClipboardSnapshot {\n return snapshotSceneSelection(clipboardEnv, ids);\n },\n commitPaste(\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n ): Node<TData, TLayer, TPose>[] {\n return pasteSceneSnapshot(clipboardEnv, clipboard, offset, ctx);\n },\n // Constant cascade: the hook re-snapshots the just-created items, so\n // repeated pastes stack +12/+12 each time.\n getPasteOffset(): { dx: number; dy: number } {\n return { dx: 12, dy: 12 };\n },\n };\n\n return adapter;\n}\n"],"mappings":"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"}
@@ -1,112 +1,161 @@
1
- import { definesFrame as e } from "../core/scene/effectivePose.js";
2
- import { asNodeId as t } from "../core/scene/types.js";
3
- import { NODE_FN_FIELDS as n, createNodeFnFields as r, fnFieldsOfNode as i, fnKeysOf as a } from "../core/scene/nodeFnFields.js";
4
- import { statedFields as o } from "../core/scene/statedFields.js";
1
+ import { definesFrame } from "../core/scene/effectivePose.js";
2
+ import { asNodeId } from "../core/scene/types.js";
3
+ import { NODE_FN_FIELDS, createNodeFnFields, fnFieldsOfNode, fnKeysOf } from "../core/scene/nodeFnFields.js";
4
+ import { statedFields } from "../core/scene/statedFields.js";
5
+
5
6
  //#region src/canvas/sceneClipboard.ts
6
- function s(e) {
7
- return Array.isArray(e) ? [...e] : typeof e == "object" && e ? { ...e } : e;
7
+ function copyField(value) {
8
+ if (Array.isArray(value)) return [...value];
9
+ if (value !== null && typeof value === "object") return { ...value };
10
+ return value;
8
11
  }
9
- var c = (e) => Array.isArray(e.dependsOn) ? e.dependsOn : [];
10
- function l(e, n) {
11
- let { scene: c } = e, l = r(c.registry), u = new Set(n), d = /* @__PURE__ */ new Set(), f = [], p = (t, n) => {
12
- if (!e.composes) return t.pose;
13
- if (n) return e.worldPoseOf(t.id);
14
- let r = e.frameAtOrAbove(t.parent);
15
- return r !== null && d.has(r) ? t.pose : e.worldPoseOf(t.id);
16
- }, m = (e, n = !1) => {
17
- if (d.has(e)) return;
18
- let r = c.get(t(e));
19
- if (r && (d.add(e), f.push({
20
- kind: r.kind,
21
- id: r.id,
22
- layer: r.layer,
23
- parent: r.parent,
24
- pose: s(p(r, n)),
25
- data: s(r.data),
26
- ...r.kind === "container" ? { children: [...r.children] } : {},
27
- ...o(r),
28
- ...r.dependsOn === void 0 ? {} : { dependsOn: s(r.dependsOn) },
29
- ...i(r),
30
- ...a(l, r, "jsonKey")
31
- }), r.kind === "container")) for (let n of c.childrenOf(t(e))) m(n);
12
+ var dependencyList = (item) => Array.isArray(item.dependsOn) ? item.dependsOn : [];
13
+ function snapshotSceneSelection(env, ids) {
14
+ const { scene } = env;
15
+ const fnFields = createNodeFnFields(scene.registry);
16
+ const idSet = new Set(ids);
17
+ const taken = /* @__PURE__ */ new Set();
18
+ const items = [];
19
+ const poseFor = (n, isRoot) => {
20
+ if (!env.composes) return n.pose;
21
+ if (isRoot) return env.worldPoseOf(n.id);
22
+ const frame = env.frameAtOrAbove(n.parent);
23
+ return frame !== null && taken.has(frame) ? n.pose : env.worldPoseOf(n.id);
24
+ };
25
+ const capture = (id, isRoot = false) => {
26
+ if (taken.has(id)) return;
27
+ const n = scene.get(asNodeId(id));
28
+ if (!n) return;
29
+ taken.add(id);
30
+ items.push({
31
+ kind: n.kind,
32
+ id: n.id,
33
+ layer: n.layer,
34
+ parent: n.parent,
35
+ pose: copyField(poseFor(n, isRoot)),
36
+ data: copyField(n.data),
37
+ ...n.kind === "container" ? { children: [...n.children] } : {},
38
+ ...statedFields(n),
39
+ ...n.dependsOn !== void 0 ? { dependsOn: copyField(n.dependsOn) } : {},
40
+ ...fnFieldsOfNode(n),
41
+ ...fnKeysOf(fnFields, n, "jsonKey")
42
+ });
43
+ if (n.kind === "container") for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);
32
44
  };
33
- for (let e of n) c.ancestorsOf(t(e)).some((e) => u.has(e)) || m(e, !0);
34
- return { items: f };
45
+ for (const id of ids) {
46
+ if (scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a))) continue;
47
+ capture(id, true);
48
+ }
49
+ return { items };
35
50
  }
36
- var u = (e) => typeof e == "function" || typeof e == "object" && !!e && Object.values(e).some((e) => typeof e == "function");
37
- function d(e, t) {
38
- let r = {}, i = e.registry;
39
- for (let e of n) {
40
- if (e.containersOnly && t.kind !== "container") continue;
41
- let n = t[e.jsonKey], a = (typeof n == "string" ? i[e.field]?.[n] : void 0) ?? (u(t[e.field]) ? t[e.field] : void 0);
42
- a !== void 0 && (r[e.field] = a);
51
+ var isLive = (value) => typeof value === "function" || typeof value === "object" && value !== null && Object.values(value).some((member) => typeof member === "function");
52
+ /**
53
+ * The item's function fields: for each, what its registry key names in this
54
+ * scene, else the live one it carries, else nothing.
55
+ */
56
+ function restoredFnFields(scene, item) {
57
+ const out = {};
58
+ const registry = scene.registry;
59
+ for (const spec of NODE_FN_FIELDS) {
60
+ if (spec.containersOnly && item.kind !== "container") continue;
61
+ const key = item[spec.jsonKey];
62
+ const fn = (typeof key === "string" ? registry[spec.field]?.[key] : void 0) ?? (isLive(item[spec.field]) ? item[spec.field] : void 0);
63
+ if (fn !== void 0) out[spec.field] = fn;
43
64
  }
44
- return r;
65
+ return out;
45
66
  }
46
- function f(e, t) {
47
- let n = /* @__PURE__ */ new Map(), r = new Set(e.map((e) => e.id));
48
- for (let i = !0; i;) {
49
- i = !1;
50
- for (let a of e) {
51
- if (n.has(a.id)) continue;
52
- let e, o = c(a), s = o.filter((e) => !r.has(e)), l = t.get(a.id);
53
- a.parent !== null && n.has(a.parent) ? e = {
54
- id: a.id,
67
+ /**
68
+ * Which items a paste leaves out, and why. A node deriving from an id list is
69
+ * pasted only with everything it depends on, since a copy still naming the
70
+ * originals would follow them rather than the copies beside it; and only with
71
+ * a derivation to run, since without one it is a placeholder that paints
72
+ * nothing. Leaving one out can strand another, so this runs to a fixed point.
73
+ */
74
+ function omissions(src, fns) {
75
+ const out = /* @__PURE__ */ new Map();
76
+ const present = new Set(src.map((item) => item.id));
77
+ for (let changed = true; changed;) {
78
+ changed = false;
79
+ for (const item of src) {
80
+ if (out.has(item.id)) continue;
81
+ let omission;
82
+ const deps = dependencyList(item);
83
+ const missing = deps.filter((dep) => !present.has(dep));
84
+ const fn = fns.get(item.id);
85
+ if (item.parent !== null && out.has(item.parent)) omission = {
86
+ id: item.id,
55
87
  reason: "container-not-pasted"
56
- } : s.length > 0 ? e = {
57
- id: a.id,
88
+ };
89
+ else if (missing.length > 0) omission = {
90
+ id: item.id,
58
91
  reason: "dependency-not-copied",
59
- missing: s
60
- } : o.length > 0 && l.derivePath === void 0 && l.derivePose === void 0 && (e = {
61
- id: a.id,
92
+ missing
93
+ };
94
+ else if (deps.length > 0 && fn.derivePath === void 0 && fn.derivePose === void 0) omission = {
95
+ id: item.id,
62
96
  reason: "derivation-not-registered"
63
- }), e !== void 0 && (n.set(a.id, e), r.delete(a.id), i = !0);
97
+ };
98
+ if (omission === void 0) continue;
99
+ out.set(item.id, omission);
100
+ present.delete(item.id);
101
+ changed = true;
64
102
  }
65
103
  }
66
- return n;
104
+ return out;
67
105
  }
68
- function p(t, n, r, i) {
69
- let a = n.items;
70
- if (a.length === 0) return [];
71
- let l = new Map(a.map((e) => [e.id, d(t.scene, e)])), u = f(a, l);
72
- if (i?.onOmit) for (let e of a) {
73
- let t = u.get(e.id);
74
- t && i.onOmit(t);
106
+ function pasteSceneSnapshot(env, clipboard, offset, ctx) {
107
+ const all = clipboard.items;
108
+ if (all.length === 0) return [];
109
+ const fns = new Map(all.map((item) => [item.id, restoredFnFields(env.scene, item)]));
110
+ const omitted = omissions(all, fns);
111
+ if (ctx?.onOmit) for (const item of all) {
112
+ const omission = omitted.get(item.id);
113
+ if (omission) ctx.onOmit(omission);
75
114
  }
76
- let p = u.size === 0 ? a : a.filter((e) => !u.has(e.id)), m = /* @__PURE__ */ new Map();
77
- for (let e of p) m.set(e.id, t.scene.mintId());
78
- let h = (e) => e.parent === null || !m.has(e.parent), g = new Map(p.map((e) => [e.id, e])), _ = (n) => {
79
- if (!t.composes) return !1;
80
- let r = n.parent === null ? void 0 : g.get(n.parent);
81
- for (; r !== void 0;) {
82
- if (e(r)) return !0;
83
- r = r.parent === null ? void 0 : g.get(r.parent);
115
+ const src = omitted.size === 0 ? all : all.filter((item) => !omitted.has(item.id));
116
+ const idMap = /* @__PURE__ */ new Map();
117
+ for (const item of src) idMap.set(item.id, env.scene.mintId());
118
+ const isRoot = (item) => item.parent === null || !idMap.has(item.parent);
119
+ const byId = new Map(src.map((item) => [item.id, item]));
120
+ const ridesPastedFrame = (item) => {
121
+ if (!env.composes) return false;
122
+ let p = item.parent === null ? void 0 : byId.get(item.parent);
123
+ while (p !== void 0) {
124
+ if (definesFrame(p)) return true;
125
+ p = p.parent === null ? void 0 : byId.get(p.parent);
84
126
  }
85
- return !1;
86
- }, v = r.dx, y = r.dy;
87
- if (i?.dropPoint) {
88
- let e = Infinity, n = Infinity;
89
- for (let r of p) {
90
- if (!h(r)) continue;
91
- let i = t.poseBounds(r.pose, r);
92
- i.x < e && (e = i.x), i.y < n && (n = i.y);
127
+ return false;
128
+ };
129
+ let dx = offset.dx;
130
+ let dy = offset.dy;
131
+ if (ctx?.dropPoint) {
132
+ let minX = Infinity;
133
+ let minY = Infinity;
134
+ for (const item of src) {
135
+ if (!isRoot(item)) continue;
136
+ const b = env.poseBounds(item.pose, item);
137
+ if (b.x < minX) minX = b.x;
138
+ if (b.y < minY) minY = b.y;
139
+ }
140
+ if (Number.isFinite(minX) && Number.isFinite(minY)) {
141
+ dx = ctx.dropPoint.worldX - minX;
142
+ dy = ctx.dropPoint.worldY - minY;
93
143
  }
94
- Number.isFinite(e) && Number.isFinite(n) && (v = i.dropPoint.worldX - e, y = i.dropPoint.worldY - n);
95
144
  }
96
- return p.map((e) => ({
97
- id: m.get(e.id),
98
- kind: e.kind,
99
- layer: e.layer,
100
- parent: h(e) ? null : m.get(e.parent),
101
- pose: _(e) ? s(e.pose) : t.translate(s(e.pose), v, y, e),
102
- data: s(e.data),
103
- ...o(e),
104
- ...e.kind === "container" ? { children: e.children.filter((e) => m.has(e)).map((e) => m.get(e)) } : {},
105
- ...e.dependsOn === "children" ? { dependsOn: "children" } : c(e).length > 0 ? { dependsOn: c(e).map((e) => m.get(e)) } : {},
106
- ...l.get(e.id)
145
+ return src.map((item) => ({
146
+ id: idMap.get(item.id),
147
+ kind: item.kind,
148
+ layer: item.layer,
149
+ parent: isRoot(item) ? null : idMap.get(item.parent),
150
+ pose: ridesPastedFrame(item) ? copyField(item.pose) : env.translate(copyField(item.pose), dx, dy, item),
151
+ data: copyField(item.data),
152
+ ...statedFields(item),
153
+ ...item.kind === "container" ? { children: item.children.filter((c) => idMap.has(c)).map((c) => idMap.get(c)) } : {},
154
+ ...item.dependsOn === "children" ? { dependsOn: "children" } : dependencyList(item).length > 0 ? { dependsOn: dependencyList(item).map((dep) => idMap.get(dep)) } : {},
155
+ ...fns.get(item.id)
107
156
  }));
108
157
  }
109
- //#endregion
110
- export { p as pasteSceneSnapshot, l as snapshotSceneSelection };
111
158
 
159
+ //#endregion
160
+ export { pasteSceneSnapshot, snapshotSceneSelection };
112
161
  //# sourceMappingURL=sceneClipboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sceneClipboard.js","names":["copyField","value","dependencyList","item","snapshotSceneSelection","env","fnFields","createNodeFnFields","scene","idSet","ids","taken","items","poseFor","n","isRoot","frame","capture","id","asNodeId","statedFields","fnFieldsOfNode","fnKeysOf","cid","a","isLive","member","restoredFnFields","out","registry","spec","NODE_FN_FIELDS","key","fn","omissions","present","src","changed","omission","deps","missing","dep","fns","pasteSceneSnapshot","all","clipboard","omitted","ctx","idMap","byId","ridesPastedFrame","p","definesFrame","dx","offset","dy","minX","minY","b","c"],"sources":["../../src/canvas/sceneClipboard.ts"],"sourcesContent":["/**\n * The scene adapter's clipboard seam: what a copy captures and what a paste\n * mints from it.\n *\n * `pasteSceneSnapshot` is a pure factory — it mints fresh nodes and never\n * touches the scene. Insertion happens through the caller's InsertOps (one per\n * created node, parents before children).\n *\n * A snapshot item carries its node's function fields twice: live, for a paste\n * in the same session, and as the scene's registry keys, for a snapshot that\n * crossed JSON on the way back.\n */\nimport type { ClipboardSnapshot, PasteCtx, PasteOmission } from 'core/adapters/types';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport { definesFrame } from 'core/scene/effectivePose';\nimport {\n NODE_FN_FIELDS, createNodeFnFields, fnFieldsOfNode, fnKeysOf, type FnBearingNode,\n} from 'core/scene/nodeFnFields';\nimport { statedFields } from 'core/scene/statedFields';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\n\n/** What the seam needs from the adapter it serves. */\nexport interface SceneClipboardEnv<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** Whether a stored pose is relative to its container's frame. */\n composes: boolean;\n worldPoseOf(id: string): TPose;\n /** The nearest frame-defining container at or above `id`. */\n frameAtOrAbove(id: string | null): string | null;\n poseBounds(pose: TPose, node: unknown): Bounds;\n translate(pose: TPose, dx: number, dy: number, node?: unknown): TPose;\n}\n\n// Spread-level copy per the clipboard contract: mutating a snapshot's\n// pose/data/children must not touch the scene.\nfunction copyField<T>(value: T): T {\n if (Array.isArray(value)) return [...value] as T;\n if (value !== null && typeof value === 'object') return { ...(value as object) } as T;\n return value;\n}\n\ntype Item<TData, TLayer extends string, TPose> =\n Node<TData, TLayer, TPose> & Record<string, unknown>;\n\nconst dependencyList = (item: { dependsOn?: readonly NodeId[] | 'children' }): readonly NodeId[] =>\n (Array.isArray(item.dependsOn) ? item.dependsOn : []);\n\nexport function snapshotSceneSelection<TData, TLayer extends string, TPose>(\n env: SceneClipboardEnv<TData, TLayer, TPose>,\n ids: string[],\n): ClipboardSnapshot {\n const { scene } = env;\n const fnFields = createNodeFnFields<TPose>(scene.registry as never);\n const idSet = new Set(ids);\n const taken = new Set<string>();\n const items: Node<TData, TLayer, TPose>[] = [];\n // A stored pose is relative to its frame, and a node whose frame is not\n // copied with it lands somewhere else entirely on paste. Capture those in\n // world coordinates: every root, and under an envelope root, the nodes\n // sharing the frame the root left behind.\n const poseFor = (n: Node<TData, TLayer, TPose>, isRoot: boolean): TPose => {\n if (!env.composes) return n.pose;\n if (isRoot) return env.worldPoseOf(n.id);\n const frame = env.frameAtOrAbove(n.parent);\n return frame !== null && taken.has(frame) ? n.pose : env.worldPoseOf(n.id);\n };\n\n // DFS from one snapshot root: push the node, then its subtree —\n // parents-before-children, so paste can re-insert in array order.\n const capture = (id: string, isRoot = false): void => {\n if (taken.has(id)) return;\n const n = scene.get(asNodeId(id));\n if (!n) return;\n taken.add(id);\n items.push({\n kind: n.kind,\n id: n.id,\n layer: n.layer,\n parent: n.parent,\n pose: copyField(poseFor(n, isRoot)),\n data: copyField(n.data),\n ...(n.kind === 'container' ? { children: [...n.children] } : {}),\n ...statedFields(n),\n ...(n.dependsOn !== undefined ? { dependsOn: copyField(n.dependsOn) } : {}),\n ...fnFieldsOfNode(n),\n ...fnKeysOf(fnFields, n as unknown as FnBearingNode, 'jsonKey'),\n } as Node<TData, TLayer, TPose>);\n if (n.kind === 'container') {\n for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);\n }\n };\n for (const id of ids) {\n // Dedupe: an id whose ancestor is also selected is already covered\n // by that ancestor's subtree walk.\n if (scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a))) continue;\n capture(id, true);\n }\n return { items };\n}\n\n// JSON drops a function, and turns a layout strategy into an object with no\n// methods on it: neither is something a pasted node can run.\nconst isLive = (value: unknown): boolean =>\n typeof value === 'function'\n || (typeof value === 'object' && value !== null\n && Object.values(value).some((member) => typeof member === 'function'));\n\n/**\n * The item's function fields: for each, what its registry key names in this\n * scene, else the live one it carries, else nothing.\n */\nfunction restoredFnFields<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n item: Item<TData, TLayer, TPose>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const registry = scene.registry as Record<string, Record<string, unknown> | undefined>;\n for (const spec of NODE_FN_FIELDS) {\n if (spec.containersOnly && item.kind !== 'container') continue;\n const key = item[spec.jsonKey];\n const registered = typeof key === 'string' ? registry[spec.field]?.[key] : undefined;\n const fn = registered ?? (isLive(item[spec.field]) ? item[spec.field] : undefined);\n if (fn !== undefined) out[spec.field] = fn;\n }\n return out;\n}\n\n/**\n * Which items a paste leaves out, and why. A node deriving from an id list is\n * pasted only with everything it depends on, since a copy still naming the\n * originals would follow them rather than the copies beside it; and only with\n * a derivation to run, since without one it is a placeholder that paints\n * nothing. Leaving one out can strand another, so this runs to a fixed point.\n */\nfunction omissions<TData, TLayer extends string, TPose>(\n src: readonly Item<TData, TLayer, TPose>[],\n fns: ReadonlyMap<string, Record<string, unknown>>,\n): Map<string, PasteOmission> {\n const out = new Map<string, PasteOmission>();\n const present = new Set(src.map((item) => item.id as string));\n for (let changed = true; changed;) {\n changed = false;\n for (const item of src) {\n if (out.has(item.id)) continue;\n let omission: PasteOmission | undefined;\n const deps = dependencyList(item);\n const missing = deps.filter((dep) => !present.has(dep));\n const fn = fns.get(item.id)!;\n if (item.parent !== null && out.has(item.parent)) {\n omission = { id: item.id, reason: 'container-not-pasted' };\n } else if (missing.length > 0) {\n omission = { id: item.id, reason: 'dependency-not-copied', missing };\n } else if (deps.length > 0 && fn.derivePath === undefined && fn.derivePose === undefined) {\n omission = { id: item.id, reason: 'derivation-not-registered' };\n }\n if (omission === undefined) continue;\n out.set(item.id, omission);\n present.delete(item.id);\n changed = true;\n }\n }\n return out;\n}\n\nexport function pasteSceneSnapshot<TData, TLayer extends string, TPose>(\n env: SceneClipboardEnv<TData, TLayer, TPose>,\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n): Node<TData, TLayer, TPose>[] {\n const all = clipboard.items as Item<TData, TLayer, TPose>[];\n if (all.length === 0) return [];\n const fns = new Map(all.map((item) => [item.id as string, restoredFnFields(env.scene, item)]));\n const omitted = omissions(all, fns);\n if (ctx?.onOmit) for (const item of all) {\n const omission = omitted.get(item.id);\n if (omission) ctx.onOmit(omission);\n }\n const src = omitted.size === 0 ? all : all.filter((item) => !omitted.has(item.id));\n\n const idMap = new Map<string, NodeId>();\n for (const item of src) idMap.set(item.id, env.scene.mintId());\n // Items whose captured parent isn't part of the snapshot become roots\n // of the pasted cluster.\n const isRoot = (item: Node<TData, TLayer, TPose>): boolean =>\n item.parent === null || !idMap.has(item.parent);\n // Under a composing strategy a node inside a pasted frame rides it, and\n // offsetting it as well would move it twice.\n const byId = new Map(src.map((item) => [item.id as string, item]));\n const ridesPastedFrame = (item: Node<TData, TLayer, TPose>): boolean => {\n if (!env.composes) return false;\n let p = item.parent === null ? undefined : byId.get(item.parent);\n while (p !== undefined) {\n if (definesFrame(p)) return true;\n p = p.parent === null ? undefined : byId.get(p.parent);\n }\n return false;\n };\n // Without composition poses are absolute, so the delta applies to EVERY\n // pasted node.\n let dx = offset.dx;\n let dy = offset.dy;\n if (ctx?.dropPoint) {\n // Drop-point policy: land the cluster origin (min corner of the root\n // items' bounds) on the drop point; `offset` is ignored.\n let minX = Infinity;\n let minY = Infinity;\n for (const item of src) {\n if (!isRoot(item)) continue;\n const b = env.poseBounds(item.pose, item);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n }\n if (Number.isFinite(minX) && Number.isFinite(minY)) {\n dx = ctx.dropPoint.worldX - minX;\n dy = ctx.dropPoint.worldY - minY;\n }\n }\n // `src` is parents-before-children and this keeps it, so children re-attach\n // to freshly inserted parents when the caller's InsertOps apply in order.\n return src.map((item) => ({\n id: idMap.get(item.id)!,\n kind: item.kind,\n layer: item.layer,\n parent: isRoot(item) ? null : idMap.get(item.parent as string)!,\n pose: ridesPastedFrame(item)\n ? copyField(item.pose)\n : env.translate(copyField(item.pose), dx, dy, item),\n data: copyField(item.data),\n ...statedFields(item),\n ...(item.kind === 'container'\n ? { children: item.children.filter((c) => idMap.has(c)).map((c) => idMap.get(c)!) }\n : {}),\n ...(item.dependsOn === 'children'\n ? { dependsOn: 'children' as const }\n : dependencyList(item).length > 0\n ? { dependsOn: dependencyList(item).map((dep) => idMap.get(dep)!) }\n : {}),\n ...fns.get(item.id),\n } as Node<TData, TLayer, TPose>));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"sceneClipboard.js","names":[],"sources":["../../src/canvas/sceneClipboard.ts"],"sourcesContent":["/**\n * The scene adapter's clipboard seam: what a copy captures and what a paste\n * mints from it.\n *\n * `pasteSceneSnapshot` is a pure factory — it mints fresh nodes and never\n * touches the scene. Insertion happens through the caller's InsertOps (one per\n * created node, parents before children).\n *\n * A snapshot item carries its node's function fields twice: live, for a paste\n * in the same session, and as the scene's registry keys, for a snapshot that\n * crossed JSON on the way back.\n */\nimport type { ClipboardSnapshot, PasteCtx, PasteOmission } from 'core/adapters/types';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport { definesFrame } from 'core/scene/effectivePose';\nimport {\n NODE_FN_FIELDS, createNodeFnFields, fnFieldsOfNode, fnKeysOf, type FnBearingNode,\n} from 'core/scene/nodeFnFields';\nimport { statedFields } from 'core/scene/statedFields';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\n\n/** What the seam needs from the adapter it serves. */\nexport interface SceneClipboardEnv<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** Whether a stored pose is relative to its container's frame. */\n composes: boolean;\n worldPoseOf(id: string): TPose;\n /** The nearest frame-defining container at or above `id`. */\n frameAtOrAbove(id: string | null): string | null;\n poseBounds(pose: TPose, node: unknown): Bounds;\n translate(pose: TPose, dx: number, dy: number, node?: unknown): TPose;\n}\n\n// Spread-level copy per the clipboard contract: mutating a snapshot's\n// pose/data/children must not touch the scene.\nfunction copyField<T>(value: T): T {\n if (Array.isArray(value)) return [...value] as T;\n if (value !== null && typeof value === 'object') return { ...(value as object) } as T;\n return value;\n}\n\ntype Item<TData, TLayer extends string, TPose> =\n Node<TData, TLayer, TPose> & Record<string, unknown>;\n\nconst dependencyList = (item: { dependsOn?: readonly NodeId[] | 'children' }): readonly NodeId[] =>\n (Array.isArray(item.dependsOn) ? item.dependsOn : []);\n\nexport function snapshotSceneSelection<TData, TLayer extends string, TPose>(\n env: SceneClipboardEnv<TData, TLayer, TPose>,\n ids: string[],\n): ClipboardSnapshot {\n const { scene } = env;\n const fnFields = createNodeFnFields<TPose>(scene.registry as never);\n const idSet = new Set(ids);\n const taken = new Set<string>();\n const items: Node<TData, TLayer, TPose>[] = [];\n // A stored pose is relative to its frame, and a node whose frame is not\n // copied with it lands somewhere else entirely on paste. Capture those in\n // world coordinates: every root, and under an envelope root, the nodes\n // sharing the frame the root left behind.\n const poseFor = (n: Node<TData, TLayer, TPose>, isRoot: boolean): TPose => {\n if (!env.composes) return n.pose;\n if (isRoot) return env.worldPoseOf(n.id);\n const frame = env.frameAtOrAbove(n.parent);\n return frame !== null && taken.has(frame) ? n.pose : env.worldPoseOf(n.id);\n };\n\n // DFS from one snapshot root: push the node, then its subtree —\n // parents-before-children, so paste can re-insert in array order.\n const capture = (id: string, isRoot = false): void => {\n if (taken.has(id)) return;\n const n = scene.get(asNodeId(id));\n if (!n) return;\n taken.add(id);\n items.push({\n kind: n.kind,\n id: n.id,\n layer: n.layer,\n parent: n.parent,\n pose: copyField(poseFor(n, isRoot)),\n data: copyField(n.data),\n ...(n.kind === 'container' ? { children: [...n.children] } : {}),\n ...statedFields(n),\n ...(n.dependsOn !== undefined ? { dependsOn: copyField(n.dependsOn) } : {}),\n ...fnFieldsOfNode(n),\n ...fnKeysOf(fnFields, n as unknown as FnBearingNode, 'jsonKey'),\n } as Node<TData, TLayer, TPose>);\n if (n.kind === 'container') {\n for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);\n }\n };\n for (const id of ids) {\n // Dedupe: an id whose ancestor is also selected is already covered\n // by that ancestor's subtree walk.\n if (scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a))) continue;\n capture(id, true);\n }\n return { items };\n}\n\n// JSON drops a function, and turns a layout strategy into an object with no\n// methods on it: neither is something a pasted node can run.\nconst isLive = (value: unknown): boolean =>\n typeof value === 'function'\n || (typeof value === 'object' && value !== null\n && Object.values(value).some((member) => typeof member === 'function'));\n\n/**\n * The item's function fields: for each, what its registry key names in this\n * scene, else the live one it carries, else nothing.\n */\nfunction restoredFnFields<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n item: Item<TData, TLayer, TPose>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n const registry = scene.registry as Record<string, Record<string, unknown> | undefined>;\n for (const spec of NODE_FN_FIELDS) {\n if (spec.containersOnly && item.kind !== 'container') continue;\n const key = item[spec.jsonKey];\n const registered = typeof key === 'string' ? registry[spec.field]?.[key] : undefined;\n const fn = registered ?? (isLive(item[spec.field]) ? item[spec.field] : undefined);\n if (fn !== undefined) out[spec.field] = fn;\n }\n return out;\n}\n\n/**\n * Which items a paste leaves out, and why. A node deriving from an id list is\n * pasted only with everything it depends on, since a copy still naming the\n * originals would follow them rather than the copies beside it; and only with\n * a derivation to run, since without one it is a placeholder that paints\n * nothing. Leaving one out can strand another, so this runs to a fixed point.\n */\nfunction omissions<TData, TLayer extends string, TPose>(\n src: readonly Item<TData, TLayer, TPose>[],\n fns: ReadonlyMap<string, Record<string, unknown>>,\n): Map<string, PasteOmission> {\n const out = new Map<string, PasteOmission>();\n const present = new Set(src.map((item) => item.id as string));\n for (let changed = true; changed;) {\n changed = false;\n for (const item of src) {\n if (out.has(item.id)) continue;\n let omission: PasteOmission | undefined;\n const deps = dependencyList(item);\n const missing = deps.filter((dep) => !present.has(dep));\n const fn = fns.get(item.id)!;\n if (item.parent !== null && out.has(item.parent)) {\n omission = { id: item.id, reason: 'container-not-pasted' };\n } else if (missing.length > 0) {\n omission = { id: item.id, reason: 'dependency-not-copied', missing };\n } else if (deps.length > 0 && fn.derivePath === undefined && fn.derivePose === undefined) {\n omission = { id: item.id, reason: 'derivation-not-registered' };\n }\n if (omission === undefined) continue;\n out.set(item.id, omission);\n present.delete(item.id);\n changed = true;\n }\n }\n return out;\n}\n\nexport function pasteSceneSnapshot<TData, TLayer extends string, TPose>(\n env: SceneClipboardEnv<TData, TLayer, TPose>,\n clipboard: ClipboardSnapshot,\n offset: { dx: number; dy: number },\n ctx?: PasteCtx,\n): Node<TData, TLayer, TPose>[] {\n const all = clipboard.items as Item<TData, TLayer, TPose>[];\n if (all.length === 0) return [];\n const fns = new Map(all.map((item) => [item.id as string, restoredFnFields(env.scene, item)]));\n const omitted = omissions(all, fns);\n if (ctx?.onOmit) for (const item of all) {\n const omission = omitted.get(item.id);\n if (omission) ctx.onOmit(omission);\n }\n const src = omitted.size === 0 ? all : all.filter((item) => !omitted.has(item.id));\n\n const idMap = new Map<string, NodeId>();\n for (const item of src) idMap.set(item.id, env.scene.mintId());\n // Items whose captured parent isn't part of the snapshot become roots\n // of the pasted cluster.\n const isRoot = (item: Node<TData, TLayer, TPose>): boolean =>\n item.parent === null || !idMap.has(item.parent);\n // Under a composing strategy a node inside a pasted frame rides it, and\n // offsetting it as well would move it twice.\n const byId = new Map(src.map((item) => [item.id as string, item]));\n const ridesPastedFrame = (item: Node<TData, TLayer, TPose>): boolean => {\n if (!env.composes) return false;\n let p = item.parent === null ? undefined : byId.get(item.parent);\n while (p !== undefined) {\n if (definesFrame(p)) return true;\n p = p.parent === null ? undefined : byId.get(p.parent);\n }\n return false;\n };\n // Without composition poses are absolute, so the delta applies to EVERY\n // pasted node.\n let dx = offset.dx;\n let dy = offset.dy;\n if (ctx?.dropPoint) {\n // Drop-point policy: land the cluster origin (min corner of the root\n // items' bounds) on the drop point; `offset` is ignored.\n let minX = Infinity;\n let minY = Infinity;\n for (const item of src) {\n if (!isRoot(item)) continue;\n const b = env.poseBounds(item.pose, item);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n }\n if (Number.isFinite(minX) && Number.isFinite(minY)) {\n dx = ctx.dropPoint.worldX - minX;\n dy = ctx.dropPoint.worldY - minY;\n }\n }\n // `src` is parents-before-children and this keeps it, so children re-attach\n // to freshly inserted parents when the caller's InsertOps apply in order.\n return src.map((item) => ({\n id: idMap.get(item.id)!,\n kind: item.kind,\n layer: item.layer,\n parent: isRoot(item) ? null : idMap.get(item.parent as string)!,\n pose: ridesPastedFrame(item)\n ? copyField(item.pose)\n : env.translate(copyField(item.pose), dx, dy, item),\n data: copyField(item.data),\n ...statedFields(item),\n ...(item.kind === 'container'\n ? { children: item.children.filter((c) => idMap.has(c)).map((c) => idMap.get(c)!) }\n : {}),\n ...(item.dependsOn === 'children'\n ? { dependsOn: 'children' as const }\n : dependencyList(item).length > 0\n ? { dependsOn: dependencyList(item).map((dep) => idMap.get(dep)!) }\n : {}),\n ...fns.get(item.id),\n } as Node<TData, TLayer, TPose>));\n}\n"],"mappings":"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"}