@weasel-js/core 1.15.0 → 1.15.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 (794) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/WeaselProvider.js +4 -5
  3. package/dist/affordances/composeAffordanceLayer.js +1 -2
  4. package/dist/affordances/cornerResize.js +4 -5
  5. package/dist/affordances/hitAffordanceRegions.js +1 -2
  6. package/dist/affordances/pathAnchors.js +1 -2
  7. package/dist/affordances/rotateCursor.js +1 -2
  8. package/dist/affordances/rotationHandle.js +2 -3
  9. package/dist/animation/behaviors/coast.js +1 -2
  10. package/dist/animation/behaviors/coastByWrite.js +2 -3
  11. package/dist/animation/behaviors/coastOnTargets.js +2 -3
  12. package/dist/animation/behaviors/momentum.js +1 -2
  13. package/dist/animation/clipTargets.js +1 -2
  14. package/dist/animation/departures.js +2 -3
  15. package/dist/animation/poseHelpers.js +2 -3
  16. package/dist/animation/poseTarget.js +2 -3
  17. package/dist/animation/poseTransition.js +1 -2
  18. package/dist/animation/reflow.js +2 -3
  19. package/dist/animation/rewind.js +1 -2
  20. package/dist/animation/rig/bindRig.js +2 -3
  21. package/dist/animation/rig/rigNode.js +1 -2
  22. package/dist/animation/rig/rigSeat.js +1 -2
  23. package/dist/animation/rig/skinBinding.js +1 -2
  24. package/dist/animation/rig/useRig.js +2 -3
  25. package/dist/animation/wrappers/animateLifecycle.js +1 -2
  26. package/dist/animation/wrappers/animateOnSetPose.js +1 -2
  27. package/dist/animation/wrappers/instantPose.js +1 -2
  28. package/dist/animation/writtenPoseTarget.js +1 -2
  29. package/dist/barrel/interactions.js +2 -1
  30. package/dist/barrel/routing.js +2 -2
  31. package/dist/barrel/scene.js +2 -2
  32. package/dist/canvas/Canvas.js +5 -6
  33. package/dist/canvas/CanvasView.js +6 -7
  34. package/dist/canvas/CursorCoordsHud.js +2 -3
  35. package/dist/canvas/DrawCanvas.js +3 -4
  36. package/dist/canvas/GestureReason.js +1 -2
  37. package/dist/canvas/GestureReason.module.js +1 -2
  38. package/dist/canvas/LeanSceneCanvas.js +2 -3
  39. package/dist/canvas/ModalityHud.js +2 -3
  40. package/dist/canvas/NodeShape.js +3 -4
  41. package/dist/canvas/PickHud.js +2 -3
  42. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +1 -2
  43. package/dist/canvas/SceneCanvas/CanvasKitProviders.js +3 -4
  44. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +1 -2
  45. package/dist/canvas/SceneCanvas/DevHuds.js +1 -2
  46. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +1 -2
  47. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +4 -5
  48. package/dist/canvas/SceneCanvas/SurfaceDeclarations.js +1 -2
  49. package/dist/canvas/SceneCanvas/brushOverlay.js +1 -2
  50. package/dist/canvas/SceneCanvas/builtinToolSets.js +1 -2
  51. package/dist/canvas/SceneCanvas/canvasPassThrough.js +1 -2
  52. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +1 -2
  53. package/dist/canvas/SceneCanvas/coordTrace.js +1 -2
  54. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +3 -4
  55. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -2
  56. package/dist/canvas/SceneCanvas/defaultTextEditor.js +4 -5
  57. package/dist/canvas/SceneCanvas/describePresets.js +1 -2
  58. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +1 -2
  59. package/dist/canvas/SceneCanvas/features.js +1 -2
  60. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +1 -2
  61. package/dist/canvas/SceneCanvas/mergeLayers.js +1 -2
  62. package/dist/canvas/SceneCanvas/namedPresets.js +5 -6
  63. package/dist/canvas/SceneCanvas/poseGeometry.js +1 -2
  64. package/dist/canvas/SceneCanvas/poseRegistrars.js +1 -2
  65. package/dist/canvas/SceneCanvas/presets/arrange.js +2 -3
  66. package/dist/canvas/SceneCanvas/presets/baseline.js +1 -2
  67. package/dist/canvas/SceneCanvas/presets/chrome.js +1 -2
  68. package/dist/canvas/SceneCanvas/presets/composites.js +1 -2
  69. package/dist/canvas/SceneCanvas/presets/edit.js +4 -5
  70. package/dist/canvas/SceneCanvas/presets/ingest.js +1 -2
  71. package/dist/canvas/SceneCanvas/presets/paths.js +3 -4
  72. package/dist/canvas/SceneCanvas/presets/select.js +1 -2
  73. package/dist/canvas/SceneCanvas/presets/toolDriven.js +2 -3
  74. package/dist/canvas/SceneCanvas/presets/tools.js +1 -2
  75. package/dist/canvas/SceneCanvas/presets/transform.js +2 -3
  76. package/dist/canvas/SceneCanvas/presets/view.js +2 -3
  77. package/dist/canvas/SceneCanvas/props.js +1 -2
  78. package/dist/canvas/SceneCanvas/scenePointQuery.js +2 -3
  79. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +1 -2
  80. package/dist/canvas/SceneCanvas/toolRegistry.js +2 -3
  81. package/dist/canvas/SceneCanvas/useActionTunings.js +1 -2
  82. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -2
  83. package/dist/canvas/SceneCanvas/useBakedScene.js +2 -3
  84. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +7 -8
  85. package/dist/canvas/SceneCanvas/useBuiltinTools.js +2 -3
  86. package/dist/canvas/SceneCanvas/useCanvasCamera.js +2 -3
  87. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +1 -2
  88. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +1 -2
  89. package/dist/canvas/SceneCanvas/useCanvasSelection.js +8 -6
  90. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/useCanvasTools.js +2 -3
  92. package/dist/canvas/SceneCanvas/useChromeAffordances.js +2 -3
  93. package/dist/canvas/SceneCanvas/useContributionRoles.js +1 -2
  94. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +4 -5
  95. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +2 -3
  96. package/dist/canvas/SceneCanvas/useHeldModifiers.js +1 -2
  97. package/dist/canvas/SceneCanvas/useMagnificationCheck.js +41 -0
  98. package/dist/canvas/SceneCanvas/useMagnificationCheck.js.map +1 -0
  99. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +1 -2
  100. package/dist/canvas/SceneCanvas/useNodeKinds.js +2 -3
  101. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +10 -11
  102. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +1 -2
  103. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +6 -7
  104. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +1 -2
  105. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +1 -2
  106. package/dist/canvas/SceneCanvas/useSceneChrome.js +5 -6
  107. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +6 -7
  108. package/dist/canvas/SceneCanvas/useScenePicking.js +5 -6
  109. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +1 -2
  110. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +7 -8
  111. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +2 -3
  112. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +26 -18
  113. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  114. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +2 -3
  115. package/dist/canvas/SceneCanvas/useSurfaceRouting.js +1 -2
  116. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js +1 -2
  117. package/dist/canvas/SceneCanvas/useToolKeybindings.js +1 -2
  118. package/dist/canvas/SceneCanvas/useViewportActions.js +3 -4
  119. package/dist/canvas/SceneCanvas/worldPointAt.js +1 -2
  120. package/dist/canvas/SceneCanvas.js +18 -17
  121. package/dist/canvas/SceneCanvas.js.map +1 -1
  122. package/dist/canvas/SceneViewCanvas.js +2 -3
  123. package/dist/canvas/SurfaceCanvas.js +1 -2
  124. package/dist/canvas/ViewMarker.js +1 -2
  125. package/dist/canvas/accentColor.js +1 -2
  126. package/dist/canvas/adapterDerivedPath.js +2 -3
  127. package/dist/canvas/adapterPickSource.js +1 -2
  128. package/dist/canvas/affordanceAt.js +2 -3
  129. package/dist/canvas/buildSceneLayer.js +4 -5
  130. package/dist/canvas/buildSceneTree.js +4 -5
  131. package/dist/canvas/canvasRenderer.js +1 -2
  132. package/dist/canvas/colorOverrides.js +1 -2
  133. package/dist/canvas/contextAttributes.js +1 -2
  134. package/dist/canvas/copiesAbove.js +1 -2
  135. package/dist/canvas/defaultDrawOne.js +1 -2
  136. package/dist/canvas/deps/areaSelect.js +5 -3
  137. package/dist/canvas/deps/areaSelect.js.map +1 -1
  138. package/dist/canvas/deps/booleans.js +5 -6
  139. package/dist/canvas/deps/changes.js +1 -2
  140. package/dist/canvas/deps/chromeRules.js +1 -2
  141. package/dist/canvas/deps/debug.js +1 -2
  142. package/dist/canvas/deps/dispatchSources.js +1 -2
  143. package/dist/canvas/deps/dispatcher.js +1 -2
  144. package/dist/canvas/deps/editAnchors.js +3 -4
  145. package/dist/canvas/deps/enteredGroup.js +1 -2
  146. package/dist/canvas/deps/geometryProjection.js +1 -2
  147. package/dist/canvas/deps/hitTestArea.js +4 -5
  148. package/dist/canvas/deps/ingestion.js +1 -2
  149. package/dist/canvas/deps/insert.js +3 -4
  150. package/dist/canvas/deps/insertSite.js +3 -4
  151. package/dist/canvas/deps/kitSettings.js +1 -2
  152. package/dist/canvas/deps/lassoSelect.js +5 -3
  153. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  154. package/dist/canvas/deps/layout.js +1 -2
  155. package/dist/canvas/deps/modeDefaultTool.js +1 -2
  156. package/dist/canvas/deps/nodeAtPoint.js +1 -2
  157. package/dist/canvas/deps/pathEditCommits.js +4 -5
  158. package/dist/canvas/deps/pathLeaf.js +1 -2
  159. package/dist/canvas/deps/pathLeafDeps.js +2 -3
  160. package/dist/canvas/deps/poseDescriptor.js +1 -2
  161. package/dist/canvas/deps/previewPaths.js +1 -2
  162. package/dist/canvas/deps/resizePolicy.js +1 -2
  163. package/dist/canvas/deps/selectionSnapshot.js +1 -2
  164. package/dist/canvas/deps/slice.js +5 -6
  165. package/dist/canvas/deps/snap.js +3 -4
  166. package/dist/canvas/deps/surface.js +1 -2
  167. package/dist/canvas/deps/textEdit.js +1 -2
  168. package/dist/canvas/deps/transformFollowers.js +1 -2
  169. package/dist/canvas/deps/view.js +1 -2
  170. package/dist/canvas/derivedPath.js +6 -7
  171. package/dist/canvas/doubleClickTarget.js +1 -2
  172. package/dist/canvas/drawEnvelope.js +1 -2
  173. package/dist/canvas/drawnBounds.js +4 -5
  174. package/dist/canvas/getNodeAtPoint.js +1 -2
  175. package/dist/canvas/hostAnchor.js +1 -2
  176. package/dist/canvas/hud.module.js +1 -2
  177. package/dist/canvas/inheritedPaints.js +1 -2
  178. package/dist/canvas/insertPreviewExtent.js +1 -2
  179. package/dist/canvas/kitRequirements.js +1 -2
  180. package/dist/canvas/layerHover.js +1 -2
  181. package/dist/canvas/layerOrder.js +1 -2
  182. package/dist/canvas/layerSlots.js +1 -2
  183. package/dist/canvas/mountedCanvases.js +1 -2
  184. package/dist/canvas/nodeShapes/derivedPainter.js +2 -3
  185. package/dist/canvas/nodeShapes/imagePainter.js +1 -2
  186. package/dist/canvas/nodeShapes/measurePainter.js +2 -3
  187. package/dist/canvas/nodeShapes/memo.js +1 -2
  188. package/dist/canvas/nodeShapes/nodePaint.js +1 -2
  189. package/dist/canvas/nodeShapes/pathPainter.js +3 -4
  190. package/dist/canvas/nodeShapes/poseBox.js +1 -2
  191. package/dist/canvas/nodeShapes/rectFallbackPainter.js +1 -2
  192. package/dist/canvas/nodeShapes/shapePainter.js +2 -3
  193. package/dist/canvas/nodeShapes/strokedBounds.js +1 -2
  194. package/dist/canvas/nodeShapes/textPainter.js +1 -2
  195. package/dist/canvas/overChildren.js +1 -2
  196. package/dist/canvas/overlayRoleStrokes.js +1 -2
  197. package/dist/canvas/ownClip.js +1 -2
  198. package/dist/canvas/paintCull.js +1 -2
  199. package/dist/canvas/paintedCursorLayer.js +1 -2
  200. package/dist/canvas/pathOverlay.js +1 -2
  201. package/dist/canvas/pickIndex/nodeBroadBox.js +3 -4
  202. package/dist/canvas/pickIndex/scenePickIndex.js +3 -4
  203. package/dist/canvas/pickReach.js +1 -2
  204. package/dist/canvas/pickWalk.js +2 -3
  205. package/dist/canvas/planeClips.js +1 -2
  206. package/dist/canvas/poseRotation.js +1 -2
  207. package/dist/canvas/publishPreviews.js +1 -2
  208. package/dist/canvas/rasterReadback.js +1 -2
  209. package/dist/canvas/rasterToPng.js +1 -2
  210. package/dist/canvas/renderDebugSnapshot.js +1 -2
  211. package/dist/canvas/renderNeeds.js +1 -2
  212. package/dist/canvas/renderSceneToPixels.js +5 -6
  213. package/dist/canvas/sceneAdapter.js +37 -27
  214. package/dist/canvas/sceneAdapter.js.map +1 -1
  215. package/dist/canvas/sceneClipboard.js +19 -7
  216. package/dist/canvas/sceneClipboard.js.map +1 -1
  217. package/dist/canvas/sceneLayerPaint.js +1 -2
  218. package/dist/canvas/scenePickReads.js +1 -2
  219. package/dist/canvas/scenePickSource.js +5 -6
  220. package/dist/canvas/sceneSlotWiring.js +2 -3
  221. package/dist/canvas/sceneViewRender.js +5 -6
  222. package/dist/canvas/shownNodes.js +1 -2
  223. package/dist/canvas/slopsDebugLayer.js +1 -2
  224. package/dist/canvas/surfaceContribution.js +1 -2
  225. package/dist/canvas/useCanvasElements.js +1 -2
  226. package/dist/canvas/useCanvasHandle.js +1 -2
  227. package/dist/canvas/useCanvasPaint.js +2 -3
  228. package/dist/canvas/useCanvasRenderer.js +1 -2
  229. package/dist/canvas/useCanvasSurface.js +1 -2
  230. package/dist/canvas/useCanvasView.js +2 -3
  231. package/dist/canvas/useClientToWorld.js +1 -2
  232. package/dist/canvas/useExtraLayers.js +1 -2
  233. package/dist/canvas/useFrameLoop.js +1 -2
  234. package/dist/canvas/useHitObserver.js +1 -2
  235. package/dist/canvas/useHostAnchor.js +1 -2
  236. package/dist/canvas/useInFlightBounds.js +6 -6
  237. package/dist/canvas/useInFlightBounds.js.map +1 -1
  238. package/dist/canvas/useLateContentRedraw.js +1 -2
  239. package/dist/canvas/useLayerStack.js +2 -3
  240. package/dist/canvas/usePaintedCursor.js +1 -2
  241. package/dist/canvas/useRedrawOn.js +1 -2
  242. package/dist/canvas/useSceneAdapter.js +1 -2
  243. package/dist/canvas/useSceneLayerList.js +1 -2
  244. package/dist/canvas/useSurfaceInput.js +1 -2
  245. package/dist/canvas/useSurfaceSize.js +1 -2
  246. package/dist/canvas/useToolCursor.js +1 -2
  247. package/dist/canvas/useViewAim.js +2 -3
  248. package/dist/canvas/useViewHelpers.js +5 -4
  249. package/dist/canvas/useViewHelpers.js.map +1 -1
  250. package/dist/canvas/useViewLayerGate.js +1 -2
  251. package/dist/canvas/useViewNesting.js +1 -2
  252. package/dist/canvas/useViewRegistrySurface.js +1 -2
  253. package/dist/canvas/viewInputs.js +1 -2
  254. package/dist/canvas/viewMarkers.js +1 -2
  255. package/dist/canvas/viewRegistry.js +1 -2
  256. package/dist/canvas/viewSnap.js +1 -2
  257. package/dist/canvas/watchElementMove.js +1 -2
  258. package/dist/canvas/wrapNodeOutput.js +1 -2
  259. package/dist/core/adapters/testing/rootsTree.js +1 -2
  260. package/dist/core/applyOps.js +1 -2
  261. package/dist/core/device/targets.js +1 -2
  262. package/dist/core/device/useDeviceProfile.js +1 -2
  263. package/dist/core/device/useTargetBasePx.js +1 -2
  264. package/dist/core/device/watchDevicePixelRatio.js +1 -2
  265. package/dist/core/geometry/autoPoseDescriptor.js +2 -3
  266. package/dist/core/geometry/booleanOfPaths.js +1 -2
  267. package/dist/core/geometry/inkExtents.js +1 -2
  268. package/dist/core/geometry/pathPoseDescriptor.js +1 -2
  269. package/dist/core/geometry/poseDescriptor.js +1 -2
  270. package/dist/core/geometry/regionHit.js +1 -2
  271. package/dist/core/geometry/targetFrame.js +1 -2
  272. package/dist/core/geometry/unionBounds.js +1 -2
  273. package/dist/core/layers/backgroundFill.js +1 -2
  274. package/dist/core/layers/children.js +1 -2
  275. package/dist/core/layers/gateLayer.js +1 -2
  276. package/dist/core/layers/layerGroup.js +1 -2
  277. package/dist/core/layers/redrawSource.js +1 -2
  278. package/dist/core/layers/render.js +1 -2
  279. package/dist/core/layers/retain.js +1 -2
  280. package/dist/core/ops/arrange.js +1 -2
  281. package/dist/core/ops/create.js +2 -3
  282. package/dist/core/ops/createHistory.js +2 -3
  283. package/dist/core/ops/delete.js +2 -3
  284. package/dist/core/ops/nodeFlags.js +1 -2
  285. package/dist/core/ops/registry.js +1 -2
  286. package/dist/core/ops/reorder/algorithms.js +1 -2
  287. package/dist/core/ops/reorder/index.js +1 -2
  288. package/dist/core/ops/reorder/setChildOrder.js +1 -2
  289. package/dist/core/ops/reparent.js +1 -2
  290. package/dist/core/ops/select.js +1 -2
  291. package/dist/core/ops/setData.js +1 -2
  292. package/dist/core/ops/setDependsOn.js +1 -2
  293. package/dist/core/ops/setLayer.js +1 -2
  294. package/dist/core/ops/setLayout.js +1 -2
  295. package/dist/core/ops/setPath.js +1 -2
  296. package/dist/core/ops/setText.js +1 -2
  297. package/dist/core/ops/slot.js +1 -2
  298. package/dist/core/ops/transform.js +1 -2
  299. package/dist/core/ops/writtenBy.js +1 -2
  300. package/dist/core/pages/fitViewToPage.js +1 -2
  301. package/dist/core/pages/pageEdits.js +3 -4
  302. package/dist/core/pages/pages.js +1 -2
  303. package/dist/core/pages/pages.js.map +1 -1
  304. package/dist/core/pages/pagesLayer.js +1 -2
  305. package/dist/core/paint/meshKind.js +1 -2
  306. package/dist/core/paint/meshKindLazy.js +9 -18
  307. package/dist/core/paint/meshKindLazy.js.map +1 -1
  308. package/dist/core/paint/paintKindEntry.js +1 -2
  309. package/dist/core/paint/paintKinds.js +1 -2
  310. package/dist/core/paint/registerMesh.js +1 -2
  311. package/dist/core/scene/NodeProperties.js +1 -2
  312. package/dist/core/scene/NodeRouting.js +1 -2
  313. package/dist/core/scene/annotation.js +1 -2
  314. package/dist/core/scene/appliedLog.js +1 -2
  315. package/dist/core/scene/arrivalWindow.js +2 -3
  316. package/dist/core/scene/arrivals.js +1 -2
  317. package/dist/core/scene/booleanGroup.js +1 -2
  318. package/dist/core/scene/booleanOfChildren.js +1 -2
  319. package/dist/core/scene/boundOps.js +1 -2
  320. package/dist/core/scene/carryDescendants.js +2 -3
  321. package/dist/core/scene/clipNothing.js +1 -2
  322. package/dist/core/scene/composeFrame.js +1 -2
  323. package/dist/core/scene/composePose.js +1 -2
  324. package/dist/core/scene/declaredFieldSetters.js +1 -2
  325. package/dist/core/scene/depFrame.js +1 -2
  326. package/dist/core/scene/depMemo.js +1 -2
  327. package/dist/core/scene/dependents.js +1 -2
  328. package/dist/core/scene/derivedParts.js +1 -2
  329. package/dist/core/scene/derivedPath.js +2 -3
  330. package/dist/core/scene/docValues.js +1 -2
  331. package/dist/core/scene/documentOf.js +1 -2
  332. package/dist/core/scene/editMode.js +1 -2
  333. package/dist/core/scene/editPass.js +1 -2
  334. package/dist/core/scene/effectivePose.js +3 -4
  335. package/dist/core/scene/fieldEdits.js +1 -2
  336. package/dist/core/scene/fontReads.js +1 -2
  337. package/dist/core/scene/historyFacade.js +1 -2
  338. package/dist/core/scene/historyForm.js +1 -2
  339. package/dist/core/scene/inheritedPaint.js +1 -2
  340. package/dist/core/scene/kitOps.js +16 -15
  341. package/dist/core/scene/kitOps.js.map +1 -1
  342. package/dist/core/scene/kitRegistry.js +2 -3
  343. package/dist/core/scene/layerOps.js +1 -2
  344. package/dist/core/scene/layerStack.js +1 -2
  345. package/dist/core/scene/layoutPass.js +4 -5
  346. package/dist/core/scene/lockGuard.js +1 -2
  347. package/dist/core/scene/minSize.js +1 -2
  348. package/dist/core/scene/nestedHit.js +1 -2
  349. package/dist/core/scene/nodeAsShown.js +1 -2
  350. package/dist/core/scene/nodeFlags.js +1 -2
  351. package/dist/core/scene/nodeFnFields.js +1 -2
  352. package/dist/core/scene/nodeGates.js +1 -2
  353. package/dist/core/scene/nodeMemo.js +1 -2
  354. package/dist/core/scene/nodeStore.js +2 -3
  355. package/dist/core/scene/notifier.js +1 -2
  356. package/dist/core/scene/opTable.js +1 -2
  357. package/dist/core/scene/outerOps.js +1 -2
  358. package/dist/core/scene/pathEffects/blend.js +1 -2
  359. package/dist/core/scene/pathEffects/derive.js +2 -3
  360. package/dist/core/scene/pathEffects/effects.js +1 -2
  361. package/dist/core/scene/pathEffects/foundHidden.js +1 -2
  362. package/dist/core/scene/pathEffects/textAlong.js +1 -2
  363. package/dist/core/scene/pathEffects/textAlongBands.js +1 -2
  364. package/dist/core/scene/plyStacks.js +1 -2
  365. package/dist/core/scene/poseFeed.js +1 -2
  366. package/dist/core/scene/poseHold.js +1 -2
  367. package/dist/core/scene/poseOverrides.js +1 -2
  368. package/dist/core/scene/posePlies.js +1 -2
  369. package/dist/core/scene/poseRemovals.js +1 -2
  370. package/dist/core/scene/poseSnapshot.js +1 -2
  371. package/dist/core/scene/poseWrites.js +1 -2
  372. package/dist/core/scene/reconcileSpecs.js +26 -3
  373. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  374. package/dist/core/scene/recorder.js +1 -2
  375. package/dist/core/scene/renderOrder.js +1 -2
  376. package/dist/core/scene/sameValue.js +1 -2
  377. package/dist/core/scene/scene.js +11 -12
  378. package/dist/core/scene/scene.js.map +1 -1
  379. package/dist/core/scene/sceneChanges.js +1 -2
  380. package/dist/core/scene/sceneEdits.js +1 -2
  381. package/dist/core/scene/sceneJournals.js +1 -2
  382. package/dist/core/scene/sceneMutators.js +2 -3
  383. package/dist/core/scene/scenePoseAdapter.js +1 -2
  384. package/dist/core/scene/sceneRecording.js +1 -2
  385. package/dist/core/scene/sceneSelection.js +8 -5
  386. package/dist/core/scene/sceneSelection.js.map +1 -1
  387. package/dist/core/scene/sceneState.js +3 -4
  388. package/dist/core/scene/scrollOffsets.js +1 -2
  389. package/dist/core/scene/serialization.js +2 -3
  390. package/dist/core/scene/staleReplay.js +1 -2
  391. package/dist/core/scene/statedFields.js +1 -2
  392. package/dist/core/scene/strategyView.js +1 -2
  393. package/dist/core/scene/treeEdits.js +2 -3
  394. package/dist/core/scene/treeOrder.js +1 -2
  395. package/dist/core/scene/treeReads.js +1 -2
  396. package/dist/core/scene/treeShape.js +1 -2
  397. package/dist/core/scene/types.js +1 -2
  398. package/dist/core/scene/types.js.map +1 -1
  399. package/dist/core/scene/unionOfChildren.js +1 -2
  400. package/dist/core/scene/unitScopes.js +20 -4
  401. package/dist/core/scene/unitScopes.js.map +1 -1
  402. package/dist/core/scene/useScene.js +2 -3
  403. package/dist/core/scene/worldSave.js +2 -3
  404. package/dist/core/selection/chromeState.js +1 -2
  405. package/dist/core/selection/outermostSelection.js +56 -0
  406. package/dist/core/selection/outermostSelection.js.map +1 -0
  407. package/dist/core/selection/readOnlySelection.js +1 -2
  408. package/dist/core/selection/selectionTarget.js +1 -2
  409. package/dist/core/selection/usePublishSceneSelection.js +1 -2
  410. package/dist/core/selection/useSelection.js +1 -2
  411. package/dist/core/shapeKinds.js +1 -2
  412. package/dist/core/stableStringify.js +1 -2
  413. package/dist/core/stylus/stylus.js +1 -2
  414. package/dist/core/stylus/usePointerStylus.js +1 -2
  415. package/dist/core/usePaintKinds.js +1 -2
  416. package/dist/core/viewport/clampView.js +1 -2
  417. package/dist/core/viewport/clientToWorld.js +1 -2
  418. package/dist/core/viewport/createVelocityTracker.js +1 -2
  419. package/dist/core/viewport/fitToBounds.js +1 -2
  420. package/dist/core/viewport/fitViewToBounds.js +1 -2
  421. package/dist/core/viewport/interpolateView.js +1 -2
  422. package/dist/core/viewport/parallax.js +1 -2
  423. package/dist/core/viewport/sceneNodeClientRect.js +1 -2
  424. package/dist/core/viewport/screenSlop.js +1 -2
  425. package/dist/core/viewport/useAutoCenter.js +1 -2
  426. package/dist/core/viewport/useCanvasSize.js +1 -2
  427. package/dist/core/viewport/useDecayLoop.js +1 -2
  428. package/dist/core/viewport/useNodeOverlayFrame.js +1 -2
  429. package/dist/core/viewport/useVelocityTracker.js +1 -2
  430. package/dist/core/viewport/useViewAnimation.js +3 -4
  431. package/dist/core/viewport/view.js +1 -2
  432. package/dist/core/viewport/viewTransform.js +1 -2
  433. package/dist/core/viewport/viewportWorldRect.js +1 -2
  434. package/dist/core/viewport/wheelHandler.js +1 -2
  435. package/dist/core/viewport/zoomAt.js +2 -3
  436. package/dist/core/viewport/zoomBounds.js +1 -2
  437. package/dist/debug/createDebugOverlayLayer.js +1 -2
  438. package/dist/debug/createDebugSink.js +1 -2
  439. package/dist/debug/defaultTheme.js +1 -2
  440. package/dist/debug/features.js +1 -2
  441. package/dist/debug/frameStats.js +1 -2
  442. package/dist/debug/overlayPanels.js +1 -2
  443. package/dist/debug/parseDebugFlags.js +1 -2
  444. package/dist/debug/useDebugSink.js +2 -3
  445. package/dist/{depSchema-ChQPzEkW.d.ts → depSchema-C7a_OMt-.d.ts} +61 -52
  446. package/dist/devtools/handlers.js +1 -2
  447. package/dist/devtools/history.js +1 -2
  448. package/dist/devtools/hook.js +1 -2
  449. package/dist/devtools/label.js +1 -2
  450. package/dist/devtools/notices.js +1 -2
  451. package/dist/devtools/protocol.js +1 -2
  452. package/dist/devtools/registry.js +1 -2
  453. package/dist/devtools/root.js +1 -2
  454. package/dist/devtools/serialize.js +1 -2
  455. package/dist/devtools/session.js +2 -3
  456. package/dist/devtools/transport.js +1 -2
  457. package/dist/devtools/useDevtoolsRoot.js +1 -2
  458. package/dist/devtools-protocol.d.ts +1 -1
  459. package/dist/devtools-protocol.js +2 -2
  460. package/dist/devtools.d.ts +1 -1
  461. package/dist/devtools.js +1 -2
  462. package/dist/domains/chrome-caps/buildChromeCtx.js +1 -2
  463. package/dist/domains/chrome-caps/conditions.js +1 -2
  464. package/dist/domains/chrome-caps/defaults.js +1 -2
  465. package/dist/domains/chrome-caps/resolve.js +2 -3
  466. package/dist/domains/chrome-caps/useChromeCaps.js +1 -2
  467. package/dist/domains/chrome-caps/useHoverTracking.js +1 -2
  468. package/dist/domains/ingestion/contentHandlers.js +1 -2
  469. package/dist/domains/ingestion/ghost.js +2 -3
  470. package/dist/domains/ingestion/imageHandler.js +1 -2
  471. package/dist/domains/ingestion/kitHandlers.js +2 -3
  472. package/dist/domains/ingestion/openFilePicker.js +1 -2
  473. package/dist/domains/ingestion/placement.js +1 -2
  474. package/dist/domains/ingestion/svgHandler.js +1 -2
  475. package/dist/domains/ingestion/textHandler.js +1 -2
  476. package/dist/domains/ingestion/useCanvasIngestion.js +1 -2
  477. package/dist/domains/ingestion/weaselJsonHandler.js +2 -3
  478. package/dist/domains/longPress/longPressFeedback.js +1 -2
  479. package/dist/domains/measure/actionIds.js +1 -2
  480. package/dist/domains/measure/measureCommands.js +6 -7
  481. package/dist/domains/measure/measureContribution.js +3 -4
  482. package/dist/domains/measure/measureEdits.js +3 -4
  483. package/dist/domains/measure/measureGestures.js +2 -3
  484. package/dist/domains/measure/measureHit.js +3 -4
  485. package/dist/domains/measure/measureLayer.js +3 -4
  486. package/dist/domains/measure/measurement.js +1 -2
  487. package/dist/domains/measure/measurements.js +1 -2
  488. package/dist/domains/modes/modeLayers.js +1 -2
  489. package/dist/domains/modes/modeTriggers.js +1 -2
  490. package/dist/domains/pathEffects/effectSources.js +2 -3
  491. package/dist/domains/pathEffects/index.js +1 -2
  492. package/dist/domains/pathEffects/readSource.js +3 -4
  493. package/dist/domains/pathEffects/textItems.js +1 -2
  494. package/dist/domains/pathEffects/useEffectSourcesLayer.js +3 -4
  495. package/dist/domains/paths/anchorData.js +1 -2
  496. package/dist/domains/paths/anchorMarkers.js +1 -2
  497. package/dist/domains/paths/editablePath.js +3 -4
  498. package/dist/domains/paths/originProjection.js +1 -2
  499. package/dist/domains/paths/pathEditExtension.js +1 -2
  500. package/dist/domains/paths/pathEditState.js +1 -2
  501. package/dist/domains/paths/pathEditingOverlayLayer.js +2 -3
  502. package/dist/domains/paths/pathLayer.js +1 -2
  503. package/dist/domains/paths/pathRepresentation.js +1 -2
  504. package/dist/domains/paths/pathSnap/glyphs.js +1 -2
  505. package/dist/domains/paths/pathSnap/pathSnapSource.js +1 -2
  506. package/dist/domains/paths/pathSnap/sceneIndex.js +1 -2
  507. package/dist/domains/paths/pathSnap/snapGeometry.js +2 -3
  508. package/dist/domains/paths/penPreviewLayer.js +1 -2
  509. package/dist/domains/paths/shapeGenerator.js +1 -2
  510. package/dist/domains/paths/strokeOutline.js +2 -3
  511. package/dist/domains/paths/useAnchorFields.js +1 -2
  512. package/dist/domains/paths/usePathEdit.js +2 -3
  513. package/dist/domains/poseRun/usePoseRun.js +1 -2
  514. package/dist/domains/selection/enteredGroupFrame.js +1 -2
  515. package/dist/domains/selection/enteredGroupScope.js +1 -2
  516. package/dist/domains/selection/enteredOperands.js +1 -2
  517. package/dist/domains/selection/handleCommands.js +2 -3
  518. package/dist/domains/selection/overlay.js +6 -7
  519. package/dist/domains/selection/selectionPose.js +2 -3
  520. package/dist/domains/snap/angle2d.js +1 -2
  521. package/dist/domains/snap/debugCandidates.js +1 -2
  522. package/dist/domains/snap/gather.js +1 -2
  523. package/dist/domains/snap/inputSubspace.js +2 -3
  524. package/dist/domains/snap/lazySession.js +1 -2
  525. package/dist/domains/snap/marks.js +1 -2
  526. package/dist/domains/snap/outcomeStore.js +1 -2
  527. package/dist/domains/snap/pointSnap.js +1 -2
  528. package/dist/domains/snap/probes2d.js +1 -2
  529. package/dist/domains/snap/readoutDraw.js +1 -2
  530. package/dist/domains/snap/readoutLayer.js +1 -2
  531. package/dist/domains/snap/registry.js +1 -2
  532. package/dist/domains/snap/resizeBox.js +1 -2
  533. package/dist/domains/snap/roles.js +1 -2
  534. package/dist/domains/snap/rotationSource.js +1 -2
  535. package/dist/domains/snap/sceneReads.js +2 -3
  536. package/dist/domains/snap/sceneSession2d.js +2 -3
  537. package/dist/domains/snap/screen.js +2 -3
  538. package/dist/domains/snap/session2d.js +4 -5
  539. package/dist/domains/snap/spanSnap.js +1 -2
  540. package/dist/domains/snap/stepAngles.js +1 -2
  541. package/dist/domains/text/editingDrawOne.js +1 -2
  542. package/dist/domains/text/hostTextEditors.js +1 -2
  543. package/dist/domains/text/sceneTextDrafts.js +1 -2
  544. package/dist/domains/text/textHitAt.js +4 -5
  545. package/dist/domains/text/textLayer.js +12 -2
  546. package/dist/domains/text/textLayer.js.map +1 -1
  547. package/dist/domains/text/useSceneTextEdit.js +4 -5
  548. package/dist/domains/viewports/aim.js +3 -4
  549. package/dist/domains/viewports/viewMarker.js +1 -2
  550. package/dist/domains/viewports/viewMarkerDrag.js +1 -2
  551. package/dist/domains/viewports/viewResolver.js +1 -2
  552. package/dist/domains/viewports/viewportLayer.js +1 -2
  553. package/dist/iconRegistry/IconRegistryProvider.js +1 -2
  554. package/dist/iconRegistry/useIconGlyph.js +1 -2
  555. package/dist/iconRegistry/useIconVariant.js +1 -2
  556. package/dist/icons.table.js +1 -2
  557. package/dist/icons2.table.js +1 -2
  558. package/dist/index.d.ts +51 -7
  559. package/dist/index.js +3 -2
  560. package/dist/input/keyState.js +1 -2
  561. package/dist/input/useKeyModifiers.js +1 -2
  562. package/dist/input/useKeyState.js +1 -2
  563. package/dist/interactions/actions/admitsChild.js +1 -2
  564. package/dist/interactions/actions/align/action.js +6 -7
  565. package/dist/interactions/actions/align/align.js +6 -7
  566. package/dist/interactions/actions/booleans/action.js +1 -2
  567. package/dist/interactions/actions/booleans/booleanGroupAction.js +2 -3
  568. package/dist/interactions/actions/booleans/booleans.js +1 -2
  569. package/dist/interactions/actions/booleans/commit.js +4 -5
  570. package/dist/interactions/actions/booleans/custom.js +2 -3
  571. package/dist/interactions/actions/booleans/keymap.js +1 -2
  572. package/dist/interactions/actions/booleans/operands.js +1 -2
  573. package/dist/interactions/actions/booleans/pieces.js +1 -2
  574. package/dist/interactions/actions/booleans/placement.js +1 -2
  575. package/dist/interactions/actions/booleans/useBooleans.js +1 -2
  576. package/dist/interactions/actions/booleans/useBooleansAdapter.js +1 -2
  577. package/dist/interactions/actions/clipboard/action.js +2 -3
  578. package/dist/interactions/actions/clipboard/clipboardOps.js +2 -3
  579. package/dist/interactions/actions/clipboard/materializePaste.js +1 -2
  580. package/dist/interactions/actions/clipboard/wireFormat.js +1 -2
  581. package/dist/interactions/actions/clone/action.js +7 -8
  582. package/dist/interactions/actions/clone/behaviors.js +4 -5
  583. package/dist/interactions/actions/defaultCommitAdapter.js +2 -3
  584. package/dist/interactions/actions/defaults/anchorEditing.js +3 -4
  585. package/dist/interactions/actions/defaults/anchorFields.js +1 -2
  586. package/dist/interactions/actions/defaults/anchorHandles.js +2 -3
  587. package/dist/interactions/actions/defaults/anchorJoin.js +2 -3
  588. package/dist/interactions/actions/defaults/areaSelect.js +6 -6
  589. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  590. package/dist/interactions/actions/defaults/bendSegment.js +3 -4
  591. package/dist/interactions/actions/defaults/cancelGesture.js +1 -2
  592. package/dist/interactions/actions/defaults/clearSelection.js +1 -2
  593. package/dist/interactions/actions/defaults/containerScroll.js +4 -5
  594. package/dist/interactions/actions/defaults/contextMenu.js +6 -7
  595. package/dist/interactions/actions/defaults/copySubtree.js +2 -3
  596. package/dist/interactions/actions/defaults/createPaintAction.js +3 -4
  597. package/dist/interactions/actions/defaults/delete.js +2 -3
  598. package/dist/interactions/actions/defaults/duplicate.js +5 -6
  599. package/dist/interactions/actions/defaults/enterGroup.js +2 -3
  600. package/dist/interactions/actions/defaults/enterPathEdit.js +1 -2
  601. package/dist/interactions/actions/defaults/enterTextEdit.js +1 -2
  602. package/dist/interactions/actions/defaults/escape.js +1 -2
  603. package/dist/interactions/actions/defaults/exitPathEdit.js +1 -2
  604. package/dist/interactions/actions/defaults/group.js +6 -7
  605. package/dist/interactions/actions/defaults/ingest.js +3 -4
  606. package/dist/interactions/actions/defaults/insertPathAnchor.js +2 -3
  607. package/dist/interactions/actions/defaults/nudge.js +3 -4
  608. package/dist/interactions/actions/defaults/nudgeSteps.js +2 -3
  609. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
  610. package/dist/interactions/actions/defaults/pathEditMarks.js +1 -2
  611. package/dist/interactions/actions/defaults/pinchZoom.js +3 -4
  612. package/dist/interactions/actions/defaults/reorder.js +2 -3
  613. package/dist/interactions/actions/defaults/requiresSelection.js +1 -2
  614. package/dist/interactions/actions/defaults/segmentUnder.js +1 -2
  615. package/dist/interactions/actions/defaults/selectAll.js +1 -2
  616. package/dist/interactions/actions/defaults/selectDeep.js +1 -2
  617. package/dist/interactions/actions/defaults/setFill.js +1 -2
  618. package/dist/interactions/actions/defaults/setFillOpacity.js +1 -2
  619. package/dist/interactions/actions/defaults/setStroke.js +1 -2
  620. package/dist/interactions/actions/defaults/setStrokeOpacity.js +1 -2
  621. package/dist/interactions/actions/defaults/slice.js +1 -2
  622. package/dist/interactions/actions/defaults/sliceOps.js +1 -2
  623. package/dist/interactions/actions/defaults/toolActivate.js +1 -2
  624. package/dist/interactions/actions/defaults/toolResetToDefault.js +1 -2
  625. package/dist/interactions/actions/defaults/undoRedo.js +1 -2
  626. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -2
  627. package/dist/interactions/actions/defaults/viewportWheelPan.js +1 -2
  628. package/dist/interactions/actions/defaults/viewportZoom.js +3 -4
  629. package/dist/interactions/actions/distribute/action.js +4 -5
  630. package/dist/interactions/actions/distribute/distribute.js +5 -6
  631. package/dist/interactions/actions/distribute/plan.js +1 -2
  632. package/dist/interactions/actions/drawnBoxes.js +4 -5
  633. package/dist/interactions/actions/dropVerdict.js +1 -2
  634. package/dist/interactions/actions/edit-anchors/action.js +4 -5
  635. package/dist/interactions/actions/edit-anchors/extensionDrags.js +1 -2
  636. package/dist/interactions/actions/edit-anchors/geometry.js +1 -2
  637. package/dist/interactions/actions/edit-anchors/handleDrag.js +1 -2
  638. package/dist/interactions/actions/edit-anchors/handles.js +1 -2
  639. package/dist/interactions/actions/edit-anchors/params.js +1 -2
  640. package/dist/interactions/actions/edit-anchors/preview.js +1 -2
  641. package/dist/interactions/actions/edit-anchors/symmetry.js +1 -2
  642. package/dist/interactions/actions/flip/action.js +8 -9
  643. package/dist/interactions/actions/flip/helpers.js +1 -2
  644. package/dist/interactions/actions/geometryProjection.js +1 -2
  645. package/dist/interactions/actions/gestureFrames.js +3 -4
  646. package/dist/interactions/actions/gestureLifecycle.js +1 -2
  647. package/dist/interactions/actions/hitSelection.js +7 -3
  648. package/dist/interactions/actions/hitSelection.js.map +1 -1
  649. package/dist/interactions/actions/insert/action.js +6 -7
  650. package/dist/interactions/actions/insert/commit.js +2 -3
  651. package/dist/interactions/actions/insert/extras.js +1 -2
  652. package/dist/interactions/actions/insert/frame.js +1 -2
  653. package/dist/interactions/actions/insert/geometry.js +1 -2
  654. package/dist/interactions/actions/insert/params.js +2 -3
  655. package/dist/interactions/actions/insert/parent.js +1 -2
  656. package/dist/interactions/actions/insert/placeAction.js +5 -6
  657. package/dist/interactions/actions/insert/repositionAction.js +1 -2
  658. package/dist/interactions/actions/insert/rotateAction.js +1 -2
  659. package/dist/interactions/actions/insert/session.js +5 -6
  660. package/dist/interactions/actions/insert/shape.js +2 -3
  661. package/dist/interactions/actions/lasso-select/action.js +9 -9
  662. package/dist/interactions/actions/lasso-select/action.js.map +1 -1
  663. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +2 -3
  664. package/dist/interactions/actions/magnification.js +37 -0
  665. package/dist/interactions/actions/magnification.js.map +1 -0
  666. package/dist/interactions/actions/move/action.js +2 -3
  667. package/dist/interactions/actions/move/behaviors/layoutDrop.js +2 -3
  668. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +2 -3
  669. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +1 -2
  670. package/dist/interactions/actions/move/behaviors/snapToContainer.js +2 -3
  671. package/dist/interactions/actions/move/capture.js +6 -7
  672. package/dist/interactions/actions/move/commit/index.js +2 -3
  673. package/dist/interactions/actions/move/commit/layoutDrop.js +4 -5
  674. package/dist/interactions/actions/move/commit/layoutRelease.js +7 -8
  675. package/dist/interactions/actions/move/commit/rebase.js +2 -3
  676. package/dist/interactions/actions/move/commit/reparent.js +5 -6
  677. package/dist/interactions/actions/move/delta.js +2 -3
  678. package/dist/interactions/actions/move/frame.js +2 -3
  679. package/dist/interactions/actions/move/gestureAdapter.js +1 -2
  680. package/dist/interactions/actions/move/landedDescendants.js +2 -3
  681. package/dist/interactions/actions/move/layout/container.js +3 -4
  682. package/dist/interactions/actions/move/layout/dragged.js +2 -3
  683. package/dist/interactions/actions/move/layout/dropPass.js +5 -6
  684. package/dist/interactions/actions/move/layout/exits.js +2 -3
  685. package/dist/interactions/actions/move/layout/glide.js +2 -3
  686. package/dist/interactions/actions/move/layout/view.js +1 -2
  687. package/dist/interactions/actions/move/refusal.js +2 -3
  688. package/dist/interactions/actions/move/session.js +4 -5
  689. package/dist/interactions/actions/move/translate.js +2 -3
  690. package/dist/interactions/actions/moveNodes.js +5 -6
  691. package/dist/interactions/actions/notices.js +1 -2
  692. package/dist/interactions/actions/outlines/createOutlines.js +1 -2
  693. package/dist/interactions/actions/outlines/createOutlinesAction.js +2 -3
  694. package/dist/interactions/actions/outlines/outlineStroke.js +2 -3
  695. package/dist/interactions/actions/outlines/outlineStrokeAction.js +2 -3
  696. package/dist/interactions/actions/outlines/replaceWithPaths.js +5 -6
  697. package/dist/interactions/actions/outlines/strokeRegion.js +1 -2
  698. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +1 -2
  699. package/dist/interactions/actions/pathCommands/cutJoin.js +3 -4
  700. package/dist/interactions/actions/pathCommands/livePathEdit.js +3 -4
  701. package/dist/interactions/actions/pathCommands/pathNodes.js +3 -4
  702. package/dist/interactions/actions/pathCommands/simplifyOffset.js +2 -3
  703. package/dist/interactions/actions/pathGestureTags.js +1 -2
  704. package/dist/interactions/actions/planeInput.js +2 -3
  705. package/dist/interactions/actions/pointerState.js +1 -2
  706. package/dist/interactions/actions/poseDescriptorDep.js +1 -2
  707. package/dist/interactions/actions/poseFrame.js +3 -4
  708. package/dist/interactions/actions/resize/action.js +3 -4
  709. package/dist/interactions/actions/resize/aspect.js +1 -2
  710. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +1 -2
  711. package/dist/interactions/actions/resize/boxFrame.js +1 -2
  712. package/dist/interactions/actions/resize/capture.js +7 -8
  713. package/dist/interactions/actions/resize/commit.js +3 -4
  714. package/dist/interactions/actions/resize/cornerHandles.js +1 -2
  715. package/dist/interactions/actions/resize/frame.js +7 -8
  716. package/dist/interactions/actions/resize/held.js +2 -3
  717. package/dist/interactions/actions/resize/minimum.js +1 -2
  718. package/dist/interactions/actions/resize/replay.js +1 -2
  719. package/dist/interactions/actions/resize/ruleBounds.js +1 -2
  720. package/dist/interactions/actions/resize/session.js +9 -10
  721. package/dist/interactions/actions/resolveOverlays.js +1 -2
  722. package/dist/interactions/actions/resolvePreviews.js +3 -4
  723. package/dist/interactions/actions/rotate/action.js +5 -6
  724. package/dist/interactions/actions/rotate/commit.js +2 -3
  725. package/dist/interactions/actions/rotate/frame.js +3 -4
  726. package/dist/interactions/actions/rotate/geometry.js +1 -2
  727. package/dist/interactions/actions/rotate/handle.js +2 -3
  728. package/dist/interactions/actions/rotate/replay.js +2 -3
  729. package/dist/interactions/actions/rotate/session.js +10 -11
  730. package/dist/interactions/actions/selectionSubtree.js +7 -22
  731. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  732. package/dist/interactions/actions/spatialReference.js +1 -2
  733. package/dist/interactions/actions/testUtils.js +1 -2
  734. package/dist/interactions/actions/transform-again/action.js +5 -6
  735. package/dist/interactions/actions/transform-again/memory.js +1 -2
  736. package/dist/interactions/actions/transformFinish.js +1 -2
  737. package/dist/interactions/actions/useActionSet.js +1 -2
  738. package/dist/interactions/actions/useNotices.js +1 -2
  739. package/dist/interactions/actions/useStandardActions.js +1 -2
  740. package/dist/interactions/gestures/dragGesture/dragGesture.js +1 -2
  741. package/dist/interactions/gestures/dragGesture/dragPointOf.js +1 -2
  742. package/dist/interactions/gestures/dragRadial/dragRadial.js +2 -3
  743. package/dist/interactions/gestures/dragRect/dragRect.js +2 -3
  744. package/dist/interactions/gestures/handleDrag/handleDrag.js +1 -2
  745. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +1 -2
  746. package/dist/interactions/gestures/shared/originProjection.js +1 -2
  747. package/dist/interactions/gestures/shared/screenTolerance.js +1 -2
  748. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +1 -2
  749. package/dist/kitSettingsSchema.js +4 -5
  750. package/dist/test-hook/createTestHook.js +1 -2
  751. package/dist/test-hook/install.js +1 -2
  752. package/dist/test-hook/useTestHook.js +1 -2
  753. package/dist/test-seams.d.ts +4 -4
  754. package/dist/test-seams.js +2 -2
  755. package/dist/tools/builtin/anchors/anchorsTool.js +1 -2
  756. package/dist/tools/builtin/ellipse/useEllipseTool.js +2 -3
  757. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +1 -2
  758. package/dist/tools/builtin/hand/dragPanContribution.js +1 -2
  759. package/dist/tools/builtin/hand/useHandTool.js +1 -2
  760. package/dist/tools/builtin/image/useImageTool.js +1 -2
  761. package/dist/tools/builtin/lasso/useLassoTool.js +1 -2
  762. package/dist/tools/builtin/line/useLineTool.js +2 -3
  763. package/dist/tools/builtin/measure/useMeasureTool.js +2 -3
  764. package/dist/tools/builtin/pen/penHandle.js +1 -2
  765. package/dist/tools/builtin/pen/usePenTool.js +6 -7
  766. package/dist/tools/builtin/pencil/usePencilTool.js +1 -2
  767. package/dist/tools/builtin/pickTopMostHit.js +1 -2
  768. package/dist/tools/builtin/polygon/usePolygonTool.js +3 -4
  769. package/dist/tools/builtin/pressTarget.js +1 -2
  770. package/dist/tools/builtin/rect/useRectTool.js +2 -3
  771. package/dist/tools/builtin/select/adapterPointQuery.js +3 -4
  772. package/dist/tools/builtin/select/collapseDeferred.js +1 -2
  773. package/dist/tools/builtin/select/groupEntry.js +2 -3
  774. package/dist/tools/builtin/select/pressDecision.js +3 -4
  775. package/dist/tools/builtin/select/pressDecision.js.map +1 -1
  776. package/dist/tools/builtin/select/selectionContributions.js +1 -2
  777. package/dist/tools/builtin/select/useSelectTool.js +5 -6
  778. package/dist/tools/builtin/shared/insertToolOptions.js +1 -2
  779. package/dist/tools/builtin/shared/pointerFollower.js +1 -2
  780. package/dist/tools/builtin/slice/useSliceTool.js +5 -6
  781. package/dist/tools/builtin/star/useStarTool.js +3 -4
  782. package/dist/tools/builtin/sticky/stickyNode.js +1 -2
  783. package/dist/tools/builtin/sticky/useStickyTool.js +2 -3
  784. package/dist/tools/builtin/text/useTextTool.js +1 -2
  785. package/dist/tools/index.js +2 -2
  786. package/dist/tools/overlayBinding.js +1 -2
  787. package/dist/tools/toolOptions.js +17 -4
  788. package/dist/tools/toolOptions.js.map +1 -1
  789. package/dist/tools/useKeybindings.js +1 -2
  790. package/dist/{types-DW14eu9B.d.ts → types-BUvUXZe5.d.ts} +3 -3
  791. package/dist/util/color.js +1 -2
  792. package/dist/util/paint.js +1 -2
  793. package/dist/version.js +2 -3
  794. package/package.json +27 -27
@@ -1,4 +1,4 @@
1
- //#region src/canvas/renderNeeds.ts
1
+ // src/canvas/renderNeeds.ts
2
2
  /**
3
3
  * The fonts and paint kinds `commands` draw with, read off the commands
4
4
  * themselves: text runs, path fills and strokes, run fills and strokes, and
@@ -35,6 +35,5 @@ function renderNeeds(commands) {
35
35
  };
36
36
  }
37
37
 
38
- //#endregion
39
38
  export { renderNeeds };
40
39
  //# sourceMappingURL=renderNeeds.js.map
@@ -1,15 +1,15 @@
1
- import { sceneLayerKey } from "./sceneLayerPaint.js";
2
- import { CANVAS_CONTEXT_ATTRIBUTES } from "./contextAttributes.js";
3
- import { annotationLayerIds } from "../core/scene/annotation.js";
4
- import { defaultDrawOne } from "./defaultDrawOne.js";
5
1
  import { buildSceneViewCommands } from "./sceneViewRender.js";
2
+ import { defaultDrawOne } from "./defaultDrawOne.js";
6
3
  import { renderNeeds } from "./renderNeeds.js";
7
4
  import { straightTopDown } from "./rasterReadback.js";
5
+ import { annotationLayerIds } from "../core/scene/annotation.js";
6
+ import { sceneLayerKey } from "./sceneLayerPaint.js";
7
+ import { CANVAS_CONTEXT_ATTRIBUTES } from "./contextAttributes.js";
8
8
  import { WeaselRenderer, isPaintKindKnown, warmPaintKinds } from "@weasel-js/renderer";
9
9
  import { viewToMat3 as viewToMat3$1 } from "@weasel-js/geom";
10
10
  import { warmFonts } from "@weasel-js/font";
11
11
 
12
- //#region src/canvas/renderSceneToPixels.ts
12
+ // src/canvas/renderSceneToPixels.ts
13
13
  /**
14
14
  * `renderSceneToPixels` — headless rasterization of a scene-space rect to raw RGBA pixels at an
15
15
  * explicit, per-axis scale. It drives the same WebGL2 pipeline (`WeaselRenderer` +
@@ -237,6 +237,5 @@ function renderSceneToPixels(args) {
237
237
  }
238
238
  }
239
239
 
240
- //#endregion
241
240
  export { createRasterSession, planPixelRender, renderSceneToPixels, warmRender };
242
241
  //# sourceMappingURL=renderSceneToPixels.js.map
@@ -1,18 +1,48 @@
1
- import { composeWorldPose, composesFrames, frameAtOrAbove, memoizeCompose } from "../core/scene/composeFrame.js";
2
1
  import { definesFrame, effectivePose } from "../core/scene/effectivePose.js";
3
- import { poseDescriptorForNode, translatePoseViaDescriptor, visualBoundsViaDescriptor } from "../core/geometry/poseDescriptor.js";
4
- import { scrolledFrames } from "../core/scene/scrollOffsets.js";
5
- import { AUTO_POSE_DESCRIPTOR } from "../core/geometry/autoPoseDescriptor.js";
2
+ import { sceneMutators } from "../core/scene/sceneMutators.js";
6
3
  import { asNodeId } from "../core/scene/types.js";
7
4
  import { nodeGates } from "../core/scene/nodeGates.js";
8
- import { sceneMutators } from "../core/scene/sceneMutators.js";
9
5
  import { applyOpsTo } from "../core/applyOps.js";
10
6
  import { hitTestArea, hitTestLassoPolygon, regionPickOptions } from "./deps/hitTestArea.js";
7
+ import { poseDescriptorForNode, translatePoseViaDescriptor, visualBoundsViaDescriptor } from "../core/geometry/poseDescriptor.js";
8
+ import { AUTO_POSE_DESCRIPTOR } from "../core/geometry/autoPoseDescriptor.js";
9
+ import { composeChildFrame, composeWorldPose, composesFrames, frameAtOrAbove, memoizeCompose } from "../core/scene/composeFrame.js";
10
+ import { scrolledFrames } from "../core/scene/scrollOffsets.js";
11
11
  import { insertSite } from "./deps/insertSite.js";
12
12
  import { scenePoseTarget } from "../animation/poseTarget.js";
13
13
  import { pasteSceneSnapshot, snapshotSceneSelection } from "./sceneClipboard.js";
14
14
 
15
- //#region src/canvas/sceneAdapter.ts
15
+ // src/canvas/sceneAdapter.ts
16
+ /** A scene adapter's pose reads: the stored pose, the world pose, and the fold between them. */
17
+ function scenePoseReads(scene) {
18
+ const composes = composesFrames(scene.composition);
19
+ const compose = memoizeCompose(scene.composition.compose);
20
+ const childFrame = composes ? scrolledFrames(scene) : void 0;
21
+ const reads = {
22
+ getParent: (id) => scene.get(asNodeId(id))?.parent ?? null,
23
+ getPose(id) {
24
+ const n = scene.get(asNodeId(id));
25
+ if (!n) throw new Error(`sceneToAdapter: unknown node "${id}"`);
26
+ return effectivePose(scene, n);
27
+ },
28
+ definesFrame(id) {
29
+ const n = scene.get(asNodeId(id));
30
+ return n === void 0 || definesFrame(n);
31
+ },
32
+ ...childFrame ? { childFrame } : {}
33
+ };
34
+ return {
35
+ getPose: reads.getPose,
36
+ definesFrame: reads.definesFrame,
37
+ getWorldPose: (id) => composes ? composeWorldPose(reads, id, compose) : reads.getPose(id),
38
+ worldOfStored(id, stored) {
39
+ const frame = composes ? frameAtOrAbove(reads, reads.getParent(id)) : null;
40
+ return frame === null ? stored : compose(composeChildFrame(reads, frame, compose), stored);
41
+ },
42
+ ...composes ? { composePose: compose } : {},
43
+ ...childFrame ? { childFrame } : {}
44
+ };
45
+ }
16
46
  /** Derive the adapter for a scene. Reads go straight to the scene; writes are
17
47
  * ops applied through its history, so anything done through the adapter is
18
48
  * undoable. A container's pose is a frame its children are stored in, so the
@@ -24,10 +54,6 @@ function sceneToAdapter(scene, options = {}) {
24
54
  const d = options.poseDescriptor ?? AUTO_POSE_DESCRIPTOR;
25
55
  const poseBounds = (p, node) => visualBoundsViaDescriptor(p, poseDescriptorForNode(d, node));
26
56
  const translate = (p, dx, dy, node) => translatePoseViaDescriptor(p, dx, dy, node === void 0 ? d : poseDescriptorForNode(d, node));
27
- const composition = scene.composition;
28
- const composes = composesFrames(composition);
29
- const compose = memoizeCompose(composition.compose);
30
- const childFrame = composes ? scrolledFrames(scene) : void 0;
31
57
  const pickOpts = {};
32
58
  const pickOptsFor = (view) => view ? {
33
59
  ...pickOpts,
@@ -47,22 +73,7 @@ function sceneToAdapter(scene, options = {}) {
47
73
  const gates = nodeGates(scene);
48
74
  return scene.renderOrderNodes().filter((n) => !gates.hidden(n.id));
49
75
  },
50
- getPose(id) {
51
- const nid = asNodeId(id);
52
- const n = scene.get(nid);
53
- if (!n) throw new Error(`sceneToAdapter: unknown node "${id}"`);
54
- return effectivePose(scene, n);
55
- },
56
- definesFrame(id) {
57
- const n = scene.get(asNodeId(id));
58
- return n === void 0 || definesFrame(n);
59
- },
60
- getWorldPose(id) {
61
- if (!composes) return adapter.getPose(id);
62
- return composeWorldPose(adapter, id, compose);
63
- },
64
- ...composes ? { composePose: compose } : {},
65
- ...childFrame ? { childFrame } : {},
76
+ ...scenePoseReads(scene),
66
77
  poseTarget: (id, descriptor) => scenePoseTarget(scene, id, descriptor ?? d),
67
78
  getLayers: () => scene.layers.map((l) => ({
68
79
  id: l.id,
@@ -112,6 +123,5 @@ function sceneToAdapter(scene, options = {}) {
112
123
  return adapter;
113
124
  }
114
125
 
115
- //#endregion
116
126
  export { sceneToAdapter };
117
127
  //# sourceMappingURL=sceneAdapter.js.map
@@ -1 +1 @@
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 { memoizeCompose } from 'core/scene/composeFrame';\nimport { scrolledFrames } from 'core/scene/scrollOffsets';\nimport { insertSite } from './deps/insertSite';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\nimport { scenePoseTarget } from '../animation/poseTarget';\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 /** The frame a container gives its children, scrolled by the scene's\n * `scroll` offset — see `PoseAdapter.childFrame`. Present only when the\n * composition can scroll. */\n childFrame?(id: string, world: 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 /** The container a paste lands in, read at each paste: `<SceneCanvas>` passes the `insertInto` dep's. */\n pasteInto?: () => string | null;\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. A container's pose is a frame its children are stored in, so the\n * one pose written moves its contents. */\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(p, dx, dy, node === undefined ? d : poseDescriptorForNode(d, node));\n\n const composition = scene.composition;\n const composes = composesFrames(composition);\n const compose = memoizeCompose(composition.compose);\n const childFrame = composes ? scrolledFrames(scene) : undefined;\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 clipboardEnv: SceneClipboardEnv<TData, TLayer, TPose> = {\n scene,\n worldPoseOf: (id) => adapter.getWorldPose(id),\n frameAtOrAbove: (id) => frameAtOrAbove(adapter, id),\n poseBounds,\n translate, ...(options.pasteInto ? { landing: () => insertSite(scene as never, options.pasteInto!()) } : {}),\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, 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: compose } : {}),\n ...(childFrame ? { childFrame } : {}),\n poseTarget: (id, descriptor) => scenePoseTarget(scene, id, descriptor ?? d),\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. Groups 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 { includeGroups: 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 { includeGroups: 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: 'mark',\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 { composeChildFrame, composesFrames, composeWorldPose, frameAtOrAbove, type PoseAdapter } from 'core/scene/composePose';\nimport { memoizeCompose } from 'core/scene/composeFrame';\nimport { scrolledFrames } from 'core/scene/scrollOffsets';\nimport { insertSite } from './deps/insertSite';\nimport type { Bounds } from '../core/viewport/fitViewToBounds';\nimport { scenePoseTarget } from '../animation/poseTarget';\nimport { pasteSceneSnapshot, snapshotSceneSelection, type SceneClipboardEnv } from './sceneClipboard';\n\n/** A scene adapter's pose reads: the stored pose, the world pose, and the fold between them. */\nfunction scenePoseReads<TData, TLayer extends string, TPose>(scene: Scene<TData, TLayer, TPose>) {\n const composes = composesFrames(scene.composition);\n const compose = memoizeCompose(scene.composition.compose);\n const childFrame = composes ? scrolledFrames(scene) : undefined;\n const reads: PoseAdapter<TPose> & { definesFrame(id: string): boolean } = {\n getParent: (id) => scene.get(asNodeId(id))?.parent ?? null,\n getPose(id) {\n const n = scene.get(asNodeId(id));\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 ...(childFrame ? { childFrame } : {}),\n };\n return {\n getPose: reads.getPose,\n definesFrame: reads.definesFrame,\n getWorldPose: (id: string): TPose => (composes ? composeWorldPose(reads, id, compose) : reads.getPose(id)),\n worldOfStored(id: string, stored: TPose): TPose {\n const frame = composes ? frameAtOrAbove(reads, reads.getParent(id)) : null;\n return frame === null ? stored : compose(composeChildFrame(reads, frame, compose), stored);\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: compose } : {}),\n ...(childFrame ? { childFrame } : {}),\n };\n}\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 /** Where `id` is drawn if it stores `stored`: `stored` folded into the\n * frame of its parent's world pose. */\n worldOfStored(id: string, stored: TPose): 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 /** The frame a container gives its children, scrolled by the scene's\n * `scroll` offset — see `PoseAdapter.childFrame`. Present only when the\n * composition can scroll. */\n childFrame?(id: string, world: 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 /** The container a paste lands in, read at each paste: `<SceneCanvas>` passes the `insertInto` dep's. */\n pasteInto?: () => string | null;\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. A container's pose is a frame its children are stored in, so the\n * one pose written moves its contents. */\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(p, dx, dy, node === undefined ? d : poseDescriptorForNode(d, node));\n\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 clipboardEnv: SceneClipboardEnv<TData, TLayer, TPose> = {\n scene,\n worldPoseOf: (id) => adapter.getWorldPose(id),\n frameAtOrAbove: (id) => frameAtOrAbove(adapter, id),\n poseBounds,\n translate, ...(options.pasteInto ? { landing: () => insertSite(scene as never, options.pasteInto!()) } : {}),\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 ...scenePoseReads(scene),\n poseTarget: (id, descriptor) => scenePoseTarget(scene, id, descriptor ?? d),\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. Groups 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 { includeGroups: 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 { includeGroups: 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: 'mark',\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,11 +1,24 @@
1
+ import { asNodeId } from "../core/scene/types.js";
2
+ import { hasChildren } from "../core/scene/treeShape.js";
1
3
  import { sourcesOf } from "../core/scene/dependents.js";
2
4
  import { definesFrame } from "../core/scene/effectivePose.js";
3
- import { asNodeId } from "../core/scene/types.js";
4
5
  import { NODE_FN_FIELDS, createNodeFnFields, fnFieldsOfNode, fnKeysOf } from "../core/scene/nodeFnFields.js";
5
6
  import { statedFields } from "../core/scene/statedFields.js";
6
- import { hasChildren } from "../core/scene/treeShape.js";
7
+ import { holderOf, outermost } from "@weasel-js/select";
7
8
 
8
- //#region src/canvas/sceneClipboard.ts
9
+ // src/canvas/sceneClipboard.ts
10
+ /**
11
+ * The scene adapter's clipboard seam: what a copy captures and what a paste
12
+ * mints from it.
13
+ *
14
+ * `pasteSceneSnapshot` is a pure factory — it mints fresh nodes and never
15
+ * touches the scene. Insertion happens through the caller's InsertOps (one per
16
+ * created node, parents before children).
17
+ *
18
+ * A snapshot item carries its node's function fields twice: live, for a paste
19
+ * in the same session, and as the scene's registry keys, for a snapshot that
20
+ * crossed JSON on the way back.
21
+ */
9
22
  function copyField(value) {
10
23
  if (Array.isArray(value)) return [...value];
11
24
  if (value !== null && typeof value === "object") return { ...value };
@@ -42,7 +55,8 @@ function snapshotSceneSelection(env, ids) {
42
55
  });
43
56
  if (hasChildren(n)) for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);
44
57
  };
45
- const covered = (id) => idSet.has(id) || scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a));
58
+ const parentOf = (id) => scene.get(asNodeId(id))?.parent;
59
+ const covered = (id) => holderOf(idSet, id, parentOf) !== null;
46
60
  const carrying = /* @__PURE__ */ new Set();
47
61
  const carrySources = (id) => {
48
62
  if (carrying.has(id)) return;
@@ -56,8 +70,7 @@ function snapshotSceneSelection(env, ids) {
56
70
  }
57
71
  if (hasChildren(n)) for (const cid of scene.childrenOf(asNodeId(id))) carrySources(cid);
58
72
  };
59
- for (const id of ids) {
60
- if (scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a))) continue;
73
+ for (const id of outermost(ids, parentOf)) {
61
74
  carrySources(id);
62
75
  capture(id, true);
63
76
  }
@@ -176,6 +189,5 @@ function pasteSceneSnapshot(env, clipboard, offset, ctx) {
176
189
  }));
177
190
  }
178
191
 
179
- //#endregion
180
192
  export { pasteSceneSnapshot, snapshotSceneSelection };
181
193
  //# sourceMappingURL=sceneClipboard.js.map
@@ -1 +1 @@
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 { hasChildren } from 'core/scene/treeShape';\nimport { sourcesOf } from 'core/scene/dependents';\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';\nimport type { InsertSite } from './deps/insertSite';\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 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 /** Where the pasted cluster's roots land; absent, or naming no parent, they keep their layer at the top of the tree. */\n landing?: () => InsertSite;\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\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 (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.children !== undefined ? { 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 (hasChildren(n)) {\n for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);\n }\n };\n const covered = (id: string): boolean =>\n idSet.has(id) || scene.ancestorsOf(asNodeId(id)).some((a) => idSet.has(a));\n // A hidden node cannot be selected, so one that a copied node derives from\n // comes with it, ahead of it: without it the paste would leave the copy out.\n const carrying = new Set<string>();\n const carrySources = (id: string): void => {\n if (carrying.has(id)) return;\n carrying.add(id);\n const n = scene.get(asNodeId(id));\n if (!n) return;\n for (const source of sourcesOf(n)) {\n if (taken.has(source) || covered(source) || scene.get(source)?.hidden !== true) continue;\n carrySources(source);\n capture(source, true);\n }\n if (hasChildren(n)) for (const cid of scene.childrenOf(asNodeId(id))) carrySources(cid);\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 carrySources(id);\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 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 = sourcesOf(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 // A node inside a pasted frame rides it, and offsetting it as well would\n // 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 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 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.x - minX;\n dy = ctx.dropPoint.y - minY;\n }\n }\n const site = env.landing?.();\n const into = site?.parent != null ? site : null;\n const placed = (item: Item<TData, TLayer, TPose>): TPose => {\n if (ridesPastedFrame(item)) return copyField(item.pose);\n const moved = env.translate(copyField(item.pose), dx, dy, item);\n return into && isRoot(item) ? into.local(moved) as TPose : moved;\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: into && isRoot(item) ? into.layer as TLayer : item.layer,\n parent: isRoot(item) ? into?.parent ?? null : idMap.get(item.parent as string)!,\n pose: placed(item),\n data: copyField(item.data),\n ...statedFields(item),\n ...(item.children !== undefined\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 : sourcesOf(item).length > 0\n ? { dependsOn: sourcesOf(item).map((dep) => idMap.get(dep)!) }\n : {}),\n ...fns.get(item.id),\n } as Node<TData, TLayer, TPose>));\n}\n"],"mappings":";;;;;;;;AAuCA,SAAS,UAAa,OAAa;CACjC,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC,GAAG,KAAK;CAC1C,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO,EAAE,GAAI,MAAiB;CAC/E,OAAO;AACT;AAKA,SAAgB,uBACd,KACA,KACmB;CACnB,MAAM,EAAE,UAAU;CAClB,MAAM,WAAW,mBAA0B,MAAM,QAAiB;CAClE,MAAM,QAAQ,IAAI,IAAI,GAAG;CACzB,MAAM,wBAAQ,IAAI,IAAY;CAC9B,MAAM,QAAsC,CAAC;CAK7C,MAAM,WAAW,GAA+B,WAA2B;EACzE,IAAI,QAAQ,OAAO,IAAI,YAAY,EAAE,EAAE;EACvC,MAAM,QAAQ,IAAI,eAAe,EAAE,MAAM;EACzC,OAAO,UAAU,QAAQ,MAAM,IAAI,KAAK,IAAI,EAAE,OAAO,IAAI,YAAY,EAAE,EAAE;CAC3E;CAIA,MAAM,WAAW,IAAY,SAAS,UAAgB;EACpD,IAAI,MAAM,IAAI,EAAE,GAAG;EACnB,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;EAChC,IAAI,CAAC,GAAG;EACR,MAAM,IAAI,EAAE;EACZ,MAAM,KAAK;GACT,MAAM,EAAE;GACR,IAAI,EAAE;GACN,OAAO,EAAE;GACT,QAAQ,EAAE;GACV,MAAM,UAAU,QAAQ,GAAG,MAAM,CAAC;GAClC,MAAM,UAAU,EAAE,IAAI;GACtB,GAAI,EAAE,aAAa,SAAY,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC;GAChE,GAAG,aAAa,CAAC;GACjB,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC;GACzE,GAAG,eAAe,CAAC;GACnB,GAAG,SAAS,UAAU,GAA+B,SAAS;EAChE,CAA+B;EAC/B,IAAI,YAAY,CAAC,GACf,KAAK,MAAM,OAAO,MAAM,WAAW,SAAS,EAAE,CAAC,GAAG,QAAQ,GAAG;CAEjE;CACA,MAAM,WAAW,OACf,MAAM,IAAI,EAAE,KAAK,MAAM,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,CAAC;CAG3E,MAAM,2BAAW,IAAI,IAAY;CACjC,MAAM,gBAAgB,OAAqB;EACzC,IAAI,SAAS,IAAI,EAAE,GAAG;EACtB,SAAS,IAAI,EAAE;EACf,MAAM,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;EAChC,IAAI,CAAC,GAAG;EACR,KAAK,MAAM,UAAU,UAAU,CAAC,GAAG;GACjC,IAAI,MAAM,IAAI,MAAM,KAAK,QAAQ,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,EAAE,WAAW,MAAM;GAChF,aAAa,MAAM;GACnB,QAAQ,QAAQ,IAAI;EACtB;EACA,IAAI,YAAY,CAAC,GAAG,KAAK,MAAM,OAAO,MAAM,WAAW,SAAS,EAAE,CAAC,GAAG,aAAa,GAAG;CACxF;CACA,KAAK,MAAM,MAAM,KAAK;EAGpB,IAAI,MAAM,YAAY,SAAS,EAAE,CAAC,CAAC,CAAC,MAAM,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG;EAC/D,aAAa,EAAE;EACf,QAAQ,IAAI,IAAI;CAClB;CACA,OAAO,EAAE,MAAM;AACjB;AAIA,IAAM,UAAU,UACd,OAAO,UAAU,cACb,OAAO,UAAU,YAAY,UAAU,QACtC,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,WAAW,OAAO,WAAW,UAAU;;;;;AAMzE,SAAS,iBACP,OACA,MACyB;CACzB,MAAM,MAA+B,CAAC;CACtC,MAAM,WAAW,MAAM;CACvB,KAAK,MAAM,QAAQ,gBAAgB;EACjC,MAAM,MAAM,KAAK,KAAK;EAEtB,MAAM,MADa,OAAO,QAAQ,WAAW,SAAS,KAAK,MAAM,GAAG,OAAO,YACjD,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS;EACxE,IAAI,OAAO,QAAW,IAAI,KAAK,SAAS;CAC1C;CACA,OAAO;AACT;;;;;;;;AASA,SAAS,UACP,KACA,KAC4B;CAC5B,MAAM,sBAAM,IAAI,IAA2B;CAC3C,MAAM,UAAU,IAAI,IAAI,IAAI,KAAK,SAAS,KAAK,EAAY,CAAC;CAC5D,KAAK,IAAI,UAAU,MAAM,UAAU;EACjC,UAAU;EACV,KAAK,MAAM,QAAQ,KAAK;GACtB,IAAI,IAAI,IAAI,KAAK,EAAE,GAAG;GACtB,IAAI;GACJ,MAAM,OAAO,UAAU,IAAI;GAC3B,MAAM,UAAU,KAAK,QAAQ,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC;GACtD,MAAM,KAAK,IAAI,IAAI,KAAK,EAAE;GAC1B,IAAI,KAAK,WAAW,QAAQ,IAAI,IAAI,KAAK,MAAM,GAC7C,WAAW;IAAE,IAAI,KAAK;IAAI,QAAQ;GAAuB;QACpD,IAAI,QAAQ,SAAS,GAC1B,WAAW;IAAE,IAAI,KAAK;IAAI,QAAQ;IAAyB;GAAQ;QAC9D,IAAI,KAAK,SAAS,KAAK,GAAG,eAAe,UAAa,GAAG,eAAe,QAC7E,WAAW;IAAE,IAAI,KAAK;IAAI,QAAQ;GAA4B;GAEhE,IAAI,aAAa,QAAW;GAC5B,IAAI,IAAI,KAAK,IAAI,QAAQ;GACzB,QAAQ,OAAO,KAAK,EAAE;GACtB,UAAU;EACZ;CACF;CACA,OAAO;AACT;AAEA,SAAgB,mBACd,KACA,WACA,QACA,KAC8B;CAC9B,MAAM,MAAM,UAAU;CACtB,IAAI,IAAI,WAAW,GAAG,OAAO,CAAC;CAC9B,MAAM,MAAM,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,KAAK,IAAc,iBAAiB,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC;CAC7F,MAAM,UAAU,UAAU,KAAK,GAAG;CAClC,IAAI,KAAK,QAAQ,KAAK,MAAM,QAAQ,KAAK;EACvC,MAAM,WAAW,QAAQ,IAAI,KAAK,EAAE;EACpC,IAAI,UAAU,IAAI,OAAO,QAAQ;CACnC;CACA,MAAM,MAAM,QAAQ,SAAS,IAAI,MAAM,IAAI,QAAQ,SAAS,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;CAEjF,MAAM,wBAAQ,IAAI,IAAoB;CACtC,KAAK,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK,IAAI,IAAI,MAAM,OAAO,CAAC;CAG7D,MAAM,UAAU,SACd,KAAK,WAAW,QAAQ,CAAC,MAAM,IAAI,KAAK,MAAM;CAGhD,MAAM,OAAO,IAAI,IAAI,IAAI,KAAK,SAAS,CAAC,KAAK,IAAc,IAAI,CAAC,CAAC;CACjE,MAAM,oBAAoB,SAA8C;EACtE,IAAI,IAAI,KAAK,WAAW,OAAO,SAAY,KAAK,IAAI,KAAK,MAAM;EAC/D,OAAO,MAAM,QAAW;GACtB,IAAI,aAAa,CAAC,GAAG,OAAO;GAC5B,IAAI,EAAE,WAAW,OAAO,SAAY,KAAK,IAAI,EAAE,MAAM;EACvD;EACA,OAAO;CACT;CACA,IAAI,KAAK,OAAO;CAChB,IAAI,KAAK,OAAO;CAChB,IAAI,KAAK,WAAW;EAGlB,IAAI,OAAO;EACX,IAAI,OAAO;EACX,KAAK,MAAM,QAAQ,KAAK;GACtB,IAAI,CAAC,OAAO,IAAI,GAAG;GACnB,MAAM,IAAI,IAAI,WAAW,KAAK,MAAM,IAAI;GACxC,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;GACzB,IAAI,EAAE,IAAI,MAAM,OAAO,EAAE;EAC3B;EACA,IAAI,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,IAAI,GAAG;GAClD,KAAK,IAAI,UAAU,IAAI;GACvB,KAAK,IAAI,UAAU,IAAI;EACzB;CACF;CACA,MAAM,OAAO,IAAI,UAAU;CAC3B,MAAM,OAAO,MAAM,UAAU,OAAO,OAAO;CAC3C,MAAM,UAAU,SAA4C;EAC1D,IAAI,iBAAiB,IAAI,GAAG,OAAO,UAAU,KAAK,IAAI;EACtD,MAAM,QAAQ,IAAI,UAAU,UAAU,KAAK,IAAI,GAAG,IAAI,IAAI,IAAI;EAC9D,OAAO,QAAQ,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,IAAa;CAC7D;CAGA,OAAO,IAAI,KAAK,UAAU;EACxB,IAAI,MAAM,IAAI,KAAK,EAAE;EACrB,MAAM,KAAK;EACX,OAAO,QAAQ,OAAO,IAAI,IAAI,KAAK,QAAkB,KAAK;EAC1D,QAAQ,OAAO,IAAI,IAAI,MAAM,UAAU,OAAO,MAAM,IAAI,KAAK,MAAgB;EAC7E,MAAM,OAAO,IAAI;EACjB,MAAM,UAAU,KAAK,IAAI;EACzB,GAAG,aAAa,IAAI;EACpB,GAAI,KAAK,aAAa,SAClB,EAAE,UAAU,KAAK,SAAS,QAAQ,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,CAAE,EAAE,IAChF,CAAC;EACL,GAAI,KAAK,cAAc,aACnB,EAAE,WAAW,WAAoB,IACjC,UAAU,IAAI,CAAC,CAAC,SAAS,IACvB,EAAE,WAAW,UAAU,IAAI,CAAC,CAAC,KAAK,QAAQ,MAAM,IAAI,GAAG,CAAE,EAAE,IAC3D,CAAC;EACP,GAAG,IAAI,IAAI,KAAK,EAAE;CACpB,EAAgC;AAClC"}
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 { holderOf, outermost } from '@weasel-js/select';\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 { hasChildren } from 'core/scene/treeShape';\nimport { sourcesOf } from 'core/scene/dependents';\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';\nimport type { InsertSite } from './deps/insertSite';\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 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 /** Where the pasted cluster's roots land; absent, or naming no parent, they keep their layer at the top of the tree. */\n landing?: () => InsertSite;\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\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 (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.children !== undefined ? { 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 (hasChildren(n)) {\n for (const cid of scene.childrenOf(asNodeId(id))) capture(cid);\n }\n };\n const parentOf = (id: string) => scene.get(asNodeId(id))?.parent;\n const covered = (id: string): boolean => holderOf(idSet, id, parentOf) !== null;\n // A hidden node cannot be selected, so one that a copied node derives from\n // comes with it, ahead of it: without it the paste would leave the copy out.\n const carrying = new Set<string>();\n const carrySources = (id: string): void => {\n if (carrying.has(id)) return;\n carrying.add(id);\n const n = scene.get(asNodeId(id));\n if (!n) return;\n for (const source of sourcesOf(n)) {\n if (taken.has(source) || covered(source) || scene.get(source)?.hidden !== true) continue;\n carrySources(source);\n capture(source, true);\n }\n if (hasChildren(n)) for (const cid of scene.childrenOf(asNodeId(id))) carrySources(cid);\n };\n // An id an ancestor holds comes with that ancestor's subtree walk.\n for (const id of outermost(ids, parentOf)) {\n carrySources(id);\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 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 = sourcesOf(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 // A node inside a pasted frame rides it, and offsetting it as well would\n // 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 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 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.x - minX;\n dy = ctx.dropPoint.y - minY;\n }\n }\n const site = env.landing?.();\n const into = site?.parent != null ? site : null;\n const placed = (item: Item<TData, TLayer, TPose>): TPose => {\n if (ridesPastedFrame(item)) return copyField(item.pose);\n const moved = env.translate(copyField(item.pose), dx, dy, item);\n return into && isRoot(item) ? into.local(moved) as TPose : moved;\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: into && isRoot(item) ? into.layer as TLayer : item.layer,\n parent: isRoot(item) ? into?.parent ?? null : idMap.get(item.parent as string)!,\n pose: placed(item),\n data: copyField(item.data),\n ...statedFields(item),\n ...(item.children !== undefined\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 : sourcesOf(item).length > 0\n ? { dependsOn: sourcesOf(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,6 +1,6 @@
1
1
  import { paintedLayers } from "../core/layers/render.js";
2
2
 
3
- //#region src/canvas/sceneLayerPaint.ts
3
+ // src/canvas/sceneLayerPaint.ts
4
4
  /**
5
5
  * Which scene layers a view paints.
6
6
  *
@@ -61,6 +61,5 @@ function paintedSceneLayers(layers, view) {
61
61
  return (layerOrder ? layerOrder.map((key) => layers.find((l) => sceneLayerKey(l.id) === key)).filter((l) => l !== void 0) : layers).filter((l) => layerVisibility?.[sceneLayerKey(l.id)] !== false);
62
62
  }
63
63
 
64
- //#endregion
65
64
  export { createSceneLayerGate, paintedSceneLayers, sceneLayerKey, viewPaintedLayers };
66
65
  //# sourceMappingURL=sceneLayerPaint.js.map
@@ -1,7 +1,7 @@
1
1
  import { asNodeId } from "../core/scene/types.js";
2
2
  import { sceneDerivedPathOf, showsComputedPath } from "./derivedPath.js";
3
3
 
4
- //#region src/canvas/scenePickReads.ts
4
+ // src/canvas/scenePickReads.ts
5
5
  /** Shared, never mutated: most scenes are flat and every node returns it. */
6
6
  var EMPTY_PARENTS = [];
7
7
  /** `(node) => its ancestors, innermost first`, stopping at a cycle or a missing parent. */
@@ -32,6 +32,5 @@ function sceneShownPathOf(scene) {
32
32
  };
33
33
  }
34
34
 
35
- //#endregion
36
35
  export { sceneParentsOf, sceneShownPathOf };
37
36
  //# sourceMappingURL=scenePickReads.js.map
@@ -1,14 +1,14 @@
1
- import { planeMap } from "../core/viewport/parallax.js";
2
- import { resolveDerivedPath } from "../core/scene/derivedPath.js";
3
- import { nodeAsShown, nodesAsShown } from "../core/scene/nodeAsShown.js";
4
1
  import { asNodeId } from "../core/scene/types.js";
2
+ import { resolveDerivedPath } from "../core/scene/derivedPath.js";
5
3
  import { annotationLayerIds } from "../core/scene/annotation.js";
6
4
  import { nodeGates } from "../core/scene/nodeGates.js";
5
+ import { planeMap } from "../core/viewport/parallax.js";
7
6
  import { scenePaintedPoseOf } from "./derivedPath.js";
8
- import { sceneParentsOf, sceneShownPathOf } from "./scenePickReads.js";
9
7
  import { indexedCandidates } from "./pickIndex/scenePickIndex.js";
8
+ import { sceneParentsOf, sceneShownPathOf } from "./scenePickReads.js";
9
+ import { nodeAsShown, nodesAsShown } from "../core/scene/nodeAsShown.js";
10
10
 
11
- //#region src/canvas/scenePickSource.ts
11
+ // src/canvas/scenePickSource.ts
12
12
  function scenePickSource(scene, opts = {}) {
13
13
  const gates = nodeGates(scene);
14
14
  const enumerable = typeof scene.overrides?.ids === "function";
@@ -69,6 +69,5 @@ function scenePlaneOf(layers, camera) {
69
69
  return (layer) => found.get(layer) ?? null;
70
70
  }
71
71
 
72
- //#endregion
73
72
  export { scenePickSource, scenePlaneOf };
74
73
  //# sourceMappingURL=scenePickSource.js.map
@@ -1,10 +1,10 @@
1
- import { nodeAsShown, shownLookup } from "../core/scene/nodeAsShown.js";
2
1
  import { withInheritedPaintBounds, withInheritedPaints } from "./inheritedPaints.js";
3
2
  import { sceneDerivedPathOf, sceneShownToPose, withDerivedPaths } from "./derivedPath.js";
4
3
  import { withColorOverrides } from "./colorOverrides.js";
4
+ import { nodeAsShown, shownLookup } from "../core/scene/nodeAsShown.js";
5
5
  import { withShownNode } from "./shownNodes.js";
6
6
 
7
- //#region src/canvas/sceneSlotWiring.ts
7
+ // src/canvas/sceneSlotWiring.ts
8
8
  /**
9
9
  * The alpha a view paints a node at: the view's own `alphaFor` times any
10
10
  * ephemeral override alpha.
@@ -32,6 +32,5 @@ function wireSceneSlotToScene(slot, scene, alphaFor, colorOverrides) {
32
32
  };
33
33
  }
34
34
 
35
- //#endregion
36
35
  export { composeAlphaFor, wireSceneSlotToScene };
37
36
  //# sourceMappingURL=sceneSlotWiring.js.map
@@ -1,19 +1,19 @@
1
- import { nodeAsShown, shownLookup } from "../core/scene/nodeAsShown.js";
2
- import { withInheritedPaintBounds, withInheritedPaints } from "./inheritedPaints.js";
3
- import { paintedSceneLayers } from "./sceneLayerPaint.js";
4
1
  import { paintCanvas, resolveDpr } from "./canvasRenderer.js";
5
2
  import { wrapNodeOutput } from "./wrapNodeOutput.js";
6
- import { sceneDerivedPathOf, withDerivedPaths } from "./derivedPath.js";
7
3
  import { buildSceneTree } from "./buildSceneTree.js";
8
4
  import { sceneToAdapter } from "./sceneAdapter.js";
5
+ import { withInheritedPaintBounds, withInheritedPaints } from "./inheritedPaints.js";
6
+ import { sceneDerivedPathOf, withDerivedPaths } from "./derivedPath.js";
9
7
  import { withColorOverrides } from "./colorOverrides.js";
8
+ import { paintedSceneLayers } from "./sceneLayerPaint.js";
10
9
  import { paintMissesView } from "./paintCull.js";
11
10
  import { paintBoundsFor } from "./defaultDrawOne.js";
11
+ import { nodeAsShown, shownLookup } from "../core/scene/nodeAsShown.js";
12
12
  import { withShownNode } from "./shownNodes.js";
13
13
  import { cullDrawCommands } from "@weasel-js/renderer";
14
14
  import { viewToMat3 as viewToMat3$1 } from "@weasel-js/geom";
15
15
 
16
- //#region src/canvas/sceneViewRender.ts
16
+ // src/canvas/sceneViewRender.ts
17
17
  /**
18
18
  * Present a `Scene` as the reading surface `buildSceneTree` walks: the scene
19
19
  * adapter's own reads, under this view's layer list.
@@ -104,6 +104,5 @@ function renderSceneToCanvas(args) {
104
104
  });
105
105
  }
106
106
 
107
- //#endregion
108
107
  export { buildSceneViewCommands, renderSceneToCanvas, sceneViewFrame };
109
108
  //# sourceMappingURL=sceneViewRender.js.map
@@ -1,6 +1,6 @@
1
1
  import { nodeAsShown } from "../core/scene/nodeAsShown.js";
2
2
 
3
- //#region src/canvas/shownNodes.ts
3
+ // src/canvas/shownNodes.ts
4
4
  /**
5
5
  * The scene walks' half of `PoseOverride.data`: handing painters and cull
6
6
  * bounds each node as the scene shows it, through `nodeAsShown`.
@@ -10,6 +10,5 @@ function withShownNode(overrides, fn) {
10
10
  return (node, a, b, c) => fn(nodeAsShown(overrides, node), a, b, c);
11
11
  }
12
12
 
13
- //#endregion
14
13
  export { withShownNode };
15
14
  //# sourceMappingURL=shownNodes.js.map
@@ -2,7 +2,7 @@ import { pointRegionLive, pointRegionScreenQuad, transformOf } from "../affordan
2
2
  import { chromeStateFrom, isVisibleFrom } from "./drawEnvelope.js";
3
3
  import { PATH_L, PATH_M, PATH_Z } from "@weasel-js/geom";
4
4
 
5
- //#region src/canvas/slopsDebugLayer.ts
5
+ // src/canvas/slopsDebugLayer.ts
6
6
  var SLOP_FILL = "rgba(255, 80, 140, 0.18)";
7
7
  var SLOP_STROKE = "rgba(255, 80, 140, 0.55)";
8
8
  function createSlopsDebugLayer(opts) {
@@ -65,6 +65,5 @@ function createSlopsDebugLayer(opts) {
65
65
  };
66
66
  }
67
67
 
68
- //#endregion
69
68
  export { createSlopsDebugLayer };
70
69
  //# sourceMappingURL=slopsDebugLayer.js.map
@@ -1,6 +1,6 @@
1
1
  import { mergeContributions } from "@weasel-js/routing";
2
2
 
3
- //#region src/canvas/surfaceContribution.ts
3
+ // src/canvas/surfaceContribution.ts
4
4
  /**
5
5
  * The canvas's unit of extension: a routing `Contribution` plus the roles only
6
6
  * a surface can install — views on it, and whatever else needs the mounted
@@ -26,6 +26,5 @@ function claimIds(entries, kind, of) {
26
26
  }
27
27
  }
28
28
 
29
- //#endregion
30
29
  export { mergeContributions$1 as mergeContributions };
31
30
  //# sourceMappingURL=surfaceContribution.js.map
@@ -1,7 +1,7 @@
1
1
  import { useCallback, useInsertionEffect, useRef } from "react";
2
2
  import { useLatest } from "@weasel-js/react";
3
3
 
4
- //#region src/canvas/useCanvasElements.ts
4
+ // src/canvas/useCanvasElements.ts
5
5
  function useCanvasElements(paintInto, inputElement) {
6
6
  const canvasRef = useRef(null);
7
7
  const ownCanvasRef = useRef(null);
@@ -26,6 +26,5 @@ function useCanvasElements(paintInto, inputElement) {
26
26
  };
27
27
  }
28
28
 
29
- //#endregion
30
29
  export { useCanvasElements };
31
30
  //# sourceMappingURL=useCanvasElements.js.map
@@ -1,6 +1,6 @@
1
1
  import { useCallback, useImperativeHandle } from "react";
2
2
 
3
- //#region src/canvas/useCanvasHandle.ts
3
+ // src/canvas/useCanvasHandle.ts
4
4
  /** The bare canvas's imperative handle. Its own-frame members answer against `frame`. */
5
5
  function useCanvasHandle(ref, target, frame, api) {
6
6
  const { canvasRef, ownCanvasRef, detached, paintRectRef, inputElement, paintCanvas } = target;
@@ -64,6 +64,5 @@ function useCanvasHandle(ref, target, frame, api) {
64
64
  ]);
65
65
  }
66
66
 
67
- //#endregion
68
67
  export { useCanvasHandle };
69
68
  //# sourceMappingURL=useCanvasHandle.js.map
@@ -1,14 +1,14 @@
1
1
  import { DEFAULT_LAYER_RETAIN } from "../core/layers/retain.js";
2
2
  import { drawLayers } from "../core/layers/render.js";
3
- import { resolveDpr } from "./canvasRenderer.js";
4
3
  import { beginDebugFrame } from "../debug/useDebugSink.js";
4
+ import { resolveDpr } from "./canvasRenderer.js";
5
5
  import { NO_LAYER_VISIBILITY } from "./useExtraLayers.js";
6
6
  import { ViewSnap } from "./viewSnap.js";
7
7
  import { viewToMat3 } from "@weasel-js/renderer";
8
8
  import { useCallback, useEffect, useInsertionEffect, useRef } from "react";
9
9
  import { useLatest } from "@weasel-js/react";
10
10
 
11
- //#region src/canvas/useCanvasPaint.ts
11
+ // src/canvas/useCanvasPaint.ts
12
12
  /**
13
13
  * Which content version the last paint showed. `markPainted` records the current one, read
14
14
  * from `contentVersion`'s latest committed value.
@@ -95,6 +95,5 @@ function useCanvasPaint(paintRef, lease, target, frame, markPainted, requestRedr
95
95
  }, []);
96
96
  }
97
97
 
98
- //#endregion
99
98
  export { useCanvasPaint, usePaintedVersion };
100
99
  //# sourceMappingURL=useCanvasPaint.js.map
@@ -3,7 +3,7 @@ import { leaseCanvasRenderer, shaderKeyOf } from "./canvasRenderer.js";
3
3
  import { getProgramSource, programSourceRegistry } from "@weasel-js/renderer";
4
4
  import { useEffect, useState } from "react";
5
5
 
6
- //#region src/canvas/useCanvasRenderer.ts
6
+ // src/canvas/useCanvasRenderer.ts
7
7
  /**
8
8
  * The React lifetime of `leaseCanvasRenderer`: a stable lease for the
9
9
  * component's canvas, whose renderer and GL objects are freed on unmount.
@@ -48,6 +48,5 @@ function useRedrawOnShaderSource(shaders, requestRedraw) {
48
48
  }, [key, requestRedraw]);
49
49
  }
50
50
 
51
- //#endregion
52
51
  export { useCanvasRenderer, useRedrawOnDensityChange, useRedrawOnRestore, useRedrawOnShaderSource };
53
52
  //# sourceMappingURL=useCanvasRenderer.js.map
@@ -4,7 +4,7 @@ import { useLateContentRedraw } from "./useLateContentRedraw.js";
4
4
  import { useRedrawOn } from "./useRedrawOn.js";
5
5
  import { useEffect, useLayoutEffect, useRef } from "react";
6
6
 
7
- //#region src/canvas/useCanvasSurface.ts
7
+ // src/canvas/useCanvasSurface.ts
8
8
  /**
9
9
  * Everything a canvas surface in core needs around its paint: the renderer
10
10
  * lease, the frame loop, and a repaint for each thing that changes pixels with
@@ -62,6 +62,5 @@ function useRedrawOnCommit(mode, paintNow, requestRedraw, resized) {
62
62
  }, []);
63
63
  }
64
64
 
65
- //#endregion
66
65
  export { useCanvasSurface };
67
66
  //# sourceMappingURL=useCanvasSurface.js.map
@@ -1,9 +1,9 @@
1
- import { normalizeView, sameView } from "../core/viewport/view.js";
2
1
  import { clampView } from "../core/viewport/clampView.js";
2
+ import { normalizeView, sameView } from "../core/viewport/view.js";
3
3
  import { useCallback, useRef } from "react";
4
4
  import { useLatest } from "@weasel-js/react";
5
5
 
6
- //#region src/canvas/useCanvasView.ts
6
+ // src/canvas/useCanvasView.ts
7
7
  /**
8
8
  * A camera: held in a ref when uncontrolled, taken from the `view` option when
9
9
  * controlled, with one write path and one subscriber list over both.
@@ -94,6 +94,5 @@ function useCanvasView(opts) {
94
94
  };
95
95
  }
96
96
 
97
- //#endregion
98
97
  export { useCanvasView };
99
98
  //# sourceMappingURL=useCanvasView.js.map