@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
@@ -1 +1 @@
1
- {"version":3,"file":"rotationHandle.js","names":["isAnnulusForm","paint","DEFAULT_PAINT","createRotationAffordance","opts","annulusPaint","target","pickTarget","state","b","halfW","halfH","regionCursor","cursor","angleOf","transformOf","bind","region","bandPx","handle","id","MULTI_RESIZE_TARGET_ID"],"sources":["../../src/affordances/rotationHandle.ts"],"sourcesContent":["import type { Affordance, AffordanceBinding, AffordanceRegion, CommonAffordanceScratch } from './types';\nimport type { ChromeState, Bounds } from 'core/selection/chromeState';\nimport type { CommandFill, CommandStroke } from '@weasel-js/paint';\nimport { MULTI_RESIZE_TARGET_ID } from 'core/selection/selectionTarget';\nimport { angleOf, transformOf } from './hitAffordanceRegions';\nimport type { CursorSpec } from '@weasel-js/cursor';\n\n/** Options for `createRotationAffordance` — how thick the rotate band is\n * outside the selection, and how (or whether) it is painted. */\nexport interface RotationAffordanceOptions {\n /** Minimum screen-space thickness of the rotate-zone band outside the\n * selection AABB. The outer ellipse semi-axes are clamped to\n * `max(w/√2, w/2 + bandPx/scale)` so the zone stays hoverable at any\n * zoom and any selection size. Default 24. */\n bandPx?: number;\n /** Paint for the ring. `null` / `false` = invisible. Default is a\n * semi-transparent fill of the band, contracted by `insetPx` screen\n * pixels on the outer edge so the visible band sits inside the\n * hoverable zone with a clear margin. Pass a `Stroke` (or\n * `{ fill, stroke, insetPx }`) to override. */\n paint?:\n | CommandStroke\n | { fill?: CommandFill; stroke?: CommandStroke; insetPx?: number }\n | null\n | false;\n /** Cursor while hovering the ring. Defaults to the `rotate` glyph turned\n * with the target, falling back to `'grab'` if the browser rejects the\n * image. */\n cursor?: CursorSpec;\n /** A grab region for a rotate badge painted off the top edge — the one\n * the selection overlay's `rotationHandle` draws. `distancePx` is how far\n * off the edge it sits and `hitRadiusPx` the half-extent of its square,\n * both in screen pixels. Placed by the same `standoff` the painted badge\n * is, so the two cannot drift apart. Omitted, only the ring rotates. */\n handle?: { distancePx: number; hitRadiusPx: number };\n}\n\n/** What a rotation-handle hit hands to the rotate action: what is being\n * rotated, and the world-space pivot it turns around. */\nexport interface RotationScratch extends CommonAffordanceScratch {\n /** Id of the rotation target — single selection id, or\n * `MULTI_RESIZE_TARGET_ID` for multi-selection. */\n targetId: string;\n /** Rotation pivot in world coords — the AABB (or union AABB) center. */\n fixedPoint: { x: number; y: number };\n}\n\ntype AnnulusPaintForm = { fill?: CommandFill; stroke?: CommandStroke; insetPx?: number };\n\nconst isAnnulusForm = (paint: CommandStroke | AnnulusPaintForm): paint is AnnulusPaintForm =>\n 'fill' in paint || 'stroke' in paint || 'insetPx' in paint;\n\nconst DEFAULT_PAINT: AnnulusPaintForm = {\n fill: { fill: 'solid', color: 'rgba(26, 19, 13, 0.12)' },\n insetPx: 10,\n};\n\n/**\n * @experimental\n * Rotation affordance for the active selection. Replaces the legacy\n * \"small dot above the AABB\" handle with an elliptical ring that wraps\n * the selection: the smallest ellipse containing the AABB, minus the AABB\n * itself. Hovering the ring sets the cursor (default the `rotate` glyph)\n * and drag-from-ring triggers `rotateAction` via the same\n * binding path the old point-handle used (id stays\n * `'selection.rotation-handle'`).\n *\n * The ring is target-local — under target rotation the ellipse rotates\n * with the AABB so the hoverable band always wraps the rendered shape.\n *\n * Visibility: gated by chrome-caps' `'selection.rotation-handle'` rule.\n * The ring paints as a faint band by default; `paint: null` leaves the\n * cursor change as the only cue.\n */\nexport function createRotationAffordance(\n opts: RotationAffordanceOptions = {},\n): Affordance {\n const { bandPx = 24, paint = DEFAULT_PAINT, cursor, handle } = opts;\n\n // Normalize `paint` into the AnnulusPaint shape understood by\n // `composeAffordanceLayer`. Three input forms are accepted: a bare\n // `Stroke` (legacy outline form), the `{ fill, stroke, insetPx }`\n // object form, or `null`/`false` for invisible. The object form is what\n // carries these three keys; `Stroke` carries none of them, and cannot be\n // told apart by its own `paint` since that is optional.\n const annulusPaint:\n | { kind: 'annulus'; fill?: CommandFill; stroke?: CommandStroke; insetPx?: number }\n | null = (() => {\n if (!paint) return null;\n if (!isAnnulusForm(paint)) {\n return { kind: 'annulus' as const, stroke: paint };\n }\n return {\n kind: 'annulus' as const,\n ...(paint.fill ? { fill: paint.fill } : {}),\n ...(paint.stroke ? { stroke: paint.stroke } : {}),\n ...(paint.insetPx !== undefined ? { insetPx: paint.insetPx } : {}),\n };\n })();\n\n return {\n id: 'selection.rotation-handle',\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const target = pickTarget(state);\n if (!target) return [];\n const b = target.bounds;\n\n // The natural ring: the smallest ellipse containing the AABB. For a\n // small or thin selection that band is too tight to hover, so\n // `minBandPx` asks the framework to widen it to at least `bandPx`\n // screen pixels outside the rect. The floor is declared in screen units\n // rather than applied here because `ChromeState` carries no view scale\n // — the framework applies it at paint and hit time, where the view is\n // known, so the ring holds its apparent thickness at any zoom.\n const halfW = b.width / 2;\n const halfH = b.height / 2;\n\n // Turned with the target, so the arc follows the selection it rotates.\n // Resolved per region rather than defaulted in the option list because\n // the angle is only known once a target is picked.\n const regionCursor: CursorSpec = cursor ?? {\n glyph: 'rotate',\n angle: angleOf(transformOf(state, target.id)),\n fallback: 'grab',\n };\n const bind = (): AffordanceBinding => ({\n initialScratch: {\n targetId: target.id,\n // Pivot. `rotateAction` recomputes its own union pivot for\n // multi-selection, but the single-target case reads this.\n fixedPoint: { x: b.x + halfW, y: b.y + halfH },\n } satisfies RotationScratch,\n });\n\n const region: AffordanceRegion = {\n id: 'selection.rotation-handle',\n targetId: target.id,\n shape: {\n kind: 'annulus',\n cx: b.x + halfW,\n cy: b.y + halfH,\n rx: halfW * Math.SQRT2,\n ry: halfH * Math.SQRT2,\n innerX: b.x,\n innerY: b.y,\n innerWidth: b.width,\n innerHeight: b.height,\n minBandPx: bandPx,\n },\n ...(annulusPaint ? { paint: annulusPaint } : {}),\n hitKind: 'rotate-handle',\n cursor: regionCursor,\n bind,\n };\n if (!handle) return [region];\n const badge: AffordanceRegion = {\n id: 'rotation-badge',\n targetId: target.id,\n shape: {\n kind: 'point',\n x: b.x + halfW,\n y: b.y,\n hitRadiusPx: handle.hitRadiusPx,\n standoff: { px: handle.distancePx, normal: { x: 0, y: -1 } },\n },\n hitKind: 'rotate-handle',\n cursor: regionCursor,\n bind,\n };\n return [region, badge];\n },\n };\n}\n\nfunction pickTarget(state: ChromeState): { id: string; bounds: Bounds } | null {\n if (state.selection.length === 1) {\n const id = state.selection[0];\n // Skip when the selected node's pose-descriptor declares it can't\n // carry a rotation. Without this the rotation affordance would expose\n // a rotate cursor over (e.g.) polygon-Path selections whose\n // `rotateAction` write is silently dropped at paint time.\n if (state.canRotate && !state.canRotate(id)) return null;\n const b = state.boundsOf(id);\n return b ? { id, bounds: b } : null;\n }\n // Multi-selection: anchor the ring to the union AABB. `rotateAction`\n // ignores the synthetic id and pivots at its own union center\n // (`useUnionPivot: ids.length > 1` branch in `defaults/rotate.ts`).\n // Require every selected id to support rotation — a partial multi-rotate\n // (some ids rotate, others silently no-op) would feel broken.\n if (state.multiActive && state.unionBounds) {\n if (state.canRotate) {\n for (const id of state.selection) {\n if (!state.canRotate(id)) return null;\n }\n }\n return { id: MULTI_RESIZE_TARGET_ID, bounds: state.unionBounds };\n }\n return null;\n}\n"],"mappings":";;;AAiDA,IAAMA,KAAiB,MACrB,UAAUC,KAAS,YAAYA,KAAS,aAAaA,GAEjDC,IAAkC;CACtC,MAAM;EAAE,MAAM;EAAS,OAAO;CAAyB;CACvD,SAAS;AACX;AAmBA,SAAgBC,EACd,IAAkC,CAAC,GACvB;CACZ,IAAM,EAAE,YAAS,IAAI,WAAQD,GAAe,WAAQ,cAAWE,GAQzDC,IAGGJ,IACAD,EAAcC,CAAK,IAGjB;EACL,MAAM;EACN,GAAIA,EAAM,OAAO,EAAE,MAAMA,EAAM,KAAK,IAAI,CAAC;EACzC,GAAIA,EAAM,SAAS,EAAE,QAAQA,EAAM,OAAO,IAAI,CAAC;EAC/C,GAAIA,EAAM,YAAY,KAAA,IAAyC,CAAC,IAA9B,EAAE,SAASA,EAAM,QAAQ;CAC7D,IAPS;EAAE,MAAM;EAAoB,QAAQA;CAAM,IAFhC;CAYvB,OAAO;EACL,IAAI;EACJ,QAAQ,GAAiD;GACvD,IAAMK,IAASC,EAAWC,CAAK;GAC/B,IAAI,CAACF,GAAQ,OAAO,CAAC;GACrB,IAAMG,IAAIH,EAAO,QASXI,IAAQD,EAAE,QAAQ,GAClBE,IAAQF,EAAE,SAAS,GAKnBG,IAA2BC,KAAU;IACzC,OAAO;IACP,OAAOC,EAAQC,EAAYP,GAAOF,EAAO,EAAE,CAAC;IAC5C,UAAU;GACZ,GACMU,WAAiC,EACrC,gBAAgB;IACd,UAAUV,EAAO;IAGjB,YAAY;KAAE,GAAGG,EAAE,IAAIC;KAAO,GAAGD,EAAE,IAAIE;IAAM;GAC/C,EACF,IAEMM,IAA2B;IAC/B,IAAI;IACJ,UAAUX,EAAO;IACjB,OAAO;KACL,MAAM;KACN,IAAIG,EAAE,IAAIC;KACV,IAAID,EAAE,IAAIE;KACV,IAAID,IAAQ,KAAK;KACjB,IAAIC,IAAQ,KAAK;KACjB,QAAQF,EAAE;KACV,QAAQA,EAAE;KACV,YAAYA,EAAE;KACd,aAAaA,EAAE;KACf,WAAWS;IACb;IACA,GAAIb,IAAe,EAAE,OAAOA,EAAa,IAAI,CAAC;IAC9C,SAAS;IACT,QAAQO;IACR;GACF;GAgBA,OAfKO,IAeE,CAACF,GAAQ;IAbd,IAAI;IACJ,UAAUX,EAAO;IACjB,OAAO;KACL,MAAM;KACN,GAAGG,EAAE,IAAIC;KACT,GAAGD,EAAE;KACL,aAAaU,EAAO;KACpB,UAAU;MAAE,IAAIA,EAAO;MAAY,QAAQ;OAAE,GAAG;OAAG,GAAG;MAAG;KAAE;IAC7D;IACA,SAAS;IACT,QAAQP;IACR;GAEc,CAAK,IAfD,CAACK,CAAM;EAgB7B;CACF;AACF;AAEA,SAASV,EAAW,GAA2D;CAC7E,IAAIC,EAAM,UAAU,WAAW,GAAG;EAChC,IAAMY,IAAKZ,EAAM,UAAU;EAK3B,IAAIA,EAAM,aAAa,CAACA,EAAM,UAAUY,CAAE,GAAG,OAAO;EACpD,IAAMX,IAAID,EAAM,SAASY,CAAE;EAC3B,OAAOX,IAAI;GAAE;GAAI,QAAQA;EAAE,IAAI;CACjC;CAMA,IAAID,EAAM,eAAeA,EAAM,aAAa;EAC1C,IAAIA,EAAM,WACH;QAAA,IAAMY,KAAMZ,EAAM,WACrB,IAAI,CAACA,EAAM,UAAUY,CAAE,GAAG,OAAO;EAAA;EAGrC,OAAO;GAAE,IAAIC;GAAwB,QAAQb,EAAM;EAAY;CACjE;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"rotationHandle.js","names":["isAnnulusForm","paint","DEFAULT_PAINT","createRotationAffordance","opts","annulusPaint","target","pickTarget","state","b","halfW","halfH","pivot","localToWorld","transformOf","regionCursor","cursor","rotateCursorAt","at","view","bind","region","bandPx","handle","id","MULTI_RESIZE_TARGET_ID"],"sources":["../../src/affordances/rotationHandle.ts"],"sourcesContent":["import type { Affordance, AffordanceBinding, AffordanceRegion, CommonAffordanceScratch } from './types';\nimport type { ChromeState, Bounds } from 'core/selection/chromeState';\nimport type { CommandStroke, CommandFill } from '@weasel-js/paint';\nimport { MULTI_RESIZE_TARGET_ID } from 'core/selection/selectionTarget';\nimport { localToWorld, transformOf } from './hitAffordanceRegions';\nimport type { CursorSpec } from '@weasel-js/cursor';\nimport { rotateCursorAt } from './rotateCursor';\n\n/** Options for `createRotationAffordance` — how thick the rotate band is\n * outside the selection, and how (or whether) it is painted. */\nexport interface RotationAffordanceOptions {\n /** Minimum screen-space thickness of the rotate-zone band outside the selection AABB, so\n * the zone stays hoverable at any zoom and any selection size. Default 24. */\n bandPx?: number;\n /** Paint for the ring. `null` / `false` = invisible. Default is a semi-transparent fill of\n * the band, contracted by `insetPx` screen pixels on the outer edge. Pass a `Stroke` (or\n * `{ fill, stroke, insetPx }`) to override. */\n paint?:\n | CommandStroke\n | { fill?: CommandFill; stroke?: CommandStroke; insetPx?: number }\n | null\n | false;\n /** Cursor while hovering the ring. Defaults to the `rotate` glyph turned\n * square to the line from the pivot to the pointer, falling back to\n * `'grab'` if the browser rejects the image. */\n cursor?: CursorSpec;\n /** A grab region for a rotate badge painted off the top edge — the one\n * the selection overlay's `rotationHandle` draws. `distancePx` is how far\n * off the edge it sits and `hitRadiusPx` the half-extent of its square,\n * both in screen pixels. Placed by the same `standoff` the painted badge\n * is, so the two cannot drift apart. Omitted, only the ring rotates. */\n handle?: { distancePx: number; hitRadiusPx: number };\n}\n\n/** What a rotation-handle hit hands to the rotate action: what is being\n * rotated, and the world-space pivot it turns around. */\nexport interface RotationScratch extends CommonAffordanceScratch {\n /** Id of the rotation target — single selection id, or\n * `MULTI_RESIZE_TARGET_ID` for multi-selection. */\n targetId: string;\n /** Rotation pivot in world coords — the AABB (or union AABB) center. */\n fixedPoint: { x: number; y: number };\n}\n\ntype AnnulusPaintForm = { fill?: CommandFill; stroke?: CommandStroke; insetPx?: number };\n\nconst isAnnulusForm = (paint: CommandStroke | AnnulusPaintForm): paint is AnnulusPaintForm =>\n 'fill' in paint || 'stroke' in paint || 'insetPx' in paint;\n\nconst DEFAULT_PAINT: AnnulusPaintForm = {\n fill: { paint: { kind: 'solid', color: 'rgba(26, 19, 13, 0.12)' } },\n insetPx: 10,\n};\n\n/**\n * @experimental\n * Rotation affordance for the active selection: an elliptical ring that wraps the selection —\n * the smallest ellipse containing the AABB, minus the AABB itself. Hovering the ring sets the\n * cursor (default the `rotate` glyph) and a drag from it triggers `rotateAction`.\n *\n * The ring is target-local — under target rotation the ellipse rotates with the AABB.\n * Visibility is gated by chrome-caps' `'selection.rotation-handle'` rule. `paint: null` leaves\n * the cursor change as the only cue.\n */\nexport function createRotationAffordance(\n opts: RotationAffordanceOptions = {},\n): Affordance {\n const { bandPx = 24, paint = DEFAULT_PAINT, cursor, handle } = opts;\n\n // A bare `Stroke` carries none of the object form's three keys, and cannot be told apart\n // by its own `paint` since that is optional.\n const annulusPaint:\n | { kind: 'annulus'; fill?: CommandFill; stroke?: CommandStroke; insetPx?: number }\n | null = (() => {\n if (!paint) return null;\n if (!isAnnulusForm(paint)) {\n return { kind: 'annulus' as const, stroke: paint };\n }\n return {\n kind: 'annulus' as const,\n ...(paint.fill ? { fill: paint.fill } : {}),\n ...(paint.stroke ? { stroke: paint.stroke } : {}),\n ...(paint.insetPx !== undefined ? { insetPx: paint.insetPx } : {}),\n };\n })();\n\n return {\n id: 'selection.rotation-handle',\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const target = pickTarget(state);\n if (!target) return [];\n const b = target.bounds;\n\n // The natural ring is the smallest ellipse containing the AABB. `minBandPx` asks the\n // framework to widen it to at least `bandPx` screen pixels outside the rect; the floor is\n // declared in screen units because `ChromeState` carries no view scale.\n const halfW = b.width / 2;\n const halfH = b.height / 2;\n\n const pivot = localToWorld(transformOf(state, target.id), b.x + halfW, b.y + halfH);\n const regionCursor: AffordanceRegion['cursor'] = cursor\n ?? ((at, view) => rotateCursorAt(pivot, at, view.scale));\n const bind = (): AffordanceBinding => ({\n initialScratch: {\n targetId: target.id,\n // Pivot. `rotateAction` recomputes its own union pivot for\n // multi-selection, but the single-target case reads this.\n fixedPoint: { x: b.x + halfW, y: b.y + halfH },\n } satisfies RotationScratch,\n });\n\n const region: AffordanceRegion = {\n id: 'selection.rotation-handle',\n targetId: target.id,\n shape: {\n kind: 'annulus',\n cx: b.x + halfW,\n cy: b.y + halfH,\n rx: halfW * Math.SQRT2,\n ry: halfH * Math.SQRT2,\n innerX: b.x,\n innerY: b.y,\n innerWidth: b.width,\n innerHeight: b.height,\n minBandPx: bandPx,\n },\n ...(annulusPaint ? { paint: annulusPaint } : {}),\n hitKind: 'rotate-handle',\n cursor: regionCursor,\n bind,\n };\n if (!handle) return [region];\n const badge: AffordanceRegion = {\n id: 'rotation-badge',\n targetId: target.id,\n shape: {\n kind: 'point',\n x: b.x + halfW,\n y: b.y,\n hitRadiusPx: handle.hitRadiusPx,\n standoff: { px: handle.distancePx, normal: { x: 0, y: -1 } },\n },\n hitKind: 'rotate-handle',\n cursor: regionCursor,\n bind,\n };\n return [region, badge];\n },\n };\n}\n\nfunction pickTarget(state: ChromeState): { id: string; bounds: Bounds } | null {\n if (state.selection.length === 1) {\n const id = state.selection[0];\n // Skip when the selected node's pose-descriptor declares it can't carry a rotation;\n // otherwise the ring would offer a rotate cursor over a node whose write is dropped.\n if (state.canRotate && !state.canRotate(id)) return null;\n const b = state.boundsOf(id);\n return b ? { id, bounds: b } : null;\n }\n // Multi-selection: anchor the ring to the union AABB; `rotateAction` ignores the synthetic\n // id and pivots at its own union center. Every selected id must support rotation — a\n // partial multi-rotate would feel broken.\n if (state.multiActive && state.unionBounds) {\n if (state.canRotate) {\n for (const id of state.selection) {\n if (!state.canRotate(id)) return null;\n }\n }\n return { id: MULTI_RESIZE_TARGET_ID, bounds: state.unionBounds };\n }\n return null;\n}\n"],"mappings":";;;;;AA8CA,IAAMA,KAAiB,MACrB,UAAUC,KAAS,YAAYA,KAAS,aAAaA,GAEjDC,IAAkC;CACtC,MAAM,EAAE,OAAO;EAAE,MAAM;EAAS,OAAO;CAAyB,EAAE;CAClE,SAAS;AACX;AAYA,SAAgBC,EACd,IAAkC,CAAC,GACvB;CACZ,IAAM,EAAE,YAAS,IAAI,WAAQD,GAAe,WAAQ,cAAWE,GAIzDC,IAGGJ,IACAD,EAAcC,CAAK,IAGjB;EACL,MAAM;EACN,GAAIA,EAAM,OAAO,EAAE,MAAMA,EAAM,KAAK,IAAI,CAAC;EACzC,GAAIA,EAAM,SAAS,EAAE,QAAQA,EAAM,OAAO,IAAI,CAAC;EAC/C,GAAIA,EAAM,YAAY,KAAA,IAAyC,CAAC,IAA9B,EAAE,SAASA,EAAM,QAAQ;CAC7D,IAPS;EAAE,MAAM;EAAoB,QAAQA;CAAM,IAFhC;CAYvB,OAAO;EACL,IAAI;EACJ,QAAQ,GAAiD;GACvD,IAAMK,IAASC,EAAWC,CAAK;GAC/B,IAAI,CAACF,GAAQ,OAAO,CAAC;GACrB,IAAMG,IAAIH,EAAO,QAKXI,IAAQD,EAAE,QAAQ,GAClBE,IAAQF,EAAE,SAAS,GAEnBG,IAAQC,EAAaC,EAAYN,GAAOF,EAAO,EAAE,GAAGG,EAAE,IAAIC,GAAOD,EAAE,IAAIE,CAAK,GAC5EI,IAA2CC,OAC1C,GAAI,MAASC,EAAeL,GAAOM,GAAIC,EAAK,KAAK,IAClDC,WAAiC,EACrC,gBAAgB;IACd,UAAUd,EAAO;IAGjB,YAAY;KAAE,GAAGG,EAAE,IAAIC;KAAO,GAAGD,EAAE,IAAIE;IAAM;GAC/C,EACF,IAEMU,IAA2B;IAC/B,IAAI;IACJ,UAAUf,EAAO;IACjB,OAAO;KACL,MAAM;KACN,IAAIG,EAAE,IAAIC;KACV,IAAID,EAAE,IAAIE;KACV,IAAID,IAAQ,KAAK;KACjB,IAAIC,IAAQ,KAAK;KACjB,QAAQF,EAAE;KACV,QAAQA,EAAE;KACV,YAAYA,EAAE;KACd,aAAaA,EAAE;KACf,WAAWa;IACb;IACA,GAAIjB,IAAe,EAAE,OAAOA,EAAa,IAAI,CAAC;IAC9C,SAAS;IACT,QAAQU;IACR;GACF;GAgBA,OAfKQ,IAeE,CAACF,GAAQ;IAbd,IAAI;IACJ,UAAUf,EAAO;IACjB,OAAO;KACL,MAAM;KACN,GAAGG,EAAE,IAAIC;KACT,GAAGD,EAAE;KACL,aAAac,EAAO;KACpB,UAAU;MAAE,IAAIA,EAAO;MAAY,QAAQ;OAAE,GAAG;OAAG,GAAG;MAAG;KAAE;IAC7D;IACA,SAAS;IACT,QAAQR;IACR;GAEc,CAAK,IAfD,CAACM,CAAM;EAgB7B;CACF;AACF;AAEA,SAASd,EAAW,GAA2D;CAC7E,IAAIC,EAAM,UAAU,WAAW,GAAG;EAChC,IAAMgB,IAAKhB,EAAM,UAAU;EAG3B,IAAIA,EAAM,aAAa,CAACA,EAAM,UAAUgB,CAAE,GAAG,OAAO;EACpD,IAAMf,IAAID,EAAM,SAASgB,CAAE;EAC3B,OAAOf,IAAI;GAAE;GAAI,QAAQA;EAAE,IAAI;CACjC;CAIA,IAAID,EAAM,eAAeA,EAAM,aAAa;EAC1C,IAAIA,EAAM,WACH;QAAA,IAAMgB,KAAMhB,EAAM,WACrB,IAAI,CAACA,EAAM,UAAUgB,CAAE,GAAG,OAAO;EAAA;EAGrC,OAAO;GAAE,IAAIC;GAAwB,QAAQjB,EAAM;EAAY;CACjE;CACA,OAAO;AACT"}
@@ -0,0 +1,21 @@
1
+ //#region src/animation/behaviors/coast.ts
2
+ var e = 0, t = () => `momentum:${e++}`, n = (e, t) => e.x === t.x && e.y === t.y && e.width === t.width && e.height === t.height;
3
+ function r(e, t, n) {
4
+ if (!e) return {
5
+ nx: t,
6
+ ny: n,
7
+ hitX: !1,
8
+ hitY: !1
9
+ };
10
+ let r = Math.min(Math.max(t, e.x), e.x + e.width), i = Math.min(Math.max(n, e.y), e.y + e.height);
11
+ return {
12
+ nx: r,
13
+ ny: i,
14
+ hitX: r !== t,
15
+ hitY: i !== n
16
+ };
17
+ }
18
+ //#endregion
19
+ export { r as clampCorner, t as coastKey, n as sameBounds };
20
+
21
+ //# sourceMappingURL=coast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coast.js","names":["nextCoast","coastKey","sameBounds","a","b","clampCorner","bounds","x","y","nx","ny"],"sources":["../../../src/animation/behaviors/coast.ts"],"sourcesContent":["import type { GestureContext } from 'interactions/gestures/types';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { Animator } from '@weasel-js/animator';\n\n/** One flick still traveling: the nodes it carries, and how a new drag of one stops it. */\nexport interface Coast {\n ids: readonly string[];\n stop(): void;\n}\n\n/** What a coast is started with. */\nexport interface CoastArgs<TPose> {\n animator: Animator;\n ctx: GestureContext<TPose>;\n /** Release velocity in world units a second. */\n vx: number;\n vy: number;\n friction: number;\n bounds: { x: number; y: number; width: number; height: number } | undefined;\n boundary: 'stop' | 'continue';\n d: PoseDescriptor<TPose>;\n /** The behavior's running coasts. A coast adds itself and takes itself out as it ends. */\n coasts: Set<Coast>;\n}\n\nlet nextCoast = 0;\n\n/** A cancel key no other coast holds. */\nexport const coastKey = (): string => `momentum:${nextCoast++}`;\n\n/** Whether two bounds are the same box. */\nexport const sameBounds = (a: Bounds, b: Bounds): boolean =>\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\n/** A top-left corner held inside `bounds`, and which axes that moved. */\nexport function clampCorner(\n bounds: CoastArgs<unknown>['bounds'],\n x: number,\n y: number,\n): { nx: number; ny: number; hitX: boolean; hitY: boolean } {\n if (!bounds) return { nx: x, ny: y, hitX: false, hitY: false };\n const nx = Math.min(Math.max(x, bounds.x), bounds.x + bounds.width);\n const ny = Math.min(Math.max(y, bounds.y), bounds.y + bounds.height);\n return { nx, ny, hitX: nx !== x, hitY: ny !== y };\n}\n"],"mappings":";AA0BA,IAAIA,IAAY,GAGHC,UAAyB,YAAY,OAGrCC,KAAc,GAAW,MACpCC,EAAE,MAAMC,EAAE,KAAKD,EAAE,MAAMC,EAAE,KAAKD,EAAE,UAAUC,EAAE,SAASD,EAAE,WAAWC,EAAE;AAGtE,SAAgBC,EACd,GACA,GACA,GAC0D;CAC1D,IAAI,CAACC,GAAQ,OAAO;EAAE,IAAIC;EAAG,IAAIC;EAAG,MAAM;EAAO,MAAM;CAAM;CAC7D,IAAMC,IAAK,KAAK,IAAI,KAAK,IAAIF,GAAGD,EAAO,CAAC,GAAGA,EAAO,IAAIA,EAAO,KAAK,GAC5DI,IAAK,KAAK,IAAI,KAAK,IAAIF,GAAGF,EAAO,CAAC,GAAGA,EAAO,IAAIA,EAAO,MAAM;CACnE,OAAO;EAAE;EAAI;EAAI,MAAMG,MAAOF;EAAG,MAAMG,MAAOF;CAAE;AAClD"}
@@ -0,0 +1,107 @@
1
+ import { translatePoseViaDescriptor as e } from "../../core/geometry/poseDescriptor.js";
2
+ import { createTransformOp as t } from "../../core/ops/transform.js";
3
+ import { clampCorner as n, coastKey as r, sameBounds as i } from "./coast.js";
4
+ //#region src/animation/behaviors/coastByWrite.ts
5
+ function a(a) {
6
+ let { animator: o, ctx: s, d: c, bounds: l, coasts: u } = a, d = s.adapter, f = new Map(s.current), p = {
7
+ x: 0,
8
+ y: 0
9
+ }, m = (e) => {
10
+ if (d.previewPoses) d.previewPoses(e);
11
+ else for (let [t, n] of e) n !== null && d.setPose(t, n);
12
+ }, h = new Set(s.draggedIds), g = /* @__PURE__ */ new Map();
13
+ for (let e of h) d.getNode(e) && g.set(e, c.getBounds(d.getPose(e)));
14
+ let _ = (e) => {
15
+ let t = g.get(e);
16
+ return t !== void 0 && d.getNode(e) !== void 0 && i(c.getBounds(d.getPose(e)), t);
17
+ }, v = /* @__PURE__ */ new Map(), y = r(), b = {
18
+ ids: s.draggedIds.slice(),
19
+ stop: () => {
20
+ if (!o.isActive(y)) {
21
+ u.delete(b);
22
+ return;
23
+ }
24
+ x.cancel(), S();
25
+ }
26
+ };
27
+ u.add(b), m(new Map([...h].flatMap((e) => {
28
+ let t = f.get(e);
29
+ return t === void 0 ? [] : [[e, t]];
30
+ })));
31
+ let x = o.decay({
32
+ from: {
33
+ x: 0,
34
+ y: 0
35
+ },
36
+ velocity: {
37
+ x: a.vx,
38
+ y: a.vy
39
+ },
40
+ friction: a.friction,
41
+ cancelKey: y,
42
+ add: (e, t) => ({
43
+ x: e.x + t.x,
44
+ y: e.y + t.y
45
+ }),
46
+ scale: (e, t) => ({
47
+ x: e.x * t,
48
+ y: e.y * t
49
+ }),
50
+ magnitude: (e) => Math.hypot(e.x, e.y),
51
+ onTick: (t) => {
52
+ p = t;
53
+ let r = l !== void 0, i = /* @__PURE__ */ new Map();
54
+ for (let a of [...h]) {
55
+ if (!_(a)) {
56
+ h.delete(a), i.set(a, null);
57
+ continue;
58
+ }
59
+ let o = f.get(a);
60
+ if (!o) continue;
61
+ let s = c.getBounds(o), { nx: u, ny: d, hitX: p, hitY: m } = n(l, s.x + t.x, s.y + t.y);
62
+ !p && !m && (r = !1), v.set(a, {
63
+ x: u,
64
+ y: d
65
+ }), i.set(a, e(o, u - s.x, d - s.y, c));
66
+ }
67
+ m(i);
68
+ for (let e of h) g.set(e, c.getBounds(d.getPose(e)));
69
+ if (h.size === 0) {
70
+ u.delete(b), x.cancel();
71
+ return;
72
+ }
73
+ a.boundary === "stop" && r && b.stop();
74
+ },
75
+ onDone: () => {
76
+ S();
77
+ }
78
+ });
79
+ function S() {
80
+ if (!u.delete(b)) return;
81
+ let n = [], r = /* @__PURE__ */ new Map();
82
+ for (let i of h) {
83
+ if (r.set(i, null), !_(i)) continue;
84
+ let a = f.get(i);
85
+ if (!a) continue;
86
+ let o = c.getBounds(a), l = v.get(i) ?? {
87
+ x: o.x + p.x,
88
+ y: o.y + p.y
89
+ }, u = e(a, l.x - o.x, l.y - o.y, c), d = s.origin.get(i) ?? a;
90
+ n.push(t({
91
+ id: i,
92
+ from: d,
93
+ to: u,
94
+ label: "flick"
95
+ }));
96
+ }
97
+ if (n.length > 0) {
98
+ if (d.applyOps) d.applyOps(n, "flick");
99
+ else if (d.previewPoses) for (let e of n) e.apply(d);
100
+ }
101
+ d.previewPoses?.(r);
102
+ }
103
+ }
104
+ //#endregion
105
+ export { a as coastByWrite };
106
+
107
+ //# sourceMappingURL=coastByWrite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coastByWrite.js","names":["coastByWrite","adapter","ctx","startPoses","lastValue","show","poses","id","pose","riding","lastSeen","d","stillOurs","seen","sameBounds","finalPositions","cancelKey","coastKey","coast","animator","decayHandle","commitFlick","coasts","start","p","q","v","k","delta","allHit","bounds","frame","o","clampCorner","hitX","hitY","nx","ny","translatePoseViaDescriptor","ops","shown","fp","finalPose","from","createTransformOp","op"],"sources":["../../../src/animation/behaviors/coastByWrite.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { clampCorner, coastKey, sameBounds, type Coast, type CoastArgs } from './coast';\n\ninterface Delta { x: number; y: number }\n\n/**\n * A coast over an adapter with no pose targets: one decay of the flick's travel, written to\n * every node it carries each frame, through `previewPoses` where the adapter has it and\n * `setPose` where it does not. Nothing else animating a node adds to it.\n */\nexport function coastByWrite<TPose>(a: CoastArgs<TPose>): void {\n const { animator, ctx, d, bounds, coasts } = a;\n const adapter = ctx.adapter;\n const startPoses = new Map<string, TPose>(ctx.current);\n let lastValue: Delta = { x: 0, y: 0 };\n const show = (poses: Map<string, TPose | null>): void => {\n if (adapter.previewPoses) adapter.previewPoses(poses);\n else for (const [id, pose] of poses) if (pose !== null) adapter.setPose(id, pose);\n };\n // What the scene held for each node right after the coast last wrote it.\n // A node that is gone, or reads back as anything else, has another\n // writer now, an undo or a delete, and leaves the coast unrecorded.\n const riding = new Set(ctx.draggedIds);\n const lastSeen = new Map<string, Bounds>();\n for (const id of riding) {\n if (adapter.getNode(id)) lastSeen.set(id, d.getBounds(adapter.getPose(id)));\n }\n const stillOurs = (id: string): boolean => {\n const seen = lastSeen.get(id);\n return seen !== undefined && adapter.getNode(id) !== undefined\n && sameBounds(d.getBounds(adapter.getPose(id)), seen);\n };\n // Where each node was last put, which under bounds is not its start plus the decay's travel.\n const finalPositions = new Map<string, Delta>();\n const cancelKey = coastKey();\n const coast: Coast = {\n ids: ctx.draggedIds.slice(),\n stop: (): void => {\n // Canceled from outside (cancelAll, unmount), it stopped long ago and somewhere else.\n if (!animator.isActive(cancelKey)) {\n coasts.delete(coast);\n return;\n }\n decayHandle.cancel();\n commitFlick();\n },\n };\n coasts.add(coast);\n // Held from the release itself, so no frame paints the pre-drag pose\n // between the drag's preview going away and the first coast frame.\n show(new Map([...riding].flatMap((id) => {\n const start = startPoses.get(id);\n return start === undefined ? [] : [[id, start] as const];\n })));\n const decayHandle = animator.decay<Delta>({\n from: { x: 0, y: 0 },\n velocity: { x: a.vx, y: a.vy },\n friction: a.friction,\n cancelKey,\n add: (p, q) => ({ x: p.x + q.x, y: p.y + q.y }),\n scale: (v, k) => ({ x: v.x * k, y: v.y * k }),\n magnitude: (v) => Math.hypot(v.x, v.y),\n onTick: (delta) => {\n lastValue = delta;\n let allHit = bounds !== undefined;\n const frame = new Map<string, TPose | null>();\n for (const id of [...riding]) {\n if (!stillOurs(id)) {\n riding.delete(id);\n frame.set(id, null);\n continue;\n }\n const start = startPoses.get(id);\n if (!start) continue;\n const o = d.getBounds(start);\n const { nx, ny, hitX, hitY } = clampCorner(bounds, o.x + delta.x, o.y + delta.y);\n if (!hitX && !hitY) allHit = false;\n finalPositions.set(id, { x: nx, y: ny });\n frame.set(id, translatePoseViaDescriptor(start, nx - o.x, ny - o.y, d));\n }\n show(frame);\n for (const id of riding) lastSeen.set(id, d.getBounds(adapter.getPose(id)));\n if (riding.size === 0) {\n coasts.delete(coast);\n decayHandle.cancel();\n return;\n }\n // Under 'stop', once every node is at the boundary the coast ends\n // there instead of drifting along the edge as friction wears off.\n if (a.boundary === 'stop' && allHit) coast.stop();\n },\n onDone: () => {\n commitFlick();\n },\n });\n\n function commitFlick(): void {\n if (!coasts.delete(coast)) return;\n const ops: Op[] = [];\n const shown = new Map<string, TPose | null>();\n for (const id of riding) {\n shown.set(id, null);\n if (!stillOurs(id)) continue;\n const start = startPoses.get(id);\n if (!start) continue;\n const o = d.getBounds(start);\n const fp = finalPositions.get(id) ?? { x: o.x + lastValue.x, y: o.y + lastValue.y };\n const finalPose = translatePoseViaDescriptor(start, fp.x - o.x, fp.y - o.y, d);\n const from = ctx.origin.get(id) ?? start;\n ops.push(createTransformOp<TPose>({ id, from, to: finalPose, label: 'flick' }));\n }\n // The document first, so the preview never gives way to the pre-drag pose.\n if (ops.length > 0) {\n if (adapter.applyOps) adapter.applyOps(ops, 'flick');\n else if (adapter.previewPoses) for (const op of ops) op.apply(adapter);\n }\n adapter.previewPoses?.(shown);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { translatePoseViaDescriptor as e } from "../../core/geometry/poseDescriptor.js";
2
+ import { createTransformOp as t } from "../../core/ops/transform.js";
3
+ import { poseKey as n } from "../poseHelpers.js";
4
+ import { clampCorner as r, coastKey as i, sameBounds as a } from "./coast.js";
5
+ //#region src/animation/behaviors/coastOnTargets.ts
6
+ function o(t, n, r, i, a) {
7
+ let o = t.to(r), s = t.to(e(r, 1, 0, n)), c = t.to(e(r, 0, 1, n));
8
+ return t.from(o.map((e, t) => i * (s[t] - e) + a * (c[t] - e)));
9
+ }
10
+ function s(s, c) {
11
+ let { animator: l, ctx: u, d, bounds: f, coasts: p } = s, m = u.adapter, h = -Math.log(s.friction), g = i(), _ = /* @__PURE__ */ new Map(), v = (e) => m.getNode(e.id) !== void 0 && a(d.getBounds(e.target.committed()), d.getBounds(e.seen)), y = (e, t, n, r) => {
12
+ let i = t ?? e.target.committed(), a = o(e.target.axes, d, i, n, r), c = d.getBounds(i);
13
+ e.startX = c.x, e.startY = c.y, e.vx = n, e.vy = r, e.handle = l.decay({
14
+ target: e.target,
15
+ from: t,
16
+ velocity: a,
17
+ friction: s.friction,
18
+ cancelKey: g,
19
+ interrupt: !1,
20
+ onTick: (t) => S(e, t),
21
+ onDone: () => b(e)
22
+ });
23
+ }, b = (e) => {
24
+ e.handle = null, e.seen = e.target.committed();
25
+ for (let e of _.values()) if (e.handle) return;
26
+ w();
27
+ }, x = (e, t) => {
28
+ let r = e.target.committed();
29
+ if (_.delete(e.id), e.handle?.cancel(), e.target.commit(r), e.target.active && m.getNode(e.id) !== void 0) {
30
+ let i = d.getBounds(r), a = d.getBounds(e.seen), s = d.getBounds(t), c = e.vx - h * (s.x - (i.x - a.x) - e.startX), u = e.vy - h * (s.y - (i.y - a.y) - e.startY);
31
+ l.spring({
32
+ target: e.target,
33
+ from: t,
34
+ to: r,
35
+ velocity: o(e.target.axes, d, t, c, u),
36
+ cancelKey: n(e.id),
37
+ interrupt: !1
38
+ });
39
+ }
40
+ b(e);
41
+ };
42
+ function S(t, n) {
43
+ if (!v(t)) {
44
+ x(t, n);
45
+ return;
46
+ }
47
+ let i = d.getBounds(n), { nx: a, ny: o, hitX: c, hitY: l } = r(f, i.x, i.y);
48
+ if (!c && !l) return;
49
+ let u = c ? 0 : t.vx - h * (i.x - t.startX), p = l ? 0 : t.vy - h * (i.y - t.startY);
50
+ t.handle?.cancel(), t.target.commit(e(t.target.committed(), a - i.x, o - i.y, d)), t.seen = t.target.committed(), s.boundary === "continue" && Math.hypot(u, p) > 0 ? y(t, void 0, u, p) : b(t);
51
+ }
52
+ let C = {
53
+ ids: u.draggedIds.slice(),
54
+ stop: () => {
55
+ if (!l.isActive(g)) {
56
+ p.delete(C);
57
+ return;
58
+ }
59
+ for (let e of _.values()) e.handle?.cancel(), e.handle = null, e.seen = e.target.committed();
60
+ w();
61
+ }
62
+ };
63
+ p.add(C);
64
+ function w() {
65
+ if (!p.delete(C) || !m.applyOps) return;
66
+ let e = [];
67
+ for (let n of _.values()) {
68
+ if (!v(n)) continue;
69
+ let r = u.origin.get(n.id) ?? n.seen, i = n.target.committed();
70
+ n.target.commit(r), e.push(t({
71
+ id: n.id,
72
+ from: r,
73
+ to: i,
74
+ label: "flick"
75
+ }));
76
+ }
77
+ e.length > 0 && m.applyOps(e, "flick");
78
+ }
79
+ for (let [e, t] of c) _.set(e, {
80
+ id: e,
81
+ target: t,
82
+ seen: t.committed(),
83
+ handle: null,
84
+ startX: 0,
85
+ startY: 0,
86
+ vx: 0,
87
+ vy: 0
88
+ });
89
+ for (let e of [..._.values()]) y(e, u.current.get(e.id), s.vx, s.vy);
90
+ }
91
+ //#endregion
92
+ export { s as coastOnTargets };
93
+
94
+ //# sourceMappingURL=coastOnTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coastOnTargets.js","names":["poseVelocity","base","ax","at","alongX","translatePoseViaDescriptor","d","alongY","vx","i","b","vy","coastOnTargets","a","adapter","ctx","drag","cancelKey","coastKey","riders","ours","r","sameBounds","launch","from","velocity","corner","animator","tick","own","halted","other","drop","left","moved","was","poseKey","clampCorner","bounds","hitX","hitY","nx","ny","coast","commitFlick","coasts","ops","to","createTransformOp","id","target","targets"],"sources":["../../../src/animation/behaviors/coastOnTargets.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport { translatePoseViaDescriptor, type PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { Target, TargetAxes } from '@weasel-js/animator';\nimport type { AnimationHandle } from '@weasel-js/animator';\nimport { poseKey } from '../poseHelpers';\nimport { clampCorner, coastKey, sameBounds, type Coast, type CoastArgs } from './coast';\n\ninterface Rider<TPose> {\n id: string;\n target: Target<TPose>;\n /** The committed pose as the coast last left it. Anything else there is another writer's. */\n seen: TPose;\n /** Null once this node has stopped. */\n handle: AnimationHandle | null;\n /** The corner and velocity its running decay started with. */\n startX: number;\n startY: number;\n vx: number;\n vy: number;\n}\n\n/** A world velocity as the rate of change of a pose at `at`. */\nfunction poseVelocity<TPose>(\n ax: TargetAxes<TPose>,\n d: PoseDescriptor<TPose>,\n at: TPose,\n vx: number,\n vy: number,\n): TPose {\n const base = ax.to(at);\n const alongX = ax.to(translatePoseViaDescriptor(at, 1, 0, d));\n const alongY = ax.to(translatePoseViaDescriptor(at, 0, 1, d));\n return ax.from(base.map((b, i) => vx * (alongX[i]! - b) + vy * (alongY[i]! - b)));\n}\n\n/**\n * A coast on each node's own pose target: a decay per node, so anything else animating the\n * node adds to it. The document keeps the pre-drag pose while the node travels, takes the\n * pose it stops at, and the flick is recorded as one transform once every node has stopped.\n */\nexport function coastOnTargets<TPose>(a: CoastArgs<TPose>, targets: ReadonlyMap<string, Target<TPose>>): void {\n const { animator, ctx, d, bounds, coasts } = a;\n const adapter = ctx.adapter;\n // Speed lost per unit traveled: an exponential coast's velocity is its first less this times\n // how far it has gone, which is how a node stopped at an edge knows what speed it has left.\n const drag = -Math.log(a.friction);\n const cancelKey = coastKey();\n const riders = new Map<string, Rider<TPose>>();\n\n const ours = (r: Rider<TPose>): boolean =>\n adapter.getNode(r.id) !== undefined && sameBounds(d.getBounds(r.target.committed()), d.getBounds(r.seen));\n\n const launch = (r: Rider<TPose>, from: TPose | undefined, vx: number, vy: number): void => {\n const at = from ?? r.target.committed();\n const velocity = poseVelocity(r.target.axes, d, at, vx, vy);\n const corner = d.getBounds(at);\n r.startX = corner.x;\n r.startY = corner.y;\n r.vx = vx;\n r.vy = vy;\n r.handle = animator.decay<TPose>({\n target: r.target,\n from,\n velocity,\n friction: a.friction,\n cancelKey,\n interrupt: false,\n onTick: (own) => tick(r, own),\n onDone: () => halted(r),\n });\n };\n\n const halted = (r: Rider<TPose>): void => {\n r.handle = null;\n r.seen = r.target.committed();\n for (const other of riders.values()) if (other.handle) return;\n commitFlick();\n };\n\n /**\n * Takes `r` out of the coast where another writer left its node. Where that writer is another\n * animation on the node, the node is still short of `left` by what the coast had traveled, at\n * `own`: a spring carries that to nothing from the coast's speed, joining the node's moves.\n */\n const drop = (r: Rider<TPose>, own: TPose): void => {\n const left = r.target.committed();\n riders.delete(r.id);\n r.handle?.cancel();\n r.target.commit(left);\n if (r.target.active && adapter.getNode(r.id) !== undefined) {\n const moved = d.getBounds(left);\n const was = d.getBounds(r.seen);\n const corner = d.getBounds(own);\n const vx = r.vx - drag * (corner.x - (moved.x - was.x) - r.startX);\n const vy = r.vy - drag * (corner.y - (moved.y - was.y) - r.startY);\n animator.spring<TPose>({\n target: r.target,\n from: own,\n to: left,\n velocity: poseVelocity(r.target.axes, d, own, vx, vy),\n cancelKey: poseKey(r.id),\n interrupt: false,\n });\n }\n halted(r);\n };\n\n function tick(r: Rider<TPose>, own: TPose): void {\n if (!ours(r)) { drop(r, own); return; }\n const corner = d.getBounds(own);\n const { nx, ny, hitX, hitY } = clampCorner(bounds, corner.x, corner.y);\n if (!hitX && !hitY) return;\n const vx = hitX ? 0 : r.vx - drag * (corner.x - r.startX);\n const vy = hitY ? 0 : r.vy - drag * (corner.y - r.startY);\n // Canceled, it commits the pose it reached; the edge is where it belongs.\n r.handle?.cancel();\n r.target.commit(translatePoseViaDescriptor(r.target.committed(), nx - corner.x, ny - corner.y, d));\n r.seen = r.target.committed();\n if (a.boundary === 'continue' && Math.hypot(vx, vy) > 0) launch(r, undefined, vx, vy);\n else halted(r);\n }\n\n const coast: Coast = {\n ids: ctx.draggedIds.slice(),\n stop: (): void => {\n // Canceled from outside (cancelAll, unmount), it stopped long ago and somewhere else.\n if (!animator.isActive(cancelKey)) {\n coasts.delete(coast);\n return;\n }\n for (const r of riders.values()) {\n r.handle?.cancel();\n r.handle = null;\n r.seen = r.target.committed();\n }\n commitFlick();\n },\n };\n coasts.add(coast);\n\n function commitFlick(): void {\n if (!coasts.delete(coast) || !adapter.applyOps) return;\n const ops: Op[] = [];\n for (const r of riders.values()) {\n if (!ours(r)) continue;\n const from = ctx.origin.get(r.id) ?? r.seen;\n const to = r.target.committed();\n // A scene records the write it sees, not an op's `from`, so the document goes back first.\n r.target.commit(from);\n ops.push(createTransformOp<TPose>({ id: r.id, from, to, label: 'flick' }));\n }\n if (ops.length > 0) adapter.applyOps(ops, 'flick');\n }\n\n for (const [id, target] of targets) {\n riders.set(id, { id, target, seen: target.committed(), handle: null, startX: 0, startY: 0, vx: 0, vy: 0 });\n }\n // Each starts from its release pose, which the document does not hold: the drag was a preview.\n for (const r of [...riders.values()]) launch(r, ctx.current.get(r.id), a.vx, a.vy);\n}\n"],"mappings":"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"}
@@ -1,156 +1,68 @@
1
- import { createTransformOp as e } from "../../core/ops/transform.js";
2
- import { translatePoseViaDescriptor as t } from "../../core/geometry/poseDescriptor.js";
3
- import { AUTO_POSE_DESCRIPTOR as n } from "../../interactions/actions/resize/autoPoseDescriptor.js";
1
+ import { AUTO_POSE_DESCRIPTOR as e } from "../../core/geometry/autoPoseDescriptor.js";
2
+ import { coastByWrite as t } from "./coastByWrite.js";
3
+ import { coastOnTargets as n } from "./coastOnTargets.js";
4
4
  import { getScratch as r, scratchKey as i, setScratch as a } from "@weasel-js/routing";
5
5
  //#region src/animation/behaviors/momentum.ts
6
- var o = (e, t) => e.x === t.x && e.y === t.y && e.width === t.width && e.height === t.height, s = 0, c = i("momentum.samples");
7
- function l(i) {
8
- let l = i.friction ?? .92, u = i.threshold ?? 200, d = i.velocitySampleMs ?? 80, f = i.now ?? (() => Date.now()), p = i.bounds, m = i.boundary ?? "stop", h = i.poseDescriptor ?? n, g = (e, t, n, r) => {
9
- let i = e + n, a = t + r;
10
- if (!p) return {
11
- nx: i,
12
- ny: a,
13
- hit: !1
14
- };
15
- let o = !1;
16
- return i < p.x ? (i = p.x, o = !0) : i > p.x + p.width && (i = p.x + p.width, o = !0), a < p.y ? (a = p.y, o = !0) : a > p.y + p.height && (a = p.y + p.height, o = !0), {
17
- nx: i,
18
- ny: a,
19
- hit: o
20
- };
21
- }, _ = (e) => {
22
- let t = r(e.scratch, c);
23
- t || (t = [], a(e.scratch, c, t)), t.push({
24
- t: f(),
6
+ var o = i("momentum.samples");
7
+ function s(i) {
8
+ let s = i.friction ?? .92, c = i.threshold ?? 200, l = i.velocitySampleMs ?? 80, u = i.now ?? (() => Date.now()), d = i.poseDescriptor ?? e, f = (e) => {
9
+ let t = r(e.scratch, o);
10
+ t || (t = [], a(e.scratch, o, t)), t.push({
11
+ t: u(),
25
12
  x: e.pointer.worldX,
26
13
  y: e.pointer.worldY
27
14
  });
28
- let n = f() - d * 4;
15
+ let n = u() - l * 4;
29
16
  for (; t.length > 1 && t[0].t < n;) t.shift();
30
- }, v = /* @__PURE__ */ new Set();
17
+ }, p = /* @__PURE__ */ new Set(), m = (e) => {
18
+ let { adapter: t } = e;
19
+ if (!t.poseTarget) return null;
20
+ let n = /* @__PURE__ */ new Map();
21
+ for (let r of e.draggedIds) {
22
+ if (!e.current.has(r)) continue;
23
+ let a = t.getNode(r) && t.poseTarget(r, i.poseDescriptor);
24
+ if (!a) return null;
25
+ n.set(r, a);
26
+ }
27
+ return n;
28
+ };
31
29
  return {
32
30
  onStart(e) {
33
- for (let t of [...v]) t.ids.some((t) => e.draggedIds.includes(t)) && t.stop();
34
- a(e.scratch, c, []), _(e);
31
+ for (let t of [...p]) t.ids.some((t) => e.draggedIds.includes(t)) && t.stop();
32
+ a(e.scratch, o, []), f(e);
35
33
  },
36
34
  onMove(e) {
37
- _(e);
35
+ f(e);
38
36
  },
39
- onEnd(n, a) {
37
+ onEnd(e, a) {
40
38
  if (a.answered) return;
41
- let f = r(n.scratch, c) ?? [];
42
- if (f.length < 2) return;
43
- let _ = f[f.length - 1], y = _.t - d, b = f[0];
44
- for (let e of f) if (e.t >= y) {
45
- b = e;
39
+ let u = r(e.scratch, o) ?? [];
40
+ if (u.length < 2) return;
41
+ let f = u[u.length - 1], h = f.t - l, g = u[0];
42
+ for (let e of u) if (e.t >= h) {
43
+ g = e;
46
44
  break;
47
45
  }
48
- let x = (_.t - b.t) / 1e3;
49
- if (x <= 0) return;
50
- let S = (_.x - b.x) / x, C = (_.y - b.y) / x;
51
- if (Math.hypot(S, C) < u) return;
52
- let w = new Map(n.current), T = {
53
- x: 0,
54
- y: 0
55
- }, E = n.adapter, D = (e) => {
56
- if (E.previewPoses) E.previewPoses(e);
57
- else for (let [t, n] of e) n !== null && E.setPose(t, n);
58
- }, O = new Set(n.draggedIds), k = /* @__PURE__ */ new Map();
59
- for (let e of O) E.getNode(e) && k.set(e, h.getBounds(E.getPose(e)));
60
- let A = (e) => {
61
- let t = k.get(e);
62
- return t !== void 0 && E.getNode(e) !== void 0 && o(h.getBounds(E.getPose(e)), t);
63
- }, j = /* @__PURE__ */ new Map(), M = `momentum:${s++}`, N = {
64
- ids: n.draggedIds.slice(),
65
- stop: () => {
66
- if (!i.animator.isActive(M)) {
67
- v.delete(N);
68
- return;
69
- }
70
- P.cancel(), F();
71
- }
72
- };
73
- v.add(N), D(new Map([...O].flatMap((e) => {
74
- let t = w.get(e);
75
- return t === void 0 ? [] : [[e, t]];
76
- })));
77
- let P = i.animator.decay({
78
- from: {
79
- x: 0,
80
- y: 0
81
- },
82
- velocity: {
83
- x: S,
84
- y: C
85
- },
86
- friction: l,
87
- cancelKey: M,
88
- add: (e, t) => ({
89
- x: e.x + t.x,
90
- y: e.y + t.y
91
- }),
92
- scale: (e, t) => ({
93
- x: e.x * t,
94
- y: e.y * t
95
- }),
96
- magnitude: (e) => Math.hypot(e.x, e.y),
97
- onTick: (e) => {
98
- T = e;
99
- let n = p !== void 0, r = /* @__PURE__ */ new Map();
100
- for (let i of [...O]) {
101
- if (!A(i)) {
102
- O.delete(i), r.set(i, null);
103
- continue;
104
- }
105
- let a = w.get(i);
106
- if (!a) continue;
107
- let o = h.getBounds(a), { nx: s, ny: c, hit: l } = g(o.x, o.y, e.x, e.y);
108
- l || (n = !1), j.set(i, {
109
- x: s,
110
- y: c
111
- }), r.set(i, t(a, s - o.x, c - o.y, h));
112
- }
113
- D(r);
114
- for (let e of O) k.set(e, h.getBounds(E.getPose(e)));
115
- if (O.size === 0) {
116
- v.delete(N), P.cancel();
117
- return;
118
- }
119
- m === "stop" && n && N.stop();
120
- },
121
- onDone: () => {
122
- F();
123
- }
124
- });
125
- function F() {
126
- if (!v.delete(N)) return;
127
- let r = [], i = /* @__PURE__ */ new Map();
128
- for (let a of O) {
129
- if (i.set(a, null), !A(a)) continue;
130
- let o = w.get(a);
131
- if (!o) continue;
132
- let s = h.getBounds(o), c = j.get(a) ?? {
133
- x: s.x + T.x,
134
- y: s.y + T.y
135
- }, l = t(o, c.x - s.x, c.y - s.y, h), u = n.origin.get(a) ?? o;
136
- r.push(e({
137
- id: a,
138
- from: u,
139
- to: l,
140
- label: "flick"
141
- }));
142
- }
143
- if (r.length > 0) {
144
- if (E.applyOps) E.applyOps(r, "flick");
145
- else if (E.previewPoses) for (let e of r) e.apply(E);
146
- }
147
- E.previewPoses?.(i);
148
- }
149
- return null;
46
+ let _ = (f.t - g.t) / 1e3;
47
+ if (_ <= 0) return;
48
+ let v = (f.x - g.x) / _, y = (f.y - g.y) / _;
49
+ if (Math.hypot(v, y) < c) return;
50
+ let b = {
51
+ animator: i.animator,
52
+ ctx: e,
53
+ vx: v,
54
+ vy: y,
55
+ friction: s,
56
+ d,
57
+ coasts: p,
58
+ bounds: i.bounds,
59
+ boundary: i.boundary ?? "stop"
60
+ }, x = m(e);
61
+ return x ? n(b, x) : t(b), null;
150
62
  }
151
63
  };
152
64
  }
153
65
  //#endregion
154
- export { l as momentum };
66
+ export { s as momentum };
155
67
 
156
68
  //# sourceMappingURL=momentum.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"momentum.js","names":["sameBounds","a","b","nextCoast","SAMPLES","scratchKey","momentum","friction","opts","threshold","sampleMs","now","bounds","boundaryPolicy","d","AUTO_POSE_DESCRIPTOR","clampToBounds","nx","sx","dx","ny","sy","dy","hit","recordSample","samples","getScratch","ctx","setScratch","cutoff","coasts","coast","id","end","last","first","s","dt","vx","vy","startPoses","lastValue","adapter","show","poses","pose","riding","lastSeen","stillOurs","seen","finalPositions","cancelKey","decayHandle","commitFlick","start","v","k","delta","allHit","frame","translatePoseViaDescriptor","ops","shown","o","fp","finalPose","from","createTransformOp","op"],"sources":["../../../src/animation/behaviors/momentum.ts"],"sourcesContent":["import { createTransformOp } from 'core/ops/transform';\nimport type { Op } from 'core/ops/types';\nimport type { MoveBehavior, GestureContext } from 'interactions/gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport type { Animator } from '../types';\n\n/** Options for the `momentum` move behavior. */\nexport interface MomentumOptions {\n /** Required: the per-Canvas animator that will own the decay. */\n animator: Animator;\n friction?: number; // default 0.92 (per second)\n threshold?: number; // default 200 world units/sec; the slowest release that coasts\n /** Sample window in ms for velocity computation. Default 80ms. */\n velocitySampleMs?: number;\n /** Optional clock override for tests. Defaults to `Date.now`. */\n now?: () => number;\n /**\n * Optional bounds for the object's top-left corner (in world units). When\n * supplied, momentum-driven translation is clamped: each tick's new\n * position is constrained so the object's `(x, y)` stays inside the rect.\n * Without bounds, a hard flick carries the object indefinitely until\n * friction dampens velocity below `threshold`.\n *\n * Note: ignores object size for now — the bound is on the top-left, not\n * the visible edges. A consumer wanting \"object stays fully inside\" should\n * pass `bounds = { x: canvas.x, y: canvas.y, width: canvas.w - obj.w,\n * height: canvas.h - obj.h }` (and accept that it doesn't adapt to\n * variable-sized objects mid-flight).\n */\n bounds?: { x: number; y: number; width: number; height: number };\n /**\n * Boundary policy when the clamped position hits an edge. 'stop' cancels\n * the decay (instant settle at the edge). 'continue' keeps decaying but\n * subsequent ticks stay clamped (object drifts along the edge as friction\n * decays the velocity). Default 'stop'.\n */\n boundary?: 'stop' | 'continue';\n /** How to translate poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<unknown>;\n}\n\ninterface PointerSample {\n t: number; // ms timestamp\n x: number;\n y: number;\n}\n\ninterface RectLike { x: number; y: number }\n\nconst sameBounds = (a: Bounds, b: Bounds): boolean =>\n a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n\nlet nextCoast = 0;\n\nconst SAMPLES = scratchKey<PointerSample[]>('momentum.samples');\n\n/**\n * Move behavior that keeps a dragged node coasting after the pointer is\n * released, at the velocity it was traveling, until friction brings it to\n * rest. A release slower than `threshold` does not coast at all.\n *\n * Plugs into the move action rather than replacing it, so the drag itself is\n * unchanged — this only decides what happens after the release. The whole\n * flick, coast included, records as one undoable transform: under an adapter\n * with `previewPoses` the coast is shown without touching the document, and\n * the transform is written once it comes to rest. Dragging a node\n * again while it coasts stops the coast and records it where it stands. A node\n * something else moves or deletes mid-coast, an undo included, drops out of\n * the coast where that left it, and nothing is recorded for it.\n */\nexport function momentum<TPose>(opts: MomentumOptions): MoveBehavior<TPose> {\n const friction = opts.friction ?? 0.92;\n const threshold = opts.threshold ?? 200;\n const sampleMs = opts.velocitySampleMs ?? 80;\n const now = opts.now ?? (() => Date.now());\n const bounds = opts.bounds;\n const boundaryPolicy = opts.boundary ?? 'stop';\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n /** Apply bounds clamp to (sx + dx, sy + dy). Returns clamped (nx, ny) and\n * whether either axis was clamped (signalling boundary hit). */\n const clampToBounds = (sx: number, sy: number, dx: number, dy: number): { nx: number; ny: number; hit: boolean } => {\n let nx = sx + dx;\n let ny = sy + dy;\n if (!bounds) return { nx, ny, hit: false };\n let hit = false;\n if (nx < bounds.x) { nx = bounds.x; hit = true; }\n else if (nx > bounds.x + bounds.width) { nx = bounds.x + bounds.width; hit = true; }\n if (ny < bounds.y) { ny = bounds.y; hit = true; }\n else if (ny > bounds.y + bounds.height) { ny = bounds.y + bounds.height; hit = true; }\n return { nx, ny, hit };\n };\n\n const recordSample = (ctx: GestureContext<TPose>): void => {\n let samples = getScratch(ctx.scratch, SAMPLES);\n if (!samples) {\n samples = [];\n setScratch(ctx.scratch, SAMPLES, samples);\n }\n samples.push({\n t: now(),\n x: ctx.pointer.worldX,\n y: ctx.pointer.worldY,\n });\n // Trim anything older than 4× the sample window — bounded memory.\n const cutoff = now() - sampleMs * 4;\n while (samples.length > 1 && samples[0].t < cutoff) samples.shift();\n };\n\n const coasts = new Set<{ ids: readonly string[]; stop(): void }>();\n\n return {\n onStart(ctx) {\n for (const coast of [...coasts]) {\n if (coast.ids.some((id) => ctx.draggedIds.includes(id))) coast.stop();\n }\n setScratch(ctx.scratch, SAMPLES, []);\n recordSample(ctx);\n },\n onMove(ctx) {\n recordSample(ctx);\n },\n onEnd(ctx, end): Op[] | null | void {\n if (end.answered) return undefined;\n const samples = getScratch(ctx.scratch, SAMPLES) ?? [];\n if (samples.length < 2) return undefined;\n const last = samples[samples.length - 1];\n // Find the oldest sample within `sampleMs` of `last`.\n const cutoff = last.t - sampleMs;\n let first = samples[0];\n for (const s of samples) {\n if (s.t >= cutoff) { first = s; break; }\n }\n const dt = (last.t - first.t) / 1000;\n if (dt <= 0) return undefined;\n const vx = (last.x - first.x) / dt;\n const vy = (last.y - first.y) / dt;\n const speed = Math.hypot(vx, vy);\n if (speed < threshold) return undefined;\n\n // Suppress default commit and fire decay. We translate each dragged id\n // by the per-frame delta and commit one transform op per id when done.\n const startPoses = new Map<string, TPose>(ctx.current);\n let lastValue = { x: 0, y: 0 };\n const adapter = ctx.adapter;\n const show = (poses: Map<string, TPose | null>): void => {\n if (adapter.previewPoses) adapter.previewPoses(poses);\n else for (const [id, pose] of poses) if (pose !== null) adapter.setPose(id, pose);\n };\n // What the scene held for each node right after the coast last wrote it.\n // A node that is gone, or reads back as anything else, has another\n // writer now, an undo or a delete, and leaves the coast unrecorded.\n const riding = new Set(ctx.draggedIds);\n const lastSeen = new Map<string, Bounds>();\n for (const id of riding) {\n if (adapter.getNode(id)) lastSeen.set(id, d.getBounds(adapter.getPose(id)));\n }\n const stillOurs = (id: string): boolean => {\n const seen = lastSeen.get(id);\n return seen !== undefined && adapter.getNode(id) !== undefined\n && sameBounds(d.getBounds(adapter.getPose(id)), seen);\n };\n // Track per-id final positions when bounds clamping is active — used\n // by onDone to compute the correct final transform op (not just\n // start + decay's last delta, which may overshoot the boundary).\n const finalPositions = new Map<string, { x: number; y: number }>();\n const cancelKey = `momentum:${nextCoast++}`;\n const coast = {\n ids: ctx.draggedIds.slice(),\n stop: (): void => {\n // Canceled from outside (cancelAll, unmount), it stopped long ago and somewhere else.\n if (!opts.animator.isActive(cancelKey)) {\n coasts.delete(coast);\n return;\n }\n decayHandle.cancel();\n commitFlick();\n },\n };\n coasts.add(coast);\n // Held from the release itself, so no frame paints the pre-drag pose\n // between the drag's preview going away and the first coast frame.\n show(new Map([...riding].flatMap((id) => {\n const start = startPoses.get(id);\n return start === undefined ? [] : [[id, start] as const];\n })));\n const decayHandle = opts.animator.decay<RectLike>({\n from: { x: 0, y: 0 },\n velocity: { x: vx, y: vy },\n friction,\n cancelKey,\n add: (a, b) => ({ x: a.x + b.x, y: a.y + b.y }),\n scale: (v, k) => ({ x: v.x * k, y: v.y * k }),\n magnitude: (v) => Math.hypot(v.x, v.y),\n onTick: (delta) => {\n lastValue = delta;\n let allHit = bounds !== undefined;\n const frame = new Map<string, TPose | null>();\n for (const id of [...riding]) {\n if (!stillOurs(id)) {\n riding.delete(id);\n frame.set(id, null);\n continue;\n }\n const start = startPoses.get(id);\n if (!start) continue;\n const o = d.getBounds(start);\n const { nx, ny, hit } = clampToBounds(o.x, o.y, delta.x, delta.y);\n if (!hit) allHit = false;\n finalPositions.set(id, { x: nx, y: ny });\n frame.set(id, translatePoseViaDescriptor(start, nx - o.x, ny - o.y, d));\n }\n show(frame);\n for (const id of riding) lastSeen.set(id, d.getBounds(adapter.getPose(id)));\n if (riding.size === 0) {\n coasts.delete(coast);\n decayHandle.cancel();\n return;\n }\n // If 'stop' policy and every dragged id's clamped position hit\n // the boundary, cancel the decay so the animation settles instantly\n // instead of drifting along the edge as friction wears off.\n if (boundaryPolicy === 'stop' && allHit) coast.stop();\n },\n onDone: () => {\n commitFlick();\n },\n });\n\n function commitFlick(): void {\n if (!coasts.delete(coast)) return;\n const ops: Op[] = [];\n const shown = new Map<string, TPose | null>();\n for (const id of riding) {\n shown.set(id, null);\n if (!stillOurs(id)) continue;\n const start = startPoses.get(id);\n if (!start) continue;\n const o = d.getBounds(start);\n const fp = finalPositions.get(id) ?? { x: o.x + lastValue.x, y: o.y + lastValue.y };\n const finalPose = translatePoseViaDescriptor(start, fp.x - o.x, fp.y - o.y, d);\n const from = ctx.origin.get(id) ?? start;\n ops.push(createTransformOp<TPose>({ id, from, to: finalPose, label: 'flick' }));\n }\n // The document first, so the preview never gives way to the pre-drag pose.\n if (ops.length > 0) {\n if (adapter.applyOps) adapter.applyOps(ops, 'flick');\n else if (adapter.previewPoses) for (const op of ops) op.apply(adapter);\n }\n adapter.previewPoses?.(shown);\n }\n\n return null;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"momentum.js","names":["SAMPLES","scratchKey","momentum","friction","opts","threshold","sampleMs","now","AUTO_POSE_DESCRIPTOR","recordSample","samples","getScratch","ctx","setScratch","cutoff","coasts","targetsOf","adapter","targets","id","target","coast","end","last","first","s","dt","vx","vy","args","coastOnTargets","coastByWrite"],"sources":["../../../src/animation/behaviors/momentum.ts"],"sourcesContent":["import type { Op } from 'core/ops/types';\nimport type { MoveBehavior, GestureContext } from 'interactions/gestures/types';\nimport { scratchKey, getScratch, setScratch } from '@weasel-js/routing';\nimport type { PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport type { Target } from '@weasel-js/animator';\nimport type { Animator } from '@weasel-js/animator';\nimport type { Coast, CoastArgs } from './coast';\nimport { coastByWrite } from './coastByWrite';\nimport { coastOnTargets } from './coastOnTargets';\n\n/** Options for the `momentum` move behavior. */\nexport interface MomentumOptions {\n /** Required: the per-Canvas animator that will own the decay. */\n animator: Animator;\n friction?: number; // default 0.92 (per second)\n threshold?: number; // default 200 world units/sec; the slowest release that coasts\n /** Sample window in ms for velocity computation. Default 80ms. */\n velocitySampleMs?: number;\n /** Optional clock override for tests. Defaults to `Date.now`. */\n now?: () => number;\n /**\n * Optional bounds for the object's top-left corner (in world units): each\n * tick's new position is clamped so the object's `(x, y)` stays inside the\n * rect. Object size is ignored, so to keep an object fully inside, shrink\n * the rect by the object's width and height.\n */\n bounds?: { x: number; y: number; width: number; height: number };\n /**\n * Boundary policy when the clamped position hits an edge. 'stop' settles at\n * the edge at once. 'continue' keeps decaying, so the object drifts along\n * the edge. Default 'stop'.\n */\n boundary?: 'stop' | 'continue';\n /** How to translate poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<unknown>;\n}\n\ninterface PointerSample {\n t: number; // ms timestamp\n x: number;\n y: number;\n}\n\nconst SAMPLES = scratchKey<PointerSample[]>('momentum.samples');\n\n/**\n * Move behavior that keeps a dragged node coasting after the pointer is\n * released, at the velocity it was traveling, until friction brings it to\n * rest. A release slower than `threshold` does not coast at all.\n *\n * The whole flick, coast included, records as one undoable transform, written\n * once it comes to rest. Over an adapter with `poseTarget`, which a\n * scene-backed one has, each node coasts on its own pose target, so anything\n * else animating it adds; over one without, the coast is shown through\n * `previewPoses`, or written through `setPose` each frame. Dragging a node\n * again while it coasts stops the coast and records it where it stands. A\n * `tweenPose` or `springPose` of a coasting node ends its coast. A node\n * something else moves or deletes mid-coast, an undo included, drops out of\n * the coast where that left it, and nothing is recorded for it.\n */\nexport function momentum<TPose>(opts: MomentumOptions): MoveBehavior<TPose> {\n const friction = opts.friction ?? 0.92;\n const threshold = opts.threshold ?? 200;\n const sampleMs = opts.velocitySampleMs ?? 80;\n const now = opts.now ?? (() => Date.now());\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const recordSample = (ctx: GestureContext<TPose>): void => {\n let samples = getScratch(ctx.scratch, SAMPLES);\n if (!samples) {\n samples = [];\n setScratch(ctx.scratch, SAMPLES, samples);\n }\n samples.push({\n t: now(),\n x: ctx.pointer.worldX,\n y: ctx.pointer.worldY,\n });\n // Trim anything older than 4× the sample window — bounded memory.\n const cutoff = now() - sampleMs * 4;\n while (samples.length > 1 && samples[0].t < cutoff) samples.shift();\n };\n\n const coasts = new Set<Coast>();\n\n /** Every dragged node's pose target, or null where the adapter has none for one of them. */\n const targetsOf = (ctx: GestureContext<TPose>): Map<string, Target<TPose>> | null => {\n const { adapter } = ctx;\n if (!adapter.poseTarget) return null;\n const targets = new Map<string, Target<TPose>>();\n for (const id of ctx.draggedIds) {\n if (!ctx.current.has(id)) continue;\n const target = adapter.getNode(id) && adapter.poseTarget(id, opts.poseDescriptor as PoseDescriptor<TPose> | undefined);\n if (!target) return null;\n targets.set(id, target);\n }\n return targets;\n };\n\n return {\n onStart(ctx) {\n for (const coast of [...coasts]) {\n if (coast.ids.some((id) => ctx.draggedIds.includes(id))) coast.stop();\n }\n setScratch(ctx.scratch, SAMPLES, []);\n recordSample(ctx);\n },\n onMove(ctx) {\n recordSample(ctx);\n },\n onEnd(ctx, end): Op[] | null | void {\n if (end.answered) return undefined;\n const samples = getScratch(ctx.scratch, SAMPLES) ?? [];\n if (samples.length < 2) return undefined;\n const last = samples[samples.length - 1];\n // Find the oldest sample within `sampleMs` of `last`.\n const cutoff = last.t - sampleMs;\n let first = samples[0];\n for (const s of samples) {\n if (s.t >= cutoff) { first = s; break; }\n }\n const dt = (last.t - first.t) / 1000;\n if (dt <= 0) return undefined;\n const vx = (last.x - first.x) / dt;\n const vy = (last.y - first.y) / dt;\n if (Math.hypot(vx, vy) < threshold) return undefined;\n\n const args: CoastArgs<TPose> = {\n animator: opts.animator, ctx, vx, vy, friction, d, coasts,\n bounds: opts.bounds, boundary: opts.boundary ?? 'stop',\n };\n const targets = targetsOf(ctx);\n if (targets) coastOnTargets(args, targets);\n else coastByWrite(args);\n // The coast commits the flick itself, so the move action's own commit is suppressed.\n return null;\n },\n };\n}\n"],"mappings":";;;;;AA4CA,IAAMA,IAAUC,EAA4B,kBAAkB;AAiB9D,SAAgBC,EAAgB,GAA4C;CAC1E,IAAMC,IAAWC,EAAK,YAAY,KAC5BC,IAAYD,EAAK,aAAa,KAC9BE,IAAWF,EAAK,oBAAoB,IACpCG,IAAMH,EAAK,cAAc,KAAK,IAAI,IAClC,IAAKA,EAAK,kBAAkBI,GAE5BC,KAAgB,MAAqC;EACzD,IAAIC,IAAUC,EAAWC,EAAI,SAASZ,CAAO;EAK7C,AAJKU,MACH,IAAU,CAAC,GACXG,EAAWD,EAAI,SAASZ,GAASU,CAAO,IAE1CA,EAAQ,KAAK;GACX,GAAGH,EAAI;GACP,GAAGK,EAAI,QAAQ;GACf,GAAGA,EAAI,QAAQ;EACjB,CAAC;EAED,IAAME,IAASP,EAAI,IAAID,IAAW;EAClC,OAAOI,EAAQ,SAAS,KAAKA,EAAQ,EAAE,CAAC,IAAII,IAAQ,EAAQ,MAAM;CACpE,GAEMC,oBAAS,IAAI,IAAW,GAGxBC,KAAa,MAAkE;EACnF,IAAM,EAAE,eAAYJ;EACpB,IAAI,CAACK,EAAQ,YAAY,OAAO;EAChC,IAAMC,oBAAU,IAAI,IAA2B;EAC/C,KAAK,IAAMC,KAAMP,EAAI,YAAY;GAC/B,IAAI,CAACA,EAAI,QAAQ,IAAIO,CAAE,GAAG;GAC1B,IAAMC,IAASH,EAAQ,QAAQE,CAAE,KAAKF,EAAQ,WAAWE,GAAIf,EAAK,cAAmD;GACrH,IAAI,CAACgB,GAAQ,OAAO;GACpB,EAAQ,IAAID,GAAIC,CAAM;EACxB;EACA,OAAOF;CACT;CAEA,OAAO;EACL,QAAQ,GAAK;GACX,KAAK,IAAMG,KAAS,CAAC,GAAGN,CAAM,GAC5B,AAAIM,EAAM,IAAI,MAAM,MAAOT,EAAI,WAAW,SAASO,CAAE,CAAC,KAAGE,EAAM,KAAK;GAGtE,AADAR,EAAWD,EAAI,SAASZ,GAAS,CAAC,CAAC,GACnCS,EAAaG,CAAG;EAClB;EACA,OAAO,GAAK;GACV,EAAaA,CAAG;EAClB;EACA,MAAM,GAAK,GAAyB;GAClC,IAAIU,EAAI,UAAU;GAClB,IAAMZ,IAAUC,EAAWC,EAAI,SAASZ,CAAO,KAAK,CAAC;GACrD,IAAIU,EAAQ,SAAS,GAAG;GACxB,IAAMa,IAAOb,EAAQA,EAAQ,SAAS,IAEhCI,IAASS,EAAK,IAAIjB,GACpBkB,IAAQd,EAAQ;GACpB,KAAK,IAAMe,KAAKf,GACd,IAAIe,EAAE,KAAKX,GAAQ;IAAE,IAAQW;IAAG;GAAO;GAEzC,IAAMC,KAAMH,EAAK,IAAIC,EAAM,KAAK;GAChC,IAAIE,KAAM,GAAG;GACb,IAAMC,KAAMJ,EAAK,IAAIC,EAAM,KAAKE,GAC1BE,KAAML,EAAK,IAAIC,EAAM,KAAKE;GAChC,IAAI,KAAK,MAAMC,GAAIC,CAAE,IAAIvB,GAAW;GAEpC,IAAMwB,IAAyB;IAC7B,UAAUzB,EAAK;IAAU;IAAK;IAAI;IAAI;IAAU;IAAG;IACnD,QAAQA,EAAK;IAAQ,UAAUA,EAAK,YAAY;GAClD,GACMc,IAAUF,EAAUJ,CAAG;GAI7B,OAHIM,IAASY,EAAeD,GAAMX,CAAO,IACpCa,EAAaF,CAAI,GAEf;EACT;CACF;AACF"}
@@ -0,0 +1,12 @@
1
+ import { scenePoseTarget as e } from "./poseTarget.js";
2
+ //#region src/animation/clipTargets.ts
3
+ function t(t, n = {}) {
4
+ return (r) => {
5
+ if (r.startsWith("pose:")) return e(t, r.slice(5), n.descriptor, n.cascade);
6
+ if (r.startsWith("rig:")) return n.rigs?.[r.slice(4)]?.target;
7
+ };
8
+ }
9
+ //#endregion
10
+ export { t as sceneClipTargets };
11
+
12
+ //# sourceMappingURL=clipTargets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipTargets.js","names":["sceneClipTargets","name","scenePoseTarget","scene","options"],"sources":["../../src/animation/clipTargets.ts"],"sourcesContent":["import type { ClipBinder, Pose, Target } from '@weasel-js/animator';\nimport type { PoseDescriptor } from '../core/geometry/poseDescriptor';\nimport { scenePoseTarget, type PoseCascade, type PoseTargetScene } from './poseTarget';\n\n/** Options for `sceneClipTargets`. */\nexport interface SceneClipTargetsOptions<TPose> {\n /** Rigs by the name a clip calls them: a track naming `rig:<name>` moves that rig's pose. */\n rigs?: Readonly<Record<string, { readonly target: Target<Pose> }>>;\n /** As `scenePoseTarget` takes them. */\n descriptor?: PoseDescriptor<TPose>;\n cascade?: PoseCascade<TPose>;\n}\n\n/**\n * A `ClipBinder.target` over a scene. `pose:<node id>` is that node's pose target, the one\n * `scenePoseTarget` answers, and `rig:<name>` is the target of the rig given under that\n * name. Any other name is `undefined`, for a caller to resolve itself first or after. A track\n * over part of a rig names joints as its `axes`, which the rig's target resolves.\n */\nexport function sceneClipTargets<TPose>(\n scene: PoseTargetScene<TPose>,\n options: SceneClipTargetsOptions<TPose> = {},\n): NonNullable<ClipBinder['target']> {\n return (name) => {\n if (name.startsWith('pose:')) return scenePoseTarget(scene, name.slice(5), options.descriptor, options.cascade);\n if (name.startsWith('rig:')) return options.rigs?.[name.slice(4)]?.target;\n return undefined;\n };\n}\n"],"mappings":";;AAmBA,SAAgBA,EACd,GACA,IAA0C,CAAC,GACR;CACnC,QAAQ,MAAS;EACf,IAAIC,EAAK,WAAW,OAAO,GAAG,OAAOC,EAAgBC,GAAOF,EAAK,MAAM,CAAC,GAAGG,EAAQ,YAAYA,EAAQ,OAAO;EAC9G,IAAIH,EAAK,WAAW,MAAM,GAAG,OAAOG,EAAQ,OAAOH,EAAK,MAAM,CAAC,EAAE,EAAE;CAErE;AACF"}