@weasel-js/core 1.14.2 → 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 (856) hide show
  1. package/CHANGELOG.md +251 -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 -3
  7. package/dist/affordances/pathAnchors.js.map +1 -1
  8. package/dist/affordances/rotateCursor.js +1 -2
  9. package/dist/affordances/rotationHandle.js +2 -3
  10. package/dist/animation/behaviors/coast.js +1 -2
  11. package/dist/animation/behaviors/coastByWrite.js +2 -3
  12. package/dist/animation/behaviors/coastOnTargets.js +2 -3
  13. package/dist/animation/behaviors/momentum.js +1 -2
  14. package/dist/animation/clipTargets.js +1 -2
  15. package/dist/animation/departures.js +2 -3
  16. package/dist/animation/poseHelpers.js +2 -3
  17. package/dist/animation/poseTarget.js +2 -3
  18. package/dist/animation/poseTransition.js +1 -2
  19. package/dist/animation/reflow.js +2 -3
  20. package/dist/animation/rewind.js +1 -2
  21. package/dist/animation/rig/bindRig.js +2 -3
  22. package/dist/animation/rig/rigNode.js +1 -2
  23. package/dist/animation/rig/rigSeat.js +1 -2
  24. package/dist/animation/rig/skinBinding.js +1 -2
  25. package/dist/animation/rig/useRig.js +2 -3
  26. package/dist/animation/wrappers/animateLifecycle.js +1 -2
  27. package/dist/animation/wrappers/animateOnSetPose.js +1 -2
  28. package/dist/animation/wrappers/instantPose.js +1 -2
  29. package/dist/animation/writtenPoseTarget.js +1 -2
  30. package/dist/barrel/interactions.js +2 -1
  31. package/dist/barrel/paths.js +1 -1
  32. package/dist/barrel/renderer.js +2 -2
  33. package/dist/barrel/routing.js +6 -4
  34. package/dist/barrel/scene.js +2 -2
  35. package/dist/barrel/text.js +5 -3
  36. package/dist/canvas/Canvas.js +10 -7
  37. package/dist/canvas/Canvas.js.map +1 -1
  38. package/dist/canvas/CanvasView.js +6 -7
  39. package/dist/canvas/CursorCoordsHud.js +2 -3
  40. package/dist/canvas/DrawCanvas.js +8 -5
  41. package/dist/canvas/DrawCanvas.js.map +1 -1
  42. package/dist/canvas/GestureReason.js +1 -2
  43. package/dist/canvas/GestureReason.module.js +1 -2
  44. package/dist/canvas/LeanSceneCanvas.js +2 -3
  45. package/dist/canvas/ModalityHud.js +2 -3
  46. package/dist/canvas/NodeShape.js +3 -4
  47. package/dist/canvas/PickHud.js +2 -3
  48. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +1 -2
  49. package/dist/canvas/SceneCanvas/CanvasKitProviders.js +3 -4
  50. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +1 -2
  51. package/dist/canvas/SceneCanvas/DevHuds.js +1 -2
  52. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +1 -2
  53. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +8 -5
  54. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
  55. package/dist/canvas/SceneCanvas/SurfaceDeclarations.js +1 -2
  56. package/dist/canvas/SceneCanvas/brushOverlay.js +1 -2
  57. package/dist/canvas/SceneCanvas/builtinToolSets.js +7 -5
  58. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/canvasPassThrough.js +1 -2
  60. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +1 -2
  61. package/dist/canvas/SceneCanvas/coordTrace.js +1 -2
  62. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +4 -5
  63. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -2
  64. package/dist/canvas/SceneCanvas/defaultTextEditor.js +4 -5
  65. package/dist/canvas/SceneCanvas/describePresets.js +1 -2
  66. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +1 -2
  67. package/dist/canvas/SceneCanvas/features.js +1 -2
  68. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +1 -2
  69. package/dist/canvas/SceneCanvas/mergeLayers.js +1 -2
  70. package/dist/canvas/SceneCanvas/namedPresets.js +5 -6
  71. package/dist/canvas/SceneCanvas/poseGeometry.js +1 -2
  72. package/dist/canvas/SceneCanvas/poseRegistrars.js +1 -2
  73. package/dist/canvas/SceneCanvas/presets/arrange.js +2 -3
  74. package/dist/canvas/SceneCanvas/presets/baseline.js +1 -2
  75. package/dist/canvas/SceneCanvas/presets/chrome.js +1 -2
  76. package/dist/canvas/SceneCanvas/presets/composites.js +1 -2
  77. package/dist/canvas/SceneCanvas/presets/edit.js +4 -5
  78. package/dist/canvas/SceneCanvas/presets/ingest.js +1 -2
  79. package/dist/canvas/SceneCanvas/presets/paths.js +9 -10
  80. package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -1
  81. package/dist/canvas/SceneCanvas/presets/select.js +1 -2
  82. package/dist/canvas/SceneCanvas/presets/toolDriven.js +2 -3
  83. package/dist/canvas/SceneCanvas/presets/tools.js +1 -2
  84. package/dist/canvas/SceneCanvas/presets/transform.js +2 -3
  85. package/dist/canvas/SceneCanvas/presets/view.js +2 -3
  86. package/dist/canvas/SceneCanvas/props.js +1 -2
  87. package/dist/canvas/SceneCanvas/scenePointQuery.js +2 -3
  88. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +2 -3
  89. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
  90. package/dist/canvas/SceneCanvas/toolRegistry.js +2 -3
  91. package/dist/canvas/SceneCanvas/useActionTunings.js +1 -2
  92. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -2
  93. package/dist/canvas/SceneCanvas/useBakedScene.js +2 -3
  94. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +7 -8
  95. package/dist/canvas/SceneCanvas/useBuiltinTools.js +3 -2
  96. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
  97. package/dist/canvas/SceneCanvas/useCanvasCamera.js +2 -3
  98. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +1 -2
  99. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +1 -2
  100. package/dist/canvas/SceneCanvas/useCanvasSelection.js +8 -6
  101. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
  102. package/dist/canvas/SceneCanvas/useCanvasTools.js +2 -3
  103. package/dist/canvas/SceneCanvas/useChromeAffordances.js +2 -3
  104. package/dist/canvas/SceneCanvas/useContributionRoles.js +3 -2
  105. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
  106. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +4 -5
  107. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +2 -3
  108. package/dist/canvas/SceneCanvas/useHeldModifiers.js +1 -2
  109. package/dist/canvas/SceneCanvas/useMagnificationCheck.js +41 -0
  110. package/dist/canvas/SceneCanvas/useMagnificationCheck.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +1 -2
  112. package/dist/canvas/SceneCanvas/useNodeKinds.js +2 -3
  113. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +10 -11
  114. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +1 -2
  115. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +6 -7
  116. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +1 -2
  117. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +1 -2
  118. package/dist/canvas/SceneCanvas/useSceneChrome.js +22 -11
  119. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  120. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +6 -7
  121. package/dist/canvas/SceneCanvas/useScenePicking.js +5 -6
  122. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +1 -2
  123. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +7 -8
  124. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +2 -3
  125. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +28 -17
  126. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  127. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +2 -3
  128. package/dist/canvas/SceneCanvas/useSurfaceRouting.js +1 -2
  129. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js +1 -2
  130. package/dist/canvas/SceneCanvas/useToolKeybindings.js +1 -2
  131. package/dist/canvas/SceneCanvas/useViewportActions.js +3 -4
  132. package/dist/canvas/SceneCanvas/worldPointAt.js +1 -2
  133. package/dist/canvas/SceneCanvas.js +22 -20
  134. package/dist/canvas/SceneCanvas.js.map +1 -1
  135. package/dist/canvas/SceneViewCanvas.js +7 -4
  136. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  137. package/dist/canvas/SurfaceCanvas.js +1 -2
  138. package/dist/canvas/ViewMarker.js +1 -2
  139. package/dist/canvas/accentColor.js +1 -2
  140. package/dist/canvas/adapterDerivedPath.js +2 -3
  141. package/dist/canvas/adapterPickSource.js +1 -2
  142. package/dist/canvas/affordanceAt.js +2 -4
  143. package/dist/canvas/affordanceAt.js.map +1 -1
  144. package/dist/canvas/buildSceneLayer.js +4 -5
  145. package/dist/canvas/buildSceneTree.js +4 -5
  146. package/dist/canvas/canvasRenderer.js +1 -2
  147. package/dist/canvas/colorOverrides.js +1 -2
  148. package/dist/canvas/contextAttributes.js +1 -2
  149. package/dist/canvas/copiesAbove.js +1 -2
  150. package/dist/canvas/defaultDrawOne.js +1 -2
  151. package/dist/canvas/deps/areaSelect.js +5 -3
  152. package/dist/canvas/deps/areaSelect.js.map +1 -1
  153. package/dist/canvas/deps/booleans.js +5 -6
  154. package/dist/canvas/deps/changes.js +1 -2
  155. package/dist/canvas/deps/chromeRules.js +36 -0
  156. package/dist/canvas/deps/chromeRules.js.map +1 -0
  157. package/dist/canvas/deps/debug.js +1 -2
  158. package/dist/canvas/deps/dispatchSources.js +1 -2
  159. package/dist/canvas/deps/dispatcher.js +1 -2
  160. package/dist/canvas/deps/editAnchors.js +3 -10
  161. package/dist/canvas/deps/editAnchors.js.map +1 -1
  162. package/dist/canvas/deps/enteredGroup.js +1 -2
  163. package/dist/canvas/deps/geometryProjection.js +1 -2
  164. package/dist/canvas/deps/hitTestArea.js +6 -5
  165. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  166. package/dist/canvas/deps/ingestion.js +1 -2
  167. package/dist/canvas/deps/insert.js +3 -4
  168. package/dist/canvas/deps/insertSite.js +3 -4
  169. package/dist/canvas/deps/kitSettings.js +1 -2
  170. package/dist/canvas/deps/lassoSelect.js +5 -3
  171. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  172. package/dist/canvas/deps/layout.js +1 -2
  173. package/dist/canvas/deps/modeDefaultTool.js +22 -0
  174. package/dist/canvas/deps/modeDefaultTool.js.map +1 -0
  175. package/dist/canvas/deps/nodeAtPoint.js +1 -2
  176. package/dist/canvas/deps/pathEditCommits.js +3 -4
  177. package/dist/canvas/deps/pathLeaf.js +1 -2
  178. package/dist/canvas/deps/pathLeafDeps.js +2 -3
  179. package/dist/canvas/deps/poseDescriptor.js +1 -2
  180. package/dist/canvas/deps/previewPaths.js +1 -2
  181. package/dist/canvas/deps/resizePolicy.js +1 -2
  182. package/dist/canvas/deps/selectionSnapshot.js +22 -0
  183. package/dist/canvas/deps/selectionSnapshot.js.map +1 -0
  184. package/dist/canvas/deps/slice.js +5 -6
  185. package/dist/canvas/deps/snap.js +4 -4
  186. package/dist/canvas/deps/snap.js.map +1 -1
  187. package/dist/canvas/deps/surface.js +1 -2
  188. package/dist/canvas/deps/textEdit.js +1 -2
  189. package/dist/canvas/deps/transformFollowers.js +1 -2
  190. package/dist/canvas/deps/view.js +1 -2
  191. package/dist/canvas/derivedPath.js +6 -7
  192. package/dist/canvas/doubleClickTarget.js +1 -2
  193. package/dist/canvas/drawEnvelope.js +1 -2
  194. package/dist/canvas/drawnBounds.js +4 -5
  195. package/dist/canvas/getNodeAtPoint.js +1 -2
  196. package/dist/canvas/hostAnchor.js +1 -2
  197. package/dist/canvas/hud.module.js +1 -2
  198. package/dist/canvas/inheritedPaints.js +1 -2
  199. package/dist/canvas/insertPreviewExtent.js +1 -2
  200. package/dist/canvas/kitRequirements.js +1 -2
  201. package/dist/canvas/layerHover.js +1 -2
  202. package/dist/canvas/layerOrder.js +1 -2
  203. package/dist/canvas/layerSlots.js +1 -2
  204. package/dist/canvas/mountedCanvases.js +1 -2
  205. package/dist/canvas/nodeShapes/derivedPainter.js +2 -3
  206. package/dist/canvas/nodeShapes/imagePainter.js +1 -2
  207. package/dist/canvas/nodeShapes/measurePainter.js +2 -3
  208. package/dist/canvas/nodeShapes/memo.js +1 -2
  209. package/dist/canvas/nodeShapes/nodePaint.js +1 -2
  210. package/dist/canvas/nodeShapes/pathPainter.js +3 -4
  211. package/dist/canvas/nodeShapes/poseBox.js +1 -2
  212. package/dist/canvas/nodeShapes/rectFallbackPainter.js +1 -2
  213. package/dist/canvas/nodeShapes/shapePainter.js +2 -3
  214. package/dist/canvas/nodeShapes/strokedBounds.js +1 -2
  215. package/dist/canvas/nodeShapes/textPainter.js +1 -2
  216. package/dist/canvas/overChildren.js +1 -2
  217. package/dist/canvas/overlayRoleStrokes.js +1 -2
  218. package/dist/canvas/ownClip.js +1 -2
  219. package/dist/canvas/paintCull.js +1 -2
  220. package/dist/canvas/paintedCursorLayer.js +1 -2
  221. package/dist/canvas/pathOverlay.js +1 -2
  222. package/dist/canvas/pickIndex/nodeBroadBox.js +3 -4
  223. package/dist/canvas/pickIndex/scenePickIndex.js +3 -4
  224. package/dist/canvas/pickReach.js +13 -10
  225. package/dist/canvas/pickReach.js.map +1 -1
  226. package/dist/canvas/pickWalk.js +9 -8
  227. package/dist/canvas/pickWalk.js.map +1 -1
  228. package/dist/canvas/planeClips.js +1 -2
  229. package/dist/canvas/poseRotation.js +1 -2
  230. package/dist/canvas/publishPreviews.js +1 -2
  231. package/dist/canvas/rasterReadback.js +1 -2
  232. package/dist/canvas/rasterToPng.js +1 -2
  233. package/dist/canvas/renderDebugSnapshot.js +1 -2
  234. package/dist/canvas/renderNeeds.js +1 -2
  235. package/dist/canvas/renderSceneToPixels.js +5 -6
  236. package/dist/canvas/sceneAdapter.js +37 -27
  237. package/dist/canvas/sceneAdapter.js.map +1 -1
  238. package/dist/canvas/sceneClipboard.js +19 -7
  239. package/dist/canvas/sceneClipboard.js.map +1 -1
  240. package/dist/canvas/sceneLayerPaint.js +1 -2
  241. package/dist/canvas/scenePickReads.js +1 -2
  242. package/dist/canvas/scenePickSource.js +7 -8
  243. package/dist/canvas/scenePickSource.js.map +1 -1
  244. package/dist/canvas/sceneSlotWiring.js +2 -3
  245. package/dist/canvas/sceneViewRender.js +5 -6
  246. package/dist/canvas/shownNodes.js +1 -2
  247. package/dist/canvas/slopsDebugLayer.js +1 -2
  248. package/dist/canvas/surfaceContribution.js +1 -2
  249. package/dist/canvas/useCanvasElements.js +1 -2
  250. package/dist/canvas/useCanvasHandle.js +1 -2
  251. package/dist/canvas/useCanvasPaint.js +2 -3
  252. package/dist/canvas/useCanvasRenderer.js +1 -2
  253. package/dist/canvas/useCanvasSurface.js +22 -5
  254. package/dist/canvas/useCanvasSurface.js.map +1 -1
  255. package/dist/canvas/useCanvasView.js +2 -3
  256. package/dist/canvas/useClientToWorld.js +1 -2
  257. package/dist/canvas/useExtraLayers.js +1 -2
  258. package/dist/canvas/useFrameLoop.js +7 -9
  259. package/dist/canvas/useFrameLoop.js.map +1 -1
  260. package/dist/canvas/useHitObserver.js +1 -2
  261. package/dist/canvas/useHostAnchor.js +1 -2
  262. package/dist/canvas/useInFlightBounds.js +6 -6
  263. package/dist/canvas/useInFlightBounds.js.map +1 -1
  264. package/dist/canvas/useLateContentRedraw.js +1 -2
  265. package/dist/canvas/useLayerStack.js +2 -3
  266. package/dist/canvas/usePaintedCursor.js +1 -2
  267. package/dist/canvas/useRedrawOn.js +1 -2
  268. package/dist/canvas/useSceneAdapter.js +1 -2
  269. package/dist/canvas/useSceneLayerList.js +1 -2
  270. package/dist/canvas/useSurfaceInput.js +1 -2
  271. package/dist/canvas/useSurfaceSize.js +5 -5
  272. package/dist/canvas/useSurfaceSize.js.map +1 -1
  273. package/dist/canvas/useToolCursor.js +1 -2
  274. package/dist/canvas/useViewAim.js +2 -3
  275. package/dist/canvas/useViewHelpers.js +5 -4
  276. package/dist/canvas/useViewHelpers.js.map +1 -1
  277. package/dist/canvas/useViewLayerGate.js +1 -2
  278. package/dist/canvas/useViewNesting.js +1 -2
  279. package/dist/canvas/useViewRegistrySurface.js +1 -2
  280. package/dist/canvas/viewInputs.js +1 -2
  281. package/dist/canvas/viewMarkers.js +1 -2
  282. package/dist/canvas/viewRegistry.js +1 -2
  283. package/dist/canvas/viewSnap.js +1 -2
  284. package/dist/canvas/watchElementMove.js +1 -2
  285. package/dist/canvas/wrapNodeOutput.js +1 -2
  286. package/dist/core/adapters/testing/rootsTree.js +1 -2
  287. package/dist/core/applyOps.js +1 -2
  288. package/dist/core/device/targets.js +1 -2
  289. package/dist/core/device/useDeviceProfile.js +1 -2
  290. package/dist/core/device/useTargetBasePx.js +1 -2
  291. package/dist/core/device/watchDevicePixelRatio.js +1 -2
  292. package/dist/core/geometry/autoPoseDescriptor.js +2 -3
  293. package/dist/core/geometry/booleanOfPaths.js +1 -2
  294. package/dist/core/geometry/inkExtents.js +1 -2
  295. package/dist/core/geometry/pathPoseDescriptor.js +1 -2
  296. package/dist/core/geometry/poseDescriptor.js +1 -2
  297. package/dist/core/geometry/regionHit.js +36 -18
  298. package/dist/core/geometry/regionHit.js.map +1 -1
  299. package/dist/core/geometry/targetFrame.js +1 -2
  300. package/dist/core/geometry/unionBounds.js +1 -2
  301. package/dist/core/layers/backgroundFill.js +1 -2
  302. package/dist/core/layers/children.js +1 -2
  303. package/dist/core/layers/gateLayer.js +1 -2
  304. package/dist/core/layers/layerGroup.js +1 -2
  305. package/dist/core/layers/redrawSource.js +1 -2
  306. package/dist/core/layers/render.js +1 -2
  307. package/dist/core/layers/retain.js +1 -2
  308. package/dist/core/ops/arrange.js +1 -2
  309. package/dist/core/ops/create.js +2 -3
  310. package/dist/core/ops/createHistory.js +2 -3
  311. package/dist/core/ops/delete.js +2 -3
  312. package/dist/core/ops/nodeFlags.js +1 -2
  313. package/dist/core/ops/registry.js +1 -2
  314. package/dist/core/ops/reorder/algorithms.js +1 -2
  315. package/dist/core/ops/reorder/index.js +1 -2
  316. package/dist/core/ops/reorder/setChildOrder.js +1 -2
  317. package/dist/core/ops/reparent.js +1 -2
  318. package/dist/core/ops/select.js +1 -2
  319. package/dist/core/ops/setData.js +1 -2
  320. package/dist/core/ops/setDependsOn.js +1 -2
  321. package/dist/core/ops/setLayer.js +1 -2
  322. package/dist/core/ops/setLayout.js +1 -2
  323. package/dist/core/ops/setPath.js +1 -2
  324. package/dist/core/ops/setText.js +1 -2
  325. package/dist/core/ops/slot.js +1 -2
  326. package/dist/core/ops/transform.js +1 -2
  327. package/dist/core/ops/writtenBy.js +1 -2
  328. package/dist/core/pages/fitViewToPage.js +1 -2
  329. package/dist/core/pages/pageEdits.js +3 -4
  330. package/dist/core/pages/pages.js +1 -2
  331. package/dist/core/pages/pages.js.map +1 -1
  332. package/dist/core/pages/pagesLayer.js +1 -2
  333. package/dist/core/paint/meshKind.js +1 -2
  334. package/dist/core/paint/meshKindLazy.js +9 -18
  335. package/dist/core/paint/meshKindLazy.js.map +1 -1
  336. package/dist/core/paint/paintKindEntry.js +1 -2
  337. package/dist/core/paint/paintKinds.js +1 -2
  338. package/dist/core/paint/registerMesh.js +1 -2
  339. package/dist/core/scene/NodeProperties.js +1 -2
  340. package/dist/core/scene/NodeRouting.js +1 -2
  341. package/dist/core/scene/annotation.js +1 -2
  342. package/dist/core/scene/appliedLog.js +1 -2
  343. package/dist/core/scene/arrivalWindow.js +2 -3
  344. package/dist/core/scene/arrivals.js +1 -2
  345. package/dist/core/scene/booleanGroup.js +1 -2
  346. package/dist/core/scene/booleanOfChildren.js +1 -2
  347. package/dist/core/scene/boundOps.js +1 -2
  348. package/dist/core/scene/carryDescendants.js +2 -3
  349. package/dist/core/scene/clipNothing.js +1 -2
  350. package/dist/core/scene/composeFrame.js +1 -2
  351. package/dist/core/scene/composePose.js +1 -2
  352. package/dist/core/scene/declaredFieldSetters.js +1 -2
  353. package/dist/core/scene/depFrame.js +1 -2
  354. package/dist/core/scene/depMemo.js +1 -2
  355. package/dist/core/scene/dependents.js +1 -2
  356. package/dist/core/scene/derivedParts.js +1 -2
  357. package/dist/core/scene/derivedPath.js +2 -3
  358. package/dist/core/scene/docValues.js +1 -2
  359. package/dist/core/scene/documentOf.js +1 -2
  360. package/dist/core/scene/editMode.js +5 -3
  361. package/dist/core/scene/editMode.js.map +1 -1
  362. package/dist/core/scene/editPass.js +1 -2
  363. package/dist/core/scene/effectivePose.js +3 -4
  364. package/dist/core/scene/fieldEdits.js +1 -2
  365. package/dist/core/scene/fontReads.js +1 -2
  366. package/dist/core/scene/historyFacade.js +8 -52
  367. package/dist/core/scene/historyFacade.js.map +1 -1
  368. package/dist/core/scene/historyForm.js +1 -2
  369. package/dist/core/scene/inheritedPaint.js +1 -2
  370. package/dist/core/scene/kitOps.js +16 -15
  371. package/dist/core/scene/kitOps.js.map +1 -1
  372. package/dist/core/scene/kitRegistry.js +2 -3
  373. package/dist/core/scene/layerOps.js +1 -2
  374. package/dist/core/scene/layerStack.js +1 -2
  375. package/dist/core/scene/layoutPass.js +4 -5
  376. package/dist/core/scene/lockGuard.js +1 -2
  377. package/dist/core/scene/minSize.js +1 -2
  378. package/dist/core/scene/nestedHit.js +1 -2
  379. package/dist/core/scene/nodeAsShown.js +1 -2
  380. package/dist/core/scene/nodeFlags.js +1 -2
  381. package/dist/core/scene/nodeFnFields.js +1 -2
  382. package/dist/core/scene/nodeGates.js +3 -4
  383. package/dist/core/scene/nodeGates.js.map +1 -1
  384. package/dist/core/scene/nodeMemo.js +1 -2
  385. package/dist/core/scene/nodeStore.js +2 -3
  386. package/dist/core/scene/notifier.js +1 -2
  387. package/dist/core/scene/opTable.js +9 -10
  388. package/dist/core/scene/opTable.js.map +1 -1
  389. package/dist/core/scene/outerOps.js +3 -4
  390. package/dist/core/scene/outerOps.js.map +1 -1
  391. package/dist/core/scene/pathEffects/blend.js +1 -2
  392. package/dist/core/scene/pathEffects/derive.js +2 -3
  393. package/dist/core/scene/pathEffects/effects.js +1 -2
  394. package/dist/core/scene/pathEffects/foundHidden.js +1 -2
  395. package/dist/core/scene/pathEffects/textAlong.js +1 -2
  396. package/dist/core/scene/pathEffects/textAlongBands.js +1 -2
  397. package/dist/core/scene/plyStacks.js +1 -2
  398. package/dist/core/scene/poseFeed.js +1 -2
  399. package/dist/core/scene/poseHold.js +1 -2
  400. package/dist/core/scene/poseOverrides.js +1 -2
  401. package/dist/core/scene/posePlies.js +1 -2
  402. package/dist/core/scene/poseRemovals.js +1 -2
  403. package/dist/core/scene/poseSnapshot.js +1 -2
  404. package/dist/core/scene/poseWrites.js +17 -17
  405. package/dist/core/scene/poseWrites.js.map +1 -1
  406. package/dist/core/scene/reconcileSpecs.js +26 -3
  407. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  408. package/dist/core/scene/recorder.js +1 -2
  409. package/dist/core/scene/renderOrder.js +1 -2
  410. package/dist/core/scene/sameValue.js +1 -2
  411. package/dist/core/scene/scene.js +11 -12
  412. package/dist/core/scene/scene.js.map +1 -1
  413. package/dist/core/scene/sceneChanges.js +1 -2
  414. package/dist/core/scene/sceneEdits.js +1 -2
  415. package/dist/core/scene/sceneJournals.js +77 -0
  416. package/dist/core/scene/sceneJournals.js.map +1 -0
  417. package/dist/core/scene/sceneMutators.js +2 -3
  418. package/dist/core/scene/scenePoseAdapter.js +1 -2
  419. package/dist/core/scene/sceneRecording.js +4 -4
  420. package/dist/core/scene/sceneRecording.js.map +1 -1
  421. package/dist/core/scene/sceneSelection.js +8 -5
  422. package/dist/core/scene/sceneSelection.js.map +1 -1
  423. package/dist/core/scene/sceneState.js +3 -4
  424. package/dist/core/scene/scrollOffsets.js +1 -2
  425. package/dist/core/scene/serialization.js +2 -3
  426. package/dist/core/scene/staleReplay.js +1 -2
  427. package/dist/core/scene/statedFields.js +1 -2
  428. package/dist/core/scene/strategyView.js +1 -2
  429. package/dist/core/scene/treeEdits.js +2 -3
  430. package/dist/core/scene/treeOrder.js +1 -2
  431. package/dist/core/scene/treeReads.js +1 -2
  432. package/dist/core/scene/treeShape.js +1 -2
  433. package/dist/core/scene/types.js +1 -2
  434. package/dist/core/scene/types.js.map +1 -1
  435. package/dist/core/scene/unionOfChildren.js +1 -2
  436. package/dist/core/scene/unitScopes.js +20 -4
  437. package/dist/core/scene/unitScopes.js.map +1 -1
  438. package/dist/core/scene/useScene.js +2 -3
  439. package/dist/core/scene/worldSave.js +2 -3
  440. package/dist/core/selection/chromeState.js +1 -2
  441. package/dist/core/selection/outermostSelection.js +56 -0
  442. package/dist/core/selection/outermostSelection.js.map +1 -0
  443. package/dist/core/selection/readOnlySelection.js +1 -2
  444. package/dist/core/selection/selectionTarget.js +1 -2
  445. package/dist/core/selection/usePublishSceneSelection.js +1 -2
  446. package/dist/core/selection/useSelection.js +1 -2
  447. package/dist/core/shapeKinds.js +1 -2
  448. package/dist/core/stableStringify.js +1 -2
  449. package/dist/core/stylus/stylus.js +1 -2
  450. package/dist/core/stylus/usePointerStylus.js +1 -2
  451. package/dist/core/usePaintKinds.js +1 -2
  452. package/dist/core/viewport/clampView.js +1 -2
  453. package/dist/core/viewport/clientToWorld.js +1 -2
  454. package/dist/core/viewport/createVelocityTracker.js +1 -2
  455. package/dist/core/viewport/fitToBounds.js +1 -2
  456. package/dist/core/viewport/fitViewToBounds.js +1 -2
  457. package/dist/core/viewport/interpolateView.js +1 -2
  458. package/dist/core/viewport/parallax.js +1 -2
  459. package/dist/core/viewport/sceneNodeClientRect.js +1 -2
  460. package/dist/core/viewport/screenSlop.js +1 -2
  461. package/dist/core/viewport/useAutoCenter.js +1 -2
  462. package/dist/core/viewport/useCanvasSize.js +48 -28
  463. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  464. package/dist/core/viewport/useDecayLoop.js +1 -2
  465. package/dist/core/viewport/useNodeOverlayFrame.js +1 -2
  466. package/dist/core/viewport/useVelocityTracker.js +1 -2
  467. package/dist/core/viewport/useViewAnimation.js +3 -4
  468. package/dist/core/viewport/view.js +1 -2
  469. package/dist/core/viewport/viewTransform.js +1 -2
  470. package/dist/core/viewport/viewportWorldRect.js +1 -2
  471. package/dist/core/viewport/wheelHandler.js +1 -2
  472. package/dist/core/viewport/zoomAt.js +2 -3
  473. package/dist/core/viewport/zoomBounds.js +1 -2
  474. package/dist/debug/createDebugOverlayLayer.js +1 -2
  475. package/dist/debug/createDebugSink.js +1 -2
  476. package/dist/debug/defaultTheme.js +1 -2
  477. package/dist/debug/features.js +1 -2
  478. package/dist/debug/frameStats.js +1 -2
  479. package/dist/debug/overlayPanels.js +1 -2
  480. package/dist/debug/parseDebugFlags.js +1 -2
  481. package/dist/debug/useDebugSink.js +2 -3
  482. package/dist/{depSchema-DD9H89gX.d.ts → depSchema-C7a_OMt-.d.ts} +101 -65
  483. package/dist/devtools/handlers.js +1 -2
  484. package/dist/devtools/history.js +1 -2
  485. package/dist/devtools/hook.js +1 -2
  486. package/dist/devtools/label.js +1 -2
  487. package/dist/devtools/notices.js +1 -2
  488. package/dist/devtools/protocol.js +1 -2
  489. package/dist/devtools/registry.js +1 -2
  490. package/dist/devtools/root.js +1 -2
  491. package/dist/devtools/serialize.js +1 -2
  492. package/dist/devtools/session.js +2 -3
  493. package/dist/devtools/transport.js +1 -2
  494. package/dist/devtools/useDevtoolsRoot.js +1 -2
  495. package/dist/devtools-protocol.d.ts +1 -1
  496. package/dist/devtools-protocol.js +2 -2
  497. package/dist/devtools.d.ts +1 -1
  498. package/dist/devtools.js +1 -2
  499. package/dist/domains/chrome-caps/buildChromeCtx.js +1 -2
  500. package/dist/domains/chrome-caps/conditions.js +1 -2
  501. package/dist/domains/chrome-caps/defaults.js +1 -2
  502. package/dist/domains/chrome-caps/resolve.js +3 -3
  503. package/dist/domains/chrome-caps/resolve.js.map +1 -1
  504. package/dist/domains/chrome-caps/useChromeCaps.js +5 -4
  505. package/dist/domains/chrome-caps/useChromeCaps.js.map +1 -1
  506. package/dist/domains/chrome-caps/useHoverTracking.js +1 -2
  507. package/dist/domains/ingestion/contentHandlers.js +1 -2
  508. package/dist/domains/ingestion/ghost.js +2 -3
  509. package/dist/domains/ingestion/imageHandler.js +1 -2
  510. package/dist/domains/ingestion/kitHandlers.js +2 -3
  511. package/dist/domains/ingestion/openFilePicker.js +1 -2
  512. package/dist/domains/ingestion/placement.js +1 -2
  513. package/dist/domains/ingestion/svgHandler.js +1 -2
  514. package/dist/domains/ingestion/textHandler.js +1 -2
  515. package/dist/domains/ingestion/useCanvasIngestion.js +1 -2
  516. package/dist/domains/ingestion/weaselJsonHandler.js +2 -3
  517. package/dist/domains/longPress/longPressFeedback.js +1 -2
  518. package/dist/domains/measure/actionIds.js +1 -2
  519. package/dist/domains/measure/measureCommands.js +6 -7
  520. package/dist/domains/measure/measureContribution.js +3 -4
  521. package/dist/domains/measure/measureEdits.js +3 -4
  522. package/dist/domains/measure/measureGestures.js +2 -3
  523. package/dist/domains/measure/measureHit.js +3 -4
  524. package/dist/domains/measure/measureLayer.js +3 -4
  525. package/dist/domains/measure/measurement.js +1 -2
  526. package/dist/domains/measure/measurements.js +1 -2
  527. package/dist/domains/modes/modeLayers.js +1 -2
  528. package/dist/domains/modes/modeTriggers.js +1 -2
  529. package/dist/domains/pathEffects/effectSources.js +2 -3
  530. package/dist/domains/pathEffects/index.js +1 -2
  531. package/dist/domains/pathEffects/readSource.js +3 -4
  532. package/dist/domains/pathEffects/textItems.js +1 -2
  533. package/dist/domains/pathEffects/useEffectSourcesLayer.js +3 -4
  534. package/dist/domains/paths/anchorData.js +1 -2
  535. package/dist/domains/paths/anchorMarkers.js +1 -2
  536. package/dist/domains/paths/editablePath.js +3 -4
  537. package/dist/domains/paths/originProjection.js +1 -2
  538. package/dist/domains/paths/pathEditExtension.js +1 -2
  539. package/dist/domains/paths/pathEditState.js +1 -26
  540. package/dist/domains/paths/pathEditState.js.map +1 -1
  541. package/dist/domains/paths/pathEditingOverlayLayer.js +2 -3
  542. package/dist/domains/paths/pathLayer.js +1 -2
  543. package/dist/domains/paths/pathRepresentation.js +1 -2
  544. package/dist/domains/paths/pathSnap/glyphs.js +1 -2
  545. package/dist/domains/paths/pathSnap/pathSnapSource.js +1 -2
  546. package/dist/domains/paths/pathSnap/sceneIndex.js +1 -2
  547. package/dist/domains/paths/pathSnap/snapGeometry.js +2 -3
  548. package/dist/domains/paths/penPreviewLayer.js +1 -2
  549. package/dist/domains/paths/shapeGenerator.js +1 -2
  550. package/dist/domains/paths/strokeOutline.js +2 -3
  551. package/dist/domains/paths/useAnchorFields.js +1 -2
  552. package/dist/domains/paths/usePathEdit.js +2 -3
  553. package/dist/domains/poseRun/usePoseRun.js +1 -2
  554. package/dist/domains/selection/enteredGroupFrame.js +1 -2
  555. package/dist/domains/selection/enteredGroupScope.js +1 -2
  556. package/dist/domains/selection/enteredOperands.js +1 -2
  557. package/dist/domains/selection/handleCommands.js +2 -3
  558. package/dist/domains/selection/overlay.js +6 -7
  559. package/dist/domains/selection/selectionPose.js +2 -3
  560. package/dist/domains/snap/angle2d.js +1 -2
  561. package/dist/domains/snap/debugCandidates.js +1 -2
  562. package/dist/domains/snap/gather.js +1 -2
  563. package/dist/domains/snap/inputSubspace.js +2 -3
  564. package/dist/domains/snap/lazySession.js +1 -2
  565. package/dist/domains/snap/marks.js +1 -2
  566. package/dist/domains/snap/outcomeStore.js +1 -2
  567. package/dist/domains/snap/pointSnap.js +1 -2
  568. package/dist/domains/snap/probes2d.js +6 -2
  569. package/dist/domains/snap/probes2d.js.map +1 -1
  570. package/dist/domains/snap/readoutDraw.js +1 -2
  571. package/dist/domains/snap/readoutLayer.js +1 -2
  572. package/dist/domains/snap/registry.js +1 -2
  573. package/dist/domains/snap/resizeBox.js +1 -2
  574. package/dist/domains/snap/roles.js +1 -2
  575. package/dist/domains/snap/rotationSource.js +1 -2
  576. package/dist/domains/snap/sceneReads.js +13 -4
  577. package/dist/domains/snap/sceneReads.js.map +1 -1
  578. package/dist/domains/snap/sceneSession2d.js +6 -5
  579. package/dist/domains/snap/sceneSession2d.js.map +1 -1
  580. package/dist/domains/snap/screen.js +2 -3
  581. package/dist/domains/snap/session2d.js +4 -5
  582. package/dist/domains/snap/spanSnap.js +1 -2
  583. package/dist/domains/snap/stepAngles.js +1 -2
  584. package/dist/domains/text/editingDrawOne.js +1 -2
  585. package/dist/domains/text/hostTextEditors.js +1 -2
  586. package/dist/domains/text/index.js +2 -2
  587. package/dist/domains/text/sceneTextDrafts.js +1 -2
  588. package/dist/domains/text/textHitAt.js +4 -5
  589. package/dist/domains/text/textLayer.js +12 -2
  590. package/dist/domains/text/textLayer.js.map +1 -1
  591. package/dist/domains/text/useSceneTextEdit.js +4 -5
  592. package/dist/domains/viewports/aim.js +3 -4
  593. package/dist/domains/viewports/viewMarker.js +1 -2
  594. package/dist/domains/viewports/viewMarkerDrag.js +1 -2
  595. package/dist/domains/viewports/viewResolver.js +1 -2
  596. package/dist/domains/viewports/viewportLayer.js +1 -2
  597. package/dist/iconRegistry/IconRegistryProvider.js +1 -2
  598. package/dist/iconRegistry/useIconGlyph.js +1 -2
  599. package/dist/iconRegistry/useIconVariant.js +1 -2
  600. package/dist/icons.table.js +2 -3
  601. package/dist/icons.table.js.map +1 -1
  602. package/dist/icons.table.json +5 -0
  603. package/dist/icons2.table.js +1 -2
  604. package/dist/index.d.ts +160 -64
  605. package/dist/index.js +14 -9
  606. package/dist/input/keyState.js +1 -2
  607. package/dist/input/useKeyModifiers.js +1 -2
  608. package/dist/input/useKeyState.js +1 -2
  609. package/dist/interactions/actions/admitsChild.js +1 -2
  610. package/dist/interactions/actions/align/action.js +6 -7
  611. package/dist/interactions/actions/align/align.js +6 -7
  612. package/dist/interactions/actions/booleans/action.js +5 -4
  613. package/dist/interactions/actions/booleans/action.js.map +1 -1
  614. package/dist/interactions/actions/booleans/booleanGroupAction.js +2 -3
  615. package/dist/interactions/actions/booleans/booleans.js +1 -2
  616. package/dist/interactions/actions/booleans/commit.js +4 -5
  617. package/dist/interactions/actions/booleans/custom.js +2 -3
  618. package/dist/interactions/actions/booleans/keymap.js +1 -2
  619. package/dist/interactions/actions/booleans/operands.js +1 -2
  620. package/dist/interactions/actions/booleans/pieces.js +1 -2
  621. package/dist/interactions/actions/booleans/placement.js +1 -2
  622. package/dist/interactions/actions/booleans/useBooleans.js +1 -2
  623. package/dist/interactions/actions/booleans/useBooleansAdapter.js +1 -2
  624. package/dist/interactions/actions/clipboard/action.js +2 -3
  625. package/dist/interactions/actions/clipboard/clipboardOps.js +2 -3
  626. package/dist/interactions/actions/clipboard/materializePaste.js +1 -2
  627. package/dist/interactions/actions/clipboard/wireFormat.js +1 -2
  628. package/dist/interactions/actions/clone/action.js +7 -8
  629. package/dist/interactions/actions/clone/behaviors.js +4 -5
  630. package/dist/interactions/actions/defaultCommitAdapter.js +2 -3
  631. package/dist/interactions/actions/defaults/anchorEditing.js +6 -10
  632. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  633. package/dist/interactions/actions/defaults/anchorFields.js +1 -2
  634. package/dist/interactions/actions/defaults/anchorHandles.js +2 -3
  635. package/dist/interactions/actions/defaults/anchorJoin.js +2 -3
  636. package/dist/interactions/actions/defaults/areaSelect.js +6 -6
  637. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  638. package/dist/interactions/actions/defaults/bendSegment.js +4 -6
  639. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  640. package/dist/interactions/actions/defaults/cancelGesture.js +1 -2
  641. package/dist/interactions/actions/defaults/clearSelection.js +1 -2
  642. package/dist/interactions/actions/defaults/containerScroll.js +4 -5
  643. package/dist/interactions/actions/defaults/contextMenu.js +6 -7
  644. package/dist/interactions/actions/defaults/copySubtree.js +2 -3
  645. package/dist/interactions/actions/defaults/createPaintAction.js +3 -4
  646. package/dist/interactions/actions/defaults/delete.js +2 -3
  647. package/dist/interactions/actions/defaults/duplicate.js +5 -6
  648. package/dist/interactions/actions/defaults/enterGroup.js +2 -3
  649. package/dist/interactions/actions/defaults/enterPathEdit.js +1 -2
  650. package/dist/interactions/actions/defaults/enterTextEdit.js +1 -2
  651. package/dist/interactions/actions/defaults/escape.js +1 -2
  652. package/dist/interactions/actions/defaults/exitPathEdit.js +18 -3
  653. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -1
  654. package/dist/interactions/actions/defaults/group.js +6 -7
  655. package/dist/interactions/actions/defaults/ingest.js +3 -4
  656. package/dist/interactions/actions/defaults/insertPathAnchor.js +2 -3
  657. package/dist/interactions/actions/defaults/nudge.js +3 -4
  658. package/dist/interactions/actions/defaults/nudgeSteps.js +2 -3
  659. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
  660. package/dist/interactions/actions/defaults/pathEditMarks.js +1 -2
  661. package/dist/interactions/actions/defaults/pinchZoom.js +3 -4
  662. package/dist/interactions/actions/defaults/reorder.js +2 -3
  663. package/dist/interactions/actions/defaults/requiresSelection.js +1 -2
  664. package/dist/interactions/actions/defaults/segmentUnder.js +1 -2
  665. package/dist/interactions/actions/defaults/selectAll.js +1 -2
  666. package/dist/interactions/actions/defaults/selectDeep.js +1 -2
  667. package/dist/interactions/actions/defaults/setFill.js +1 -2
  668. package/dist/interactions/actions/defaults/setFillOpacity.js +1 -2
  669. package/dist/interactions/actions/defaults/setStroke.js +1 -2
  670. package/dist/interactions/actions/defaults/setStrokeOpacity.js +1 -2
  671. package/dist/interactions/actions/defaults/slice.js +1 -2
  672. package/dist/interactions/actions/defaults/sliceOps.js +1 -2
  673. package/dist/interactions/actions/defaults/toolActivate.js +1 -2
  674. package/dist/interactions/actions/defaults/toolResetToDefault.js +1 -2
  675. package/dist/interactions/actions/defaults/undoRedo.js +1 -2
  676. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -2
  677. package/dist/interactions/actions/defaults/viewportWheelPan.js +1 -2
  678. package/dist/interactions/actions/defaults/viewportZoom.js +3 -4
  679. package/dist/interactions/actions/distribute/action.js +4 -5
  680. package/dist/interactions/actions/distribute/distribute.js +5 -6
  681. package/dist/interactions/actions/distribute/plan.js +1 -2
  682. package/dist/interactions/actions/drawnBoxes.js +4 -5
  683. package/dist/interactions/actions/dropVerdict.js +1 -2
  684. package/dist/interactions/actions/edit-anchors/action.js +7 -9
  685. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  686. package/dist/interactions/actions/edit-anchors/extensionDrags.js +1 -2
  687. package/dist/interactions/actions/edit-anchors/geometry.js +1 -2
  688. package/dist/interactions/actions/edit-anchors/handleDrag.js +1 -2
  689. package/dist/interactions/actions/edit-anchors/handles.js +1 -2
  690. package/dist/interactions/actions/edit-anchors/params.js +1 -2
  691. package/dist/interactions/actions/edit-anchors/preview.js +1 -2
  692. package/dist/interactions/actions/edit-anchors/symmetry.js +1 -2
  693. package/dist/interactions/actions/flip/action.js +8 -9
  694. package/dist/interactions/actions/flip/helpers.js +1 -2
  695. package/dist/interactions/actions/geometryProjection.js +1 -2
  696. package/dist/interactions/actions/gestureFrames.js +3 -4
  697. package/dist/interactions/actions/gestureLifecycle.js +1 -2
  698. package/dist/interactions/actions/hitSelection.js +7 -3
  699. package/dist/interactions/actions/hitSelection.js.map +1 -1
  700. package/dist/interactions/actions/insert/action.js +27 -9
  701. package/dist/interactions/actions/insert/action.js.map +1 -1
  702. package/dist/interactions/actions/insert/commit.js +2 -3
  703. package/dist/interactions/actions/insert/extras.js +1 -2
  704. package/dist/interactions/actions/insert/frame.js +1 -2
  705. package/dist/interactions/actions/insert/geometry.js +1 -2
  706. package/dist/interactions/actions/insert/params.js +42 -0
  707. package/dist/interactions/actions/insert/params.js.map +1 -0
  708. package/dist/interactions/actions/insert/parent.js +1 -2
  709. package/dist/interactions/actions/insert/placeAction.js +5 -6
  710. package/dist/interactions/actions/insert/repositionAction.js +1 -2
  711. package/dist/interactions/actions/insert/rotateAction.js +1 -2
  712. package/dist/interactions/actions/insert/session.js +5 -6
  713. package/dist/interactions/actions/insert/shape.js +2 -3
  714. package/dist/interactions/actions/lasso-select/action.js +9 -9
  715. package/dist/interactions/actions/lasso-select/action.js.map +1 -1
  716. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +2 -3
  717. package/dist/interactions/actions/magnification.js +37 -0
  718. package/dist/interactions/actions/magnification.js.map +1 -0
  719. package/dist/interactions/actions/move/action.js +2 -3
  720. package/dist/interactions/actions/move/behaviors/layoutDrop.js +2 -3
  721. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +2 -3
  722. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +1 -2
  723. package/dist/interactions/actions/move/behaviors/snapToContainer.js +2 -3
  724. package/dist/interactions/actions/move/capture.js +6 -7
  725. package/dist/interactions/actions/move/commit/index.js +2 -3
  726. package/dist/interactions/actions/move/commit/layoutDrop.js +4 -5
  727. package/dist/interactions/actions/move/commit/layoutRelease.js +7 -8
  728. package/dist/interactions/actions/move/commit/rebase.js +2 -3
  729. package/dist/interactions/actions/move/commit/reparent.js +5 -6
  730. package/dist/interactions/actions/move/delta.js +2 -3
  731. package/dist/interactions/actions/move/frame.js +2 -3
  732. package/dist/interactions/actions/move/gestureAdapter.js +1 -2
  733. package/dist/interactions/actions/move/landedDescendants.js +2 -3
  734. package/dist/interactions/actions/move/layout/container.js +3 -4
  735. package/dist/interactions/actions/move/layout/dragged.js +2 -3
  736. package/dist/interactions/actions/move/layout/dropPass.js +5 -6
  737. package/dist/interactions/actions/move/layout/exits.js +2 -3
  738. package/dist/interactions/actions/move/layout/glide.js +2 -3
  739. package/dist/interactions/actions/move/layout/view.js +1 -2
  740. package/dist/interactions/actions/move/refusal.js +2 -3
  741. package/dist/interactions/actions/move/session.js +4 -5
  742. package/dist/interactions/actions/move/translate.js +2 -3
  743. package/dist/interactions/actions/moveNodes.js +5 -6
  744. package/dist/interactions/actions/notices.js +16 -0
  745. package/dist/interactions/actions/notices.js.map +1 -0
  746. package/dist/interactions/actions/outlines/createOutlines.js +9 -8
  747. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  748. package/dist/interactions/actions/outlines/createOutlinesAction.js +14 -10
  749. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -1
  750. package/dist/interactions/actions/outlines/outlineStroke.js +2 -3
  751. package/dist/interactions/actions/outlines/outlineStrokeAction.js +5 -5
  752. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -1
  753. package/dist/interactions/actions/outlines/replaceWithPaths.js +5 -6
  754. package/dist/interactions/actions/outlines/strokeRegion.js +1 -2
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +1 -2
  756. package/dist/interactions/actions/pathCommands/cutJoin.js +3 -4
  757. package/dist/interactions/actions/pathCommands/livePathEdit.js +3 -4
  758. package/dist/interactions/actions/pathCommands/pathNodes.js +2 -3
  759. package/dist/interactions/actions/pathCommands/simplifyOffset.js +2 -3
  760. package/dist/interactions/actions/pathGestureTags.js +1 -2
  761. package/dist/interactions/actions/planeInput.js +2 -3
  762. package/dist/interactions/actions/pointerState.js +1 -2
  763. package/dist/interactions/actions/poseDescriptorDep.js +1 -2
  764. package/dist/interactions/actions/poseFrame.js +3 -4
  765. package/dist/interactions/actions/resize/action.js +3 -4
  766. package/dist/interactions/actions/resize/aspect.js +1 -2
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +1 -2
  768. package/dist/interactions/actions/resize/boxFrame.js +1 -2
  769. package/dist/interactions/actions/resize/capture.js +7 -8
  770. package/dist/interactions/actions/resize/commit.js +3 -4
  771. package/dist/interactions/actions/resize/cornerHandles.js +1 -2
  772. package/dist/interactions/actions/resize/frame.js +7 -8
  773. package/dist/interactions/actions/resize/held.js +2 -3
  774. package/dist/interactions/actions/resize/minimum.js +1 -2
  775. package/dist/interactions/actions/resize/replay.js +1 -2
  776. package/dist/interactions/actions/resize/ruleBounds.js +1 -2
  777. package/dist/interactions/actions/resize/session.js +9 -10
  778. package/dist/interactions/actions/resolveOverlays.js +1 -2
  779. package/dist/interactions/actions/resolvePreviews.js +3 -4
  780. package/dist/interactions/actions/rotate/action.js +5 -6
  781. package/dist/interactions/actions/rotate/commit.js +2 -3
  782. package/dist/interactions/actions/rotate/frame.js +3 -4
  783. package/dist/interactions/actions/rotate/geometry.js +1 -2
  784. package/dist/interactions/actions/rotate/handle.js +2 -3
  785. package/dist/interactions/actions/rotate/replay.js +2 -3
  786. package/dist/interactions/actions/rotate/session.js +10 -11
  787. package/dist/interactions/actions/selectionSubtree.js +7 -22
  788. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  789. package/dist/interactions/actions/spatialReference.js +1 -2
  790. package/dist/interactions/actions/testUtils.js +1 -9
  791. package/dist/interactions/actions/testUtils.js.map +1 -1
  792. package/dist/interactions/actions/transform-again/action.js +5 -6
  793. package/dist/interactions/actions/transform-again/memory.js +1 -2
  794. package/dist/interactions/actions/transformFinish.js +1 -2
  795. package/dist/interactions/actions/useActionSet.js +1 -2
  796. package/dist/interactions/actions/useNotices.js +12 -0
  797. package/dist/interactions/actions/useNotices.js.map +1 -0
  798. package/dist/interactions/actions/useStandardActions.js +1 -2
  799. package/dist/interactions/gestures/dragGesture/dragGesture.js +1 -2
  800. package/dist/interactions/gestures/dragGesture/dragPointOf.js +1 -2
  801. package/dist/interactions/gestures/dragRadial/dragRadial.js +2 -3
  802. package/dist/interactions/gestures/dragRect/dragRect.js +2 -3
  803. package/dist/interactions/gestures/handleDrag/handleDrag.js +1 -2
  804. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +1 -2
  805. package/dist/interactions/gestures/shared/originProjection.js +1 -2
  806. package/dist/interactions/gestures/shared/screenTolerance.js +1 -2
  807. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +1 -2
  808. package/dist/kitSettingsSchema.js +4 -5
  809. package/dist/test-hook/createTestHook.js +1 -2
  810. package/dist/test-hook/install.js +1 -2
  811. package/dist/test-hook/useTestHook.js +1 -2
  812. package/dist/test-seams.d.ts +7 -14
  813. package/dist/test-seams.js +2 -2
  814. package/dist/tools/builtin/anchors/anchorsTool.js +30 -0
  815. package/dist/tools/builtin/anchors/anchorsTool.js.map +1 -0
  816. package/dist/tools/builtin/ellipse/useEllipseTool.js +2 -3
  817. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +1 -2
  818. package/dist/tools/builtin/hand/dragPanContribution.js +1 -2
  819. package/dist/tools/builtin/hand/useHandTool.js +1 -2
  820. package/dist/tools/builtin/image/useImageTool.js +1 -2
  821. package/dist/tools/builtin/lasso/useLassoTool.js +1 -2
  822. package/dist/tools/builtin/line/useLineTool.js +2 -3
  823. package/dist/tools/builtin/measure/useMeasureTool.js +2 -3
  824. package/dist/tools/builtin/pen/penHandle.js +1 -2
  825. package/dist/tools/builtin/pen/usePenTool.js +6 -7
  826. package/dist/tools/builtin/pencil/usePencilTool.js +1 -2
  827. package/dist/tools/builtin/pickTopMostHit.js +1 -2
  828. package/dist/tools/builtin/polygon/usePolygonTool.js +2 -3
  829. package/dist/tools/builtin/pressTarget.js +1 -2
  830. package/dist/tools/builtin/rect/useRectTool.js +2 -3
  831. package/dist/tools/builtin/select/adapterPointQuery.js +3 -4
  832. package/dist/tools/builtin/select/collapseDeferred.js +1 -2
  833. package/dist/tools/builtin/select/groupEntry.js +2 -3
  834. package/dist/tools/builtin/select/pressDecision.js +3 -4
  835. package/dist/tools/builtin/select/pressDecision.js.map +1 -1
  836. package/dist/tools/builtin/select/selectionContributions.js +1 -2
  837. package/dist/tools/builtin/select/useSelectTool.js +5 -6
  838. package/dist/tools/builtin/shared/insertToolOptions.js +1 -2
  839. package/dist/tools/builtin/shared/pointerFollower.js +1 -2
  840. package/dist/tools/builtin/slice/useSliceTool.js +5 -6
  841. package/dist/tools/builtin/star/useStarTool.js +2 -3
  842. package/dist/tools/builtin/sticky/stickyNode.js +1 -2
  843. package/dist/tools/builtin/sticky/useStickyTool.js +2 -3
  844. package/dist/tools/builtin/text/useTextTool.js +1 -2
  845. package/dist/tools/index.js +4 -2
  846. package/dist/tools/overlayBinding.js +1 -2
  847. package/dist/tools/toolOptions.js +60 -0
  848. package/dist/tools/toolOptions.js.map +1 -0
  849. package/dist/tools/useKeybindings.js +1 -2
  850. package/dist/{types-DW14eu9B.d.ts → types-BUvUXZe5.d.ts} +3 -3
  851. package/dist/util/color.js +1 -2
  852. package/dist/util/paint.js +1 -2
  853. package/dist/version.js +2 -3
  854. package/package.json +27 -27
  855. package/dist/interactions/actions/defaults/pathEditTools.js +0 -60
  856. package/dist/interactions/actions/defaults/pathEditTools.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { createSetDataOp } from "../../core/ops/setData.js";
2
2
  import "@weasel-js/geom";
3
3
 
4
- //#region src/interactions/actions/geometryProjection.ts
4
+ // src/interactions/actions/geometryProjection.ts
5
5
  /** Build the `setData` op for a node when a geometryProjection is wired and
6
6
  * returns non-null. Returns `undefined` (no op) otherwise — keeping the data
7
7
  * op strictly opt-in so adapters without `setData` are never invoked. `to` is
@@ -23,6 +23,5 @@ function geometryDataOp(projection, node, m, to, label) {
23
23
  });
24
24
  }
25
25
 
26
- //#endregion
27
26
  export { geometryDataOp };
28
27
  //# sourceMappingURL=geometryProjection.js.map
@@ -1,8 +1,8 @@
1
- import { scenePoseFrame } from "./poseFrame.js";
2
- import { planeOf } from "./planeInput.js";
3
1
  import { drawnBoxes } from "./drawnBoxes.js";
2
+ import { planeOf } from "./planeInput.js";
3
+ import { scenePoseFrame } from "./poseFrame.js";
4
4
 
5
- //#region src/interactions/actions/gestureFrames.ts
5
+ // src/interactions/actions/gestureFrames.ts
6
6
  /** A scene-backed gesture's {@link GestureFrames}, read through the action's deps. */
7
7
  function sceneGestureFrames(scene, deps, frame = scenePoseFrame(scene)) {
8
8
  const view = deps.view;
@@ -23,6 +23,5 @@ function sceneGestureFrames(scene, deps, frame = scenePoseFrame(scene)) {
23
23
  };
24
24
  }
25
25
 
26
- //#endregion
27
26
  export { sceneGestureFrames };
28
27
  //# sourceMappingURL=gestureFrames.js.map
@@ -1,6 +1,6 @@
1
1
  import { SceneArrivalRefused } from "../../core/scene/arrivals.js";
2
2
 
3
- //#region src/interactions/actions/gestureLifecycle.ts
3
+ // src/interactions/actions/gestureLifecycle.ts
4
4
  /** The params entries for {@link GestureLifecycleOptions}, with the unset
5
5
  * keys left out. */
6
6
  function gestureLifecycleParams(o) {
@@ -114,6 +114,5 @@ function closeGesture(gesture, committed) {
114
114
  runEvery([() => runBehaviorSettled(gesture.behaviors, gesture.ctx, committed), () => gesture.lifecycle.end(committed)], (step) => step());
115
115
  }
116
116
 
117
- //#endregion
118
117
  export { closeGesture, commitGestureOps, gestureLifecycleParams, readGestureLifecycle, reduceBehaviorEnd, runBehaviorCancel, runBehaviorSettled };
119
118
  //# sourceMappingURL=gestureLifecycle.js.map
@@ -1,10 +1,14 @@
1
- //#region src/interactions/actions/hitSelection.ts
1
+ // src/interactions/actions/hitSelection.ts
2
+ /** What selecting `hits` selects: each hit's `targetOf`, first answer kept,
3
+ * or the hits themselves when there is no `targetOf`. */
4
+ function hitTargets(hits, targetOf) {
5
+ return targetOf ? [...new Set(hits.map(targetOf))] : [...hits];
6
+ }
2
7
  /** The selection a hit list leaves behind: the hits alone, or, when the
3
8
  * gesture extends the selection, the current ids with the new hits after them. */
4
9
  function selectionFromHits(current, hits, extend) {
5
10
  return [...new Set(extend ? [...current, ...hits] : hits)];
6
11
  }
7
12
 
8
- //#endregion
9
- export { selectionFromHits };
13
+ export { hitTargets, selectionFromHits };
10
14
  //# sourceMappingURL=hitSelection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"hitSelection.js","names":[],"sources":["../../../src/interactions/actions/hitSelection.ts"],"sourcesContent":["/** The selection a hit list leaves behind: the hits alone, or, when the\n * gesture extends the selection, the current ids with the new hits after them. */\nexport function selectionFromHits<T extends string>(\n current: readonly T[],\n hits: readonly T[],\n extend: boolean,\n): T[] {\n return [...new Set(extend ? [...current, ...hits] : hits)];\n}\n"],"mappings":";;;AAEA,SAAgB,kBACd,SACA,MACA,QACK;CACL,OAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;AAC3D"}
1
+ {"version":3,"file":"hitSelection.js","names":[],"sources":["../../../src/interactions/actions/hitSelection.ts"],"sourcesContent":["/** What selecting `hits` selects: each hit's `targetOf`, first answer kept,\n * or the hits themselves when there is no `targetOf`. */\nexport function hitTargets<T extends string>(hits: readonly T[], targetOf?: (id: T) => T): T[] {\n return targetOf ? [...new Set(hits.map(targetOf))] : [...hits];\n}\n\n/** The selection a hit list leaves behind: the hits alone, or, when the\n * gesture extends the selection, the current ids with the new hits after them. */\nexport function selectionFromHits<T extends string>(\n current: readonly T[],\n hits: readonly T[],\n extend: boolean,\n): T[] {\n return [...new Set(extend ? [...current, ...hits] : hits)];\n}\n"],"mappings":";;;AAEA,SAAgB,WAA6B,MAAoB,UAA8B;CAC7F,OAAO,WAAW,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI;AAC/D;;;AAIA,SAAgB,kBACd,SACA,MACA,QACK;CACL,OAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,SAAS,GAAG,IAAI,IAAI,IAAI,CAAC;AAC3D"}
@@ -1,16 +1,17 @@
1
- import { scenePaintedPoseOf } from "../../../canvas/derivedPath.js";
1
+ import { shapeKindInfo } from "../../../core/shapeKinds.js";
2
+ import { SNAP_ROLES } from "../../../domains/snap/roles.js";
2
3
  import { runBehaviorSettled } from "../gestureLifecycle.js";
3
4
  import { inPlane, insertLayer } from "../planeInput.js";
4
- import { SNAP_ROLES } from "../../../domains/snap/roles.js";
5
- import { shapeKindInfo } from "../../../core/shapeKinds.js";
6
5
  import { copiesWithin } from "../../../canvas/copiesAbove.js";
7
- import { insertKind, insertShape } from "./shape.js";
6
+ import { scenePaintedPoseOf } from "../../../canvas/derivedPath.js";
8
7
  import { cancelInsert, commitInsert } from "./commit.js";
9
- import { beginInsert } from "./session.js";
10
8
  import { carryStart, nextFrame } from "./frame.js";
9
+ import { insertParams } from "./params.js";
10
+ import { beginInsert } from "./session.js";
11
+ import { insertKind, insertShape } from "./shape.js";
11
12
  import { resolveParams } from "@weasel-js/routing";
12
13
 
13
- //#region src/interactions/actions/insert/action.ts
14
+ // src/interactions/actions/insert/action.ts
14
15
  /** How far, in CSS pixels, a drag travels before it draws a shape: past the wobble of a click, so a
15
16
  * press that drifts a few pixels draws nothing rather than a shape a few pixels wide. */
16
17
  var INSERT_DRAG_THRESHOLD_PX = 8;
@@ -28,6 +29,10 @@ var INSERT_DRAG_THRESHOLD_PX = 8;
28
29
  * The new node has no scene id until commit, so the live preview is the
29
30
  * `overlay()` surface with `kind: 'insertPreview'`. A consumer-defined kind
30
31
  * the kit cannot draw skips the preview and still commits on release.
32
+ *
33
+ * A polygon's or a star's insert is the last operation once it commits, so a
34
+ * panel can change its sides, or its points and inner radius, by replaying the
35
+ * drag (`insertParams`); a drag that behaviors answered does not replay.
31
36
  */
32
37
  var insertAction = inPlane({
33
38
  id: "insert",
@@ -48,6 +53,7 @@ var insertAction = inPlane({
48
53
  "view",
49
54
  "kitSettings"
50
55
  ],
56
+ params: insertParams,
51
57
  invoker: {
52
58
  timing: "ongoing",
53
59
  dragThresholdPx: INSERT_DRAG_THRESHOLD_PX,
@@ -61,6 +67,7 @@ var insertAction = inPlane({
61
67
  userRotation: 0,
62
68
  repositioning: false
63
69
  };
70
+ let trail = null;
64
71
  const live = ctx.deps.insertLive;
65
72
  if (live) live.gesture = gesture;
66
73
  const scene = ctx.deps.scene;
@@ -94,12 +101,24 @@ var insertAction = inPlane({
94
101
  let committed = false;
95
102
  try {
96
103
  if (reason === "cancel") cancelInsert(session);
97
- else committed = commitInsert(session, frame, endCtx.drag?.points ?? frame.points, gesture.userRotation);
104
+ else {
105
+ trail = endCtx.drag?.points ?? frame.points;
106
+ committed = commitInsert(session, frame, trail, gesture.userRotation);
107
+ }
98
108
  } finally {
99
109
  session.snap.close();
100
110
  runBehaviorSettled(session.behaviors, session.gestureCtx, committed);
101
111
  }
102
- }
112
+ },
113
+ ...session.behaviors.length === 0 ? { replay(params) {
114
+ commitInsert({
115
+ ...session,
116
+ opts: {
117
+ ...session.opts,
118
+ params
119
+ }
120
+ }, frame, trail, gesture.userRotation);
121
+ } } : {}
103
122
  };
104
123
  }
105
124
  },
@@ -107,6 +126,5 @@ var insertAction = inPlane({
107
126
  enabled: () => true
108
127
  }, insertLayer);
109
128
 
110
- //#endregion
111
129
  export { INSERT_DRAG_THRESHOLD_PX, insertAction };
112
130
  //# sourceMappingURL=action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/insert/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, BindingOpts, OngoingOverlay } from '@weasel-js/routing';\nimport { resolveParams } from '@weasel-js/routing';\nimport { shapeKindInfo } from 'core/shapeKinds';\nimport type { KitInsertShape } from 'core/shapeKinds';\nimport { SNAP_ROLES } from 'domains/snap/roles';\nimport { runBehaviorSettled } from '../gestureLifecycle';\nimport { inPlane, insertLayer } from '../planeInput';\nimport { copiesWithin } from 'canvas/copiesAbove';\nimport { scenePaintedPoseOf } from 'canvas/derivedPath';\nimport { cancelInsert, commitInsert } from './commit';\nimport { carryStart, nextFrame } from './frame';\nimport type { InsertLiveGesture } from './live';\nimport { beginInsert } from './session';\nimport { insertKind, insertShape } from './shape';\n\n/** How far, in CSS pixels, a drag travels before it draws a shape: past the wobble of a click, so a\n * press that drifts a few pixels draws nothing rather than a shape a few pixels wide. */\nexport const INSERT_DRAG_THRESHOLD_PX = 8;\n\n/**\n * Drag-to-insert. The node `kind` is read from `opts.params.kind`.\n *\n * The drag's start and current point snap through the `snap` dep's `point`\n * sessions (never freehand pencil samples). While `snap.constrain` (Shift) is\n * held, a line's end stays on the 15° line through the snapped start nearest\n * the pointer, and lands where that line meets a target. Behaviors from the\n * binding's `opts.behaviors` (`InsertBehavior[]`) run over the two points\n * after that; on release the first answer wins (`null` aborts, `Op[]` commits\n * in place of the insert).\n *\n * The new node has no scene id until commit, so the live preview is the\n * `overlay()` surface with `kind: 'insertPreview'`. A consumer-defined kind\n * the kit cannot draw skips the preview and still commits on release.\n */\nexport const insertAction: Action & { requires: string[] } = inPlane({\n id: 'insert',\n label: 'Insert',\n group: 'insert',\n eligible: { capability: 'creates-shapes' },\n modifierRoles: SNAP_ROLES,\n requires: ['insert', 'insertLive', 'insertInto', 'canDropInto', 'selection', 'snap', 'textEdit', 'scene', 'applyOps', 'view', 'kitSettings'],\n invoker: {\n timing: 'ongoing',\n dragThresholdPx: INSERT_DRAG_THRESHOLD_PX,\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const begun = beginInsert(ctx, opts);\n if (!begun) return {};\n const { session, readers } = begun;\n let frame = begun.frame;\n const gesture: InsertLiveGesture = { open: true, userRotation: 0, repositioning: false };\n const live = ctx.deps.insertLive;\n if (live) live.gesture = gesture;\n // Where the shape will land decides the copies it will be drawn in.\n const scene = ctx.deps.scene;\n const copies = scene ? copiesWithin(scene, session.parent, scenePaintedPoseOf(scene)) : [];\n\n return {\n kind: 'insert',\n onMove(moveCtx: InvocationCtx): void {\n if (gesture.repositioning) carryStart(session, frame.pointer, moveCtx.world, moveCtx);\n frame = nextFrame(session, readers, frame, moveCtx);\n },\n overlay(): OngoingOverlay | null {\n if (!gesture.open) return null;\n // Resolve params on every overlay() so thunked params (polygon\n // sides ticking via ArrowUp mid-drag) reflect in the live preview.\n const resolved = resolveParams(session.opts?.params);\n if (!shapeKindInfo(insertKind(resolved))?.insertPreview) return null;\n const { bounds, extras, start } = insertShape(resolved, frame, frame.points, gesture.userRotation);\n return {\n kind: 'insertPreview',\n shape: extras.kind as KitInsertShape,\n bounds,\n extras,\n // Anchor dot at the click point: radial shapes have no vertex\n // there, and in center mode it marks the growth axis.\n anchorPoint: { x: start.x, y: start.y },\n ...(copies.length > 0 ? { copies } : {}),\n };\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n gesture.open = false;\n if (live?.gesture === gesture) live.gesture = null;\n let committed = false;\n try {\n if (reason === 'cancel') cancelInsert(session);\n else committed = commitInsert(session, frame, endCtx.drag?.points ?? frame.points, gesture.userRotation);\n } finally {\n session.snap.close();\n runBehaviorSettled(session.behaviors, session.gestureCtx, committed);\n }\n },\n };\n },\n },\n /** Insert needs no selection; anything but `true` blocks dispatcher-routed inserts. */\n enabled: () => true as const,\n}, insertLayer);\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,IAAa,2BAA2B;;;;;;;;;;;;;;;;AAiBxC,IAAa,eAAgD,QAAQ;CACnE,IAAI;CACJ,OAAO;CACP,OAAO;CACP,UAAU,EAAE,YAAY,iBAAiB;CACzC,eAAe;CACf,UAAU;EAAC;EAAU;EAAc;EAAc;EAAe;EAAa;EAAQ;EAAY;EAAS;EAAY;EAAQ;CAAa;CAC3I,SAAS;EACP,QAAQ;EACR,iBAAiB;EACjB,MAAM,KAAoB,MAAmC;GAC3D,MAAM,QAAQ,YAAY,KAAK,IAAI;GACnC,IAAI,CAAC,OAAO,OAAO,CAAC;GACpB,MAAM,EAAE,SAAS,YAAY;GAC7B,IAAI,QAAQ,MAAM;GAClB,MAAM,UAA6B;IAAE,MAAM;IAAM,cAAc;IAAG,eAAe;GAAM;GACvF,MAAM,OAAO,IAAI,KAAK;GACtB,IAAI,MAAM,KAAK,UAAU;GAEzB,MAAM,QAAQ,IAAI,KAAK;GACvB,MAAM,SAAS,QAAQ,aAAa,OAAO,QAAQ,QAAQ,mBAAmB,KAAK,CAAC,IAAI,CAAC;GAEzF,OAAO;IACL,MAAM;IACN,OAAO,SAA8B;KACnC,IAAI,QAAQ,eAAe,WAAW,SAAS,MAAM,SAAS,QAAQ,OAAO,OAAO;KACpF,QAAQ,UAAU,SAAS,SAAS,OAAO,OAAO;IACpD;IACA,UAAiC;KAC/B,IAAI,CAAC,QAAQ,MAAM,OAAO;KAG1B,MAAM,WAAW,cAAc,QAAQ,MAAM,MAAM;KACnD,IAAI,CAAC,cAAc,WAAW,QAAQ,CAAC,CAAC,EAAE,eAAe,OAAO;KAChE,MAAM,EAAE,QAAQ,QAAQ,UAAU,YAAY,UAAU,OAAO,MAAM,QAAQ,QAAQ,YAAY;KACjG,OAAO;MACL,MAAM;MACN,OAAO,OAAO;MACd;MACA;MAGA,aAAa;OAAE,GAAG,MAAM;OAAG,GAAG,MAAM;MAAE;MACtC,GAAI,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;KACxC;IACF;IACA,MAAM,QAAuB,QAAmC;KAC9D,QAAQ,OAAO;KACf,IAAI,MAAM,YAAY,SAAS,KAAK,UAAU;KAC9C,IAAI,YAAY;KAChB,IAAI;MACF,IAAI,WAAW,UAAU,aAAa,OAAO;WACxC,YAAY,aAAa,SAAS,OAAO,OAAO,MAAM,UAAU,MAAM,QAAQ,QAAQ,YAAY;KACzG,UAAU;MACR,QAAQ,KAAK,MAAM;MACnB,mBAAmB,QAAQ,WAAW,QAAQ,YAAY,SAAS;KACrE;IACF;GACF;EACF;CACF;;CAEA,eAAe;AACjB,GAAG,WAAW"}
1
+ {"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/insert/action.ts"],"sourcesContent":["import type { Action } from '@weasel-js/routing';\nimport type { DragSample, InvocationCtx, OngoingHandle, BindingOpts, OngoingOverlay } from '@weasel-js/routing';\nimport { resolveParams } from '@weasel-js/routing';\nimport { shapeKindInfo } from 'core/shapeKinds';\nimport type { KitInsertShape } from 'core/shapeKinds';\nimport { SNAP_ROLES } from 'domains/snap/roles';\nimport { runBehaviorSettled } from '../gestureLifecycle';\nimport { inPlane, insertLayer } from '../planeInput';\nimport { copiesWithin } from 'canvas/copiesAbove';\nimport { scenePaintedPoseOf } from 'canvas/derivedPath';\nimport { cancelInsert, commitInsert } from './commit';\nimport { carryStart, nextFrame } from './frame';\nimport type { InsertLiveGesture } from './live';\nimport { insertParams } from './params';\nimport { beginInsert } from './session';\nimport { insertKind, insertShape } from './shape';\n\n/** How far, in CSS pixels, a drag travels before it draws a shape: past the wobble of a click, so a\n * press that drifts a few pixels draws nothing rather than a shape a few pixels wide. */\nexport const INSERT_DRAG_THRESHOLD_PX = 8;\n\n/**\n * Drag-to-insert. The node `kind` is read from `opts.params.kind`.\n *\n * The drag's start and current point snap through the `snap` dep's `point`\n * sessions (never freehand pencil samples). While `snap.constrain` (Shift) is\n * held, a line's end stays on the 15° line through the snapped start nearest\n * the pointer, and lands where that line meets a target. Behaviors from the\n * binding's `opts.behaviors` (`InsertBehavior[]`) run over the two points\n * after that; on release the first answer wins (`null` aborts, `Op[]` commits\n * in place of the insert).\n *\n * The new node has no scene id until commit, so the live preview is the\n * `overlay()` surface with `kind: 'insertPreview'`. A consumer-defined kind\n * the kit cannot draw skips the preview and still commits on release.\n *\n * A polygon's or a star's insert is the last operation once it commits, so a\n * panel can change its sides, or its points and inner radius, by replaying the\n * drag (`insertParams`); a drag that behaviors answered does not replay.\n */\nexport const insertAction: Action & { requires: string[] } = inPlane({\n id: 'insert',\n label: 'Insert',\n group: 'insert',\n eligible: { capability: 'creates-shapes' },\n modifierRoles: SNAP_ROLES,\n requires: ['insert', 'insertLive', 'insertInto', 'canDropInto', 'selection', 'snap', 'textEdit', 'scene', 'applyOps', 'view', 'kitSettings'],\n params: insertParams,\n invoker: {\n timing: 'ongoing',\n dragThresholdPx: INSERT_DRAG_THRESHOLD_PX,\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const begun = beginInsert(ctx, opts);\n if (!begun) return {};\n const { session, readers } = begun;\n let frame = begun.frame;\n const gesture: InsertLiveGesture = { open: true, userRotation: 0, repositioning: false };\n let trail: readonly DragSample[] | null = null;\n const live = ctx.deps.insertLive;\n if (live) live.gesture = gesture;\n // Where the shape will land decides the copies it will be drawn in.\n const scene = ctx.deps.scene;\n const copies = scene ? copiesWithin(scene, session.parent, scenePaintedPoseOf(scene)) : [];\n\n return {\n kind: 'insert',\n onMove(moveCtx: InvocationCtx): void {\n if (gesture.repositioning) carryStart(session, frame.pointer, moveCtx.world, moveCtx);\n frame = nextFrame(session, readers, frame, moveCtx);\n },\n overlay(): OngoingOverlay | null {\n if (!gesture.open) return null;\n // Resolve params on every overlay() so thunked params (polygon\n // sides ticking via ArrowUp mid-drag) reflect in the live preview.\n const resolved = resolveParams(session.opts?.params);\n if (!shapeKindInfo(insertKind(resolved))?.insertPreview) return null;\n const { bounds, extras, start } = insertShape(resolved, frame, frame.points, gesture.userRotation);\n return {\n kind: 'insertPreview',\n shape: extras.kind as KitInsertShape,\n bounds,\n extras,\n // Anchor dot at the click point: radial shapes have no vertex\n // there, and in center mode it marks the growth axis.\n anchorPoint: { x: start.x, y: start.y },\n ...(copies.length > 0 ? { copies } : {}),\n };\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n gesture.open = false;\n if (live?.gesture === gesture) live.gesture = null;\n let committed = false;\n try {\n if (reason === 'cancel') cancelInsert(session);\n else {\n trail = endCtx.drag?.points ?? frame.points;\n committed = commitInsert(session, frame, trail, gesture.userRotation);\n }\n } finally {\n session.snap.close();\n runBehaviorSettled(session.behaviors, session.gestureCtx, committed);\n }\n },\n // A behavior's answer is its own to make once, so only a plain insert replays.\n ...(session.behaviors.length === 0 ? {\n replay(params: Record<string, unknown>): void {\n commitInsert({ ...session, opts: { ...session.opts, params } }, frame, trail, gesture.userRotation);\n },\n } : {}),\n };\n },\n },\n /** Insert needs no selection; anything but `true` blocks dispatcher-routed inserts. */\n enabled: () => true as const,\n}, insertLayer);\n"],"mappings":";;;;;;;;;;;;;;;;AAmBA,IAAa,2BAA2B;;;;;;;;;;;;;;;;;;;;AAqBxC,IAAa,eAAgD,QAAQ;CACnE,IAAI;CACJ,OAAO;CACP,OAAO;CACP,UAAU,EAAE,YAAY,iBAAiB;CACzC,eAAe;CACf,UAAU;EAAC;EAAU;EAAc;EAAc;EAAe;EAAa;EAAQ;EAAY;EAAS;EAAY;EAAQ;CAAa;CAC3I,QAAQ;CACR,SAAS;EACP,QAAQ;EACR,iBAAiB;EACjB,MAAM,KAAoB,MAAmC;GAC3D,MAAM,QAAQ,YAAY,KAAK,IAAI;GACnC,IAAI,CAAC,OAAO,OAAO,CAAC;GACpB,MAAM,EAAE,SAAS,YAAY;GAC7B,IAAI,QAAQ,MAAM;GAClB,MAAM,UAA6B;IAAE,MAAM;IAAM,cAAc;IAAG,eAAe;GAAM;GACvF,IAAI,QAAsC;GAC1C,MAAM,OAAO,IAAI,KAAK;GACtB,IAAI,MAAM,KAAK,UAAU;GAEzB,MAAM,QAAQ,IAAI,KAAK;GACvB,MAAM,SAAS,QAAQ,aAAa,OAAO,QAAQ,QAAQ,mBAAmB,KAAK,CAAC,IAAI,CAAC;GAEzF,OAAO;IACL,MAAM;IACN,OAAO,SAA8B;KACnC,IAAI,QAAQ,eAAe,WAAW,SAAS,MAAM,SAAS,QAAQ,OAAO,OAAO;KACpF,QAAQ,UAAU,SAAS,SAAS,OAAO,OAAO;IACpD;IACA,UAAiC;KAC/B,IAAI,CAAC,QAAQ,MAAM,OAAO;KAG1B,MAAM,WAAW,cAAc,QAAQ,MAAM,MAAM;KACnD,IAAI,CAAC,cAAc,WAAW,QAAQ,CAAC,CAAC,EAAE,eAAe,OAAO;KAChE,MAAM,EAAE,QAAQ,QAAQ,UAAU,YAAY,UAAU,OAAO,MAAM,QAAQ,QAAQ,YAAY;KACjG,OAAO;MACL,MAAM;MACN,OAAO,OAAO;MACd;MACA;MAGA,aAAa;OAAE,GAAG,MAAM;OAAG,GAAG,MAAM;MAAE;MACtC,GAAI,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;KACxC;IACF;IACA,MAAM,QAAuB,QAAmC;KAC9D,QAAQ,OAAO;KACf,IAAI,MAAM,YAAY,SAAS,KAAK,UAAU;KAC9C,IAAI,YAAY;KAChB,IAAI;MACF,IAAI,WAAW,UAAU,aAAa,OAAO;WACxC;OACH,QAAQ,OAAO,MAAM,UAAU,MAAM;OACrC,YAAY,aAAa,SAAS,OAAO,OAAO,QAAQ,YAAY;MACtE;KACF,UAAU;MACR,QAAQ,KAAK,MAAM;MACnB,mBAAmB,QAAQ,WAAW,QAAQ,YAAY,SAAS;KACrE;IACF;IAEA,GAAI,QAAQ,UAAU,WAAW,IAAI,EACnC,OAAO,QAAuC;KAC5C,aAAa;MAAE,GAAG;MAAS,MAAM;OAAE,GAAG,QAAQ;OAAM;MAAO;KAAE,GAAG,OAAO,OAAO,QAAQ,YAAY;IACpG,EACF,IAAI,CAAC;GACP;EACF;CACF;;CAEA,eAAe;AACjB,GAAG,WAAW"}
@@ -1,10 +1,10 @@
1
1
  import { defaultCommitAdapter } from "../defaultCommitAdapter.js";
2
2
  import { commitGestureOps, readGestureLifecycle, reduceBehaviorEnd, runBehaviorCancel } from "../gestureLifecycle.js";
3
- import { shapeKindInfo } from "../../../core/shapeKinds.js";
4
3
  import { insertShape, isCommittableExtent } from "./shape.js";
4
+ import { shapeKindInfo } from "../../../core/shapeKinds.js";
5
5
  import { resolveParams } from "@weasel-js/routing";
6
6
 
7
- //#region src/interactions/actions/insert/commit.ts
7
+ // src/interactions/actions/insert/commit.ts
8
8
  /**
9
9
  * A freshly inserted text box is empty, so it draws nothing and the tool's own
10
10
  * `click on selected body → enterTextEdit` binding has nothing visible to
@@ -45,6 +45,5 @@ function commitInsert(session, frame, points, userRotation) {
45
45
  return id !== null;
46
46
  }
47
47
 
48
- //#endregion
49
48
  export { cancelInsert, commitInsert, enterInsertedText };
50
49
  //# sourceMappingURL=commit.js.map
@@ -1,4 +1,4 @@
1
- //#region src/interactions/actions/insert/extras.ts
1
+ // src/interactions/actions/insert/extras.ts
2
2
  /** Build a typed `InsertExtras` from the static params + gesture context.
3
3
  * Kit-built-in kinds (line / polygon / star / pencil) read kind-specific
4
4
  * fields; unknown kinds pass the raw params through as `{ kind, ... }`. */
@@ -82,6 +82,5 @@ function applyUserRotation(extras, userRotation) {
82
82
  if (extras.kind === "star" || extras.kind === "polygon") extras.rotation += userRotation;
83
83
  }
84
84
 
85
- //#endregion
86
85
  export { applyUserRotation, buildExtras };
87
86
  //# sourceMappingURL=extras.js.map
@@ -4,7 +4,7 @@ import { computeBounds, effectiveOriginMode } from "./geometry.js";
4
4
  import { GESTURE_KEY } from "./session.js";
5
5
  import { resolveParams } from "@weasel-js/routing";
6
6
 
7
- //#region src/interactions/actions/insert/frame.ts
7
+ // src/interactions/actions/insert/frame.ts
8
8
  /**
9
9
  * Shape the raw pointer into the drag's endpoints: the snap session (with
10
10
  * the line kind's Shift step as its input subspace, about the snapped
@@ -69,6 +69,5 @@ function nextFrame(session, readers, prev, moveCtx) {
69
69
  };
70
70
  }
71
71
 
72
- //#endregion
73
72
  export { carryStart, nextFrame };
74
73
  //# sourceMappingURL=frame.js.map
@@ -1,4 +1,4 @@
1
- //#region src/interactions/actions/insert/geometry.ts
1
+ // src/interactions/actions/insert/geometry.ts
2
2
  /** Resolve the effective origin mode from the binding's nominal opt
3
3
  * and live Alt state. Alt inverts: `corner` ⇄ `center`. Applies to
4
4
  * every shape kind — radial shapes (polygon/star) included; the
@@ -34,6 +34,5 @@ function computeBounds(startX, startY, currentX, currentY, originMode) {
34
34
  };
35
35
  }
36
36
 
37
- //#endregion
38
37
  export { computeBounds, effectiveOriginMode };
39
38
  //# sourceMappingURL=geometry.js.map
@@ -0,0 +1,42 @@
1
+ import { SHAPE_COUNT_RANGE, STAR_RATIO_RANGE } from "../../../domains/paths/shapeGenerator.js";
2
+ import { insertKind } from "./shape.js";
3
+ import { pref } from "@weasel-js/prefs";
4
+
5
+ // src/interactions/actions/insert/params.ts
6
+ /** A polygon insert's params as a form, for the last-operation panel. */
7
+ var POLYGON_INSERT_PARAMS = pref.group("Polygon", { sides: pref.number("Sides", 6, {
8
+ min: SHAPE_COUNT_RANGE.min,
9
+ max: SHAPE_COUNT_RANGE.max,
10
+ step: 1,
11
+ control: "slider"
12
+ }) });
13
+ /** A star insert's params as a form, for the last-operation panel. */
14
+ var STAR_INSERT_PARAMS = pref.group("Star", {
15
+ points: pref.number("Points", 5, {
16
+ min: SHAPE_COUNT_RANGE.min,
17
+ max: SHAPE_COUNT_RANGE.max,
18
+ step: 1,
19
+ control: "slider"
20
+ }),
21
+ innerRadiusRatio: pref.number("Inner radius", .5, {
22
+ description: "Inner radius as a fraction of the outer one.",
23
+ min: STAR_RATIO_RANGE.min,
24
+ max: STAR_RATIO_RANGE.max,
25
+ step: .01,
26
+ control: "slider",
27
+ unit: {
28
+ scale: .01,
29
+ suffix: "%",
30
+ precision: 0
31
+ }
32
+ })
33
+ });
34
+ /** The form an insert of the kind `params` names shows: a polygon's sides, a star's points and inner radius, and
35
+ * none for any other kind. */
36
+ function insertParams(params) {
37
+ const kind = insertKind(params);
38
+ return kind === "polygon" ? POLYGON_INSERT_PARAMS : kind === "star" ? STAR_INSERT_PARAMS : null;
39
+ }
40
+
41
+ export { POLYGON_INSERT_PARAMS, STAR_INSERT_PARAMS, insertParams };
42
+ //# sourceMappingURL=params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.js","names":[],"sources":["../../../../src/interactions/actions/insert/params.ts"],"sourcesContent":["import { pref, type PrefGroup } from '@weasel-js/prefs';\nimport { SHAPE_COUNT_RANGE, STAR_RATIO_RANGE } from 'domains/paths/shapeGenerator';\nimport { insertKind } from './shape';\n\n/** A polygon insert's params as a form, for the last-operation panel. */\nexport const POLYGON_INSERT_PARAMS = pref.group('Polygon', {\n sides: pref.number('Sides', 6, { min: SHAPE_COUNT_RANGE.min, max: SHAPE_COUNT_RANGE.max, step: 1, control: 'slider' }),\n});\n\n/** A star insert's params as a form, for the last-operation panel. */\nexport const STAR_INSERT_PARAMS = pref.group('Star', {\n points: pref.number('Points', 5, { min: SHAPE_COUNT_RANGE.min, max: SHAPE_COUNT_RANGE.max, step: 1, control: 'slider' }),\n innerRadiusRatio: pref.number('Inner radius', 0.5, {\n description: 'Inner radius as a fraction of the outer one.',\n min: STAR_RATIO_RANGE.min, max: STAR_RATIO_RANGE.max, step: 0.01, control: 'slider',\n unit: { scale: 0.01, suffix: '%', precision: 0 },\n }),\n});\n\n/** The form an insert of the kind `params` names shows: a polygon's sides, a star's points and inner radius, and\n * none for any other kind. */\nexport function insertParams(params: Readonly<Record<string, unknown>>): PrefGroup | null {\n const kind = insertKind(params);\n return kind === 'polygon' ? POLYGON_INSERT_PARAMS : kind === 'star' ? STAR_INSERT_PARAMS : null;\n}\n"],"mappings":";;;;;;AAKA,IAAa,wBAAwB,KAAK,MAAM,WAAW,EACzD,OAAO,KAAK,OAAO,SAAS,GAAG;CAAE,KAAK,kBAAkB;CAAK,KAAK,kBAAkB;CAAK,MAAM;CAAG,SAAS;AAAS,CAAC,EACvH,CAAC;;AAGD,IAAa,qBAAqB,KAAK,MAAM,QAAQ;CACnD,QAAQ,KAAK,OAAO,UAAU,GAAG;EAAE,KAAK,kBAAkB;EAAK,KAAK,kBAAkB;EAAK,MAAM;EAAG,SAAS;CAAS,CAAC;CACvH,kBAAkB,KAAK,OAAO,gBAAgB,IAAK;EACjD,aAAa;EACb,KAAK,iBAAiB;EAAK,KAAK,iBAAiB;EAAK,MAAM;EAAM,SAAS;EAC3E,MAAM;GAAE,OAAO;GAAM,QAAQ;GAAK,WAAW;EAAE;CACjD,CAAC;AACH,CAAC;;;AAID,SAAgB,aAAa,QAA6D;CACxF,MAAM,OAAO,WAAW,MAAM;CAC9B,OAAO,SAAS,YAAY,wBAAwB,SAAS,SAAS,qBAAqB;AAC7F"}
@@ -1,6 +1,6 @@
1
1
  import { admitsChild } from "../admitsChild.js";
2
2
 
3
- //#region src/interactions/actions/insert/parent.ts
3
+ // src/interactions/actions/insert/parent.ts
4
4
  /** The node an insert lands in: the one the `insertInto` dep's `into` names when
5
5
  * it exists and admits the insert, or null, the top of the tree. */
6
6
  function insertParent(scene, into, canDropInto) {
@@ -8,6 +8,5 @@ function insertParent(scene, into, canDropInto) {
8
8
  return admitsChild(scene, into, [], canDropInto) ? into : null;
9
9
  }
10
10
 
11
- //#endregion
12
11
  export { insertParent };
13
12
  //# sourceMappingURL=parent.js.map
@@ -1,11 +1,11 @@
1
- import { insertParent } from "./parent.js";
2
- import { inPlane, insertLayer } from "../planeInput.js";
3
1
  import { SNAP_ROLES, snapMods } from "../../../domains/snap/roles.js";
4
- import { minSizeOf } from "../../../core/scene/minSize.js";
5
- import { insertKind } from "./shape.js";
2
+ import { inPlane, insertLayer } from "../planeInput.js";
6
3
  import { enterInsertedText } from "./commit.js";
4
+ import { insertParent } from "./parent.js";
5
+ import { insertKind } from "./shape.js";
6
+ import { minSizeOf } from "../../../core/scene/minSize.js";
7
7
 
8
- //#region src/interactions/actions/insert/placeAction.ts
8
+ // src/interactions/actions/insert/placeAction.ts
9
9
  /** What the dispatcher lays under an immediate action's params for a click. */
10
10
  var CLICK_FIELDS = [
11
11
  "world",
@@ -107,6 +107,5 @@ var placeAction = inPlane({
107
107
  enabled: () => true
108
108
  }, insertLayer);
109
109
 
110
- //#endregion
111
110
  export { placeAction };
112
111
  //# sourceMappingURL=placeAction.js.map
@@ -1,6 +1,6 @@
1
1
  import { heldKeySpec } from "@weasel-js/routing";
2
2
 
3
- //#region src/interactions/actions/insert/repositionAction.ts
3
+ // src/interactions/actions/insert/repositionAction.ts
4
4
  /**
5
5
  * Companion to `insertAction`: while its key is held, dragging moves the
6
6
  * shape being drawn instead of resizing it; letting go resumes resizing from
@@ -42,6 +42,5 @@ var INSERT_REPOSITION_BINDING = {
42
42
  opts: { id: "insert.reposition.held" }
43
43
  };
44
44
 
45
- //#endregion
46
45
  export { INSERT_REPOSITION_BINDING, insertRepositionAction };
47
46
  //# sourceMappingURL=repositionAction.js.map
@@ -1,4 +1,4 @@
1
- //#region src/interactions/actions/insert/rotateAction.ts
1
+ // src/interactions/actions/insert/rotateAction.ts
2
2
  /** Radians per unit of wheel deltaY. Tuned so a typical mouse-wheel click
3
3
  * (deltaY ≈ 100) yields ~25°, while a trackpad event (deltaY ≈ 1–10)
4
4
  * yields a smooth 0.25–2.5° increment. */
@@ -27,6 +27,5 @@ var insertRotateAction = {
27
27
  requires: ["insertLive"]
28
28
  };
29
29
 
30
- //#endregion
31
30
  export { insertRotateAction };
32
31
  //# sourceMappingURL=rotateAction.js.map
@@ -1,12 +1,12 @@
1
- import { insertParent } from "./parent.js";
2
- import { gestureReaders } from "../../gestures/shared/screenTolerance.js";
3
- import { pointerStateOf } from "../pointerState.js";
4
1
  import { SNAP_ANGLE_STEP, snapMods } from "../../../domains/snap/roles.js";
5
- import { insertKind } from "./shape.js";
6
2
  import { spanSnap } from "../../../domains/snap/spanSnap.js";
3
+ import { pointerStateOf } from "../pointerState.js";
4
+ import { gestureReaders } from "../../gestures/shared/screenTolerance.js";
5
+ import { insertParent } from "./parent.js";
6
+ import { insertKind } from "./shape.js";
7
7
  import { resolveParams } from "@weasel-js/routing";
8
8
 
9
- //#region src/interactions/actions/insert/session.ts
9
+ // src/interactions/actions/insert/session.ts
10
10
  /** The key an insert's single gesture point rides under in the behaviors'
11
11
  * `draggedIds` / `origin` / `current` — insert has no node id yet. */
12
12
  var GESTURE_KEY = "gesture";
@@ -74,6 +74,5 @@ function beginInsert(ctx, opts) {
74
74
  };
75
75
  }
76
76
 
77
- //#endregion
78
77
  export { GESTURE_KEY, beginInsert };
79
78
  //# sourceMappingURL=session.js.map
@@ -1,8 +1,8 @@
1
- import { minSizeOf } from "../../../core/scene/minSize.js";
2
1
  import { applyUserRotation, buildExtras } from "./extras.js";
3
2
  import { computeBounds, effectiveOriginMode } from "./geometry.js";
3
+ import { minSizeOf } from "../../../core/scene/minSize.js";
4
4
 
5
- //#region src/interactions/actions/insert/shape.ts
5
+ // src/interactions/actions/insert/shape.ts
6
6
  /** The node kind a binding's resolved params ask for. */
7
7
  function insertKind(resolved) {
8
8
  return resolved?.["kind"] ?? "rect";
@@ -87,6 +87,5 @@ function isCommittableExtent(bounds, kind) {
87
87
  return bounds.width !== 0 && bounds.height !== 0;
88
88
  }
89
89
 
90
- //#endregion
91
90
  export { insertKind, insertShape, isCommittableExtent };
92
91
  //# sourceMappingURL=shape.js.map
@@ -1,12 +1,12 @@
1
- import { applyOpsTo } from "../../../core/applyOps.js";
2
- import { reduceBehaviorEnd, runBehaviorCancel, runBehaviorSettled } from "../gestureLifecycle.js";
3
1
  import { gestureViewReader } from "../../gestures/shared/screenTolerance.js";
4
2
  import { pointerStateOf } from "../pointerState.js";
5
- import { selectionFromHits } from "../hitSelection.js";
3
+ import { applyOpsTo } from "../../../core/applyOps.js";
6
4
  import { LASSO_VERTICES } from "./behaviors/selectFromLasso.js";
5
+ import { reduceBehaviorEnd, runBehaviorCancel, runBehaviorSettled } from "../gestureLifecycle.js";
6
+ import { hitTargets, selectionFromHits } from "../hitSelection.js";
7
7
  import { resolveParams, setScratch } from "@weasel-js/routing";
8
8
 
9
- //#region src/interactions/actions/lasso-select/action.ts
9
+ // src/interactions/actions/lasso-select/action.ts
10
10
  /**
11
11
  * `lassoSelectAction` — ongoing Action descriptor for polygon lasso selection.
12
12
  *
@@ -43,11 +43,12 @@ function polygonAABB(pts) {
43
43
  };
44
44
  }
45
45
  /** The dep's polygon test, or its rect test over the polygon's AABB when it
46
- * has none. What both the default commit and a behavior's adapter ask. */
46
+ * has none, each hit taken at the depth a click selects. What both the
47
+ * default commit and a behavior's adapter ask. */
47
48
  function hitTestPolygon(dep, vertices, mode, view) {
48
- if (dep.hitTestLasso) return dep.hitTestLasso(vertices, mode, view);
49
+ if (dep.hitTestLasso) return hitTargets(dep.hitTestLasso(vertices, mode, view), dep.targetOf);
49
50
  const aabb = polygonAABB(vertices);
50
- return aabb ? dep.hitTestArea(aabb, view) : [];
51
+ return aabb ? hitTargets(dep.hitTestArea(aabb, view), dep.targetOf) : [];
51
52
  }
52
53
  /** The adapter a behavior sees: selection and hit-testing from the dep,
53
54
  * scoped to the view the lasso started in. */
@@ -55,7 +56,7 @@ function behaviorAdapter(dep, view) {
55
56
  const adapter = {
56
57
  getSelection: () => dep.getSelection(),
57
58
  setSelection: (ids) => dep.setSelection(ids),
58
- hitTestArea: (rect) => dep.hitTestArea(rect, view),
59
+ hitTestArea: (rect) => hitTargets(dep.hitTestArea(rect, view), dep.targetOf),
59
60
  hitTestLasso: (polygon, mode) => hitTestPolygon(dep, polygon, mode, view),
60
61
  applyOps: (ops) => applyOpsTo(adapter, ops)
61
62
  };
@@ -198,6 +199,5 @@ function endLasso(scratch, reason) {
198
199
  return true;
199
200
  }
200
201
 
201
- //#endregion
202
202
  export { lassoSelectAction };
203
203
  //# sourceMappingURL=action.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/lasso-select/action.ts"],"sourcesContent":["/**\n * `lassoSelectAction` — ongoing Action descriptor for polygon lasso selection.\n *\n * A move adds a vertex unless it is closer than the binding's\n * `params.minVertexSpacing` (default 2 world-px) to the last one. The commit\n * hit-tests the polygon with `dep.hitTestLasso(polygon, mode)` — `mode` from\n * the binding's `params.mode`, default `'intersect'` — falling back to the\n * polygon's AABB via `dep.hitTestArea(bounds)`. Shift extends the selection.\n * Always transient: no undo entry.\n *\n * `opts.behaviors` (`LassoSelectBehavior[]`) run over a `GestureContext`\n * whose `origin.get('gesture')` is the start pose, whose scratch holds the\n * vertices under `LASSO_VERTICES`, and whose adapter answers selection and\n * hit-testing from the `lassoSelect` dep. `onEnd` is first-non-undefined-wins:\n * `Op[]` is applied in place of the default selection, `null` aborts, and\n * all-`undefined` falls through to it. A behavior's ops are applied\n * transiently too.\n */\n\nimport { gestureViewReader } from '../../gestures/shared/screenTolerance';\nimport { resolveParams, setScratch, type Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, OngoingOverlay, Point2 } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { LassoSelectDep, ViewApi } from '../depSchema';\nimport type { LassoHitMode, LassoSelectAdapter } from 'core/adapters/types';\nimport type { Op } from 'core/ops/types';\nimport { applyOpsTo } from 'core/applyOps';\nimport type { GestureContext, LassoSelectBehavior, LassoSelectPose } from '../../gestures/types';\nimport { LASSO_VERTICES } from './behaviors/selectFromLasso';\nimport { reduceBehaviorEnd, runBehaviorCancel, runBehaviorSettled } from '../gestureLifecycle';\nimport { selectionFromHits } from '../hitSelection';\n\n/** Compute AABB of a polygon (for fallback hit-test when hitTestLasso is absent). */\nfunction polygonAABB(\n pts: Point2[],\n): { x: number; y: number; width: number; height: number } | null {\n if (pts.length === 0) return null;\n let minX = pts[0].x, minY = pts[0].y, maxX = pts[0].x, maxY = pts[0].y;\n for (const p of pts) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/** The dep's polygon test, or its rect test over the polygon's AABB when it\n * has none. What both the default commit and a behavior's adapter ask. */\nfunction hitTestPolygon(\n dep: LassoSelectDep,\n vertices: ReadonlyArray<Point2>,\n mode: LassoHitMode,\n view: ViewApi | undefined,\n): string[] {\n if (dep.hitTestLasso) return dep.hitTestLasso(vertices, mode, view);\n const aabb = polygonAABB(vertices as Point2[]);\n return aabb ? dep.hitTestArea(aabb, view) : [];\n}\n\n/** The adapter a behavior sees: selection and hit-testing from the dep,\n * scoped to the view the lasso started in. */\nfunction behaviorAdapter(dep: LassoSelectDep, view: ViewApi | undefined): LassoSelectAdapter {\n const adapter: LassoSelectAdapter = {\n getSelection: () => dep.getSelection(),\n setSelection: (ids) => dep.setSelection(ids),\n hitTestArea: (rect) => dep.hitTestArea(rect, view),\n hitTestLasso: (polygon, mode) => hitTestPolygon(dep, polygon, mode, view),\n applyOps: (ops: Op[]) => applyOpsTo(adapter, ops),\n };\n return adapter;\n}\n\nconst DEFAULT_MIN_VERTEX_SPACING = 2; // world-px\n\ninterface LassoScratch {\n dep: LassoSelectDep;\n mode: LassoHitMode;\n minVertexSpacing: number;\n /** The view the lasso started in: what it does not paint is not taken. */\n view: ViewApi | undefined;\n vertices: Point2[];\n shiftHeld: boolean;\n /** Current pointer position — paint the live \"close-line\" from the last\n * vertex back to the start while the gesture is open. Tracked separately\n * from `vertices` because we throttle vertex insertion. */\n currentX: number;\n currentY: number;\n /** Cleared by `onEnd` so post-commit `overlay()` returns null. */\n open: boolean;\n behaviors: LassoSelectBehavior[];\n /** Built only when there are behaviors to hand it to. */\n gesture: GestureContext<LassoSelectPose> | null;\n}\n\n/**\n * Static descriptor for the `lassoSelect` Action.\n */\nexport const lassoSelectAction: Action & { requires: string[] } = {\n id: 'lassoSelect',\n label: 'Lasso Select',\n eligible: { capability: 'creates-selection' },\n requires: ['lassoSelect', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts): OngoingHandle {\n const dep = ctx.deps.lassoSelect;\n if (!dep) return {};\n\n const params = resolveParams(opts?.params) as\n { mode?: LassoHitMode; minVertexSpacing?: number } | undefined;\n const view = ctx.deps.view;\n const vertices: Point2[] = [{ x: ctx.world.x, y: ctx.world.y }];\n const behaviors = (opts?.behaviors ?? []) as LassoSelectBehavior[];\n let gesture: GestureContext<LassoSelectPose> | null = null;\n const readView = gestureViewReader(ctx.deps);\n if (behaviors.length > 0) {\n const pose: LassoSelectPose = {\n worldX: ctx.world.x, worldY: ctx.world.y, shiftHeld: ctx.modifiers.shift,\n };\n gesture = {\n draggedIds: ['gesture'],\n origin: new Map([['gesture', pose]]),\n current: new Map([['gesture', { ...pose }]]),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readView(),\n adapter: behaviorAdapter(dep, view) as unknown as GestureContext<LassoSelectPose>['adapter'],\n scratch: {},\n };\n // The live array, so a behavior reads every vertex added since.\n setScratch(gesture.scratch, LASSO_VERTICES, vertices);\n for (const b of behaviors) b.onStart?.(gesture);\n }\n const scratch: LassoScratch = {\n dep,\n mode: params?.mode ?? 'intersect',\n minVertexSpacing: params?.minVertexSpacing ?? DEFAULT_MIN_VERTEX_SPACING,\n view,\n vertices,\n shiftHeld: ctx.modifiers.shift,\n currentX: ctx.world.x,\n currentY: ctx.world.y,\n open: true,\n behaviors,\n gesture,\n };\n\n return {\n kind: 'lasso',\n onMove(moveCtx: InvocationCtx): void {\n const { x, y } = moveCtx.world;\n scratch.currentX = x;\n scratch.currentY = y;\n const last = scratch.vertices[scratch.vertices.length - 1];\n const dx = x - last.x;\n const dy = y - last.y;\n const min = scratch.minVertexSpacing;\n if (dx * dx + dy * dy >= min * min) {\n scratch.vertices.push({ x, y });\n }\n const g = scratch.gesture;\n if (g) {\n g.modifiers = { ...moveCtx.modifiers };\n g.pointer = pointerStateOf(moveCtx.world, moveCtx);\n g.view = readView();\n g.current.set('gesture', { worldX: x, worldY: y, shiftHeld: scratch.shiftHeld });\n const proposed = { vertices: scratch.vertices, shiftHeld: scratch.shiftHeld };\n for (const b of scratch.behaviors) b.onMove?.(g, proposed);\n }\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n return {\n kind: 'lasso',\n vertices: scratch.vertices,\n current: { x: scratch.currentX, y: scratch.currentY },\n shiftHeld: scratch.shiftHeld,\n };\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n committed = endLasso(scratch, reason);\n } finally {\n if (scratch.gesture) runBehaviorSettled(scratch.behaviors, scratch.gesture, committed);\n }\n },\n };\n },\n },\n enabled: () => true,\n};\n\n/** Close the lasso. Returns whether it committed: a behavior's ops were\n * applied, or the lasso set the selection. */\nfunction endLasso(scratch: LassoScratch, reason: 'commit' | 'cancel'): boolean {\n scratch.open = false;\n if (reason === 'cancel') {\n if (scratch.gesture) runBehaviorCancel(scratch.behaviors, scratch.gesture);\n return false;\n }\n\n const { dep: d, mode, view, vertices, shiftHeld, gesture: g } = scratch;\n\n if (g) {\n const r = reduceBehaviorEnd(scratch.behaviors, g);\n if (r !== undefined) {\n if (r !== null) (g.adapter as unknown as LassoSelectAdapter).applyOps!(r);\n return r !== null;\n }\n }\n\n // Need at least 3 vertices for a meaningful polygon; otherwise no-op.\n if (vertices.length < 3) {\n if (!shiftHeld) d.setSelection([]);\n return !shiftHeld;\n }\n\n const hits = hitTestPolygon(d, vertices, mode, view);\n\n d.setSelection(selectionFromHits(d.getSelection(), hits, shiftHeld));\n return true;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"action.js","names":[],"sources":["../../../../src/interactions/actions/lasso-select/action.ts"],"sourcesContent":["/**\n * `lassoSelectAction` — ongoing Action descriptor for polygon lasso selection.\n *\n * A move adds a vertex unless it is closer than the binding's\n * `params.minVertexSpacing` (default 2 world-px) to the last one. The commit\n * hit-tests the polygon with `dep.hitTestLasso(polygon, mode)` — `mode` from\n * the binding's `params.mode`, default `'intersect'` — falling back to the\n * polygon's AABB via `dep.hitTestArea(bounds)`. Shift extends the selection.\n * Always transient: no undo entry.\n *\n * `opts.behaviors` (`LassoSelectBehavior[]`) run over a `GestureContext`\n * whose `origin.get('gesture')` is the start pose, whose scratch holds the\n * vertices under `LASSO_VERTICES`, and whose adapter answers selection and\n * hit-testing from the `lassoSelect` dep. `onEnd` is first-non-undefined-wins:\n * `Op[]` is applied in place of the default selection, `null` aborts, and\n * all-`undefined` falls through to it. A behavior's ops are applied\n * transiently too.\n */\n\nimport { gestureViewReader } from '../../gestures/shared/screenTolerance';\nimport { resolveParams, setScratch, type Action } from '@weasel-js/routing';\nimport type { InvocationCtx, OngoingHandle, OngoingOverlay, Point2 } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { LassoSelectDep, ViewApi } from '../depSchema';\nimport type { LassoHitMode, LassoSelectAdapter } from 'core/adapters/types';\nimport type { Op } from 'core/ops/types';\nimport { applyOpsTo } from 'core/applyOps';\nimport type { GestureContext, LassoSelectBehavior, LassoSelectPose } from '../../gestures/types';\nimport { LASSO_VERTICES } from './behaviors/selectFromLasso';\nimport { reduceBehaviorEnd, runBehaviorCancel, runBehaviorSettled } from '../gestureLifecycle';\nimport { hitTargets, selectionFromHits } from '../hitSelection';\n\n/** Compute AABB of a polygon (for fallback hit-test when hitTestLasso is absent). */\nfunction polygonAABB(\n pts: Point2[],\n): { x: number; y: number; width: number; height: number } | null {\n if (pts.length === 0) return null;\n let minX = pts[0].x, minY = pts[0].y, maxX = pts[0].x, maxY = pts[0].y;\n for (const p of pts) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/** The dep's polygon test, or its rect test over the polygon's AABB when it\n * has none, each hit taken at the depth a click selects. What both the\n * default commit and a behavior's adapter ask. */\nfunction hitTestPolygon(\n dep: LassoSelectDep,\n vertices: ReadonlyArray<Point2>,\n mode: LassoHitMode,\n view: ViewApi | undefined,\n): string[] {\n if (dep.hitTestLasso) return hitTargets(dep.hitTestLasso(vertices, mode, view), dep.targetOf);\n const aabb = polygonAABB(vertices as Point2[]);\n return aabb ? hitTargets(dep.hitTestArea(aabb, view), dep.targetOf) : [];\n}\n\n/** The adapter a behavior sees: selection and hit-testing from the dep,\n * scoped to the view the lasso started in. */\nfunction behaviorAdapter(dep: LassoSelectDep, view: ViewApi | undefined): LassoSelectAdapter {\n const adapter: LassoSelectAdapter = {\n getSelection: () => dep.getSelection(),\n setSelection: (ids) => dep.setSelection(ids),\n hitTestArea: (rect) => hitTargets(dep.hitTestArea(rect, view), dep.targetOf),\n hitTestLasso: (polygon, mode) => hitTestPolygon(dep, polygon, mode, view),\n applyOps: (ops: Op[]) => applyOpsTo(adapter, ops),\n };\n return adapter;\n}\n\nconst DEFAULT_MIN_VERTEX_SPACING = 2; // world-px\n\ninterface LassoScratch {\n dep: LassoSelectDep;\n mode: LassoHitMode;\n minVertexSpacing: number;\n /** The view the lasso started in: what it does not paint is not taken. */\n view: ViewApi | undefined;\n vertices: Point2[];\n shiftHeld: boolean;\n /** Current pointer position — paint the live \"close-line\" from the last\n * vertex back to the start while the gesture is open. Tracked separately\n * from `vertices` because we throttle vertex insertion. */\n currentX: number;\n currentY: number;\n /** Cleared by `onEnd` so post-commit `overlay()` returns null. */\n open: boolean;\n behaviors: LassoSelectBehavior[];\n /** Built only when there are behaviors to hand it to. */\n gesture: GestureContext<LassoSelectPose> | null;\n}\n\n/**\n * Static descriptor for the `lassoSelect` Action.\n */\nexport const lassoSelectAction: Action & { requires: string[] } = {\n id: 'lassoSelect',\n label: 'Lasso Select',\n eligible: { capability: 'creates-selection' },\n requires: ['lassoSelect', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts): OngoingHandle {\n const dep = ctx.deps.lassoSelect;\n if (!dep) return {};\n\n const params = resolveParams(opts?.params) as\n { mode?: LassoHitMode; minVertexSpacing?: number } | undefined;\n const view = ctx.deps.view;\n const vertices: Point2[] = [{ x: ctx.world.x, y: ctx.world.y }];\n const behaviors = (opts?.behaviors ?? []) as LassoSelectBehavior[];\n let gesture: GestureContext<LassoSelectPose> | null = null;\n const readView = gestureViewReader(ctx.deps);\n if (behaviors.length > 0) {\n const pose: LassoSelectPose = {\n worldX: ctx.world.x, worldY: ctx.world.y, shiftHeld: ctx.modifiers.shift,\n };\n gesture = {\n draggedIds: ['gesture'],\n origin: new Map([['gesture', pose]]),\n current: new Map([['gesture', { ...pose }]]),\n snap: null,\n modifiers: { ...ctx.modifiers },\n pointer: pointerStateOf(ctx.world, ctx),\n view: readView(),\n adapter: behaviorAdapter(dep, view) as unknown as GestureContext<LassoSelectPose>['adapter'],\n scratch: {},\n };\n // The live array, so a behavior reads every vertex added since.\n setScratch(gesture.scratch, LASSO_VERTICES, vertices);\n for (const b of behaviors) b.onStart?.(gesture);\n }\n const scratch: LassoScratch = {\n dep,\n mode: params?.mode ?? 'intersect',\n minVertexSpacing: params?.minVertexSpacing ?? DEFAULT_MIN_VERTEX_SPACING,\n view,\n vertices,\n shiftHeld: ctx.modifiers.shift,\n currentX: ctx.world.x,\n currentY: ctx.world.y,\n open: true,\n behaviors,\n gesture,\n };\n\n return {\n kind: 'lasso',\n onMove(moveCtx: InvocationCtx): void {\n const { x, y } = moveCtx.world;\n scratch.currentX = x;\n scratch.currentY = y;\n const last = scratch.vertices[scratch.vertices.length - 1];\n const dx = x - last.x;\n const dy = y - last.y;\n const min = scratch.minVertexSpacing;\n if (dx * dx + dy * dy >= min * min) {\n scratch.vertices.push({ x, y });\n }\n const g = scratch.gesture;\n if (g) {\n g.modifiers = { ...moveCtx.modifiers };\n g.pointer = pointerStateOf(moveCtx.world, moveCtx);\n g.view = readView();\n g.current.set('gesture', { worldX: x, worldY: y, shiftHeld: scratch.shiftHeld });\n const proposed = { vertices: scratch.vertices, shiftHeld: scratch.shiftHeld };\n for (const b of scratch.behaviors) b.onMove?.(g, proposed);\n }\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n return {\n kind: 'lasso',\n vertices: scratch.vertices,\n current: { x: scratch.currentX, y: scratch.currentY },\n shiftHeld: scratch.shiftHeld,\n };\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n let committed = false;\n try {\n committed = endLasso(scratch, reason);\n } finally {\n if (scratch.gesture) runBehaviorSettled(scratch.behaviors, scratch.gesture, committed);\n }\n },\n };\n },\n },\n enabled: () => true,\n};\n\n/** Close the lasso. Returns whether it committed: a behavior's ops were\n * applied, or the lasso set the selection. */\nfunction endLasso(scratch: LassoScratch, reason: 'commit' | 'cancel'): boolean {\n scratch.open = false;\n if (reason === 'cancel') {\n if (scratch.gesture) runBehaviorCancel(scratch.behaviors, scratch.gesture);\n return false;\n }\n\n const { dep: d, mode, view, vertices, shiftHeld, gesture: g } = scratch;\n\n if (g) {\n const r = reduceBehaviorEnd(scratch.behaviors, g);\n if (r !== undefined) {\n if (r !== null) (g.adapter as unknown as LassoSelectAdapter).applyOps!(r);\n return r !== null;\n }\n }\n\n // Need at least 3 vertices for a meaningful polygon; otherwise no-op.\n if (vertices.length < 3) {\n if (!shiftHeld) d.setSelection([]);\n return !shiftHeld;\n }\n\n const hits = hitTestPolygon(d, vertices, mode, view);\n\n d.setSelection(selectionFromHits(d.getSelection(), hits, shiftHeld));\n return true;\n}\n"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { selectionFromHits } from "../../hitSelection.js";
2
1
  import { createSetSelectionOp } from "../../../../core/ops/select.js";
2
+ import { selectionFromHits } from "../../hitSelection.js";
3
3
  import { getScratch, scratchKey } from "@weasel-js/routing";
4
4
 
5
- //#region src/interactions/actions/lasso-select/behaviors/selectFromLasso.ts
5
+ // src/interactions/actions/lasso-select/behaviors/selectFromLasso.ts
6
6
  /** Typed scratch slot the lasso tool's gesture writes into for this behavior
7
7
  * to consume. Shared identity: tools producing the polygon for a lasso
8
8
  * selection write under this same key. */
@@ -49,6 +49,5 @@ function polygonAabbArea(vertices) {
49
49
  return (maxX - minX) * (maxY - minY);
50
50
  }
51
51
 
52
- //#endregion
53
52
  export { LASSO_VERTICES, selectFromLasso };
54
53
  //# sourceMappingURL=selectFromLasso.js.map
@@ -0,0 +1,37 @@
1
+ import { sceneDeclaredScopes } from "../../core/scene/unitScopes.js";
2
+ import { sceneBoxFrames } from "./poseFrame.js";
3
+ import { magnificationOf } from "@weasel-js/quantity";
4
+
5
+ // src/interactions/actions/magnification.ts
6
+ var differs = (a, b, tolerance) => Math.abs(a / b - 1) > tolerance;
7
+ /**
8
+ * Every container in `scene` whose children are drawn magnified, by a scale
9
+ * `transform` on it or above it, by more or less than the `drawnAt` of the unit
10
+ * scopes it sits in and declares. Only containers under some declared scope
11
+ * are read: a scene stating no units says nothing about what size it draws at.
12
+ */
13
+ function undeclaredMagnifications(scene, tolerance = 1e-6) {
14
+ const frames = sceneBoxFrames(scene);
15
+ const out = [];
16
+ for (const id of scene.nodes.keys()) {
17
+ if (scene.childrenOf(id).length === 0) continue;
18
+ const scopes = sceneDeclaredScopes(scene, id, { inclusive: true });
19
+ if (scopes.length === 0) continue;
20
+ const f = frames(id);
21
+ if (f === null) continue;
22
+ const drawn = {
23
+ x: Math.hypot(f[0], f[1]),
24
+ y: Math.hypot(f[2], f[3])
25
+ };
26
+ const declared = magnificationOf(scopes);
27
+ if (differs(drawn.x, declared, tolerance) || differs(drawn.y, declared, tolerance)) out.push({
28
+ id,
29
+ drawn,
30
+ declared
31
+ });
32
+ }
33
+ return out;
34
+ }
35
+
36
+ export { undeclaredMagnifications };
37
+ //# sourceMappingURL=magnification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"magnification.js","names":[],"sources":["../../../src/interactions/actions/magnification.ts"],"sourcesContent":["import { magnificationOf } from '@weasel-js/quantity';\nimport { sceneDeclaredScopes } from 'core/scene/unitScopes';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { sceneBoxFrames } from './poseFrame';\n\n/** A container whose children are drawn at a size its unit scopes do not declare. */\nexport interface UndeclaredMagnification {\n id: NodeId;\n /** How large its children's frame is drawn in world, on each of its axes. */\n drawn: { x: number; y: number };\n /** The magnification its scope chain declares: every `drawnAt`, multiplied. */\n declared: number;\n}\n\nconst differs = (a: number, b: number, tolerance: number): boolean => Math.abs(a / b - 1) > tolerance;\n\n/**\n * Every container in `scene` whose children are drawn magnified, by a scale\n * `transform` on it or above it, by more or less than the `drawnAt` of the unit\n * scopes it sits in and declares. Only containers under some declared scope\n * are read: a scene stating no units says nothing about what size it draws at.\n */\nexport function undeclaredMagnifications(\n scene: Scene<unknown, string, unknown>,\n tolerance = 1e-6,\n): UndeclaredMagnification[] {\n const frames = sceneBoxFrames(scene);\n const out: UndeclaredMagnification[] = [];\n for (const id of scene.nodes.keys()) {\n if (scene.childrenOf(id).length === 0) continue;\n const scopes = sceneDeclaredScopes(scene, id, { inclusive: true });\n if (scopes.length === 0) continue;\n const f = frames(id);\n if (f === null) continue;\n const drawn = { x: Math.hypot(f[0], f[1]), y: Math.hypot(f[2], f[3]) };\n const declared = magnificationOf(scopes);\n if (differs(drawn.x, declared, tolerance) || differs(drawn.y, declared, tolerance)) out.push({ id, drawn, declared });\n }\n return out;\n}\n"],"mappings":";;;;;AAcA,IAAM,WAAW,GAAW,GAAW,cAA+B,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI;;;;;;;AAQ5F,SAAgB,yBACd,OACA,YAAY,MACe;CAC3B,MAAM,SAAS,eAAe,KAAK;CACnC,MAAM,MAAiC,CAAC;CACxC,KAAK,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG;EACnC,IAAI,MAAM,WAAW,EAAE,CAAC,CAAC,WAAW,GAAG;EACvC,MAAM,SAAS,oBAAoB,OAAO,IAAI,EAAE,WAAW,KAAK,CAAC;EACjE,IAAI,OAAO,WAAW,GAAG;EACzB,MAAM,IAAI,OAAO,EAAE;EACnB,IAAI,MAAM,MAAM;EAChB,MAAM,QAAQ;GAAE,GAAG,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE;GAAG,GAAG,KAAK,MAAM,EAAE,IAAI,EAAE,EAAE;EAAE;EACrE,MAAM,WAAW,gBAAgB,MAAM;EACvC,IAAI,QAAQ,MAAM,GAAG,UAAU,SAAS,KAAK,QAAQ,MAAM,GAAG,UAAU,SAAS,GAAG,IAAI,KAAK;GAAE;GAAI;GAAO;EAAS,CAAC;CACtH;CACA,OAAO;AACT"}
@@ -2,12 +2,12 @@ import { transformPreview } from "../transformFinish.js";
2
2
  import { closeGesture, runBehaviorCancel } from "../gestureLifecycle.js";
3
3
  import { inPlane, selectionLayer } from "../planeInput.js";
4
4
  import { beginMove } from "./session.js";
5
- import { SNAP_ROLES } from "../../../domains/snap/roles.js";
6
5
  import { nextFrame } from "./frame.js";
7
6
  import { commitMove } from "./commit/index.js";
8
7
  import { recordTransform } from "../transform-again/memory.js";
8
+ import { SNAP_ROLES } from "../../../domains/snap/roles.js";
9
9
 
10
- //#region src/interactions/actions/move/action.ts
10
+ // src/interactions/actions/move/action.ts
11
11
  /**
12
12
  * Drag-translates the selection.
13
13
  *
@@ -119,6 +119,5 @@ var moveAction = inPlane({
119
119
  enabled: () => true
120
120
  }, selectionLayer);
121
121
 
122
- //#endregion
123
122
  export { moveAction };
124
123
  //# sourceMappingURL=action.js.map