@weasel-js/core 1.9.4 → 1.10.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 (1191) hide show
  1. package/CHANGELOG.md +918 -0
  2. package/README.md +38 -3
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +92 -84
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +3 -2
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +71 -101
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js +50 -28
  12. package/dist/affordances/pathAnchors.js.map +1 -1
  13. package/dist/affordances/rotateCursor.js +12 -0
  14. package/dist/affordances/rotateCursor.js.map +1 -0
  15. package/dist/affordances/rotationHandle.js +44 -46
  16. package/dist/affordances/rotationHandle.js.map +1 -1
  17. package/dist/animation/behaviors/coast.js +21 -0
  18. package/dist/animation/behaviors/coast.js.map +1 -0
  19. package/dist/animation/behaviors/coastByWrite.js +107 -0
  20. package/dist/animation/behaviors/coastByWrite.js.map +1 -0
  21. package/dist/animation/behaviors/coastOnTargets.js +94 -0
  22. package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
  23. package/dist/animation/behaviors/momentum.js +48 -136
  24. package/dist/animation/behaviors/momentum.js.map +1 -1
  25. package/dist/animation/clipTargets.js +12 -0
  26. package/dist/animation/clipTargets.js.map +1 -0
  27. package/dist/animation/index.js +15 -20
  28. package/dist/animation/poseHelpers.js +112 -33
  29. package/dist/animation/poseHelpers.js.map +1 -1
  30. package/dist/animation/poseTarget.js +115 -0
  31. package/dist/animation/poseTarget.js.map +1 -0
  32. package/dist/animation/reflow.js +113 -83
  33. package/dist/animation/reflow.js.map +1 -1
  34. package/dist/animation/rewind.js +66 -0
  35. package/dist/animation/rewind.js.map +1 -0
  36. package/dist/animation/rig/bindRig.js +85 -53
  37. package/dist/animation/rig/bindRig.js.map +1 -1
  38. package/dist/animation/rig/rigNode.js +99 -0
  39. package/dist/animation/rig/rigNode.js.map +1 -0
  40. package/dist/animation/rig/rigSeat.js +59 -0
  41. package/dist/animation/rig/rigSeat.js.map +1 -0
  42. package/dist/animation/rig/skinBinding.js +64 -0
  43. package/dist/animation/rig/skinBinding.js.map +1 -0
  44. package/dist/animation/rig/useRig.js +31 -16
  45. package/dist/animation/rig/useRig.js.map +1 -1
  46. package/dist/animation/wrappers/animateLifecycle.js +8 -7
  47. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  48. package/dist/animation/wrappers/animateOnSetPose.js +31 -31
  49. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  50. package/dist/animation/wrappers/instantPose.js.map +1 -1
  51. package/dist/animation/writtenPoseTarget.js +33 -0
  52. package/dist/animation/writtenPoseTarget.js.map +1 -0
  53. package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
  54. package/dist/barrel/canvas.js +32 -0
  55. package/dist/barrel/chrome.js +10 -10
  56. package/dist/barrel/input.js +16 -17
  57. package/dist/barrel/interactions.js +34 -37
  58. package/dist/barrel/paint.js +11 -18
  59. package/dist/barrel/paths.js +13 -19
  60. package/dist/barrel/renderer.js +14 -20
  61. package/dist/barrel/routing.js +54 -47
  62. package/dist/barrel/scene.js +37 -0
  63. package/dist/barrel/text.js +9 -18
  64. package/dist/barrel/viewport.js +44 -51
  65. package/dist/canvas/Canvas.js +270 -475
  66. package/dist/canvas/Canvas.js.map +1 -1
  67. package/dist/canvas/CanvasView.js +168 -190
  68. package/dist/canvas/CanvasView.js.map +1 -1
  69. package/dist/canvas/CursorCoordsHud.js +24 -25
  70. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  71. package/dist/canvas/DrawCanvas.js +39 -56
  72. package/dist/canvas/DrawCanvas.js.map +1 -1
  73. package/dist/canvas/ModalityHud.js.map +1 -1
  74. package/dist/canvas/NodeShape.js +28 -29
  75. package/dist/canvas/NodeShape.js.map +1 -1
  76. package/dist/canvas/PickHud.js.map +1 -1
  77. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  78. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  79. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
  80. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
  81. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +33 -36
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  83. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +38 -50
  84. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  85. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
  86. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
  88. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  89. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +319 -270
  90. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
  92. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  94. package/dist/canvas/SceneCanvas/features.js +71 -62
  95. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  96. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +97 -0
  97. package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
  99. package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
  100. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  101. package/dist/canvas/SceneCanvas/props.js +15 -14
  102. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/scenePointQuery.js +50 -0
  104. package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +52 -0
  106. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -0
  107. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  108. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  109. package/dist/canvas/SceneCanvas/useActionTunings.js +17 -0
  110. package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  112. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  113. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  114. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  115. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  116. package/dist/canvas/SceneCanvas/useCanvasCamera.js +46 -0
  117. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  118. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  119. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  120. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  121. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  122. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  123. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  124. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +49 -113
  125. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  126. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  127. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  128. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  129. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  130. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  131. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  132. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +51 -41
  133. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  134. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  135. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  136. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  137. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  138. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  139. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  140. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  141. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  142. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +65 -101
  143. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  144. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  145. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  146. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  147. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  148. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  149. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  150. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  151. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  152. package/dist/canvas/SceneCanvas/worldPointAt.js +8 -0
  153. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  154. package/dist/canvas/SceneCanvas.js +301 -708
  155. package/dist/canvas/SceneCanvas.js.map +1 -1
  156. package/dist/canvas/SceneViewCanvas.js +41 -47
  157. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  158. package/dist/canvas/SurfaceCanvas.js +40 -0
  159. package/dist/canvas/SurfaceCanvas.js.map +1 -0
  160. package/dist/canvas/adapterDerivedPath.js +26 -0
  161. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  162. package/dist/canvas/adapterPickSource.js +34 -0
  163. package/dist/canvas/adapterPickSource.js.map +1 -0
  164. package/dist/canvas/affordanceAt.js +12 -2
  165. package/dist/canvas/affordanceAt.js.map +1 -1
  166. package/dist/canvas/buildSceneLayer.js +81 -61
  167. package/dist/canvas/buildSceneLayer.js.map +1 -1
  168. package/dist/canvas/buildSceneTree.js +56 -34
  169. package/dist/canvas/buildSceneTree.js.map +1 -1
  170. package/dist/canvas/canvasRenderer.js +40 -44
  171. package/dist/canvas/canvasRenderer.js.map +1 -1
  172. package/dist/canvas/colorOverrides.js.map +1 -1
  173. package/dist/canvas/copiesAbove.js +27 -0
  174. package/dist/canvas/copiesAbove.js.map +1 -0
  175. package/dist/canvas/defaultDrawOne.js +25 -24
  176. package/dist/canvas/defaultDrawOne.js.map +1 -1
  177. package/dist/canvas/deps/areaSelect.js +4 -4
  178. package/dist/canvas/deps/areaSelect.js.map +1 -1
  179. package/dist/canvas/deps/debug.js.map +1 -1
  180. package/dist/canvas/deps/editAnchors.js +47 -71
  181. package/dist/canvas/deps/editAnchors.js.map +1 -1
  182. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  183. package/dist/canvas/deps/hitTestArea.js +45 -25
  184. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  185. package/dist/canvas/deps/insert.js +149 -104
  186. package/dist/canvas/deps/insert.js.map +1 -1
  187. package/dist/canvas/deps/lassoSelect.js +5 -5
  188. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  189. package/dist/canvas/deps/layout.js +9 -15
  190. package/dist/canvas/deps/layout.js.map +1 -1
  191. package/dist/canvas/deps/poseDescriptor.js +1 -1
  192. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  193. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  194. package/dist/canvas/deps/slice.js +44 -45
  195. package/dist/canvas/deps/slice.js.map +1 -1
  196. package/dist/canvas/deps/textEdit.js +8 -8
  197. package/dist/canvas/deps/textEdit.js.map +1 -1
  198. package/dist/canvas/deps/view.js.map +1 -1
  199. package/dist/canvas/derivedPath.js +69 -43
  200. package/dist/canvas/derivedPath.js.map +1 -1
  201. package/dist/canvas/drawEnvelope.js +8 -4
  202. package/dist/canvas/drawEnvelope.js.map +1 -1
  203. package/dist/canvas/getNodeAtPoint.js +2 -6
  204. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  205. package/dist/canvas/hud.module.js.map +1 -1
  206. package/dist/canvas/insertPreviewExtent.js +33 -31
  207. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  208. package/dist/canvas/layerOrder.js.map +1 -1
  209. package/dist/canvas/layerSlots.js +6 -1
  210. package/dist/canvas/layerSlots.js.map +1 -1
  211. package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
  212. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  213. package/dist/canvas/nodeShapes/imagePainter.js +10 -10
  214. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  215. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  216. package/dist/canvas/nodeShapes/nodePaint.js +34 -23
  217. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  218. package/dist/canvas/nodeShapes/pathPainter.js +23 -22
  219. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  220. package/dist/canvas/nodeShapes/poseBox.js +6 -6
  221. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  222. package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
  223. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  224. package/dist/canvas/nodeShapes/shapePainter.js +16 -16
  225. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  226. package/dist/canvas/nodeShapes/textPainter.js +1 -1
  227. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  228. package/dist/canvas/overChildren.js +29 -0
  229. package/dist/canvas/overChildren.js.map +1 -0
  230. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  231. package/dist/canvas/paintCull.js +6 -8
  232. package/dist/canvas/paintCull.js.map +1 -1
  233. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  234. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  235. package/dist/canvas/pickReach.js +23 -0
  236. package/dist/canvas/pickReach.js.map +1 -0
  237. package/dist/canvas/pickWalk.js +43 -70
  238. package/dist/canvas/pickWalk.js.map +1 -1
  239. package/dist/canvas/planeClips.js +18 -19
  240. package/dist/canvas/planeClips.js.map +1 -1
  241. package/dist/canvas/poseCascade.js +41 -0
  242. package/dist/canvas/poseCascade.js.map +1 -0
  243. package/dist/canvas/poseRotation.js +1 -3
  244. package/dist/canvas/poseRotation.js.map +1 -1
  245. package/dist/canvas/rasterReadback.js +22 -0
  246. package/dist/canvas/rasterReadback.js.map +1 -0
  247. package/dist/canvas/renderDebugSnapshot.js +12 -12
  248. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  249. package/dist/canvas/renderNeeds.js +3 -3
  250. package/dist/canvas/renderNeeds.js.map +1 -1
  251. package/dist/canvas/renderSceneToPixels.js +64 -83
  252. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  253. package/dist/canvas/sceneAdapter.js +59 -144
  254. package/dist/canvas/sceneAdapter.js.map +1 -1
  255. package/dist/canvas/sceneClipboard.js +1 -1
  256. package/dist/canvas/sceneClipboard.js.map +1 -1
  257. package/dist/canvas/sceneLayerPaint.js +4 -4
  258. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  259. package/dist/canvas/sceneSlotWiring.js +10 -9
  260. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  261. package/dist/canvas/sceneViewRender.js +37 -42
  262. package/dist/canvas/sceneViewRender.js.map +1 -1
  263. package/dist/canvas/slopsDebugLayer.js +4 -4
  264. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  265. package/dist/canvas/useCanvasRenderer.js +23 -11
  266. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  267. package/dist/canvas/useCanvasSurface.js +31 -0
  268. package/dist/canvas/useCanvasSurface.js.map +1 -0
  269. package/dist/canvas/useCanvasView.js +51 -44
  270. package/dist/canvas/useCanvasView.js.map +1 -1
  271. package/dist/canvas/useFrameLoop.js +11 -12
  272. package/dist/canvas/useFrameLoop.js.map +1 -1
  273. package/dist/canvas/useHostAnchor.js +35 -33
  274. package/dist/canvas/useHostAnchor.js.map +1 -1
  275. package/dist/canvas/useLateContentRedraw.js +8 -8
  276. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  277. package/dist/canvas/useSceneAdapter.js +22 -0
  278. package/dist/canvas/useSceneAdapter.js.map +1 -0
  279. package/dist/canvas/useSceneLayerList.js +4 -14
  280. package/dist/canvas/useSceneLayerList.js.map +1 -1
  281. package/dist/canvas/useSurfaceInput.js +39 -0
  282. package/dist/canvas/useSurfaceInput.js.map +1 -0
  283. package/dist/canvas/useToolCursor.js +29 -0
  284. package/dist/canvas/useToolCursor.js.map +1 -0
  285. package/dist/canvas/useViewHelpers.js +46 -85
  286. package/dist/canvas/useViewHelpers.js.map +1 -1
  287. package/dist/canvas/viewInputs.js.map +1 -1
  288. package/dist/canvas/viewRegistry.js +40 -34
  289. package/dist/canvas/viewRegistry.js.map +1 -1
  290. package/dist/canvas/watchElementMove.js +43 -0
  291. package/dist/canvas/watchElementMove.js.map +1 -0
  292. package/dist/canvas/wrapNodeOutput.js +7 -2
  293. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  294. package/dist/clipboard.d.ts +7 -14
  295. package/dist/{types-B4iJRHC3.d.ts → clone-C0eADtS0.d.ts} +129 -84
  296. package/dist/clone.d.ts +4 -8
  297. package/dist/clone.js +0 -2
  298. package/dist/core/device/targets.js.map +1 -1
  299. package/dist/core/device/useDeviceProfile.js +13 -13
  300. package/dist/core/device/useDeviceProfile.js.map +1 -1
  301. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  302. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  303. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  304. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  305. package/dist/core/geometry/poseDescriptor.js +102 -29
  306. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  307. package/dist/core/geometry/regionHit.js +35 -37
  308. package/dist/core/geometry/regionHit.js.map +1 -1
  309. package/dist/core/geometry/targetFrame.js +94 -0
  310. package/dist/core/geometry/targetFrame.js.map +1 -0
  311. package/dist/core/geometry/unionBounds.js +4 -5
  312. package/dist/core/geometry/unionBounds.js.map +1 -1
  313. package/dist/core/layers/backgroundFill.js +31 -0
  314. package/dist/core/layers/backgroundFill.js.map +1 -0
  315. package/dist/{features/groups → core/layers}/children.js +2 -4
  316. package/dist/core/layers/children.js.map +1 -0
  317. package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
  318. package/dist/core/layers/gateLayer.js.map +1 -0
  319. package/dist/core/layers/layerGroup.js +40 -0
  320. package/dist/core/layers/layerGroup.js.map +1 -0
  321. package/dist/core/layers/render.js +50 -76
  322. package/dist/core/layers/render.js.map +1 -1
  323. package/dist/core/ops/create.js +2 -2
  324. package/dist/core/ops/create.js.map +1 -1
  325. package/dist/core/ops/createHistory.js +9 -9
  326. package/dist/core/ops/createHistory.js.map +1 -1
  327. package/dist/core/ops/delete.js +19 -23
  328. package/dist/core/ops/delete.js.map +1 -1
  329. package/dist/core/ops/reorder/index.js +3 -7
  330. package/dist/core/ops/reorder/index.js.map +1 -1
  331. package/dist/core/ops/reorder/setChildOrder.js +2 -4
  332. package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
  333. package/dist/core/ops/reparent.js +0 -1
  334. package/dist/core/ops/reparent.js.map +1 -1
  335. package/dist/core/ops/slot.js +3 -6
  336. package/dist/core/ops/slot.js.map +1 -1
  337. package/dist/core/pages/fitViewToPage.js +15 -0
  338. package/dist/core/pages/fitViewToPage.js.map +1 -0
  339. package/dist/core/pages/pages.js +65 -0
  340. package/dist/core/pages/pages.js.map +1 -0
  341. package/dist/core/pages/pagesLayer.js +27 -0
  342. package/dist/core/pages/pagesLayer.js.map +1 -0
  343. package/dist/core/paint/meshKind.js +16 -0
  344. package/dist/core/paint/meshKind.js.map +1 -0
  345. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +104 -93
  346. package/dist/core/paint/meshKindLazy.js.map +1 -0
  347. package/dist/core/paint/paintKindEntry.js +8 -0
  348. package/dist/core/paint/paintKindEntry.js.map +1 -0
  349. package/dist/core/paint/paintKinds.js +144 -0
  350. package/dist/core/paint/paintKinds.js.map +1 -0
  351. package/dist/core/paint/registerMesh.js +7 -0
  352. package/dist/core/paint/registerMesh.js.map +1 -0
  353. package/dist/core/scene/NodeProperties.js.map +1 -1
  354. package/dist/core/scene/NodeRouting.js.map +1 -1
  355. package/dist/core/scene/arrivalWindow.js +65 -64
  356. package/dist/core/scene/arrivalWindow.js.map +1 -1
  357. package/dist/core/scene/boundOps.js +40 -0
  358. package/dist/core/scene/boundOps.js.map +1 -0
  359. package/dist/core/scene/composeFrame.js +9 -6
  360. package/dist/core/scene/composeFrame.js.map +1 -1
  361. package/dist/core/scene/composePose.js +105 -0
  362. package/dist/core/scene/composePose.js.map +1 -0
  363. package/dist/core/scene/depMemo.js +31 -6
  364. package/dist/core/scene/depMemo.js.map +1 -1
  365. package/dist/core/scene/derivedPath.js +19 -20
  366. package/dist/core/scene/derivedPath.js.map +1 -1
  367. package/dist/core/scene/editMode.js +26 -0
  368. package/dist/core/scene/editMode.js.map +1 -0
  369. package/dist/core/scene/effectivePose.js +42 -39
  370. package/dist/core/scene/effectivePose.js.map +1 -1
  371. package/dist/core/scene/fieldEdits.js +98 -0
  372. package/dist/core/scene/fieldEdits.js.map +1 -0
  373. package/dist/core/scene/historyFacade.js +122 -70
  374. package/dist/core/scene/historyFacade.js.map +1 -1
  375. package/dist/core/scene/historyForm.js +6 -0
  376. package/dist/core/scene/historyForm.js.map +1 -0
  377. package/dist/core/scene/kitOps.js +83 -71
  378. package/dist/core/scene/kitOps.js.map +1 -1
  379. package/dist/core/scene/kitRegistry.js.map +1 -1
  380. package/dist/core/scene/layerStack.js +105 -12
  381. package/dist/core/scene/layerStack.js.map +1 -1
  382. package/dist/core/scene/layoutPass.js +58 -59
  383. package/dist/core/scene/layoutPass.js.map +1 -1
  384. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  385. package/dist/core/scene/nestedHit.js.map +1 -0
  386. package/dist/core/scene/nodeFnFields.js +16 -9
  387. package/dist/core/scene/nodeFnFields.js.map +1 -1
  388. package/dist/core/scene/nodeMemo.js.map +1 -1
  389. package/dist/core/scene/nodeStore.js +72 -71
  390. package/dist/core/scene/nodeStore.js.map +1 -1
  391. package/dist/core/scene/notifier.js +37 -0
  392. package/dist/core/scene/notifier.js.map +1 -0
  393. package/dist/core/scene/opTable.js +50 -0
  394. package/dist/core/scene/opTable.js.map +1 -0
  395. package/dist/core/scene/outerOps.js +67 -0
  396. package/dist/core/scene/outerOps.js.map +1 -0
  397. package/dist/core/scene/poseHold.js +39 -0
  398. package/dist/core/scene/poseHold.js.map +1 -0
  399. package/dist/core/scene/poseOverrides.js +44 -36
  400. package/dist/core/scene/poseOverrides.js.map +1 -1
  401. package/dist/core/scene/poseSnapshot.js.map +1 -1
  402. package/dist/core/scene/reconcileSpecs.js +4 -3
  403. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  404. package/dist/core/scene/recorder.js +86 -0
  405. package/dist/core/scene/recorder.js.map +1 -0
  406. package/dist/core/scene/renderOrder.js.map +1 -1
  407. package/dist/core/scene/scene.js +81 -690
  408. package/dist/core/scene/scene.js.map +1 -1
  409. package/dist/core/scene/sceneEdits.js +58 -0
  410. package/dist/core/scene/sceneEdits.js.map +1 -0
  411. package/dist/core/scene/sceneMutators.js +49 -0
  412. package/dist/core/scene/sceneMutators.js.map +1 -0
  413. package/dist/core/scene/scenePoseAdapter.js +16 -0
  414. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  415. package/dist/core/scene/sceneRecording.js +91 -0
  416. package/dist/core/scene/sceneRecording.js.map +1 -0
  417. package/dist/core/scene/sceneSelection.js +28 -0
  418. package/dist/core/scene/sceneSelection.js.map +1 -0
  419. package/dist/core/scene/sceneState.js +49 -0
  420. package/dist/core/scene/sceneState.js.map +1 -0
  421. package/dist/core/scene/serialization.js +8 -5
  422. package/dist/core/scene/serialization.js.map +1 -1
  423. package/dist/core/scene/staleReplay.js +51 -0
  424. package/dist/core/scene/staleReplay.js.map +1 -0
  425. package/dist/core/scene/statedFields.js +9 -0
  426. package/dist/core/scene/statedFields.js.map +1 -0
  427. package/dist/core/scene/treeEdits.js +127 -0
  428. package/dist/core/scene/treeEdits.js.map +1 -0
  429. package/dist/core/scene/treeReads.js +26 -0
  430. package/dist/core/scene/treeReads.js.map +1 -0
  431. package/dist/core/scene/types.js.map +1 -1
  432. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  433. package/dist/core/scene/unionOfChildren.js.map +1 -0
  434. package/dist/core/scene/unitScopes.js +13 -0
  435. package/dist/core/scene/unitScopes.js.map +1 -0
  436. package/dist/core/scene/useScene.js.map +1 -1
  437. package/dist/core/selection/readOnlySelection.js +32 -0
  438. package/dist/core/selection/readOnlySelection.js.map +1 -0
  439. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  440. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  441. package/dist/core/selection/useSelection.js +34 -25
  442. package/dist/core/selection/useSelection.js.map +1 -1
  443. package/dist/core/shapeKinds.js.map +1 -1
  444. package/dist/core/stylus/stylus.js.map +1 -1
  445. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  446. package/dist/core/usePaintKinds.js +1 -1
  447. package/dist/core/usePaintKinds.js.map +1 -1
  448. package/dist/core/viewport/clientToWorld.js.map +1 -1
  449. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  450. package/dist/core/viewport/parallax.js.map +1 -1
  451. package/dist/core/viewport/screenSlop.js +11 -11
  452. package/dist/core/viewport/screenSlop.js.map +1 -1
  453. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  454. package/dist/core/viewport/useDecayLoop.js +31 -33
  455. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  456. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  457. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  458. package/dist/core/viewport/useViewAnimation.js +113 -53
  459. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  460. package/dist/core/viewport/view.js +14 -11
  461. package/dist/core/viewport/view.js.map +1 -1
  462. package/dist/core/viewport/wheelHandler.js.map +1 -1
  463. package/dist/core/viewport/zoomAt.js +11 -2
  464. package/dist/core/viewport/zoomAt.js.map +1 -1
  465. package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BSKbyuvQ.d.ts} +11 -24
  466. package/dist/debug/createDebugOverlayLayer.js +100 -100
  467. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  468. package/dist/debug/createDebugSink.js.map +1 -1
  469. package/dist/debug/frameStats.js.map +1 -1
  470. package/dist/debug/useDebugSink.js +52 -0
  471. package/dist/debug/useDebugSink.js.map +1 -0
  472. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  473. package/dist/features/chrome-caps/conditions.js.map +1 -1
  474. package/dist/features/chrome-caps/defaults.js.map +1 -1
  475. package/dist/features/chrome-caps/resolve.js.map +1 -1
  476. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  477. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  478. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  479. package/dist/features/ingestion/contentHandlers.js +25 -19
  480. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  481. package/dist/features/ingestion/imageHandler.js +21 -24
  482. package/dist/features/ingestion/imageHandler.js.map +1 -1
  483. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  484. package/dist/features/ingestion/placement.js +16 -0
  485. package/dist/features/ingestion/placement.js.map +1 -0
  486. package/dist/features/ingestion/svgHandler.js +5 -0
  487. package/dist/features/ingestion/svgHandler.js.map +1 -1
  488. package/dist/features/ingestion/textHandler.js +28 -0
  489. package/dist/features/ingestion/textHandler.js.map +1 -0
  490. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  491. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  492. package/dist/features/ingestion/weaselJsonHandler.js +5 -0
  493. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  494. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  495. package/dist/features/modes/modeLayers.js +7 -7
  496. package/dist/features/modes/modeLayers.js.map +1 -1
  497. package/dist/features/paths/editablePath.js +63 -0
  498. package/dist/features/paths/editablePath.js.map +1 -0
  499. package/dist/features/paths/index.js +9 -16
  500. package/dist/features/paths/pathEditState.js +41 -0
  501. package/dist/features/paths/pathEditState.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  504. package/dist/features/paths/pathLayer.js +3 -2
  505. package/dist/features/paths/pathLayer.js.map +1 -1
  506. package/dist/features/paths/penPreviewLayer.js +86 -88
  507. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  508. package/dist/features/paths/shapeGenerator.js +89 -0
  509. package/dist/features/paths/shapeGenerator.js.map +1 -0
  510. package/dist/features/paths/usePathEdit.js +34 -0
  511. package/dist/features/paths/usePathEdit.js.map +1 -0
  512. package/dist/features/poseRun/usePoseRun.js +44 -57
  513. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  514. package/dist/features/selection/overlay.js +170 -178
  515. package/dist/features/selection/overlay.js.map +1 -1
  516. package/dist/features/text/index.js +6 -0
  517. package/dist/features/text/textLayer.js +1 -1
  518. package/dist/features/text/textLayer.js.map +1 -1
  519. package/dist/features/text/useSceneTextEdit.js +119 -88
  520. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  521. package/dist/features/viewports/viewResolver.js +28 -24
  522. package/dist/features/viewports/viewResolver.js.map +1 -1
  523. package/dist/features/viewports/viewportLayer.js +25 -36
  524. package/dist/features/viewports/viewportLayer.js.map +1 -1
  525. package/dist/icons/SliceIcon.js +24 -0
  526. package/dist/icons/SliceIcon.js.map +1 -0
  527. package/dist/index.d.ts +5200 -8777
  528. package/dist/index.js +284 -320
  529. package/dist/input/keyState.js +14 -14
  530. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  531. package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
  532. package/dist/interactions/actions/align/action.js.map +1 -0
  533. package/dist/interactions/actions/align/align.js +24 -24
  534. package/dist/interactions/actions/align/align.js.map +1 -1
  535. package/dist/interactions/actions/booleans/action.js +65 -0
  536. package/dist/interactions/actions/booleans/action.js.map +1 -0
  537. package/dist/interactions/actions/booleans/booleans.js +74 -83
  538. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  539. package/dist/interactions/actions/booleans/operands.js +40 -0
  540. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  541. package/dist/interactions/actions/booleans/pieces.js +45 -0
  542. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  543. package/dist/interactions/actions/booleans/placement.js +24 -0
  544. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  545. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  546. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  547. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  548. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
  549. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  550. package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
  551. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  552. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  553. package/dist/interactions/actions/clone/action.js +103 -0
  554. package/dist/interactions/actions/clone/action.js.map +1 -0
  555. package/dist/interactions/actions/clone/behaviors.js +52 -0
  556. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  557. package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
  558. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  559. package/dist/interactions/actions/defaults/anchorEditing.js +69 -74
  560. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  561. package/dist/interactions/actions/defaults/anchorHandles.js +42 -0
  562. package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -0
  563. package/dist/interactions/actions/defaults/anchorJoin.js +92 -0
  564. package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -0
  565. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  566. package/dist/interactions/actions/defaults/bendSegment.js +46 -0
  567. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -0
  568. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  569. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  570. package/dist/interactions/actions/defaults/copySubtree.js +1 -1
  571. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -1
  572. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  573. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  574. package/dist/interactions/actions/defaults/duplicate.js +36 -21
  575. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  576. package/dist/interactions/actions/defaults/enterPathEdit.js +19 -7
  577. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  578. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  579. package/dist/interactions/actions/defaults/group.js +35 -40
  580. package/dist/interactions/actions/defaults/group.js.map +1 -1
  581. package/dist/interactions/actions/defaults/icons/anchorIcons.js +75 -0
  582. package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +1 -0
  583. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  584. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  585. package/dist/interactions/actions/defaults/icons/editIcons.js +35 -8
  586. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -1
  587. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  588. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  589. package/dist/interactions/actions/defaults/ingest.js +19 -15
  590. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  591. package/dist/interactions/actions/defaults/insertPathAnchor.js +18 -34
  592. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  593. package/dist/interactions/actions/defaults/nudge.js +43 -39
  594. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  595. package/dist/interactions/actions/defaults/pinchZoom.js +29 -29
  596. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  597. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  598. package/dist/interactions/actions/defaults/segmentUnder.js +22 -0
  599. package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -0
  600. package/dist/interactions/actions/defaults/setFill.js +9 -3
  601. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  602. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
  603. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  604. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  605. package/dist/interactions/actions/defaults/sliceOps.js +20 -22
  606. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  607. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  608. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  609. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
  610. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  611. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  612. package/dist/interactions/actions/defaults/viewportZoom.js +82 -79
  613. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  614. package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
  615. package/dist/interactions/actions/distribute/action.js.map +1 -0
  616. package/dist/interactions/actions/distribute/distribute.js +15 -15
  617. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  618. package/dist/interactions/actions/edit-anchors/action.js +101 -0
  619. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  620. package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
  621. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  622. package/dist/interactions/actions/edit-anchors/preview.js +26 -0
  623. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -0
  624. package/dist/interactions/actions/edit-anchors/symmetry.js +11 -0
  625. package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -0
  626. package/dist/interactions/actions/flip/action.js +124 -0
  627. package/dist/interactions/actions/flip/action.js.map +1 -0
  628. package/dist/interactions/actions/flip/helpers.js +1 -1
  629. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  630. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  631. package/dist/interactions/actions/gestureFrames.js +18 -0
  632. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  633. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  634. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  635. package/dist/interactions/actions/insert/action.js +79 -0
  636. package/dist/interactions/actions/insert/action.js.map +1 -0
  637. package/dist/interactions/actions/insert/commit.js +28 -0
  638. package/dist/interactions/actions/insert/commit.js.map +1 -0
  639. package/dist/interactions/actions/insert/extras.js +65 -0
  640. package/dist/interactions/actions/insert/extras.js.map +1 -0
  641. package/dist/interactions/actions/insert/frame.js +55 -0
  642. package/dist/interactions/actions/insert/frame.js.map +1 -0
  643. package/dist/interactions/actions/insert/geometry.js +35 -0
  644. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  645. package/dist/interactions/actions/insert/repositionAction.js +31 -0
  646. package/dist/interactions/actions/insert/repositionAction.js.map +1 -0
  647. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  648. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  649. package/dist/interactions/actions/insert/session.js +59 -0
  650. package/dist/interactions/actions/insert/session.js.map +1 -0
  651. package/dist/interactions/actions/insert/shape.js +34 -0
  652. package/dist/interactions/actions/insert/shape.js.map +1 -0
  653. package/dist/interactions/actions/lasso-select/action.js +143 -0
  654. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  655. package/dist/interactions/actions/move/action.js +91 -0
  656. package/dist/interactions/actions/move/action.js.map +1 -0
  657. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  658. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  659. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  660. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  661. package/dist/interactions/actions/move/behaviors/snapToContainer.js +35 -28
  662. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  663. package/dist/interactions/actions/move/capture.js +108 -0
  664. package/dist/interactions/actions/move/capture.js.map +1 -0
  665. package/dist/interactions/actions/move/commit/index.js +41 -0
  666. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  667. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  668. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  669. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  670. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  671. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  672. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  673. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  674. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  675. package/dist/interactions/actions/move/delta.js +51 -0
  676. package/dist/interactions/actions/move/delta.js.map +1 -0
  677. package/dist/interactions/actions/move/frame.js +47 -0
  678. package/dist/interactions/actions/move/frame.js.map +1 -0
  679. package/dist/interactions/actions/move/gestureAdapter.js +15 -40
  680. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  681. package/dist/interactions/actions/move/landedDescendants.js +8 -8
  682. package/dist/interactions/actions/move/layout/container.js +94 -0
  683. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  684. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  685. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  686. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  687. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  688. package/dist/interactions/actions/move/layout/exits.js +38 -0
  689. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  690. package/dist/interactions/actions/move/layout/glide.js +48 -0
  691. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  692. package/dist/interactions/actions/move/session.js +63 -0
  693. package/dist/interactions/actions/move/session.js.map +1 -0
  694. package/dist/interactions/actions/move/translate.js +61 -0
  695. package/dist/interactions/actions/move/translate.js.map +1 -0
  696. package/dist/interactions/actions/outlines/createOutlines.js +17 -64
  697. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  698. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  699. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  700. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  701. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  702. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  703. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  704. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  705. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  706. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  707. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  708. package/dist/interactions/actions/pathCommands/cutJoin.js +102 -0
  709. package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -0
  710. package/dist/interactions/actions/pathCommands/livePathEdit.js +64 -0
  711. package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -0
  712. package/dist/interactions/actions/pathCommands/pathNodes.js +99 -0
  713. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -0
  714. package/dist/interactions/actions/pathCommands/simplifyOffset.js +42 -0
  715. package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -0
  716. package/dist/interactions/actions/planeInput.js.map +1 -1
  717. package/dist/interactions/actions/pointerState.js +12 -0
  718. package/dist/interactions/actions/pointerState.js.map +1 -0
  719. package/dist/interactions/actions/poseDescriptorDep.js +1 -1
  720. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  721. package/dist/interactions/actions/poseFrame.js +26 -26
  722. package/dist/interactions/actions/poseFrame.js.map +1 -1
  723. package/dist/interactions/actions/resize/action.js +66 -0
  724. package/dist/interactions/actions/resize/action.js.map +1 -0
  725. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  726. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  727. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  728. package/dist/interactions/actions/resize/capture.js +85 -0
  729. package/dist/interactions/actions/resize/capture.js.map +1 -0
  730. package/dist/interactions/actions/resize/commit.js +69 -0
  731. package/dist/interactions/actions/resize/commit.js.map +1 -0
  732. package/dist/interactions/actions/resize/frame.js +88 -0
  733. package/dist/interactions/actions/resize/frame.js.map +1 -0
  734. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  735. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  736. package/dist/interactions/actions/resize/replay.js +47 -0
  737. package/dist/interactions/actions/resize/replay.js.map +1 -0
  738. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  739. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  740. package/dist/interactions/actions/resize/session.js +63 -0
  741. package/dist/interactions/actions/resize/session.js.map +1 -0
  742. package/dist/interactions/actions/resolveOverlays.js +2 -1
  743. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  744. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  745. package/dist/interactions/actions/rotate/action.js +71 -0
  746. package/dist/interactions/actions/rotate/action.js.map +1 -0
  747. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  748. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  749. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  750. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  751. package/dist/interactions/actions/rotate/commit.js +40 -0
  752. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  753. package/dist/interactions/actions/rotate/frame.js +65 -0
  754. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  755. package/dist/interactions/actions/rotate/handle.js +12 -12
  756. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  757. package/dist/interactions/actions/rotate/replay.js +22 -0
  758. package/dist/interactions/actions/rotate/replay.js.map +1 -0
  759. package/dist/interactions/actions/rotate/session.js +102 -0
  760. package/dist/interactions/actions/rotate/session.js.map +1 -0
  761. package/dist/interactions/actions/spatialReference.js.map +1 -1
  762. package/dist/interactions/actions/transform-again/action.js +63 -0
  763. package/dist/interactions/actions/transform-again/action.js.map +1 -0
  764. package/dist/interactions/actions/transform-again/memory.js +35 -0
  765. package/dist/interactions/actions/transform-again/memory.js.map +1 -0
  766. package/dist/interactions/actions/useStandardActions.js +84 -61
  767. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  768. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
  769. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  770. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  771. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  772. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  773. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  774. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  775. package/dist/math-CYUjoyyU.d.ts +33 -0
  776. package/dist/math.d.ts +5 -2
  777. package/dist/math.js +6 -6
  778. package/dist/mesh.d.ts +4 -268
  779. package/dist/mesh.js +3 -7
  780. package/dist/move.d.ts +6 -4
  781. package/dist/{originProjection-gHnOup4e.d.ts → originProjection-CoNVpITV.d.ts} +1 -1
  782. package/dist/patterns-builtin.d.ts +1 -118
  783. package/dist/patterns-builtin.js +2 -3
  784. package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
  785. package/dist/renderer.d.ts +1 -92
  786. package/dist/renderer.js +2 -19
  787. package/dist/resize.d.ts +11 -22
  788. package/dist/resize.js +1 -1
  789. package/dist/style.css +1 -1
  790. package/dist/test-hook/install.js.map +1 -1
  791. package/dist/test-hook/useTestHook.js +22 -0
  792. package/dist/test-hook/useTestHook.js.map +1 -0
  793. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  794. package/dist/test-seams.d.ts +4 -4
  795. package/dist/test-seams.js +2 -2
  796. package/dist/tools/builtin/bone/boneActions.js +130 -0
  797. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  798. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  799. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  800. package/dist/tools/builtin/bone/placedRig.js +24 -0
  801. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  802. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  803. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  804. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  805. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  806. package/dist/tools/builtin/ellipse/useEllipseTool.js +16 -15
  807. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  808. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  809. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  810. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  811. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  812. package/dist/tools/builtin/line/useLineTool.js +16 -15
  813. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  814. package/dist/tools/builtin/pen/usePenTool.js +162 -164
  815. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  816. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  817. package/dist/tools/builtin/pickTopMostHit.js +11 -14
  818. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  819. package/dist/tools/builtin/polygon/usePolygonTool.js +17 -15
  820. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  821. package/dist/tools/builtin/rect/useRectTool.js +15 -14
  822. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  823. package/dist/tools/builtin/select/adapterPointQuery.js +40 -0
  824. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  825. package/dist/tools/builtin/select/selectionContributions.js +5 -5
  826. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  827. package/dist/tools/builtin/select/useSelectTool.js +44 -71
  828. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  829. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  830. package/dist/tools/builtin/slice/useSliceTool.js +69 -72
  831. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  832. package/dist/tools/builtin/star/useStarTool.js +18 -16
  833. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  834. package/dist/tools/builtin/text/useTextTool.js +10 -2
  835. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  836. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  837. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  838. package/dist/tools/builtin/weight/weightActions.js +112 -0
  839. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  840. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  841. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  842. package/dist/tools/overlayBinding.js.map +1 -1
  843. package/dist/tools/useKeybindings.js +20 -14
  844. package/dist/tools/useKeybindings.js.map +1 -1
  845. package/dist/{types-k-5Oqh-U.d.ts → types-DBbbCy0i.d.ts} +103 -176
  846. package/dist/util/paint.js +1 -1
  847. package/dist/util/paint.js.map +1 -1
  848. package/dist/version.js +1 -1
  849. package/package.json +26 -21
  850. package/dist/animation/colorHelpers.js +0 -135
  851. package/dist/animation/colorHelpers.js.map +0 -1
  852. package/dist/animation/colorRegistry.js +0 -37
  853. package/dist/animation/colorRegistry.js.map +0 -1
  854. package/dist/animation/engine/axes.js +0 -36
  855. package/dist/animation/engine/axes.js.map +0 -1
  856. package/dist/animation/engine/codec.js +0 -170
  857. package/dist/animation/engine/codec.js.map +0 -1
  858. package/dist/animation/engine/integrator.js +0 -12
  859. package/dist/animation/engine/integrator.js.map +0 -1
  860. package/dist/animation/loop.js +0 -60
  861. package/dist/animation/loop.js.map +0 -1
  862. package/dist/animation/observe.js +0 -23
  863. package/dist/animation/observe.js.map +0 -1
  864. package/dist/animation/rig/blendPoses.js +0 -43
  865. package/dist/animation/rig/blendPoses.js.map +0 -1
  866. package/dist/animation/rig/mirrorPose.js +0 -19
  867. package/dist/animation/rig/mirrorPose.js.map +0 -1
  868. package/dist/animation/rig/resolveSkeleton.js +0 -33
  869. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  870. package/dist/animation/rig/solveIk.js +0 -103
  871. package/dist/animation/rig/solveIk.js.map +0 -1
  872. package/dist/animation/rig/types.js +0 -12
  873. package/dist/animation/rig/types.js.map +0 -1
  874. package/dist/animation/slew.js +0 -27
  875. package/dist/animation/slew.js.map +0 -1
  876. package/dist/animation/stagger.js +0 -146
  877. package/dist/animation/stagger.js.map +0 -1
  878. package/dist/animation/timeline/booking.js +0 -114
  879. package/dist/animation/timeline/booking.js.map +0 -1
  880. package/dist/animation/timeline/createTimeline.js +0 -125
  881. package/dist/animation/timeline/createTimeline.js.map +0 -1
  882. package/dist/animation/timeline/sampleTrack.js +0 -79
  883. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  884. package/dist/animation/useAnimator.js +0 -388
  885. package/dist/animation/useAnimator.js.map +0 -1
  886. package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
  887. package/dist/builtins-DPcdghtB.d.ts +0 -1223
  888. package/dist/canvas/MinimapCanvas.js +0 -140
  889. package/dist/canvas/MinimapCanvas.js.map +0 -1
  890. package/dist/canvas/deps/poseComposition.js +0 -11
  891. package/dist/canvas/deps/poseComposition.js.map +0 -1
  892. package/dist/canvas/minimapMath.js +0 -82
  893. package/dist/canvas/minimapMath.js.map +0 -1
  894. package/dist/canvas/toolPreview.js +0 -39
  895. package/dist/canvas/toolPreview.js.map +0 -1
  896. package/dist/core/adapters/arrayAdapter.js +0 -94
  897. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  898. package/dist/core/adapters/useArrayAdapter.js +0 -13
  899. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  900. package/dist/core/fillInPoseFrame.js +0 -102
  901. package/dist/core/fillInPoseFrame.js.map +0 -1
  902. package/dist/core/geometry/poseFrame.js +0 -44
  903. package/dist/core/geometry/poseFrame.js.map +0 -1
  904. package/dist/core/geometry/poseRotation.js +0 -58
  905. package/dist/core/geometry/poseRotation.js.map +0 -1
  906. package/dist/core/gradient.js +0 -136
  907. package/dist/core/gradient.js.map +0 -1
  908. package/dist/core/markerInset.js +0 -24
  909. package/dist/core/markerInset.js.map +0 -1
  910. package/dist/core/mixed.js +0 -6
  911. package/dist/core/mixed.js.map +0 -1
  912. package/dist/core/paintKinds.js +0 -156
  913. package/dist/core/paintKinds.js.map +0 -1
  914. package/dist/core/scene/pickability.js +0 -6
  915. package/dist/core/scene/pickability.js.map +0 -1
  916. package/dist/core/strokeMarkerShapes.js +0 -139
  917. package/dist/core/strokeMarkerShapes.js.map +0 -1
  918. package/dist/core/strokeMarkers.js +0 -28
  919. package/dist/core/strokeMarkers.js.map +0 -1
  920. package/dist/core/viewport/meanScale.js +0 -8
  921. package/dist/core/viewport/meanScale.js.map +0 -1
  922. package/dist/core/viewport/pxExtent.js +0 -42
  923. package/dist/core/viewport/pxExtent.js.map +0 -1
  924. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  925. package/dist/features/focus/gateLayer.js.map +0 -1
  926. package/dist/features/focus/useCanvasFocus.js +0 -29
  927. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  928. package/dist/features/groups/children.js.map +0 -1
  929. package/dist/features/groups/composePose.js +0 -67
  930. package/dist/features/groups/composePose.js.map +0 -1
  931. package/dist/features/groups/nestedHit.js.map +0 -1
  932. package/dist/features/groups/unionOfChildren.js.map +0 -1
  933. package/dist/features/images/imageCache.js +0 -104
  934. package/dist/features/images/imageCache.js.map +0 -1
  935. package/dist/features/ingestion/index.js +0 -8
  936. package/dist/features/meshPaint/bake.js +0 -79
  937. package/dist/features/meshPaint/bake.js.map +0 -1
  938. package/dist/features/meshPaint/bakeCache.js +0 -59
  939. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  940. package/dist/features/meshPaint/handles.js +0 -86
  941. package/dist/features/meshPaint/handles.js.map +0 -1
  942. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  943. package/dist/features/meshPaint/meshPaint.js +0 -239
  944. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  945. package/dist/features/meshPaint/meshShader.js +0 -6
  946. package/dist/features/meshPaint/meshShader.js.map +0 -1
  947. package/dist/features/meshPaint/register.js +0 -7
  948. package/dist/features/meshPaint/register.js.map +0 -1
  949. package/dist/features/meshPaint/surface.js +0 -110
  950. package/dist/features/meshPaint/surface.js.map +0 -1
  951. package/dist/features/minimap/actions.js +0 -53
  952. package/dist/features/minimap/actions.js.map +0 -1
  953. package/dist/features/minimap/createMinimapContribution.js +0 -96
  954. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  955. package/dist/features/minimap/layers.js +0 -85
  956. package/dist/features/minimap/layers.js.map +0 -1
  957. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  958. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  959. package/dist/features/parallax/createParallaxLayer.js +0 -26
  960. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  961. package/dist/features/parallax/createParallaxPlane.js +0 -22
  962. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  963. package/dist/features/paths/anchorEdits.js +0 -167
  964. package/dist/features/paths/anchorEdits.js.map +0 -1
  965. package/dist/features/paths/anchors.js +0 -159
  966. package/dist/features/paths/anchors.js.map +0 -1
  967. package/dist/features/paths/booleans.js +0 -2
  968. package/dist/features/paths/markerCommands.js +0 -149
  969. package/dist/features/paths/markerCommands.js.map +0 -1
  970. package/dist/features/paths/markerSites.js +0 -59
  971. package/dist/features/paths/markerSites.js.map +0 -1
  972. package/dist/features/paths/markers.js +0 -95
  973. package/dist/features/paths/markers.js.map +0 -1
  974. package/dist/features/paths/nearestAnchor.js +0 -36
  975. package/dist/features/paths/nearestAnchor.js.map +0 -1
  976. package/dist/features/paths/pathInWorld.js +0 -41
  977. package/dist/features/paths/pathInWorld.js.map +0 -1
  978. package/dist/features/paths/poseDescriptor.js +0 -39
  979. package/dist/features/paths/poseDescriptor.js.map +0 -1
  980. package/dist/features/paths/strokeToPath.js +0 -40
  981. package/dist/features/paths/strokeToPath.js.map +0 -1
  982. package/dist/features/paths/tessellate/dash.js +0 -52
  983. package/dist/features/paths/tessellate/dash.js.map +0 -1
  984. package/dist/features/paths/tessellate/insets.js +0 -32
  985. package/dist/features/paths/tessellate/insets.js.map +0 -1
  986. package/dist/features/paths/tessellate/metric.js +0 -72
  987. package/dist/features/paths/tessellate/metric.js.map +0 -1
  988. package/dist/features/paths/tessellate/stroke.js +0 -170
  989. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  990. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  991. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  992. package/dist/features/patterns/commandPaint.js +0 -18
  993. package/dist/features/patterns/commandPaint.js.map +0 -1
  994. package/dist/features/patterns/index.js +0 -11
  995. package/dist/features/patterns/index.js.map +0 -1
  996. package/dist/features/patterns/patterns-builtin.js +0 -38
  997. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  998. package/dist/features/patterns/rasterizeTile.js +0 -17
  999. package/dist/features/patterns/rasterizeTile.js.map +0 -1
  1000. package/dist/features/patterns/resolveSpec.js +0 -65
  1001. package/dist/features/patterns/resolveSpec.js.map +0 -1
  1002. package/dist/features/patterns/tileGeometry.js +0 -158
  1003. package/dist/features/patterns/tileGeometry.js.map +0 -1
  1004. package/dist/features/pointer/PointerContext.js +0 -45
  1005. package/dist/features/pointer/PointerContext.js.map +0 -1
  1006. package/dist/features/selection/SelectionContext.js +0 -51
  1007. package/dist/features/selection/SelectionContext.js.map +0 -1
  1008. package/dist/features/simulation/createSimulation.js +0 -61
  1009. package/dist/features/simulation/createSimulation.js.map +0 -1
  1010. package/dist/features/simulation/types.js +0 -6
  1011. package/dist/features/simulation/types.js.map +0 -1
  1012. package/dist/features/simulation/useSimulation.js +0 -74
  1013. package/dist/features/simulation/useSimulation.js.map +0 -1
  1014. package/dist/features/text/domOffsets.js +0 -82
  1015. package/dist/features/text/domOffsets.js.map +0 -1
  1016. package/dist/features/text/domRuns.js +0 -230
  1017. package/dist/features/text/domRuns.js.map +0 -1
  1018. package/dist/features/text/fitTextPose.js +0 -38
  1019. package/dist/features/text/fitTextPose.js.map +0 -1
  1020. package/dist/features/text/hitTest.js +0 -48
  1021. package/dist/features/text/hitTest.js.map +0 -1
  1022. package/dist/features/text/isTextData.js +0 -8
  1023. package/dist/features/text/isTextData.js.map +0 -1
  1024. package/dist/features/text/overlayDirection.js +0 -15
  1025. package/dist/features/text/overlayDirection.js.map +0 -1
  1026. package/dist/features/text/renderLabel.js +0 -14
  1027. package/dist/features/text/renderLabel.js.map +0 -1
  1028. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  1029. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  1030. package/dist/features/text/runs/flagRange.js +0 -53
  1031. package/dist/features/text/runs/flagRange.js.map +0 -1
  1032. package/dist/features/text/runs/rangeStyle.js +0 -133
  1033. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  1034. package/dist/features/text/textCommand.js +0 -60
  1035. package/dist/features/text/textCommand.js.map +0 -1
  1036. package/dist/features/text/textToPath.js +0 -181
  1037. package/dist/features/text/textToPath.js.map +0 -1
  1038. package/dist/features/text/useTextEdit.js +0 -491
  1039. package/dist/features/text/useTextEdit.js.map +0 -1
  1040. package/dist/features/tiling/createTiledLayer.js +0 -65
  1041. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  1042. package/dist/features/tiling/tiledProject.js +0 -14
  1043. package/dist/features/tiling/tiledProject.js.map +0 -1
  1044. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  1045. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  1046. package/dist/interactions/actions/defaults/align.js.map +0 -1
  1047. package/dist/interactions/actions/defaults/booleans.js +0 -52
  1048. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  1049. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  1050. package/dist/interactions/actions/defaults/clone.js +0 -91
  1051. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  1052. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  1053. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  1054. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  1055. package/dist/interactions/actions/defaults/editAnchors.js +0 -100
  1056. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  1057. package/dist/interactions/actions/defaults/flip.js +0 -125
  1058. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  1059. package/dist/interactions/actions/defaults/insert.js +0 -287
  1060. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  1061. package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
  1062. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  1063. package/dist/interactions/actions/defaults/move.js +0 -778
  1064. package/dist/interactions/actions/defaults/move.js.map +0 -1
  1065. package/dist/interactions/actions/defaults/resize.js +0 -341
  1066. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  1067. package/dist/interactions/actions/defaults/rotate.js +0 -185
  1068. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  1069. package/dist/interactions/actions/previewOverrides.js +0 -25
  1070. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  1071. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  1072. package/dist/layout/arrivals.js +0 -36
  1073. package/dist/layout/arrivals.js.map +0 -1
  1074. package/dist/math-J-ACHyEg.d.ts +0 -159
  1075. package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
  1076. package/dist/renderer/DrawCommand.js +0 -6
  1077. package/dist/renderer/DrawCommand.js.map +0 -1
  1078. package/dist/renderer/WeaselRenderer.js +0 -333
  1079. package/dist/renderer/WeaselRenderer.js.map +0 -1
  1080. package/dist/renderer/batchClip.js +0 -46
  1081. package/dist/renderer/batchClip.js.map +0 -1
  1082. package/dist/renderer/cache/GLImageCache.js +0 -74
  1083. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  1084. package/dist/renderer/cache/GLMeshCache.js +0 -102
  1085. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  1086. package/dist/renderer/cache/GLTextureCache.js +0 -68
  1087. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  1088. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  1089. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  1090. package/dist/renderer/cache/cache.js +0 -13
  1091. package/dist/renderer/cache/cache.js.map +0 -1
  1092. package/dist/renderer/cache/markerCommandCache.js +0 -63
  1093. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  1094. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  1095. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  1096. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  1097. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  1098. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1099. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1100. package/dist/renderer/cullDrawCommands.js +0 -90
  1101. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1102. package/dist/renderer/draw/batch.js +0 -133
  1103. package/dist/renderer/draw/batch.js.map +0 -1
  1104. package/dist/renderer/draw/clip.js +0 -89
  1105. package/dist/renderer/draw/clip.js.map +0 -1
  1106. package/dist/renderer/draw/customShader.js +0 -230
  1107. package/dist/renderer/draw/customShader.js.map +0 -1
  1108. package/dist/renderer/draw/drawTriangles.js +0 -8
  1109. package/dist/renderer/draw/drawTriangles.js.map +0 -1
  1110. package/dist/renderer/draw/effects.js +0 -28
  1111. package/dist/renderer/draw/effects.js.map +0 -1
  1112. package/dist/renderer/draw/flushBatch.js +0 -35
  1113. package/dist/renderer/draw/flushBatch.js.map +0 -1
  1114. package/dist/renderer/draw/gradient.js +0 -90
  1115. package/dist/renderer/draw/gradient.js.map +0 -1
  1116. package/dist/renderer/draw/image.js +0 -38
  1117. package/dist/renderer/draw/image.js.map +0 -1
  1118. package/dist/renderer/draw/mesh.js +0 -16
  1119. package/dist/renderer/draw/mesh.js.map +0 -1
  1120. package/dist/renderer/draw/paintBind.js +0 -70
  1121. package/dist/renderer/draw/paintBind.js.map +0 -1
  1122. package/dist/renderer/draw/pathPaint.js +0 -142
  1123. package/dist/renderer/draw/pathPaint.js.map +0 -1
  1124. package/dist/renderer/draw/scratchPass.js +0 -83
  1125. package/dist/renderer/draw/scratchPass.js.map +0 -1
  1126. package/dist/renderer/draw/stencil.js +0 -28
  1127. package/dist/renderer/draw/stencil.js.map +0 -1
  1128. package/dist/renderer/draw/text.js +0 -167
  1129. package/dist/renderer/draw/text.js.map +0 -1
  1130. package/dist/renderer/draw/uniforms.js +0 -77
  1131. package/dist/renderer/draw/uniforms.js.map +0 -1
  1132. package/dist/renderer/draw.js +0 -79
  1133. package/dist/renderer/draw.js.map +0 -1
  1134. package/dist/renderer/drawBatch.js +0 -198
  1135. package/dist/renderer/drawBatch.js.map +0 -1
  1136. package/dist/renderer/effects/EffectTargets.js +0 -48
  1137. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1138. package/dist/renderer/effects/builtins.js +0 -31
  1139. package/dist/renderer/effects/builtins.js.map +0 -1
  1140. package/dist/renderer/effects/composite.js +0 -11
  1141. package/dist/renderer/effects/composite.js.map +0 -1
  1142. package/dist/renderer/effects/effectPrelude.js +0 -10
  1143. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1144. package/dist/renderer/effects/types.js +0 -10
  1145. package/dist/renderer/effects/types.js.map +0 -1
  1146. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1147. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1148. package/dist/renderer/index.js +0 -20
  1149. package/dist/renderer/math/color.js +0 -321
  1150. package/dist/renderer/math/color.js.map +0 -1
  1151. package/dist/renderer/math/mat3.js +0 -80
  1152. package/dist/renderer/math/mat3.js.map +0 -1
  1153. package/dist/renderer/math/patternSpace.js +0 -22
  1154. package/dist/renderer/math/patternSpace.js.map +0 -1
  1155. package/dist/renderer/math/viewToMat3.js +0 -19
  1156. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1157. package/dist/renderer/paintResources.js +0 -18
  1158. package/dist/renderer/paintResources.js.map +0 -1
  1159. package/dist/renderer/paintScratch.js +0 -37
  1160. package/dist/renderer/paintScratch.js.map +0 -1
  1161. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1162. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1163. package/dist/renderer/shaders/batchFill.js +0 -119
  1164. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1165. package/dist/renderer/shaders/customPrelude.js +0 -34
  1166. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1167. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1168. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1169. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1170. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1171. package/dist/renderer/shaders/gradFill.js +0 -31
  1172. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1173. package/dist/renderer/shaders/pathFill.js +0 -14
  1174. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1175. package/dist/renderer/shaders/patternFill.js +0 -25
  1176. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1177. package/dist/renderer/shaders/registerProgram.js +0 -18
  1178. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1179. package/dist/renderer/spriteSheet.js +0 -14
  1180. package/dist/renderer/spriteSheet.js.map +0 -1
  1181. package/dist/renderer/state/GroupState.js +0 -77
  1182. package/dist/renderer/state/GroupState.js.map +0 -1
  1183. package/dist/renderer/strokeLengths.js +0 -50
  1184. package/dist/renderer/strokeLengths.js.map +0 -1
  1185. package/dist/renderer/syntheticItalic.js +0 -6
  1186. package/dist/renderer/syntheticItalic.js.map +0 -1
  1187. package/dist/renderer/textures/registerTexture.js +0 -34
  1188. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1189. package/dist/scheduling/useVisibleRaf.js +0 -69
  1190. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1191. package/dist/test-seams-DM2B87-g.d.ts +0 -356
@@ -0,0 +1,102 @@
1
+ import { commitOps as e, deleteNode as t, insertAt as n, pathCopy as r, reshapeOps as i, selectedPathNodes as a, slotOf as o } from "./pathNodes.js";
2
+ import { anchorsToPath as s, closestOpenEnds as c, joinSubpathEnds as l, pathToAnchors as u } from "@weasel-js/geom";
3
+ import { ActionDisabledReason as d } from "@weasel-js/routing";
4
+ import { snipPathsAtCrossings as f } from "@weasel-js/geom/booleans";
5
+ //#region src/interactions/actions/pathCommands/cutJoin.ts
6
+ var p = "Cut at Crossings", m = "Join", h = {
7
+ id: "snipAtCrossings",
8
+ label: p,
9
+ group: "path",
10
+ eligible: { capability: "creates-shapes" },
11
+ requires: [
12
+ "selection",
13
+ "scene",
14
+ "applyOps"
15
+ ],
16
+ invoker: {
17
+ timing: "immediate",
18
+ run: (i) => {
19
+ let s = i.scene, c = a(i);
20
+ if (!s || c.length < 2) return;
21
+ let l = f(c.map((e) => e.path)), u = c.map((e, t) => ({
22
+ node: e,
23
+ pieces: l[t],
24
+ at: o(s, e.id)
25
+ })).filter((e) => e.pieces !== null).sort((e, t) => t.at - e.at);
26
+ if (u.length === 0) return;
27
+ let d = [], m = /* @__PURE__ */ new Map();
28
+ for (let { node: e, pieces: i, at: a } of u) {
29
+ d.push(t(s, e.node, p));
30
+ let o = i.flatMap((t) => r(s, e.node, t) ?? []);
31
+ o.forEach((e, t) => d.push(n(e, a < 0 ? a : a + t, p))), m.set(e.id, o.map((e) => e.id));
32
+ }
33
+ e(i, d, p);
34
+ let h = i.selection?.get() ?? [];
35
+ i.selection?.set(h.flatMap((e) => m.get(e) ?? [e]));
36
+ }
37
+ },
38
+ enabled: (e) => a(e).length >= 2 || d.SelectionRequired
39
+ };
40
+ function g(e) {
41
+ if (e.length === 0 || e.length > 2) return null;
42
+ let [t, n = null] = e, r = u(t.path), i = n ? (() => {
43
+ let e = u(n.path);
44
+ return {
45
+ anchors: [...r.anchors, ...e.anchors],
46
+ closed: [...r.closed, ...e.closed]
47
+ };
48
+ })() : r, a = r.anchors.length, o = i.anchors.flatMap((e, t) => !i.closed[t] && e.length >= 2 ? [t] : []), d;
49
+ if (!n && o.length === 1) d = l(i, {
50
+ sub: o[0],
51
+ end: "first"
52
+ }, {
53
+ sub: o[0],
54
+ end: "last"
55
+ });
56
+ else {
57
+ let e = c(i, (e, t) => !n || e.sub < a != t.sub < a);
58
+ d = e !== null && l(i, e[0], e[1]);
59
+ }
60
+ return d ? {
61
+ keep: t,
62
+ drop: n,
63
+ path: s(i.anchors, i.closed, t.path)
64
+ } : null;
65
+ }
66
+ var _ = {
67
+ id: "joinPaths",
68
+ label: m,
69
+ group: "path",
70
+ defaultBinding: {
71
+ kind: "key",
72
+ key: "j",
73
+ mods: { mod: !0 }
74
+ },
75
+ eligible: { capability: "creates-shapes" },
76
+ requires: [
77
+ "selection",
78
+ "scene",
79
+ "applyOps",
80
+ "editAnchors"
81
+ ],
82
+ invoker: {
83
+ timing: "immediate",
84
+ run: (n) => {
85
+ let r = n.scene;
86
+ if (n.editAnchors?.editingId) return;
87
+ let o = g(a(n));
88
+ if (!r || !o) return;
89
+ let s = i(o.keep.node, o.path, m);
90
+ o.drop && s.push(t(r, o.drop.node, m)), e(n, s, m), n.selection?.set([o.keep.id]);
91
+ }
92
+ },
93
+ enabled: (e) => {
94
+ if (e?.editAnchors?.editingId) return d.NotApplicable;
95
+ let t = a(e);
96
+ return t.length === 0 ? d.SelectionRequired : g(t) ? !0 : d.NotApplicable;
97
+ }
98
+ };
99
+ //#endregion
100
+ export { _ as joinPathsAction, g as planJoin, h as snipAtCrossingsAction };
101
+
102
+ //# sourceMappingURL=cutJoin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cutJoin.js","names":["CUT_LABEL","JOIN_LABEL","snipAtCrossingsAction","scene","deps","nodes","selectedPathNodes","pieces","snipPathsAtCrossings","n","cut","i","slotOf","node","c","b","a","ops","made","runs","deleteNode","copies","pathCopy","p","insertAt","copy","at","k","selected","id","ActionDisabledReason","planJoin","keep","drop","pathToAnchors","set","fromKeep","open","s","sub","joined","joinSubpathEnds","ends","closestOpenEnds","q","anchorsToPath","joinPathsAction","plan","reshapeOps","commitOps"],"sources":["../../../../src/interactions/actions/pathCommands/cutJoin.ts"],"sourcesContent":["/**\n * Cut at Crossings and Join: the path commands that change how many paths\n * there are.\n */\nimport type { Action, ActionDeps, ImmediateInvoker } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport {\n anchorsToPath, closestOpenEnds, joinSubpathEnds, pathToAnchors, type AnchorSet, type PolygonPath,\n} from '@weasel-js/geom';\nimport { snipPathsAtCrossings } from '@weasel-js/geom/booleans';\nimport type { Op } from 'core/ops/types';\nimport {\n commitOps, deleteNode, insertAt, pathCopy, reshapeOps, selectedPathNodes, slotOf, type PathNode,\n} from './pathNodes';\n\nconst CUT_LABEL = 'Cut at Crossings';\nconst JOIN_LABEL = 'Join';\n\n/**\n * @experimental Cut every selected path wherever another selected path\n * crosses it (`snipPathsAtCrossings`): each cut path is replaced, in its\n * slot, by its pieces, which take its paint, and the pieces are selected.\n */\nexport const snipAtCrossingsAction: Action & { requires: string[] } = {\n id: 'snipAtCrossings',\n label: CUT_LABEL,\n group: 'path',\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const scene = deps.scene;\n const nodes = selectedPathNodes(deps);\n if (!scene || nodes.length < 2) return;\n const pieces = snipPathsAtCrossings(nodes.map((n) => n.path));\n const cut = nodes\n .map((node, i) => ({ node, pieces: pieces[i], at: slotOf(scene, node.id) }))\n .filter((c): c is { node: PathNode; pieces: PolygonPath[]; at: number } => c.pieces !== null)\n .sort((a, b) => b.at - a.at);\n if (cut.length === 0) return;\n const ops: Op[] = [];\n const made = new Map<string, string[]>();\n for (const { node, pieces: runs, at } of cut) {\n ops.push(deleteNode(scene, node.node, CUT_LABEL));\n const copies = runs.flatMap((p) => pathCopy(scene, node.node, p) ?? []);\n copies.forEach((copy, k) => ops.push(insertAt(copy, at < 0 ? at : at + k, CUT_LABEL)));\n made.set(node.id, copies.map((c) => c.id));\n }\n commitOps(deps, ops, CUT_LABEL);\n const selected = deps.selection?.get() ?? [];\n deps.selection?.set(selected.flatMap((id) => made.get(id) ?? [id]) as never);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => (selectedPathNodes(deps).length >= 2 ? true : ActionDisabledReason.SelectionRequired),\n};\n\n/** What Join would do to the selection, or null when it cannot. */\ninterface JoinPlan {\n keep: PathNode;\n drop: PathNode | null;\n path: PolygonPath;\n}\n\n/**\n * One selected path: close its one open subpath, or join the two nearest\n * ends of its open subpaths. Two: join the nearest pair of open ends, one on\n * each, into the first selected, which takes in the second's other subpaths.\n */\nexport function planJoin(nodes: readonly PathNode[]): JoinPlan | null {\n if (nodes.length === 0 || nodes.length > 2) return null;\n const [keep, drop = null] = nodes;\n const a = pathToAnchors(keep.path) as AnchorSet;\n const set: AnchorSet = drop\n ? (() => {\n const b = pathToAnchors(drop.path);\n return { anchors: [...a.anchors, ...b.anchors], closed: [...a.closed, ...b.closed] };\n })()\n : a;\n const fromKeep = a.anchors.length;\n const open = set.anchors.flatMap((sub, s) => (!set.closed[s] && sub.length >= 2 ? [s] : []));\n let joined: boolean;\n if (!drop && open.length === 1) {\n joined = joinSubpathEnds(set, { sub: open[0], end: 'first' }, { sub: open[0], end: 'last' });\n } else {\n const ends = closestOpenEnds(set, (p, q) => !drop || (p.sub < fromKeep) !== (q.sub < fromKeep));\n joined = ends !== null && joinSubpathEnds(set, ends[0], ends[1]);\n }\n if (!joined) return null;\n return { keep, drop, path: anchorsToPath(set.anchors, set.closed, keep.path) };\n}\n\n/**\n * @experimental Join open paths: close a selected path's open end to its\n * start, or connect two selected paths at their nearest open ends into one\n * (`planJoin`). Ends that meet merge into one anchor; ends apart are bridged\n * straight. In path edit, `joinAnchors` joins the two selected anchors\n * instead.\n */\nexport const joinPathsAction: Action & { requires: string[] } = {\n id: 'joinPaths',\n label: JOIN_LABEL,\n group: 'path',\n defaultBinding: { kind: 'key', key: 'j', mods: { mod: true } },\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps', 'editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const scene = deps.scene;\n if (deps.editAnchors?.editingId) return;\n const plan = planJoin(selectedPathNodes(deps));\n if (!scene || !plan) return;\n const ops = reshapeOps(plan.keep.node, plan.path, JOIN_LABEL);\n if (plan.drop) ops.push(deleteNode(scene, plan.drop.node, JOIN_LABEL));\n commitOps(deps, ops, JOIN_LABEL);\n deps.selection?.set([plan.keep.id] as never);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps?: ActionDeps) => {\n // In path edit Join is the selected anchors' (`joinAnchors`).\n if (deps?.editAnchors?.editingId) return ActionDisabledReason.NotApplicable;\n const nodes = selectedPathNodes(deps);\n if (nodes.length === 0) return ActionDisabledReason.SelectionRequired;\n return planJoin(nodes) ? true : ActionDisabledReason.NotApplicable;\n },\n};\n"],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import { commitOps as e, selectedPathNodes as t, withPath as n } from "./pathNodes.js";
2
+ import { ActionDisabledReason as r } from "@weasel-js/routing";
3
+ //#region src/interactions/actions/pathCommands/livePathEdit.ts
4
+ function i(i) {
5
+ return {
6
+ id: i.id,
7
+ label: i.label,
8
+ eligible: { capability: "creates-shapes" },
9
+ requires: [
10
+ "selection",
11
+ "scene",
12
+ "applyOps"
13
+ ],
14
+ invoker: {
15
+ timing: "ongoing",
16
+ start(r, a) {
17
+ let o = t(r.deps);
18
+ if (o.length === 0) return {};
19
+ let s = (e) => {
20
+ let t = e?.[i.param];
21
+ return typeof t == "number" && Number.isFinite(t) ? t : null;
22
+ }, c = s(r.params) ?? s(a?.params) ?? i.initial, l = /* @__PURE__ */ new Map(), u = () => {
23
+ l = /* @__PURE__ */ new Map();
24
+ for (let e of o) {
25
+ let t = i.edit(e, c);
26
+ t && l.set(e.id, {
27
+ node: e,
28
+ path: t
29
+ });
30
+ }
31
+ };
32
+ u();
33
+ let d = (e) => {
34
+ let t = l.get(e);
35
+ return t ? n(t.node.node, t.path) : null;
36
+ };
37
+ return {
38
+ kind: i.id,
39
+ onMove(e) {
40
+ let t = s(e.params);
41
+ t !== null && t !== c && (c = t, u());
42
+ },
43
+ onEnd(t, n) {
44
+ let r = l;
45
+ if (l = /* @__PURE__ */ new Map(), n === "cancel" || r.size === 0) return;
46
+ let a = i.commit(t.deps, r, c);
47
+ e(t.deps, a, i.label);
48
+ let o = i.selectAfter?.(a);
49
+ o && t.deps.selection?.set(o);
50
+ },
51
+ previewIds: () => l.size > 0 ? [...l.keys()] : null,
52
+ previewPose: (e) => d(e)?.pose ?? null,
53
+ previewData: (e) => d(e)?.data ?? null,
54
+ ...i.overlaysSource ? { previewHidesSource: !1 } : {}
55
+ };
56
+ }
57
+ },
58
+ enabled: (e) => t(e).length > 0 || r.SelectionRequired
59
+ };
60
+ }
61
+ //#endregion
62
+ export { i as livePathEdit };
63
+
64
+ //# sourceMappingURL=livePathEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livePathEdit.js","names":["livePathEdit","spec","nodes","selectedPathNodes","ctx","read","v","params","value","opts","current","recompute","node","path","shapeOf","entry","id","withPath","next","moveCtx","done","reason","ops","endCtx","after","deps","ActionDisabledReason"],"sources":["../../../../src/interactions/actions/pathCommands/livePathEdit.ts"],"sourcesContent":["import type { Action, BindingOpts, InvocationCtx, OngoingHandle } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport type { Op } from 'core/ops/types';\nimport { commitOps, selectedPathNodes, withPath, type AnyNode, type PathNode } from './pathNodes';\n\n/** What one live path command does with its parameter. */\nexport interface LivePathEditSpec {\n id: string;\n label: string;\n /** The param the UI drives, and its value when none is given. */\n param: string;\n initial: number;\n /** The geometry `node` takes at `value`, or null for none. */\n edit(node: PathNode, value: number): PolygonPath | null;\n /** The ops committing `next`, made at `value`, for the edited nodes. */\n commit(deps: InvocationCtx['deps'], next: ReadonlyMap<string, { node: PathNode; path: PolygonPath }>, value: number): Op[];\n /** Ids to select after the commit; the selection stands when absent. */\n selectAfter?(ops: Op[]): string[];\n /** Whether the preview draws over the source, which stays in view. */\n overlaysSource?: boolean;\n}\n\n/**\n * An ongoing action over the selected path nodes driven by one number — a\n * slider's tolerance or distance. `begin` with the param shows the result as\n * a preview; each update recomputes it; committing writes it as one undo\n * entry, and canceling leaves the scene untouched.\n */\nexport function livePathEdit(spec: LivePathEditSpec): Action & { requires: string[] } {\n return {\n id: spec.id,\n label: spec.label,\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const nodes = selectedPathNodes(ctx.deps);\n if (nodes.length === 0) return {};\n const read = (params: Record<string, unknown> | undefined): number | null => {\n const v = params?.[spec.param];\n return typeof v === 'number' && Number.isFinite(v) ? v : null;\n };\n let value = read(ctx.params) ?? read(opts?.params as Record<string, unknown> | undefined) ?? spec.initial;\n let current = new Map<string, { node: PathNode; path: PolygonPath }>();\n const recompute = () => {\n current = new Map();\n for (const node of nodes) {\n const path = spec.edit(node, value);\n if (path) current.set(node.id, { node, path });\n }\n };\n recompute();\n const shapeOf = (id: string) => {\n const entry = current.get(id);\n return entry ? withPath(entry.node.node as AnyNode, entry.path) : null;\n };\n return {\n kind: spec.id,\n onMove(moveCtx: InvocationCtx): void {\n const next = read(moveCtx.params);\n if (next === null || next === value) return;\n value = next;\n recompute();\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n const done = current;\n current = new Map();\n if (reason === 'cancel' || done.size === 0) return;\n const ops = spec.commit(endCtx.deps, done, value);\n commitOps(endCtx.deps, ops, spec.label);\n const after = spec.selectAfter?.(ops);\n if (after) endCtx.deps.selection?.set(after as never);\n },\n previewIds: () => (current.size > 0 ? [...current.keys()] : null),\n previewPose: (id: string) => shapeOf(id)?.pose ?? null,\n previewData: (id: string) => shapeOf(id)?.data ?? null,\n ...(spec.overlaysSource ? { previewHidesSource: false } : {}),\n };\n },\n },\n enabled: (deps) => (selectedPathNodes(deps).length > 0 ? true : ActionDisabledReason.SelectionRequired),\n };\n}\n"],"mappings":";;;AA6BA,SAAgBA,EAAa,GAAyD;CACpF,OAAO;EACL,IAAIC,EAAK;EACT,OAAOA,EAAK;EACZ,UAAU,EAAE,YAAY,iBAAiB;EACzC,UAAU;GAAC;GAAa;GAAS;EAAU;EAC3C,SAAS;GACP,QAAQ;GACR,MAAM,GAAoB,GAAmC;IAC3D,IAAMC,IAAQC,EAAkBC,EAAI,IAAI;IACxC,IAAIF,EAAM,WAAW,GAAG,OAAO,CAAC;IAChC,IAAMG,KAAQ,MAA+D;KAC3E,IAAMC,IAAIC,IAASN,EAAK;KACxB,OAAO,OAAOK,KAAM,YAAY,OAAO,SAASA,CAAC,IAAIA,IAAI;IAC3D,GACIE,IAAQH,EAAKD,EAAI,MAAM,KAAKC,EAAKI,GAAM,MAA6C,KAAKR,EAAK,SAC9FS,oBAAU,IAAI,IAAmD,GAC/DC,UAAkB;KACtB,oBAAU,IAAI,IAAI;KAClB,KAAK,IAAMC,KAAQV,GAAO;MACxB,IAAMW,IAAOZ,EAAK,KAAKW,GAAMJ,CAAK;MAClC,AAAIK,KAAMH,EAAQ,IAAIE,EAAK,IAAI;OAAE;OAAM;MAAK,CAAC;KAC/C;IACF;IACA,EAAU;IACV,IAAME,KAAW,MAAe;KAC9B,IAAMC,IAAQL,EAAQ,IAAIM,CAAE;KAC5B,OAAOD,IAAQE,EAASF,EAAM,KAAK,MAAiBA,EAAM,IAAI,IAAI;IACpE;IACA,OAAO;KACL,MAAMd,EAAK;KACX,OAAO,GAA8B;MACnC,IAAMiB,IAAOb,EAAKc,EAAQ,MAAM;MAChC,AAAID,MAAS,QAAQA,MAASV,MAC9B,IAAQU,GACRP,EAAU;KACZ;KACA,MAAM,GAAuB,GAAmC;MAC9D,IAAMS,IAAOV;MAEb,IADA,oBAAU,IAAI,IAAI,GACdW,MAAW,YAAYD,EAAK,SAAS,GAAG;MAC5C,IAAME,IAAMrB,EAAK,OAAOsB,EAAO,MAAMH,GAAMZ,CAAK;MAChD,EAAUe,EAAO,MAAMD,GAAKrB,EAAK,KAAK;MACtC,IAAMuB,IAAQvB,EAAK,cAAcqB,CAAG;MACpC,AAAIE,KAAOD,EAAO,KAAK,WAAW,IAAIC,CAAc;KACtD;KACA,kBAAmBd,EAAQ,OAAO,IAAI,CAAC,GAAGA,EAAQ,KAAK,CAAC,IAAI;KAC5D,cAAc,MAAeI,EAAQE,CAAE,CAAC,EAAE,QAAQ;KAClD,cAAc,MAAeF,EAAQE,CAAE,CAAC,EAAE,QAAQ;KAClD,GAAIf,EAAK,iBAAiB,EAAE,oBAAoB,GAAM,IAAI,CAAC;IAC7D;GACF;EACF;EACA,UAAU,MAAUE,EAAkBsB,CAAI,CAAC,CAAC,SAAS,KAAWC,EAAqB;CACvF;AACF"}
@@ -0,0 +1,99 @@
1
+ import { createTransformOp as e } from "../../../core/ops/transform.js";
2
+ import { createSetDataOp as t } from "../../../core/ops/setData.js";
3
+ import { defaultCommitAdapter as n } from "../defaultCommitAdapter.js";
4
+ import { createDeleteOp as r } from "../../../core/ops/delete.js";
5
+ import { createInsertOp as i } from "../../../core/ops/create.js";
6
+ import { resolveEditablePathOf as a, storeEditablePath as o } from "../../../features/paths/editablePath.js";
7
+ import { withoutShapeGenerator as s } from "../../../features/paths/shapeGenerator.js";
8
+ //#region src/interactions/actions/pathCommands/pathNodes.ts
9
+ function c(e) {
10
+ let t = e?.scene, n = e?.selection?.get() ?? [];
11
+ if (!t) return [];
12
+ let r = [];
13
+ for (let e of n) {
14
+ let n = t.get(e);
15
+ if (!n || n.kind !== "leaf") continue;
16
+ let i = a(n);
17
+ i && r.push({
18
+ id: e,
19
+ node: n,
20
+ path: i
21
+ });
22
+ }
23
+ return r;
24
+ }
25
+ function l(e, t) {
26
+ let n = o(e, t);
27
+ if (!n) return null;
28
+ let r = s(n.data);
29
+ if (r && typeof r == "object" && "skin" in r) {
30
+ let { skin: e, ...t } = r;
31
+ return {
32
+ pose: n.pose,
33
+ data: t
34
+ };
35
+ }
36
+ return {
37
+ pose: n.pose,
38
+ data: r
39
+ };
40
+ }
41
+ function u(n, r, i) {
42
+ let a = l(n, r);
43
+ if (!a) return [];
44
+ let o = [];
45
+ return a.pose !== n.pose && o.push(e({
46
+ id: n.id,
47
+ from: n.pose,
48
+ to: a.pose,
49
+ label: i
50
+ })), a.data !== n.data && o.push(t({
51
+ id: n.id,
52
+ from: n.data,
53
+ to: a.data,
54
+ label: i
55
+ })), o;
56
+ }
57
+ function d(e, t, n) {
58
+ let r = l(t, n);
59
+ return r ? {
60
+ ...t,
61
+ id: e.mintId(),
62
+ pose: r.pose,
63
+ data: r.data
64
+ } : null;
65
+ }
66
+ function f(e, t) {
67
+ let n = e.get(t)?.parent ?? null;
68
+ return (n === null ? e.roots : e.childrenOf(n)).indexOf(t);
69
+ }
70
+ function p(e, t, n) {
71
+ return i(t >= 0 ? {
72
+ node: e,
73
+ index: t,
74
+ label: n
75
+ } : {
76
+ node: e,
77
+ label: n
78
+ });
79
+ }
80
+ function m(e, t, n) {
81
+ return r({
82
+ node: t,
83
+ index: f(e, t.id),
84
+ label: n
85
+ });
86
+ }
87
+ function h(e, t, r) {
88
+ if (t.length === 0) return;
89
+ if (e.applyOps) {
90
+ e.applyOps(t, r);
91
+ return;
92
+ }
93
+ let i = e.scene;
94
+ i && i.applyBatch(t, r, n(i, e.selection?.adapterMethods));
95
+ }
96
+ //#endregion
97
+ export { h as commitOps, m as deleteNode, p as insertAt, d as pathCopy, u as reshapeOps, c as selectedPathNodes, f as slotOf, l as withPath };
98
+
99
+ //# sourceMappingURL=pathNodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathNodes.js","names":["selectedPathNodes","scene","deps","ids","out","id","node","path","resolveEditablePathOf","withPath","stored","storeEditablePath","worldPath","data","withoutShapeGenerator","_orphaned","rest","reshapeOps","next","ops","createTransformOp","createSetDataOp","pathCopy","slotOf","parent","insertAt","createInsertOp","index","deleteNode","createDeleteOp","commitOps","label","defaultCommitAdapter"],"sources":["../../../../src/interactions/actions/pathCommands/pathNodes.ts"],"sourcesContent":["/**\n * What the path commands share: reading the selected path nodes, and writing\n * new geometry back into a node or into a copy of one. A node's geometry is\n * stored where it already lives (`storeEditablePath`); a skin, whose weights\n * follow anchors the new geometry no longer has, is dropped, and so is a\n * shape generator, which no longer makes it.\n */\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport type { Node, NodeId, Scene } from 'core/scene/types';\nimport type { Op } from 'core/ops/types';\nimport { createTransformOp } from 'core/ops/transform';\nimport { createSetDataOp } from 'core/ops/setData';\nimport { createInsertOp } from 'core/ops/create';\nimport { createDeleteOp } from 'core/ops/delete';\nimport { resolveEditablePathOf, storeEditablePath } from 'features/paths/editablePath';\nimport { withoutShapeGenerator } from 'features/paths/shapeGenerator';\nimport { defaultCommitAdapter } from '../defaultCommitAdapter';\n\ntype AnyScene = Scene<unknown, string, unknown>;\nexport type AnyNode = Node<unknown, string, unknown>;\n\n/** A selected node with an editable polygon, and that polygon in world space. */\nexport interface PathNode {\n id: NodeId;\n node: AnyNode;\n path: PolygonPath;\n}\n\n/** The selected leaves that hold an editable polygon, in selection order. */\nexport function selectedPathNodes(deps: ActionDeps | undefined): PathNode[] {\n const scene = deps?.scene as AnyScene | undefined;\n const ids = deps?.selection?.get() ?? [];\n if (!scene) return [];\n const out: PathNode[] = [];\n for (const id of ids) {\n const node = scene.get(id as NodeId);\n if (!node || node.kind !== 'leaf') continue;\n const path = resolveEditablePathOf(node);\n if (path) out.push({ id: id as NodeId, node, path });\n }\n return out;\n}\n\n/** `node` storing `worldPath`, or null when it holds no editable polygon. */\nexport function withPath(node: AnyNode, worldPath: PolygonPath): { pose: unknown; data: unknown } | null {\n const stored = storeEditablePath(node, worldPath);\n if (!stored) return null;\n const data = withoutShapeGenerator(stored.data) as { skin?: unknown } | null;\n if (data && typeof data === 'object' && 'skin' in data) {\n const { skin: _orphaned, ...rest } = data;\n void _orphaned;\n return { pose: stored.pose, data: rest };\n }\n return { pose: stored.pose, data };\n}\n\n/** The ops that give `node` the geometry `worldPath`, labeled `label`. */\nexport function reshapeOps(node: AnyNode, worldPath: PolygonPath, label: string): Op[] {\n const next = withPath(node, worldPath);\n if (!next) return [];\n const ops: Op[] = [];\n if (next.pose !== node.pose) ops.push(createTransformOp({ id: node.id, from: node.pose, to: next.pose, label }));\n if (next.data !== node.data) ops.push(createSetDataOp({ id: node.id, from: node.data, to: next.data, label }));\n return ops;\n}\n\n/** A copy of `node` under a fresh id, holding `worldPath`. */\nexport function pathCopy(scene: AnyScene, node: AnyNode, worldPath: PolygonPath): AnyNode | null {\n const next = withPath(node, worldPath);\n if (!next) return null;\n return { ...node, id: scene.mintId(), pose: next.pose, data: next.data } as AnyNode;\n}\n\n/** Where `id` sits among its siblings, back to front. */\nexport function slotOf(scene: AnyScene, id: NodeId): number {\n const parent = scene.get(id)?.parent ?? null;\n const siblings = parent === null ? scene.roots : scene.childrenOf(parent);\n return siblings.indexOf(id);\n}\n\n/** Insert `node` at `index` among its parent's children. */\nexport function insertAt(node: AnyNode, index: number, label: string): Op {\n return createInsertOp(index >= 0 ? { node, index, label } : { node, label });\n}\n\n/** Delete `node`, remembering its slot for undo. */\nexport function deleteNode(scene: AnyScene, node: AnyNode, label: string): Op {\n return createDeleteOp({ node, index: slotOf(scene, node.id), label });\n}\n\n/** Commit `ops` as one undo entry, through the consumer's `applyOps` when\n * there is one. */\nexport function commitOps(deps: ActionDeps, ops: Op[], label: string): void {\n if (ops.length === 0) return;\n if (deps.applyOps) {\n deps.applyOps(ops, label);\n return;\n }\n const scene = deps.scene as AnyScene | undefined;\n if (!scene) return;\n scene.applyBatch(ops, label, defaultCommitAdapter(scene, deps.selection?.adapterMethods));\n}\n"],"mappings":";;;;;;;;AA8BA,SAAgBA,EAAkB,GAA0C;CAC1E,IAAMC,IAAQC,GAAM,OACdC,IAAMD,GAAM,WAAW,IAAI,KAAK,CAAC;CACvC,IAAI,CAACD,GAAO,OAAO,CAAC;CACpB,IAAMG,IAAkB,CAAC;CACzB,KAAK,IAAMC,KAAMF,GAAK;EACpB,IAAMG,IAAOL,EAAM,IAAII,CAAY;EACnC,IAAI,CAACC,KAAQA,EAAK,SAAS,QAAQ;EACnC,IAAMC,IAAOC,EAAsBF,CAAI;EACvC,AAAIC,KAAMH,EAAI,KAAK;GAAM;GAAc;GAAM;EAAK,CAAC;CACrD;CACA,OAAOA;AACT;AAGA,SAAgBK,EAAS,GAAe,GAAiE;CACvG,IAAMC,IAASC,EAAkBL,GAAMM,CAAS;CAChD,IAAI,CAACF,GAAQ,OAAO;CACpB,IAAMG,IAAOC,EAAsBJ,EAAO,IAAI;CAC9C,IAAIG,KAAQ,OAAOA,KAAS,YAAY,UAAUA,GAAM;EACtD,IAAM,EAAE,MAAME,GAAW,GAAGC,MAASH;EAErC,OAAO;GAAE,MAAMH,EAAO;GAAM,MAAMM;EAAK;CACzC;CACA,OAAO;EAAE,MAAMN,EAAO;EAAM;CAAK;AACnC;AAGA,SAAgBO,EAAW,GAAe,GAAwB,GAAqB;CACrF,IAAMC,IAAOT,EAASH,GAAMM,CAAS;CACrC,IAAI,CAACM,GAAM,OAAO,CAAC;CACnB,IAAMC,IAAY,CAAC;CAGnB,OAFID,EAAK,SAASZ,EAAK,QAAMa,EAAI,KAAKC,EAAkB;EAAE,IAAId,EAAK;EAAI,MAAMA,EAAK;EAAM,IAAIY,EAAK;EAAM;CAAM,CAAC,CAAC,GAC3GA,EAAK,SAASZ,EAAK,QAAMa,EAAI,KAAKE,EAAgB;EAAE,IAAIf,EAAK;EAAI,MAAMA,EAAK;EAAM,IAAIY,EAAK;EAAM;CAAM,CAAC,CAAC,GACtGC;AACT;AAGA,SAAgBG,EAAS,GAAiB,GAAe,GAAwC;CAC/F,IAAMJ,IAAOT,EAASH,GAAMM,CAAS;CAErC,OADKM,IACE;EAAE,GAAGZ;EAAM,IAAIL,EAAM,OAAO;EAAG,MAAMiB,EAAK;EAAM,MAAMA,EAAK;CAAK,IADrD;AAEpB;AAGA,SAAgBK,EAAO,GAAiB,GAAoB;CAC1D,IAAMC,IAASvB,EAAM,IAAII,CAAE,CAAC,EAAE,UAAU;CAExC,QADiBmB,MAAW,OAAOvB,EAAM,QAAQA,EAAM,WAAWuB,CAAM,EAAA,CACxD,QAAQnB,CAAE;AAC5B;AAGA,SAAgBoB,EAAS,GAAe,GAAe,GAAmB;CACxE,OAAOC,EAAeC,KAAS,IAAI;EAAE;EAAM;EAAO;CAAM,IAAI;EAAE;EAAM;CAAM,CAAC;AAC7E;AAGA,SAAgBC,EAAW,GAAiB,GAAe,GAAmB;CAC5E,OAAOC,EAAe;EAAE;EAAM,OAAON,EAAOtB,GAAOK,EAAK,EAAE;EAAG;CAAM,CAAC;AACtE;AAIA,SAAgBwB,EAAU,GAAkB,GAAW,GAAqB;CAC1E,IAAIX,EAAI,WAAW,GAAG;CACtB,IAAIjB,EAAK,UAAU;EACjB,EAAK,SAASiB,GAAKY,CAAK;EACxB;CACF;CACA,IAAM9B,IAAQC,EAAK;CACnB,AAAKD,KACLA,EAAM,WAAWkB,GAAKY,GAAOC,EAAqB/B,GAAOC,EAAK,WAAW,cAAc,CAAC;AAC1F"}
@@ -0,0 +1,42 @@
1
+ import { insertAt as e, pathCopy as t, reshapeOps as n, slotOf as r } from "./pathNodes.js";
2
+ import { livePathEdit as i } from "./livePathEdit.js";
3
+ import { simplifyPath as a } from "@weasel-js/geom";
4
+ import { offsetPath as o } from "@weasel-js/stroke";
5
+ //#region src/interactions/actions/pathCommands/simplifyOffset.ts
6
+ var s = 1, c = i({
7
+ id: "simplifyPath",
8
+ label: "Simplify",
9
+ param: "tolerance",
10
+ initial: s,
11
+ edit: ({ path: e }, t) => a(e, Math.max(t, 0)),
12
+ commit: (e, t) => [...t.values()].flatMap(({ node: e, path: t }) => n(e.node, t, "Simplify"))
13
+ }), l = i({
14
+ id: "offsetPath",
15
+ label: "Offset Path",
16
+ param: "distance",
17
+ initial: 0,
18
+ overlaysSource: !0,
19
+ edit: ({ path: e }, t) => {
20
+ if (t === 0) return null;
21
+ let n = o(e, t);
22
+ return n.commands.length > 0 ? n : null;
23
+ },
24
+ commit: (n, i, a) => {
25
+ let o = n.scene;
26
+ if (!o) return [];
27
+ let s = [...i.values()].map((e) => ({
28
+ ...e,
29
+ at: r(o, e.node.id)
30
+ })).sort((e, t) => t.at - e.at), c = [];
31
+ for (let { node: n, path: r, at: i } of s) {
32
+ let s = t(o, n.node, r);
33
+ s && c.push(e(s, i < 0 || a > 0 ? i : i + 1, "Offset Path"));
34
+ }
35
+ return c;
36
+ },
37
+ selectAfter: (e) => e.map((e) => e.args.node.id)
38
+ });
39
+ //#endregion
40
+ export { s as DEFAULT_SIMPLIFY_TOLERANCE, l as offsetPathAction, c as simplifyPathAction };
41
+
42
+ //# sourceMappingURL=simplifyOffset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplifyOffset.js","names":["DEFAULT_SIMPLIFY_TOLERANCE","simplifyPathAction","livePathEdit","simplifyPath","path","tolerance","next","reshapeOps","node","offsetPathAction","distance","out","offsetPath","scene","deps","placed","entry","slotOf","b","a","ops","copy","pathCopy","insertAt","at","op"],"sources":["../../../../src/interactions/actions/pathCommands/simplifyOffset.ts"],"sourcesContent":["/**\n * Simplify and Offset Path: the two path commands driven by a number. Both\n * are ongoing actions so a slider can preview them live and commit once —\n * `useOngoingAction('simplifyPath').input({ tolerance })`, then `.commit()`.\n */\nimport { simplifyPath } from '@weasel-js/geom';\nimport { offsetPath } from '@weasel-js/stroke';\nimport type { Op } from 'core/ops/types';\nimport { livePathEdit } from './livePathEdit';\nimport { insertAt, pathCopy, reshapeOps, slotOf } from './pathNodes';\n\n/** Simplify's tolerance when none is given: world units off the original. */\nexport const DEFAULT_SIMPLIFY_TOLERANCE = 1;\n\n/**\n * @experimental Refit each selected path with as few anchors as keep it\n * within `params.tolerance` of where it was (`simplifyPath`).\n */\nexport const simplifyPathAction = livePathEdit({\n id: 'simplifyPath',\n label: 'Simplify',\n param: 'tolerance',\n initial: DEFAULT_SIMPLIFY_TOLERANCE,\n edit: ({ path }, tolerance) => simplifyPath(path, Math.max(tolerance, 0)),\n commit: (_deps, next) => [...next.values()].flatMap(({ node, path }) => reshapeOps(node.node, path, 'Simplify')),\n});\n\n/**\n * @experimental Add, beside each selected path, the outline of the region it\n * fills grown by `params.distance` (shrunk by a negative one), with\n * `params.join` corners (`offsetPath`). A grown outline goes behind its\n * source and a shrunk one in front, so neither hides the other; the new\n * paths are selected.\n */\nexport const offsetPathAction = livePathEdit({\n id: 'offsetPath',\n label: 'Offset Path',\n param: 'distance',\n initial: 0,\n overlaysSource: true,\n edit: ({ path }, distance) => {\n if (distance === 0) return null;\n const out = offsetPath(path, distance);\n return out.commands.length > 0 ? out : null;\n },\n commit: (deps, next, distance) => {\n const scene = deps.scene;\n if (!scene) return [];\n // Top slot first, so an insert cannot shift a later one's index.\n const placed = [...next.values()]\n .map((entry) => ({ ...entry, at: slotOf(scene, entry.node.id) }))\n .sort((a, b) => b.at - a.at);\n const ops: Op[] = [];\n for (const { node, path, at } of placed) {\n const copy = pathCopy(scene, node.node, path);\n if (!copy) continue;\n ops.push(insertAt(copy, at < 0 || distance > 0 ? at : at + 1, 'Offset Path'));\n }\n return ops;\n },\n selectAfter: (ops) => ops.map((op) => (op.args as { node: { id: string } }).node.id),\n});\n"],"mappings":";;;;;AAYA,IAAaA,IAA6B,GAM7BC,IAAqBC,EAAa;CAC7C,IAAI;CACJ,OAAO;CACP,OAAO;CACP,SAASF;CACT,OAAO,EAAE,WAAQ,MAAcG,EAAaC,GAAM,KAAK,IAAIC,GAAW,CAAC,CAAC;CACxE,SAAS,GAAO,MAAS,CAAC,GAAGC,EAAK,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,SAAM,cAAWC,EAAWC,EAAK,MAAMJ,GAAM,UAAU,CAAC;AACjH,CAAC,GASYK,IAAmBP,EAAa;CAC3C,IAAI;CACJ,OAAO;CACP,OAAO;CACP,SAAS;CACT,gBAAgB;CAChB,OAAO,EAAE,WAAQ,MAAa;EAC5B,IAAIQ,MAAa,GAAG,OAAO;EAC3B,IAAMC,IAAMC,EAAWR,GAAMM,CAAQ;EACrC,OAAOC,EAAI,SAAS,SAAS,IAAIA,IAAM;CACzC;CACA,SAAS,GAAM,GAAM,MAAa;EAChC,IAAME,IAAQC,EAAK;EACnB,IAAI,CAACD,GAAO,OAAO,CAAC;EAEpB,IAAME,IAAS,CAAC,GAAGT,EAAK,OAAO,CAAC,CAAC,CAC9B,KAAK,OAAW;GAAE,GAAGU;GAAO,IAAIC,EAAOJ,GAAOG,EAAM,KAAK,EAAE;EAAE,EAAE,CAAC,CAChE,MAAM,GAAG,MAAME,EAAE,KAAKC,EAAE,EAAE,GACvBC,IAAY,CAAC;EACnB,KAAK,IAAM,EAAE,SAAM,SAAM,WAAQL,GAAQ;GACvC,IAAMM,IAAOC,EAAST,GAAOL,EAAK,MAAMJ,CAAI;GAC5C,AAAKiB,KACLD,EAAI,KAAKG,EAASF,GAAMG,IAAK,KAAKd,IAAW,IAAIc,IAAKA,IAAK,GAAG,aAAa,CAAC;EAC9E;EACA,OAAOJ;CACT;CACA,cAAc,MAAQA,EAAI,KAAK,MAAQK,EAAG,KAAkC,KAAK,EAAE;AACrF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"planeInput.js","names":["layerOfNode","id","deps","asNodeId","selectionLayer","selection","affordance","layer","insertLayer","editingLayer","planeOf","view","invertPlane","m","planeToPlane","carryPose","pose","b","d","rectToPlane","inPlane","inner","action","declared","requires","plane","livePlane","layerOf","params","wx","\"worldX\"","wy","\"worldY\"","at","toPlane","ctx","opts","planeHandle","scene","bag","viewApi","l","parallaxOf","parallax","IDENTITY","map","p","planeMap","planeView","camera","deriveParallaxView","edited","own","override","name","nodeAtPoint","fromPlane","exclude","snap","start0","pressedAt","trail","trailCarrier","out","c","start","current","aff","src","lastMap","same","points","i","handle","reason","ov","overlayFromPlane","pt","rectFromPlane","insertExtrasFromPlane","extras","e","r","v","\"a\"","\"b\"","\"center\"","\"radius\"","\"outerRadius\"","\"samples\"","s"],"sources":["../../../src/interactions/actions/planeInput.ts"],"sourcesContent":["/**\n * Editing a node on a parallax plane.\n *\n * The dispatcher hands every action the camera's world. A node on a layer\n * carrying `parallax` stores its pose in its plane's world, which the camera's\n * reaches through a `PlaneMap` that changes with the camera. An editing action\n * pairs the pointer with the pose it edits, so the two have to be in one world.\n *\n * `inPlane` is that one place: it wraps an action so its input is carried into\n * the plane of the layer it edits before the action reads it — pointer, drag,\n * trail, affordance pivot, and the camera it converts screen pixels through —\n * and so the chrome it publishes back comes out in the camera's world. A dep\n * that answers in world points (`nodeAtPoint`, `snap`) is the surface's, so it\n * keeps speaking the camera's world and the seam converts at its boundary.\n * The action sees the plane only as `view.plane()`, which it hands its snap\n * behaviors so they can bring the camera's guides and grid into the plane.\n *\n * A selection can span planes. The edit is measured in one of them, and a\n * node on another is carried into it as the gesture starts\n * (`planeOf` at press, inverted) and back out through `planeOf` as it is now,\n * so each node ends where it was drawn relative to the pointer.\n *\n * The map is read afresh on every call: a camera panning under a held drag, or\n * a plane whose factors are being animated, moves the node with the pointer.\n */\nimport type {\n Action, ActionDeps, AffordanceHit, BindingOpts, DragSample, InvocationCtx, OngoingHandle,\n OngoingOverlay,\n} from '@weasel-js/routing';\nimport type { Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport {\n deriveParallaxView, fromPlane, planeMap, planeToPlane, rectFromPlane, rectToPlane, toPlane,\n type ParallaxOpts, type PlaneMap,\n} from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { NodeAtPointDep, SnapDep, ViewApi } from './depSchema';\n\ntype Point = { x: number; y: number };\n\n/** Which scene layer an invocation edits, read once as it starts, from its\n * deps and — for a drag — the affordance it grabbed. `undefined` means none:\n * the action runs in the camera's world. */\nexport type EditedLayerOf = (deps: ActionDeps, affordance?: AffordanceHit) => string | undefined;\n\nconst layerOfNode = (deps: ActionDeps, id: string | null | undefined): string | undefined =>\n (id ? deps.scene?.get(asNodeId(id))?.layer : undefined);\n\n/** The layer of the node a selection edit acts on: the affordance's target\n * when the drag grabbed one, the first selected node otherwise. A selection\n * spanning planes is edited in that one node's plane. */\nexport const selectionLayer: EditedLayerOf = (deps, affordance) => {\n const selection = deps.selection;\n for (const id of [...(affordance?.targetIds ?? []), ...(selection?.get() ?? [])]) {\n const layer = layerOfNode(deps, id);\n if (layer !== undefined) return layer;\n }\n return undefined;\n};\n\n/** The layer the `insert` dep will put a new node on. */\nexport const insertLayer: EditedLayerOf = (deps) =>\n deps.insert?.layer?.();\n\n/** The layer of the path in anchor-edit mode. */\nexport const editingLayer: EditedLayerOf = (deps) =>\n layerOfNode(deps, deps.editAnchors?.editingId);\n\n/** How the world an invocation edits in maps into the world `layer`'s nodes\n * are stored in, read now. Null when they are the same world. */\nexport function planeOf(view: unknown, layer: string): PlaneMap | null {\n return (view as ViewApi | undefined)?.planeOf?.(layer) ?? null;\n}\n\n/** `m` run backwards; null stays null. */\nexport function invertPlane(m: PlaneMap | null): PlaneMap | null {\n return m && planeToPlane(m, null);\n}\n\n/** `pose` carried through `m`. The map is axis-aligned, so remapping the\n * pose's bounds carries it exactly when the map scales both axes alike. */\nexport function carryPose<P>(d: PoseDescriptor<P>, pose: P, m: PlaneMap | null): P {\n if (m === null) return pose;\n const b = d.getBounds(pose);\n return d.remapBounds(pose, b, rectToPlane(m, b));\n}\n\n/** `action`, with its input carried into the plane of the layer `layerOf`\n * names. An action in a scene with no `parallax` layer, or invoked with no\n * scene or view to read a plane from, runs exactly as it would unwrapped.\n *\n * An ongoing action's drag is carried as a whole. An immediate one's world\n * point is `params.worldX` / `params.worldY`, the dispatcher's convention for\n * a click; it is carried when present. */\nexport function inPlane<A extends Action>(action: A, layerOf: EditedLayerOf): A {\n const inner = action.invoker;\n if (!inner) return action;\n const declared = action.requires ?? [];\n const requires = [...new Set([...declared, 'scene', 'selection', 'view'])];\n if (inner.timing === 'immediate') {\n return {\n ...action,\n requires,\n invoker: {\n timing: 'immediate',\n run(deps: ActionDeps, params?: Record<string, unknown>): void {\n const plane = livePlane(deps, layerOf(deps), declared, null);\n if (plane === null) return inner.run(deps, params);\n const wx = params?.['worldX'];\n const wy = params?.['worldY'];\n const at = typeof wx === 'number' && typeof wy === 'number'\n ? toPlane(plane.map(), { x: wx, y: wy })\n : null;\n inner.run(plane.deps, at ? { ...params, worldX: at.x, worldY: at.y } : params);\n },\n },\n } as A;\n }\n return {\n ...action,\n requires,\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const plane = livePlane(\n ctx.deps, layerOf(ctx.deps, ctx.drag?.affordance), declared, ctx.drag?.start ?? null,\n );\n if (plane === null) return inner.start(ctx, opts);\n return planeHandle(inner.start(plane.carry(ctx), opts), plane);\n },\n },\n } as A;\n}\n\ninterface LivePlane {\n map(): PlaneMap;\n /** The invocation's deps, speaking the plane's world. */\n deps: ActionDeps;\n /** `ctx` in the plane's world. */\n carry(ctx: InvocationCtx): InvocationCtx;\n}\n\nfunction livePlane(\n bag: ActionDeps,\n layer: string | undefined,\n /** What the wrapped action declared. The dispatcher's dev deps bag throws\n * on any other read, so the seam converts only the deps it can see. */\n declared: readonly string[],\n /** The drag's press point in the camera's world, when there is a drag. */\n pressedAt: Point | null,\n): LivePlane | null {\n const scene = bag.scene as Scene<unknown, string, unknown> | undefined;\n const viewApi = bag.view as ViewApi | undefined;\n if (layer === undefined || !scene || !viewApi) return null;\n if (!scene.layers.some((l) => l.parallax !== undefined)) return null;\n const parallaxOf = (id: string): ParallaxOpts | undefined => scene.layers.find((l) => l.id === id)?.parallax;\n const parallax = (): ParallaxOpts | undefined => parallaxOf(layer);\n\n const IDENTITY: PlaneMap = { scale: { x: 1, y: 1 }, offset: { x: 0, y: 0 } };\n const map = (): PlaneMap => {\n const p = parallax();\n return p ? planeMap(viewApi.get(), p) : IDENTITY;\n };\n\n // A screen-pixel tolerance, and anything else an action reads off the\n // camera, has to be read at the plane's scale.\n const planeView = Object.defineProperties(Object.create(viewApi), {\n get: {\n value: (): View => {\n const p = parallax();\n const camera = viewApi.get();\n return p ? deriveParallaxView(camera, p) : camera;\n },\n },\n plane: { value: map },\n planeOf: {\n value: (id: string): PlaneMap | null => {\n const edited = parallax();\n const own = parallaxOf(id);\n const camera = viewApi.get();\n return planeToPlane(edited ? planeMap(camera, edited) : null, own ? planeMap(camera, own) : null);\n },\n },\n }) as ViewApi;\n\n // Over the dispatcher's bag rather than a copy of it, so every other read\n // still goes through whatever checks the bag makes.\n const deps = Object.create(bag) as typeof bag;\n const override = (name: string, value: unknown) =>\n Object.defineProperty(deps, name, { value, enumerable: true });\n override('view', planeView);\n const nodeAtPoint = declared.includes('nodeAtPoint')\n ? bag.nodeAtPoint as NodeAtPointDep | undefined\n : undefined;\n if (nodeAtPoint) {\n override('nodeAtPoint', ((p, exclude) => nodeAtPoint(fromPlane(map(), p), exclude)) as NodeAtPointDep);\n }\n const snap = declared.includes('snap') ? bag.snap as SnapDep | undefined : undefined;\n if (snap) {\n override('snap', { point: (p: Point) => toPlane(map(), snap.point(fromPlane(map(), p))) } as SnapDep);\n }\n\n // The drag's origin, fixed in the plane at the moment it was pressed: where\n // the pointer went down on the node is where the node was grabbed, whatever\n // the camera does after.\n const start0 = pressedAt ? toPlane(map(), pressedAt) : null;\n const trail = trailCarrier();\n\n return {\n map,\n deps,\n carry(c) {\n const m = map();\n const out: InvocationCtx = { ...c, world: toPlane(m, c.world) };\n if (c.drag) {\n const start = start0 ?? toPlane(m, c.drag.start);\n const current = toPlane(m, c.drag.current);\n const aff = c.drag.affordance;\n out.drag = {\n ...c.drag,\n start,\n current,\n delta: { x: current.x - start.x, y: current.y - start.y },\n ...(c.drag.points ? { points: trail(c.drag.points, m) } : {}),\n ...(aff?.fixedPoint ? { affordance: { ...aff, fixedPoint: toPlane(m, aff.fixedPoint) } } : {}),\n };\n }\n // The dispatcher hands `onMove` no deps; only `start` has any to carry.\n if (c.deps) out.deps = deps;\n return out;\n },\n };\n}\n\n/** The drag trail in the plane. The dispatcher grows its trail in place, so\n * only the samples added since the last call are mapped — unless the map\n * moved, when every sample is. */\nfunction trailCarrier(): (points: DragSample[], m: PlaneMap) => DragSample[] {\n let src: DragSample[] | null = null;\n let lastMap: PlaneMap | null = null;\n let out: DragSample[] = [];\n return (points, m) => {\n const same = lastMap !== null\n && lastMap.scale.x === m.scale.x && lastMap.scale.y === m.scale.y\n && lastMap.offset.x === m.offset.x && lastMap.offset.y === m.offset.y;\n if (points !== src || !same || points.length < out.length) {\n src = points;\n out = [];\n }\n lastMap = m;\n for (let i = out.length; i < points.length; i++) {\n out.push({ ...points[i], ...toPlane(m, points[i]) });\n }\n // A copy, so a snapshot taken on `onEnd` is not the live accumulator.\n return out.slice();\n };\n}\n\nfunction planeHandle(handle: OngoingHandle, plane: LivePlane): OngoingHandle {\n const out: OngoingHandle = { ...handle };\n if (handle.onMove) out.onMove = (c) => handle.onMove!(plane.carry(c));\n if (handle.onEnd) out.onEnd = (c, reason) => handle.onEnd!(plane.carry(c), reason);\n if (handle.overlay) {\n out.overlay = () => {\n const ov = handle.overlay!();\n return ov ? overlayFromPlane(ov, plane.map()) : ov;\n };\n }\n return out;\n}\n\n/** An overlay drawn in the plane, in the camera's world: what every painter\n * reads an overlay as. */\nfunction overlayFromPlane(ov: OngoingOverlay, m: PlaneMap): OngoingOverlay {\n const pt = (p: Point) => fromPlane(m, p);\n switch (ov.kind) {\n case 'marquee':\n return { ...ov, start: pt(ov.start), current: pt(ov.current) };\n case 'lasso':\n return { ...ov, vertices: ov.vertices.map(pt), current: pt(ov.current) };\n case 'polyline':\n return { ...ov, points: ov.points.map(pt) };\n case 'insertPreview':\n return {\n ...ov,\n bounds: rectFromPlane(m, ov.bounds),\n extras: insertExtrasFromPlane(ov.extras, m),\n ...(ov.anchorPoint ? { anchorPoint: pt(ov.anchorPoint) } : {}),\n };\n }\n}\n\n/** The geometry the kit's insert kinds carry in `extras`, in the camera's\n * world. A consumer kind's extras are opaque, and pass through. */\nfunction insertExtrasFromPlane(extras: unknown, m: PlaneMap): unknown {\n if (extras === null || typeof extras !== 'object') return extras;\n const e = extras as Record<string, unknown>;\n const pt = (p: unknown) => fromPlane(m, p as Point);\n // Radial kinds inscribe in a square, so one scale carries a radius.\n const r = (v: unknown) => (typeof v === 'number' ? v / ((m.scale.x + m.scale.y) / 2) : v);\n const out: Record<string, unknown> = { ...e };\n if (e['a'] && e['b']) { out['a'] = pt(e['a']); out['b'] = pt(e['b']); }\n if (e['center']) out['center'] = pt(e['center']);\n if ('radius' in e) out['radius'] = r(e['radius']);\n if ('outerRadius' in e) out['outerRadius'] = r(e['outerRadius']);\n if (Array.isArray(e['samples'])) {\n out['samples'] = (e['samples'] as DragSample[]).map((s) => ({ ...s, ...pt(s) }));\n }\n return out;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"planeInput.js","names":["layerOfNode","id","deps","asNodeId","selectionLayer","selection","affordance","layer","insertLayer","editingLayer","planeOf","view","invertPlane","m","planeToPlane","carryPose","pose","b","d","rectToPlane","inPlane","inner","action","declared","requires","plane","livePlane","layerOf","params","wx","\"worldX\"","wy","\"worldY\"","at","toPlane","ctx","opts","planeHandle","scene","bag","viewApi","l","parallaxOf","parallax","IDENTITY","map","p","planeMap","planeView","camera","deriveParallaxView","edited","own","override","name","nodeAtPoint","fromPlane","exclude","snap","start0","pressedAt","trail","trailCarrier","out","c","start","current","aff","src","lastMap","same","points","i","handle","reason","ov","overlayFromPlane","pt","rectFromPlane","insertExtrasFromPlane","extras","e","r","v","\"a\"","\"b\"","\"center\"","\"radius\"","\"outerRadius\"","\"samples\"","s"],"sources":["../../../src/interactions/actions/planeInput.ts"],"sourcesContent":["/**\n * Editing a node on a parallax plane.\n *\n * The dispatcher hands every action the camera's world. A node on a layer\n * carrying `parallax` stores its pose in its plane's world, which the camera's\n * reaches through a `PlaneMap` that changes with the camera. An editing action\n * pairs the pointer with the pose it edits, so the two have to be in one world.\n *\n * `inPlane` wraps an action so its input is carried into the plane of the\n * layer it edits before the action reads it, and the chrome it publishes back\n * comes out in the camera's world. A dep that answers in world points\n * (`nodeAtPoint`, `snap`) keeps speaking the camera's world, and the seam\n * converts at its boundary.\n *\n * A selection can span planes. The edit is measured in one of them, and a\n * node on another is carried into it as the gesture starts and back out\n * through `planeOf` as it is now.\n *\n * The map is read afresh on every call: a camera panning under a held drag, or\n * a plane whose factors are being animated, moves the node with the pointer.\n */\nimport type {\n Action, ActionDeps, AffordanceHit, BindingOpts, DragSample, InvocationCtx, OngoingHandle,\n OngoingOverlay,\n} from '@weasel-js/routing';\nimport type { Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport {\n deriveParallaxView, fromPlane, planeMap, planeToPlane, rectFromPlane, rectToPlane, toPlane,\n type ParallaxOpts, type PlaneMap,\n} from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { NodeAtPointDep, SnapDep, ViewApi } from './depSchema';\n\ntype Point = { x: number; y: number };\n\n/** Which scene layer an invocation edits, read once as it starts. `undefined`\n * means none: the action runs in the camera's world. */\nexport type EditedLayerOf = (deps: ActionDeps, affordance?: AffordanceHit) => string | undefined;\n\nconst layerOfNode = (deps: ActionDeps, id: string | null | undefined): string | undefined =>\n (id ? deps.scene?.get(asNodeId(id))?.layer : undefined);\n\n/** The layer of the node a selection edit acts on: the affordance's target\n * when the drag grabbed one, the first selected node otherwise. A selection\n * spanning planes is edited in that one node's plane. */\nexport const selectionLayer: EditedLayerOf = (deps, affordance) => {\n const selection = deps.selection;\n for (const id of [...(affordance?.targetIds ?? []), ...(selection?.get() ?? [])]) {\n const layer = layerOfNode(deps, id);\n if (layer !== undefined) return layer;\n }\n return undefined;\n};\n\n/** The layer the `insert` dep will put a new node on. */\nexport const insertLayer: EditedLayerOf = (deps) =>\n deps.insert?.layer?.();\n\n/** The layer of the path in anchor-edit mode. */\nexport const editingLayer: EditedLayerOf = (deps) =>\n layerOfNode(deps, deps.editAnchors?.editingId);\n\n/** How the world an invocation edits in maps into the world `layer`'s nodes\n * are stored in, read now. Null when they are the same world. */\nexport function planeOf(view: unknown, layer: string): PlaneMap | null {\n return (view as ViewApi | undefined)?.planeOf?.(layer) ?? null;\n}\n\n/** `m` run backwards; null stays null. */\nexport function invertPlane(m: PlaneMap | null): PlaneMap | null {\n return m && planeToPlane(m, null);\n}\n\n/** `pose` carried through `m`. The map is axis-aligned, so remapping the\n * pose's bounds carries it exactly when the map scales both axes alike. */\nexport function carryPose<P>(d: PoseDescriptor<P>, pose: P, m: PlaneMap | null): P {\n if (m === null) return pose;\n const b = d.getBounds(pose);\n return d.remapBounds(pose, b, rectToPlane(m, b));\n}\n\n/** `action`, with its input carried into the plane of the layer `layerOf`\n * names. An action in a scene with no `parallax` layer, or invoked with no\n * scene or view to read a plane from, runs exactly as it would unwrapped.\n *\n * An immediate action's world point is `params.worldX` / `params.worldY`,\n * the dispatcher's convention for a click; it is carried when present. */\nexport function inPlane<A extends Action>(action: A, layerOf: EditedLayerOf): A {\n const inner = action.invoker;\n if (!inner) return action;\n const declared = action.requires ?? [];\n const requires = [...new Set([...declared, 'scene', 'selection', 'view'])];\n if (inner.timing === 'immediate') {\n return {\n ...action,\n requires,\n invoker: {\n timing: 'immediate',\n run(deps: ActionDeps, params?: Record<string, unknown>): void {\n const plane = livePlane(deps, layerOf(deps), declared, null);\n if (plane === null) return inner.run(deps, params);\n const wx = params?.['worldX'];\n const wy = params?.['worldY'];\n const at = typeof wx === 'number' && typeof wy === 'number'\n ? toPlane(plane.map(), { x: wx, y: wy })\n : null;\n inner.run(plane.deps, at ? { ...params, worldX: at.x, worldY: at.y } : params);\n },\n },\n } as A;\n }\n return {\n ...action,\n requires,\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const plane = livePlane(\n ctx.deps, layerOf(ctx.deps, ctx.drag?.affordance), declared, ctx.drag?.start ?? null,\n );\n if (plane === null) return inner.start(ctx, opts);\n return planeHandle(inner.start(plane.carry(ctx), opts), plane);\n },\n },\n } as A;\n}\n\ninterface LivePlane {\n map(): PlaneMap;\n /** The invocation's deps, speaking the plane's world. */\n deps: ActionDeps;\n /** `ctx` in the plane's world. */\n carry(ctx: InvocationCtx): InvocationCtx;\n}\n\nfunction livePlane(\n bag: ActionDeps,\n layer: string | undefined,\n /** What the wrapped action declared. The dispatcher's dev deps bag throws\n * on any other read, so the seam converts only the deps it can see. */\n declared: readonly string[],\n /** The drag's press point in the camera's world, when there is a drag. */\n pressedAt: Point | null,\n): LivePlane | null {\n const scene = bag.scene as Scene<unknown, string, unknown> | undefined;\n const viewApi = bag.view as ViewApi | undefined;\n if (layer === undefined || !scene || !viewApi) return null;\n if (!scene.layers.some((l) => l.parallax !== undefined)) return null;\n const parallaxOf = (id: string): ParallaxOpts | undefined => scene.layers.find((l) => l.id === id)?.parallax;\n const parallax = (): ParallaxOpts | undefined => parallaxOf(layer);\n\n const IDENTITY: PlaneMap = { scale: { x: 1, y: 1 }, offset: { x: 0, y: 0 } };\n const map = (): PlaneMap => {\n const p = parallax();\n return p ? planeMap(viewApi.get(), p) : IDENTITY;\n };\n\n // A screen-pixel tolerance, and anything else an action reads off the\n // camera, has to be read at the plane's scale.\n const planeView = Object.defineProperties(Object.create(viewApi), {\n get: {\n value: (): View => {\n const p = parallax();\n const camera = viewApi.get();\n return p ? deriveParallaxView(camera, p) : camera;\n },\n },\n plane: { value: map },\n planeOf: {\n value: (id: string): PlaneMap | null => {\n const edited = parallax();\n const own = parallaxOf(id);\n const camera = viewApi.get();\n return planeToPlane(edited ? planeMap(camera, edited) : null, own ? planeMap(camera, own) : null);\n },\n },\n }) as ViewApi;\n\n // Over the dispatcher's bag rather than a copy of it, so every other read\n // still goes through whatever checks the bag makes.\n const deps = Object.create(bag) as typeof bag;\n const override = (name: string, value: unknown) =>\n Object.defineProperty(deps, name, { value, enumerable: true });\n override('view', planeView);\n const nodeAtPoint = declared.includes('nodeAtPoint')\n ? bag.nodeAtPoint as NodeAtPointDep | undefined\n : undefined;\n if (nodeAtPoint) {\n override('nodeAtPoint', ((p, exclude) => nodeAtPoint(fromPlane(map(), p), exclude)) as NodeAtPointDep);\n }\n const snap = declared.includes('snap') ? bag.snap as SnapDep | undefined : undefined;\n if (snap) {\n override('snap', { point: (p: Point) => toPlane(map(), snap.point(fromPlane(map(), p))) } as SnapDep);\n }\n\n // The drag's origin, fixed in the plane at the moment it was pressed,\n // whatever the camera does after.\n const start0 = pressedAt ? toPlane(map(), pressedAt) : null;\n const trail = trailCarrier();\n\n return {\n map,\n deps,\n carry(c) {\n const m = map();\n const out: InvocationCtx = { ...c, world: toPlane(m, c.world) };\n if (c.drag) {\n const start = start0 ?? toPlane(m, c.drag.start);\n const current = toPlane(m, c.drag.current);\n const aff = c.drag.affordance;\n out.drag = {\n ...c.drag,\n start,\n current,\n delta: { x: current.x - start.x, y: current.y - start.y },\n ...(c.drag.points ? { points: trail(c.drag.points, m) } : {}),\n ...(aff?.fixedPoint ? { affordance: { ...aff, fixedPoint: toPlane(m, aff.fixedPoint) } } : {}),\n };\n }\n // The dispatcher hands `onMove` no deps; only `start` has any to carry.\n if (c.deps) out.deps = deps;\n return out;\n },\n };\n}\n\n/** The drag trail in the plane. The dispatcher grows its trail in place, so\n * only the samples added since the last call are mapped — unless the map\n * moved, when every sample is. */\nfunction trailCarrier(): (points: DragSample[], m: PlaneMap) => DragSample[] {\n let src: DragSample[] | null = null;\n let lastMap: PlaneMap | null = null;\n let out: DragSample[] = [];\n return (points, m) => {\n const same = lastMap !== null\n && lastMap.scale.x === m.scale.x && lastMap.scale.y === m.scale.y\n && lastMap.offset.x === m.offset.x && lastMap.offset.y === m.offset.y;\n if (points !== src || !same || points.length < out.length) {\n src = points;\n out = [];\n }\n lastMap = m;\n for (let i = out.length; i < points.length; i++) {\n out.push({ ...points[i], ...toPlane(m, points[i]) });\n }\n // A copy, so a snapshot taken on `onEnd` is not the live accumulator.\n return out.slice();\n };\n}\n\nfunction planeHandle(handle: OngoingHandle, plane: LivePlane): OngoingHandle {\n const out: OngoingHandle = { ...handle };\n if (handle.onMove) out.onMove = (c) => handle.onMove!(plane.carry(c));\n if (handle.onEnd) out.onEnd = (c, reason) => handle.onEnd!(plane.carry(c), reason);\n if (handle.overlay) {\n out.overlay = () => {\n const ov = handle.overlay!();\n return ov ? overlayFromPlane(ov, plane.map()) : ov;\n };\n }\n return out;\n}\n\n/** An overlay drawn in the plane, in the camera's world: what every painter\n * reads an overlay as. */\nfunction overlayFromPlane(ov: OngoingOverlay, m: PlaneMap): OngoingOverlay {\n const pt = (p: Point) => fromPlane(m, p);\n switch (ov.kind) {\n case 'marquee':\n return { ...ov, start: pt(ov.start), current: pt(ov.current) };\n case 'lasso':\n return { ...ov, vertices: ov.vertices.map(pt), current: pt(ov.current) };\n case 'polyline':\n return { ...ov, points: ov.points.map(pt) };\n case 'insertPreview':\n return {\n ...ov,\n bounds: rectFromPlane(m, ov.bounds),\n extras: insertExtrasFromPlane(ov.extras, m),\n ...(ov.anchorPoint ? { anchorPoint: pt(ov.anchorPoint) } : {}),\n };\n }\n}\n\n/** The geometry the kit's insert kinds carry in `extras`, in the camera's\n * world. A consumer kind's extras are opaque, and pass through. */\nfunction insertExtrasFromPlane(extras: unknown, m: PlaneMap): unknown {\n if (extras === null || typeof extras !== 'object') return extras;\n const e = extras as Record<string, unknown>;\n const pt = (p: unknown) => fromPlane(m, p as Point);\n // Radial kinds inscribe in a square, so one scale carries a radius.\n const r = (v: unknown) => (typeof v === 'number' ? v / ((m.scale.x + m.scale.y) / 2) : v);\n const out: Record<string, unknown> = { ...e };\n if (e['a'] && e['b']) { out['a'] = pt(e['a']); out['b'] = pt(e['b']); }\n if (e['center']) out['center'] = pt(e['center']);\n if ('radius' in e) out['radius'] = r(e['radius']);\n if ('outerRadius' in e) out['outerRadius'] = r(e['outerRadius']);\n if (Array.isArray(e['samples'])) {\n out['samples'] = (e['samples'] as DragSample[]).map((s) => ({ ...s, ...pt(s) }));\n }\n return out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ //#region src/interactions/actions/pointerState.ts
2
+ function e(e, t) {
3
+ let n = {
4
+ worldX: e.x,
5
+ worldY: e.y
6
+ };
7
+ return t.screen && (n.clientX = t.screen.x, n.clientY = t.screen.y), n;
8
+ }
9
+ //#endregion
10
+ export { e as pointerStateOf };
11
+
12
+ //# sourceMappingURL=pointerState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pointerState.js","names":["pointerStateOf","pointer","world","ctx"],"sources":["../../../src/interactions/actions/pointerState.ts"],"sourcesContent":["import type { InvocationCtx, Point2 } from '@weasel-js/routing';\nimport type { PointerState } from '../gestures/types';\n\n/** The pointer a behavior is told: `world`, and the client point `ctx` carries, if any. */\nexport function pointerStateOf(world: Point2, ctx: Pick<InvocationCtx, 'screen'>): PointerState {\n const pointer: PointerState = { worldX: world.x, worldY: world.y };\n if (ctx.screen) {\n pointer.clientX = ctx.screen.x;\n pointer.clientY = ctx.screen.y;\n }\n return pointer;\n}\n"],"mappings":";AAIA,SAAgBA,EAAe,GAAe,GAAkD;CAC9F,IAAMC,IAAwB;EAAE,QAAQC,EAAM;EAAG,QAAQA,EAAM;CAAE;CAKjE,OAJIC,EAAI,WACN,EAAQ,UAAUA,EAAI,OAAO,GAC7B,EAAQ,UAAUA,EAAI,OAAO,IAExBF;AACT"}
@@ -1,5 +1,5 @@
1
1
  import { poseDescriptorForNode as e } from "../../core/geometry/poseDescriptor.js";
2
- import { AUTO_POSE_DESCRIPTOR as t } from "./resize/autoPoseDescriptor.js";
2
+ import { AUTO_POSE_DESCRIPTOR as t } from "../../core/geometry/autoPoseDescriptor.js";
3
3
  //#region src/interactions/actions/poseDescriptorDep.ts
4
4
  function n(e) {
5
5
  return e ?? t;
@@ -1 +1 @@
1
- {"version":3,"file":"poseDescriptorDep.js","names":["poseDescriptorOf","dep","AUTO_POSE_DESCRIPTOR","nodeDescriptors","resolved","d","id","node","scene","descriptor","poseDescriptorForNode"],"sources":["../../../src/interactions/actions/poseDescriptorDep.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode, type PoseDescriptor } from './resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from './resize/autoPoseDescriptor';\n\n/** The `poseDescriptor` dep's value, or the auto descriptor when unsourced. */\nexport function poseDescriptorOf(dep: unknown): PoseDescriptor<unknown> {\n return (dep as PoseDescriptor<unknown> | undefined) ?? AUTO_POSE_DESCRIPTOR;\n}\n\n/**\n * A reader of each node's own descriptor (`PoseDescriptor.forNode`), resolved\n * once per id. An action builds one where it captures its start poses and\n * reads and writes every pose through it, so a node measured as its own shape\n * is written as that shape too. An id that is not a scene node, such as a\n * multi-selection's stand-in target, reads through `descriptor` itself.\n */\nexport function nodeDescriptors(\n scene: Scene<unknown, string, unknown>,\n descriptor: PoseDescriptor<unknown>,\n): (id: NodeId | string) => PoseDescriptor<unknown> {\n const resolved = new Map<string, PoseDescriptor<unknown>>();\n return (id) => {\n let d = resolved.get(id);\n if (d === undefined) {\n const node = scene.get(id as NodeId);\n d = node === undefined ? descriptor : poseDescriptorForNode(descriptor, node);\n resolved.set(id, d);\n }\n return d;\n };\n}\n"],"mappings":";;;AAKA,SAAgBA,EAAiB,GAAuC;CACtE,OAAQC,KAA+CC;AACzD;AASA,SAAgBC,EACd,GACA,GACkD;CAClD,IAAMC,oBAAW,IAAI,IAAqC;CAC1D,QAAQ,MAAO;EACb,IAAIC,IAAID,EAAS,IAAIE,CAAE;EACvB,IAAID,MAAM,KAAA,GAAW;GACnB,IAAME,IAAOC,EAAM,IAAIF,CAAY;GAEnC,AADA,IAAIC,MAAS,KAAA,IAAYE,IAAaC,EAAsBD,GAAYF,CAAI,GAC5EH,EAAS,IAAIE,GAAID,CAAC;EACpB;EACA,OAAOA;CACT;AACF"}
1
+ {"version":3,"file":"poseDescriptorDep.js","names":["poseDescriptorOf","dep","AUTO_POSE_DESCRIPTOR","nodeDescriptors","resolved","d","id","node","scene","descriptor","poseDescriptorForNode"],"sources":["../../../src/interactions/actions/poseDescriptorDep.ts"],"sourcesContent":["import type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode, type PoseDescriptor } from './resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\n\n/** The `poseDescriptor` dep's value, or the auto descriptor when unsourced. */\nexport function poseDescriptorOf(dep: unknown): PoseDescriptor<unknown> {\n return (dep as PoseDescriptor<unknown> | undefined) ?? AUTO_POSE_DESCRIPTOR;\n}\n\n/**\n * A reader of each node's own descriptor (`PoseDescriptor.forNode`), resolved\n * once per id. An action builds one where it captures its start poses and\n * reads and writes every pose through it, so a node measured as its own shape\n * is written as that shape too. An id that is not a scene node, such as a\n * multi-selection's stand-in target, reads through `descriptor` itself.\n */\nexport function nodeDescriptors(\n scene: Scene<unknown, string, unknown>,\n descriptor: PoseDescriptor<unknown>,\n): (id: NodeId | string) => PoseDescriptor<unknown> {\n const resolved = new Map<string, PoseDescriptor<unknown>>();\n return (id) => {\n let d = resolved.get(id);\n if (d === undefined) {\n const node = scene.get(id as NodeId);\n d = node === undefined ? descriptor : poseDescriptorForNode(descriptor, node);\n resolved.set(id, d);\n }\n return d;\n };\n}\n"],"mappings":";;;AAKA,SAAgBA,EAAiB,GAAuC;CACtE,OAAQC,KAA+CC;AACzD;AASA,SAAgBC,EACd,GACA,GACkD;CAClD,IAAMC,oBAAW,IAAI,IAAqC;CAC1D,QAAQ,MAAO;EACb,IAAIC,IAAID,EAAS,IAAIE,CAAE;EACvB,IAAID,MAAM,KAAA,GAAW;GACnB,IAAME,IAAOC,EAAM,IAAIF,CAAY;GAEnC,AADA,IAAIC,MAAS,KAAA,IAAYE,IAAaC,EAAsBD,GAAYF,CAAI,GAC5EH,EAAS,IAAIE,GAAID,CAAC;EACpB;EACA,OAAOA;CACT;AACF"}
@@ -1,43 +1,43 @@
1
- import { IDENTITY_POSE_COMPOSITION as e, composeWorldPose as t, frameAtOrAbove as n, rebaseLocalPose as r } from "../../core/scene/composeFrame.js";
2
- import { definesFrame as i, effectivePose as a } from "../../core/scene/effectivePose.js";
3
- import { asNodeId as o } from "../../core/scene/types.js";
1
+ import { composeWorldPose as e, frameAtOrAbove as t, rebaseLocalPose as n } from "../../core/scene/composeFrame.js";
2
+ import { definesFrame as r, effectivePose as i } from "../../core/scene/effectivePose.js";
3
+ import { asNodeId as a } from "../../core/scene/types.js";
4
4
  //#region src/interactions/actions/poseFrame.ts
5
- function s(e, i) {
5
+ function o(r, i) {
6
6
  return {
7
7
  pc: i,
8
- world: (n) => t(e, n, i.compose),
9
- frame: (t) => {
10
- let r = n(e, e.getParent(t));
11
- return r === null ? null : o(r);
8
+ world: (t) => e(r, t, i.compose),
9
+ frame: (e) => {
10
+ let n = t(r, r.getParent(e));
11
+ return n === null ? null : a(n);
12
12
  },
13
- parentWorld: (r) => {
14
- let a = n(e, e.getParent(r));
15
- return a === null ? null : t(e, a, i.compose);
13
+ parentWorld: (n) => {
14
+ let a = t(r, r.getParent(n));
15
+ return a === null ? null : e(r, a, i.compose);
16
16
  },
17
- local: (t, n) => r(e, n, e.getParent(t), i.compose, i.decompose),
18
- localUnder: (t, n) => r(e, n, t, i.compose, i.decompose)
17
+ local: (e, t) => n(r, t, r.getParent(e), i.compose, i.decompose),
18
+ localUnder: (e, t) => n(r, t, e, i.compose, i.decompose)
19
19
  };
20
20
  }
21
- function c(t, n) {
22
- let r = n ?? e, o = t;
23
- return s({
24
- getPose: (e) => {
25
- let n = t.get(e);
26
- return n === void 0 ? {
21
+ function s(e) {
22
+ let t = e.composition, n = e;
23
+ return o({
24
+ getPose: (t) => {
25
+ let r = e.get(t);
26
+ return r === void 0 ? {
27
27
  x: 0,
28
28
  y: 0,
29
29
  width: 0,
30
30
  height: 0
31
- } : a(o, n);
31
+ } : i(n, r);
32
32
  },
33
- getParent: (e) => t.get(e)?.parent ?? null,
34
- definesFrame: (e) => {
35
- let n = t.get(e);
36
- return n === void 0 || i(n);
33
+ getParent: (t) => e.get(t)?.parent ?? null,
34
+ definesFrame: (t) => {
35
+ let n = e.get(t);
36
+ return n === void 0 || r(n);
37
37
  }
38
- }, r);
38
+ }, t);
39
39
  }
40
40
  //#endregion
41
- export { s as poseFrame, c as scenePoseFrame };
41
+ export { o as poseFrame, s as scenePoseFrame };
42
42
 
43
43
  //# sourceMappingURL=poseFrame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"poseFrame.js","names":["poseFrame","composeWorldPose","adapter","id","pc","frame","frameAtOrAbove","asNodeId","rebaseLocalPose","worldPose","parentId","scenePoseFrame","poseComposition","IDENTITY_POSE_COMPOSITION","source","scene","node","effectivePose","definesFrame"],"sources":["../../../src/interactions/actions/poseFrame.ts"],"sourcesContent":["/**\n * World reads and local writes, paired, for the default actions.\n *\n * A container's pose defines a frame, so a node's stored pose is expressed in\n * its parent's. The geometry an action reasons about — a rotate pivot, an\n * alignment edge, a distribute span, a flip axis — is world; every pose it\n * writes back through `setPose` or a pose op is local. An action that reads\n * world and writes world looks right for one gesture and drifts on the next,\n * because the stored pose is then read in the parent's frame again.\n *\n * Under `IDENTITY_POSE_COMPOSITION` — the default, and what every consumer\n * ships today — local and world are the same value and all of this is an\n * identity. `features/groups/frameFixture.ts` is the scene where they differ.\n */\nimport { definesFrame, effectivePose, type PoseSource } from 'core/scene/effectivePose';\nimport { asNodeId, type NodeId, type Scene } from 'core/scene/types';\nimport {\n composeWorldPose,\n frameAtOrAbove,\n rebaseLocalPose,\n IDENTITY_POSE_COMPOSITION,\n type PoseAdapter,\n type PoseComposition,\n} from 'features/groups/composePose';\n\n/** The two directions an action needs, over one composition strategy. */\nexport interface PoseFrame<TPose> {\n /** The strategy in force. `closure` says what it can express exactly. */\n readonly pc: PoseComposition<TPose>;\n /** `id`'s pose in world coordinates, honoring an in-flight gesture override. */\n world(id: NodeId): TPose;\n /** The node whose frame `id` is stored in, or `null` for the root frame. */\n frame(id: NodeId): NodeId | null;\n /** World pose of the frame `id` is stored in, or `null` for the root frame. */\n parentWorld(id: NodeId): TPose | null;\n /** `worldPose` expressed in `id`'s own parent frame — what `setPose` stores. */\n local(id: NodeId, worldPose: TPose): TPose;\n /** `worldPose` expressed under `parentId`'s frame. For a node about to be\n * reparented, whose current parent is not the frame it will be stored in. */\n localUnder(parentId: NodeId | null, worldPose: TPose): TPose;\n}\n\n/** Pair the two directions over an arbitrary pose adapter. */\nexport function poseFrame<TPose>(\n adapter: PoseAdapter<TPose>,\n pc: PoseComposition<TPose>,\n): PoseFrame<TPose> {\n return {\n pc,\n world: (id) => composeWorldPose(adapter, id as string, pc.compose),\n frame: (id) => {\n const frame = frameAtOrAbove(adapter, adapter.getParent(id as string));\n return frame === null ? null : asNodeId(frame);\n },\n parentWorld: (id) => {\n const frame = frameAtOrAbove(adapter, adapter.getParent(id as string));\n return frame === null ? null : composeWorldPose(adapter, frame, pc.compose);\n },\n local: (id, worldPose) =>\n rebaseLocalPose(adapter, worldPose, adapter.getParent(id as string), pc.compose, pc.decompose),\n localUnder: (parentId, worldPose) =>\n rebaseLocalPose(adapter, worldPose, parentId as string | null, pc.compose, pc.decompose),\n };\n}\n\n/** The `poseFrame` a scene-backed action works in. `poseComposition` is the\n * dep as it arrives — absent means IDENTITY, where every method is a no-op. */\nexport function scenePoseFrame(\n scene: Scene<unknown, string, unknown>,\n poseComposition: unknown,\n): PoseFrame<unknown> {\n const pc =\n (poseComposition as PoseComposition<unknown> | undefined) ?? IDENTITY_POSE_COMPOSITION;\n const source = scene as unknown as PoseSource<unknown>;\n const adapter: PoseAdapter<unknown> = {\n getPose: (id) => {\n const node = scene.get(id as NodeId);\n return node === undefined ? { x: 0, y: 0, width: 0, height: 0 } : effectivePose(source, node);\n },\n getParent: (id) => scene.get(id as NodeId)?.parent ?? null,\n definesFrame: (id) => {\n const node = scene.get(id as NodeId);\n return node === undefined || definesFrame(node);\n },\n };\n return poseFrame(adapter, pc);\n}\n"],"mappings":";;;;AA2CA,SAAgBA,EACd,GACA,GACkB;CAClB,OAAO;EACL;EACA,QAAQ,MAAOC,EAAiBC,GAASC,GAAcC,EAAG,OAAO;EACjE,QAAQ,MAAO;GACb,IAAMC,IAAQC,EAAeJ,GAASA,EAAQ,UAAUC,CAAY,CAAC;GACrE,OAAOE,MAAU,OAAO,OAAOE,EAASF,CAAK;EAC/C;EACA,cAAc,MAAO;GACnB,IAAMA,IAAQC,EAAeJ,GAASA,EAAQ,UAAUC,CAAY,CAAC;GACrE,OAAOE,MAAU,OAAO,OAAOJ,EAAiBC,GAASG,GAAOD,EAAG,OAAO;EAC5E;EACA,QAAQ,GAAI,MACVI,EAAgBN,GAASO,GAAWP,EAAQ,UAAUC,CAAY,GAAGC,EAAG,SAASA,EAAG,SAAS;EAC/F,aAAa,GAAU,MACrBI,EAAgBN,GAASO,GAAWC,GAA2BN,EAAG,SAASA,EAAG,SAAS;CAC3F;AACF;AAIA,SAAgBO,EACd,GACA,GACoB;CACpB,IAAMP,IACHQ,KAA4DC,GACzDC,IAASC;CAYf,OAAOf,EAAU;EAVf,UAAU,MAAO;GACf,IAAMgB,IAAOD,EAAM,IAAIZ,CAAY;GACnC,OAAOa,MAAS,KAAA,IAAY;IAAE,GAAG;IAAG,GAAG;IAAG,OAAO;IAAG,QAAQ;GAAE,IAAIC,EAAcH,GAAQE,CAAI;EAC9F;EACA,YAAY,MAAOD,EAAM,IAAIZ,CAAY,CAAC,EAAE,UAAU;EACtD,eAAe,MAAO;GACpB,IAAMa,IAAOD,EAAM,IAAIZ,CAAY;GACnC,OAAOa,MAAS,KAAA,KAAaE,EAAaF,CAAI;EAChD;CAEe,GAASZ,CAAE;AAC9B"}
1
+ {"version":3,"file":"poseFrame.js","names":["poseFrame","composeWorldPose","adapter","id","pc","frame","frameAtOrAbove","asNodeId","rebaseLocalPose","worldPose","parentId","scenePoseFrame","scene","source","node","effectivePose","definesFrame"],"sources":["../../../src/interactions/actions/poseFrame.ts"],"sourcesContent":["/**\n * World reads and local writes, paired, for the default actions.\n *\n * A container's pose defines a frame, so a node's stored pose is expressed in\n * its parent's. The geometry an action reasons about is world; every pose it\n * writes back through `setPose` or a pose op is local. An action that reads\n * world and writes world looks right for one gesture and drifts on the next,\n * because the stored pose is then read in the parent's frame again.\n *\n * Under `IDENTITY_POSE_COMPOSITION`, the default, local and world are the same\n * value. `core/scene/frameFixture.ts` is the scene where they differ.\n */\nimport { definesFrame, effectivePose, type PoseSource } from 'core/scene/effectivePose';\nimport { asNodeId, type NodeId, type Scene } from 'core/scene/types';\nimport {\n composeWorldPose,\n frameAtOrAbove,\n rebaseLocalPose,\n type PoseAdapter,\n type PoseComposition,\n} from 'core/scene/composePose';\n\n/** The two directions an action needs, over one composition strategy. */\nexport interface PoseFrame<TPose> {\n /** The strategy in force. `closure` says what it can express exactly. */\n readonly pc: PoseComposition<TPose>;\n /** `id`'s pose in world coordinates, honoring an in-flight gesture override. */\n world(id: NodeId): TPose;\n /** The node whose frame `id` is stored in, or `null` for the root frame. */\n frame(id: NodeId): NodeId | null;\n /** World pose of the frame `id` is stored in, or `null` for the root frame. */\n parentWorld(id: NodeId): TPose | null;\n /** `worldPose` expressed in `id`'s own parent frame — what `setPose` stores. */\n local(id: NodeId, worldPose: TPose): TPose;\n /** `worldPose` expressed under `parentId`'s frame. For a node about to be\n * reparented, whose current parent is not the frame it will be stored in. */\n localUnder(parentId: NodeId | null, worldPose: TPose): TPose;\n}\n\n/** Pair the two directions over an arbitrary pose adapter. */\nexport function poseFrame<TPose>(\n adapter: PoseAdapter<TPose>,\n pc: PoseComposition<TPose>,\n): PoseFrame<TPose> {\n return {\n pc,\n world: (id) => composeWorldPose(adapter, id as string, pc.compose),\n frame: (id) => {\n const frame = frameAtOrAbove(adapter, adapter.getParent(id as string));\n return frame === null ? null : asNodeId(frame);\n },\n parentWorld: (id) => {\n const frame = frameAtOrAbove(adapter, adapter.getParent(id as string));\n return frame === null ? null : composeWorldPose(adapter, frame, pc.compose);\n },\n local: (id, worldPose) =>\n rebaseLocalPose(adapter, worldPose, adapter.getParent(id as string), pc.compose, pc.decompose),\n localUnder: (parentId, worldPose) =>\n rebaseLocalPose(adapter, worldPose, parentId as string | null, pc.compose, pc.decompose),\n };\n}\n\n/** The `poseFrame` a scene-backed action works in, over the scene's own\n * composition. Under IDENTITY every method is a no-op. */\nexport function scenePoseFrame(scene: Scene<unknown, string, unknown>): PoseFrame<unknown> {\n const pc = scene.composition;\n const source = scene as unknown as PoseSource<unknown>;\n const adapter: PoseAdapter<unknown> = {\n getPose: (id) => {\n const node = scene.get(id as NodeId);\n return node === undefined ? { x: 0, y: 0, width: 0, height: 0 } : effectivePose(source, node);\n },\n getParent: (id) => scene.get(id as NodeId)?.parent ?? null,\n definesFrame: (id) => {\n const node = scene.get(id as NodeId);\n return node === undefined || definesFrame(node);\n },\n };\n return poseFrame(adapter, pc);\n}\n"],"mappings":";;;;AAwCA,SAAgBA,EACd,GACA,GACkB;CAClB,OAAO;EACL;EACA,QAAQ,MAAOC,EAAiBC,GAASC,GAAcC,EAAG,OAAO;EACjE,QAAQ,MAAO;GACb,IAAMC,IAAQC,EAAeJ,GAASA,EAAQ,UAAUC,CAAY,CAAC;GACrE,OAAOE,MAAU,OAAO,OAAOE,EAASF,CAAK;EAC/C;EACA,cAAc,MAAO;GACnB,IAAMA,IAAQC,EAAeJ,GAASA,EAAQ,UAAUC,CAAY,CAAC;GACrE,OAAOE,MAAU,OAAO,OAAOJ,EAAiBC,GAASG,GAAOD,EAAG,OAAO;EAC5E;EACA,QAAQ,GAAI,MACVI,EAAgBN,GAASO,GAAWP,EAAQ,UAAUC,CAAY,GAAGC,EAAG,SAASA,EAAG,SAAS;EAC/F,aAAa,GAAU,MACrBI,EAAgBN,GAASO,GAAWC,GAA2BN,EAAG,SAASA,EAAG,SAAS;CAC3F;AACF;AAIA,SAAgBO,EAAe,GAA4D;CACzF,IAAMP,IAAKQ,EAAM,aACXC,IAASD;CAYf,OAAOZ,EAAU;EAVf,UAAU,MAAO;GACf,IAAMc,IAAOF,EAAM,IAAIT,CAAY;GACnC,OAAOW,MAAS,KAAA,IAAY;IAAE,GAAG;IAAG,GAAG;IAAG,OAAO;IAAG,QAAQ;GAAE,IAAIC,EAAcF,GAAQC,CAAI;EAC9F;EACA,YAAY,MAAOF,EAAM,IAAIT,CAAY,CAAC,EAAE,UAAU;EACtD,eAAe,MAAO;GACpB,IAAMW,IAAOF,EAAM,IAAIT,CAAY;GACnC,OAAOW,MAAS,KAAA,KAAaE,EAAaF,CAAI;EAChD;CAEe,GAASV,CAAE;AAC9B"}