@weasel-js/core 1.7.0 → 1.7.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 (1003) hide show
  1. package/CHANGELOG.md +764 -0
  2. package/README.md +7 -8
  3. package/dist/WeaselProvider.js +15 -0
  4. package/dist/WeaselProvider.js.map +1 -0
  5. package/dist/affordances/composeAffordanceLayer.js +224 -0
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -0
  7. package/dist/affordances/cornerResize.js +69 -0
  8. package/dist/affordances/cornerResize.js.map +1 -0
  9. package/dist/affordances/hitAffordanceRegions.js +138 -0
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -0
  11. package/dist/affordances/pathAnchors.js +66 -0
  12. package/dist/affordances/pathAnchors.js.map +1 -0
  13. package/dist/affordances/rotationHandle.js +103 -0
  14. package/dist/affordances/rotationHandle.js.map +1 -0
  15. package/dist/animation/behaviors/momentum.js +118 -0
  16. package/dist/animation/behaviors/momentum.js.map +1 -0
  17. package/dist/animation/colorHelpers.js +135 -0
  18. package/dist/animation/colorHelpers.js.map +1 -0
  19. package/dist/animation/colorRegistry.js +37 -0
  20. package/dist/animation/colorRegistry.js.map +1 -0
  21. package/dist/animation/index.js +20 -0
  22. package/dist/animation/loop.js +62 -0
  23. package/dist/animation/loop.js.map +1 -0
  24. package/dist/animation/observe.js +23 -0
  25. package/dist/animation/observe.js.map +1 -0
  26. package/dist/animation/poseHelpers.js +50 -0
  27. package/dist/animation/poseHelpers.js.map +1 -0
  28. package/dist/animation/reflow.js +121 -0
  29. package/dist/animation/reflow.js.map +1 -0
  30. package/dist/animation/rig/bindRig.js +74 -0
  31. package/dist/animation/rig/bindRig.js.map +1 -0
  32. package/dist/animation/rig/blendPoses.js +43 -0
  33. package/dist/animation/rig/blendPoses.js.map +1 -0
  34. package/dist/animation/rig/mirrorPose.js +19 -0
  35. package/dist/animation/rig/mirrorPose.js.map +1 -0
  36. package/dist/animation/rig/resolveSkeleton.js +33 -0
  37. package/dist/animation/rig/resolveSkeleton.js.map +1 -0
  38. package/dist/animation/rig/solveIk.js +103 -0
  39. package/dist/animation/rig/solveIk.js.map +1 -0
  40. package/dist/animation/rig/types.js +12 -0
  41. package/dist/animation/rig/types.js.map +1 -0
  42. package/dist/animation/rig/useRig.js +23 -0
  43. package/dist/animation/rig/useRig.js.map +1 -0
  44. package/dist/animation/slew.js +27 -0
  45. package/dist/animation/slew.js.map +1 -0
  46. package/dist/animation/stagger.js +138 -0
  47. package/dist/animation/stagger.js.map +1 -0
  48. package/dist/animation/timeline/booking.js +106 -0
  49. package/dist/animation/timeline/booking.js.map +1 -0
  50. package/dist/animation/timeline/createTimeline.js +116 -0
  51. package/dist/animation/timeline/createTimeline.js.map +1 -0
  52. package/dist/animation/timeline/sampleTrack.js +29 -0
  53. package/dist/animation/timeline/sampleTrack.js.map +1 -0
  54. package/dist/animation/useAnimator.js +329 -0
  55. package/dist/animation/useAnimator.js.map +1 -0
  56. package/dist/animation/wrappers/animateLifecycle.js +40 -0
  57. package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
  58. package/dist/animation/wrappers/animateOnSetPose.js +44 -0
  59. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
  60. package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
  61. package/dist/{builtins-DLn2lCr_.d.ts → builtins-BSUfH8nU.d.ts} +738 -513
  62. package/dist/canvas/Canvas.js +608 -0
  63. package/dist/canvas/Canvas.js.map +1 -0
  64. package/dist/canvas/CanvasView.js +255 -0
  65. package/dist/canvas/CanvasView.js.map +1 -0
  66. package/dist/canvas/CursorCoordsHud.js +75 -0
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -0
  68. package/dist/canvas/DrawCanvas.js +67 -0
  69. package/dist/canvas/DrawCanvas.js.map +1 -0
  70. package/dist/canvas/MinimapCanvas.js +139 -0
  71. package/dist/canvas/MinimapCanvas.js.map +1 -0
  72. package/dist/canvas/ModalityHud.js +66 -0
  73. package/dist/canvas/ModalityHud.js.map +1 -0
  74. package/dist/canvas/NodeShape.js +391 -0
  75. package/dist/canvas/NodeShape.js.map +1 -0
  76. package/dist/canvas/PickHud.js +93 -0
  77. package/dist/canvas/PickHud.js.map +1 -0
  78. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
  79. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
  81. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
  83. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
  84. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
  85. package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
  91. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
  92. package/dist/canvas/SceneCanvas/features.js +97 -0
  93. package/dist/canvas/SceneCanvas/features.js.map +1 -0
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
  96. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
  97. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
  99. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
  101. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
  102. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
  103. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
  104. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
  105. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
  106. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
  107. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
  108. package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
  109. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
  110. package/dist/canvas/SceneCanvas.js +992 -0
  111. package/dist/canvas/SceneCanvas.js.map +1 -0
  112. package/dist/canvas/SceneViewCanvas.js +54 -0
  113. package/dist/canvas/SceneViewCanvas.js.map +1 -0
  114. package/dist/canvas/accentColor.js +9 -0
  115. package/dist/canvas/accentColor.js.map +1 -0
  116. package/dist/canvas/affordanceAt.js +63 -0
  117. package/dist/canvas/affordanceAt.js.map +1 -0
  118. package/dist/canvas/buildSceneTree.js +65 -0
  119. package/dist/canvas/buildSceneTree.js.map +1 -0
  120. package/dist/canvas/canvasRenderer.js +89 -0
  121. package/dist/canvas/canvasRenderer.js.map +1 -0
  122. package/dist/canvas/colorOverrides.js +16 -0
  123. package/dist/canvas/colorOverrides.js.map +1 -0
  124. package/dist/canvas/defaultDrawOne.js +43 -0
  125. package/dist/canvas/defaultDrawOne.js.map +1 -0
  126. package/dist/canvas/deps/areaSelect.js +19 -0
  127. package/dist/canvas/deps/areaSelect.js.map +1 -0
  128. package/dist/canvas/deps/debug.js +9 -0
  129. package/dist/canvas/deps/debug.js.map +1 -0
  130. package/dist/canvas/deps/dispatcher.js +11 -0
  131. package/dist/canvas/deps/dispatcher.js.map +1 -0
  132. package/dist/canvas/deps/editAnchors.js +101 -0
  133. package/dist/canvas/deps/editAnchors.js.map +1 -0
  134. package/dist/canvas/deps/geometryProjection.js +11 -0
  135. package/dist/canvas/deps/geometryProjection.js.map +1 -0
  136. package/dist/canvas/deps/hitTestArea.js +51 -0
  137. package/dist/canvas/deps/hitTestArea.js.map +1 -0
  138. package/dist/canvas/deps/ingestion.js +31 -0
  139. package/dist/canvas/deps/ingestion.js.map +1 -0
  140. package/dist/canvas/deps/insert.js +116 -0
  141. package/dist/canvas/deps/insert.js.map +1 -0
  142. package/dist/canvas/deps/lassoSelect.js +20 -0
  143. package/dist/canvas/deps/lassoSelect.js.map +1 -0
  144. package/dist/canvas/deps/layout.js +34 -0
  145. package/dist/canvas/deps/layout.js.map +1 -0
  146. package/dist/canvas/deps/nodeAtPoint.js +19 -0
  147. package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
  148. package/dist/canvas/deps/poseComposition.js +11 -0
  149. package/dist/canvas/deps/poseComposition.js.map +1 -0
  150. package/dist/canvas/deps/poseDescriptor.js +12 -0
  151. package/dist/canvas/deps/poseDescriptor.js.map +1 -0
  152. package/dist/canvas/deps/resizePolicy.js +35 -0
  153. package/dist/canvas/deps/resizePolicy.js.map +1 -0
  154. package/dist/canvas/deps/slice.js +99 -0
  155. package/dist/canvas/deps/slice.js.map +1 -0
  156. package/dist/canvas/deps/snap.js +11 -0
  157. package/dist/canvas/deps/snap.js.map +1 -0
  158. package/dist/canvas/deps/textEdit.js +21 -0
  159. package/dist/canvas/deps/textEdit.js.map +1 -0
  160. package/dist/canvas/deps/view.js +43 -0
  161. package/dist/canvas/deps/view.js.map +1 -0
  162. package/dist/canvas/derivedPath.js +47 -0
  163. package/dist/canvas/derivedPath.js.map +1 -0
  164. package/dist/canvas/drawEnvelope.js +22 -0
  165. package/dist/canvas/drawEnvelope.js.map +1 -0
  166. package/dist/canvas/getNodeAtPoint.js +18 -0
  167. package/dist/canvas/getNodeAtPoint.js.map +1 -0
  168. package/dist/canvas/hostAnchor.js +29 -0
  169. package/dist/canvas/hostAnchor.js.map +1 -0
  170. package/dist/canvas/hud.module.js +18 -0
  171. package/dist/canvas/hud.module.js.map +1 -0
  172. package/dist/canvas/insertPreviewExtent.js +103 -0
  173. package/dist/canvas/insertPreviewExtent.js.map +1 -0
  174. package/dist/canvas/kitRequirements.js +177 -0
  175. package/dist/canvas/kitRequirements.js.map +1 -0
  176. package/dist/canvas/layerOrder.js +66 -0
  177. package/dist/canvas/layerOrder.js.map +1 -0
  178. package/dist/canvas/layerSlots.js +14 -0
  179. package/dist/canvas/layerSlots.js.map +1 -0
  180. package/dist/canvas/minimapMath.js +80 -0
  181. package/dist/canvas/minimapMath.js.map +1 -0
  182. package/dist/canvas/mountedCanvases.js +20 -0
  183. package/dist/canvas/mountedCanvases.js.map +1 -0
  184. package/dist/canvas/overlayRoleStrokes.js +17 -0
  185. package/dist/canvas/overlayRoleStrokes.js.map +1 -0
  186. package/dist/canvas/paintCull.js +20 -0
  187. package/dist/canvas/paintCull.js.map +1 -0
  188. package/dist/canvas/pickWalk.js +158 -0
  189. package/dist/canvas/pickWalk.js.map +1 -0
  190. package/dist/canvas/planeClips.js +30 -0
  191. package/dist/canvas/planeClips.js.map +1 -0
  192. package/dist/canvas/poseRotation.js +35 -0
  193. package/dist/canvas/poseRotation.js.map +1 -0
  194. package/dist/canvas/rasterToPng.js +21 -0
  195. package/dist/canvas/rasterToPng.js.map +1 -0
  196. package/dist/canvas/renderDebugSnapshot.js +32 -0
  197. package/dist/canvas/renderDebugSnapshot.js.map +1 -0
  198. package/dist/canvas/renderNeeds.js +25 -0
  199. package/dist/canvas/renderNeeds.js.map +1 -0
  200. package/dist/canvas/renderSceneToPixels.js +143 -0
  201. package/dist/canvas/renderSceneToPixels.js.map +1 -0
  202. package/dist/canvas/sceneAdapter.js +270 -0
  203. package/dist/canvas/sceneAdapter.js.map +1 -0
  204. package/dist/canvas/sceneLayerPaint.js +37 -0
  205. package/dist/canvas/sceneLayerPaint.js.map +1 -0
  206. package/dist/canvas/sceneSlotWiring.js +20 -0
  207. package/dist/canvas/sceneSlotWiring.js.map +1 -0
  208. package/dist/canvas/sceneViewRender.js +72 -0
  209. package/dist/canvas/sceneViewRender.js.map +1 -0
  210. package/dist/canvas/slopsDebugLayer.js +61 -0
  211. package/dist/canvas/slopsDebugLayer.js.map +1 -0
  212. package/dist/canvas/surfaceContribution.js +15 -0
  213. package/dist/canvas/surfaceContribution.js.map +1 -0
  214. package/dist/canvas/toolPreview.js +39 -0
  215. package/dist/canvas/toolPreview.js.map +1 -0
  216. package/dist/canvas/useCanvasRenderer.js +11 -0
  217. package/dist/canvas/useCanvasRenderer.js.map +1 -0
  218. package/dist/canvas/useFrameLoop.js +60 -0
  219. package/dist/canvas/useFrameLoop.js.map +1 -0
  220. package/dist/canvas/useHostAnchor.js +71 -0
  221. package/dist/canvas/useHostAnchor.js.map +1 -0
  222. package/dist/canvas/useLateContentRedraw.js +21 -0
  223. package/dist/canvas/useLateContentRedraw.js.map +1 -0
  224. package/dist/canvas/useRedrawOn.js +21 -0
  225. package/dist/canvas/useRedrawOn.js.map +1 -0
  226. package/dist/canvas/useViewHelpers.js +120 -0
  227. package/dist/canvas/useViewHelpers.js.map +1 -0
  228. package/dist/canvas/viewInputs.js +17 -0
  229. package/dist/canvas/viewInputs.js.map +1 -0
  230. package/dist/canvas/viewRegistry.js +61 -0
  231. package/dist/canvas/viewRegistry.js.map +1 -0
  232. package/dist/canvas/wrapNodeOutput.js +14 -0
  233. package/dist/canvas/wrapNodeOutput.js.map +1 -0
  234. package/dist/clipboard.d.ts +10 -5
  235. package/dist/clipboard.js +3 -5
  236. package/dist/clone.d.ts +3 -3
  237. package/dist/clone.js +2 -5
  238. package/dist/core/adapters/arrayAdapter.js +85 -0
  239. package/dist/core/adapters/arrayAdapter.js.map +1 -0
  240. package/dist/core/adapters/useArrayAdapter.js +13 -0
  241. package/dist/core/adapters/useArrayAdapter.js.map +1 -0
  242. package/dist/core/applyOps.js +12 -0
  243. package/dist/core/applyOps.js.map +1 -0
  244. package/dist/core/device/index.js +4 -0
  245. package/dist/core/device/targets.js +17 -0
  246. package/dist/core/device/targets.js.map +1 -0
  247. package/dist/core/device/useDeviceProfile.js +75 -0
  248. package/dist/core/device/useDeviceProfile.js.map +1 -0
  249. package/dist/core/fillInPoseFrame.js +102 -0
  250. package/dist/core/fillInPoseFrame.js.map +1 -0
  251. package/dist/core/geometry/poseDescriptor.js +98 -0
  252. package/dist/core/geometry/poseDescriptor.js.map +1 -0
  253. package/dist/core/geometry/poseRotation.js +58 -0
  254. package/dist/core/geometry/poseRotation.js.map +1 -0
  255. package/dist/core/geometry/regionHit.js +102 -0
  256. package/dist/core/geometry/regionHit.js.map +1 -0
  257. package/dist/core/geometry/unionBounds.js +60 -0
  258. package/dist/core/geometry/unionBounds.js.map +1 -0
  259. package/dist/core/gradient.js +136 -0
  260. package/dist/core/gradient.js.map +1 -0
  261. package/dist/core/isPlainObject.js +11 -0
  262. package/dist/core/isPlainObject.js.map +1 -0
  263. package/dist/core/layers/render.js +150 -0
  264. package/dist/core/layers/render.js.map +1 -0
  265. package/dist/core/markerInset.js +24 -0
  266. package/dist/core/markerInset.js.map +1 -0
  267. package/dist/core/mixed.js +6 -0
  268. package/dist/core/mixed.js.map +1 -0
  269. package/dist/core/ops/arrange.js +31 -0
  270. package/dist/core/ops/arrange.js.map +1 -0
  271. package/dist/core/ops/create.js +32 -0
  272. package/dist/core/ops/create.js.map +1 -0
  273. package/dist/core/ops/createHistory.js +20 -0
  274. package/dist/core/ops/createHistory.js.map +1 -0
  275. package/dist/core/ops/delete.js +89 -0
  276. package/dist/core/ops/delete.js.map +1 -0
  277. package/dist/core/ops/registry.js +17 -0
  278. package/dist/core/ops/registry.js.map +1 -0
  279. package/dist/core/ops/reorder/algorithms.js +55 -0
  280. package/dist/core/ops/reorder/algorithms.js.map +1 -0
  281. package/dist/core/ops/reorder/index.js +140 -0
  282. package/dist/core/ops/reorder/index.js.map +1 -0
  283. package/dist/core/ops/reparent.js +52 -0
  284. package/dist/core/ops/reparent.js.map +1 -0
  285. package/dist/core/ops/select.js +34 -0
  286. package/dist/core/ops/select.js.map +1 -0
  287. package/dist/core/ops/setData.js +34 -0
  288. package/dist/core/ops/setData.js.map +1 -0
  289. package/dist/core/ops/setLayer.js +34 -0
  290. package/dist/core/ops/setLayer.js.map +1 -0
  291. package/dist/core/ops/setLayout.js +31 -0
  292. package/dist/core/ops/setLayout.js.map +1 -0
  293. package/dist/core/ops/setPath.js +57 -0
  294. package/dist/core/ops/setPath.js.map +1 -0
  295. package/dist/core/ops/setText.js +34 -0
  296. package/dist/core/ops/setText.js.map +1 -0
  297. package/dist/core/ops/slot.js +37 -0
  298. package/dist/core/ops/slot.js.map +1 -0
  299. package/dist/core/ops/transform.js +42 -0
  300. package/dist/core/ops/transform.js.map +1 -0
  301. package/dist/core/paintKinds.js +156 -0
  302. package/dist/core/paintKinds.js.map +1 -0
  303. package/dist/core/scene/NodeProperties.js +20 -0
  304. package/dist/core/scene/NodeProperties.js.map +1 -0
  305. package/dist/core/scene/NodeRouting.js +24 -0
  306. package/dist/core/scene/NodeRouting.js.map +1 -0
  307. package/dist/core/scene/arrivals.js +12 -0
  308. package/dist/core/scene/arrivals.js.map +1 -0
  309. package/dist/core/scene/composeFrame.js +29 -0
  310. package/dist/core/scene/composeFrame.js.map +1 -0
  311. package/dist/core/scene/depMemo.js +18 -0
  312. package/dist/core/scene/depMemo.js.map +1 -0
  313. package/dist/core/scene/dependents.js +66 -0
  314. package/dist/core/scene/dependents.js.map +1 -0
  315. package/dist/core/scene/derivedPath.js +31 -0
  316. package/dist/core/scene/derivedPath.js.map +1 -0
  317. package/dist/core/scene/effectivePose.js +78 -0
  318. package/dist/core/scene/effectivePose.js.map +1 -0
  319. package/dist/core/scene/kitRegistry.js +33 -0
  320. package/dist/core/scene/kitRegistry.js.map +1 -0
  321. package/dist/core/scene/layoutPass.js +96 -0
  322. package/dist/core/scene/layoutPass.js.map +1 -0
  323. package/dist/core/scene/nodeFnFields.js +83 -0
  324. package/dist/core/scene/nodeFnFields.js.map +1 -0
  325. package/dist/core/scene/nodeMemo.js +28 -0
  326. package/dist/core/scene/nodeMemo.js.map +1 -0
  327. package/dist/core/scene/poseFeed.js +87 -0
  328. package/dist/core/scene/poseFeed.js.map +1 -0
  329. package/dist/core/scene/poseOverrides.js +52 -0
  330. package/dist/core/scene/poseOverrides.js.map +1 -0
  331. package/dist/core/scene/poseSnapshot.js +54 -0
  332. package/dist/core/scene/poseSnapshot.js.map +1 -0
  333. package/dist/core/scene/scene.js +1271 -0
  334. package/dist/core/scene/scene.js.map +1 -0
  335. package/dist/core/scene/types.js +6 -0
  336. package/dist/core/scene/types.js.map +1 -0
  337. package/dist/core/scene/useScene.js +32 -0
  338. package/dist/core/scene/useScene.js.map +1 -0
  339. package/dist/core/selection/chromeState.js +31 -0
  340. package/dist/core/selection/chromeState.js.map +1 -0
  341. package/dist/core/selection/selectionTarget.js +6 -0
  342. package/dist/core/selection/selectionTarget.js.map +1 -0
  343. package/dist/core/selection/useSelection.js +71 -0
  344. package/dist/core/selection/useSelection.js.map +1 -0
  345. package/dist/core/shapeKinds.js +54 -0
  346. package/dist/core/shapeKinds.js.map +1 -0
  347. package/dist/core/strokeMarkerShapes.js +139 -0
  348. package/dist/core/strokeMarkerShapes.js.map +1 -0
  349. package/dist/core/strokeMarkers.js +28 -0
  350. package/dist/core/strokeMarkers.js.map +1 -0
  351. package/dist/core/stylus/stylus.js +39 -0
  352. package/dist/core/stylus/stylus.js.map +1 -0
  353. package/dist/core/stylus/usePointerStylus.js +51 -0
  354. package/dist/core/stylus/usePointerStylus.js.map +1 -0
  355. package/dist/core/usePaintKinds.js +17 -0
  356. package/dist/core/usePaintKinds.js.map +1 -0
  357. package/dist/core/viewport/clampView.js +24 -0
  358. package/dist/core/viewport/clampView.js.map +1 -0
  359. package/dist/core/viewport/clientToWorld.js +8 -0
  360. package/dist/core/viewport/clientToWorld.js.map +1 -0
  361. package/dist/core/viewport/createVelocityTracker.js +39 -0
  362. package/dist/core/viewport/createVelocityTracker.js.map +1 -0
  363. package/dist/core/viewport/fitToBounds.js +18 -0
  364. package/dist/core/viewport/fitToBounds.js.map +1 -0
  365. package/dist/core/viewport/fitViewToBounds.js +36 -0
  366. package/dist/core/viewport/fitViewToBounds.js.map +1 -0
  367. package/dist/core/viewport/interpolateView.js +34 -0
  368. package/dist/core/viewport/interpolateView.js.map +1 -0
  369. package/dist/core/viewport/meanScale.js +8 -0
  370. package/dist/core/viewport/meanScale.js.map +1 -0
  371. package/dist/core/viewport/parallax.js +111 -0
  372. package/dist/core/viewport/parallax.js.map +1 -0
  373. package/dist/core/viewport/pxExtent.js +42 -0
  374. package/dist/core/viewport/pxExtent.js.map +1 -0
  375. package/dist/core/viewport/sceneNodeClientRect.js +18 -0
  376. package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
  377. package/dist/core/viewport/screenSlop.js +27 -0
  378. package/dist/core/viewport/screenSlop.js.map +1 -0
  379. package/dist/core/viewport/useAutoCenter.js +32 -0
  380. package/dist/core/viewport/useAutoCenter.js.map +1 -0
  381. package/dist/core/viewport/useCanvasSize.js +29 -0
  382. package/dist/core/viewport/useCanvasSize.js.map +1 -0
  383. package/dist/core/viewport/useDecayLoop.js +63 -0
  384. package/dist/core/viewport/useDecayLoop.js.map +1 -0
  385. package/dist/core/viewport/useVelocityTracker.js +10 -0
  386. package/dist/core/viewport/useVelocityTracker.js.map +1 -0
  387. package/dist/core/viewport/useViewAnimation.js +63 -0
  388. package/dist/core/viewport/useViewAnimation.js.map +1 -0
  389. package/dist/core/viewport/view.js +37 -0
  390. package/dist/core/viewport/view.js.map +1 -0
  391. package/dist/core/viewport/viewTransform.js +11 -0
  392. package/dist/core/viewport/viewTransform.js.map +1 -0
  393. package/dist/core/viewport/viewportWorldRect.js +13 -0
  394. package/dist/core/viewport/viewportWorldRect.js.map +1 -0
  395. package/dist/core/viewport/wheelHandler.js +30 -0
  396. package/dist/core/viewport/wheelHandler.js.map +1 -0
  397. package/dist/core/viewport/zoomAt.js +22 -0
  398. package/dist/core/viewport/zoomAt.js.map +1 -0
  399. package/dist/core/viewport/zoomBounds.js +20 -0
  400. package/dist/core/viewport/zoomBounds.js.map +1 -0
  401. package/dist/{pointSnapToGrid-Dp2IxLGb.d.ts → cornerHandles-CDcZOV8h.d.ts} +3 -13
  402. package/dist/debug/createDebugOverlayLayer.js +358 -0
  403. package/dist/debug/createDebugOverlayLayer.js.map +1 -0
  404. package/dist/debug/createDebugSink.js +83 -0
  405. package/dist/debug/createDebugSink.js.map +1 -0
  406. package/dist/debug/defaultTheme.js +31 -0
  407. package/dist/debug/defaultTheme.js.map +1 -0
  408. package/dist/debug/flag.js +41 -0
  409. package/dist/debug/flag.js.map +1 -0
  410. package/dist/debug/frameStats.js +16 -0
  411. package/dist/debug/frameStats.js.map +1 -0
  412. package/dist/debug/parseDebugFlags.js +32 -0
  413. package/dist/debug/parseDebugFlags.js.map +1 -0
  414. package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
  415. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
  416. package/dist/features/chrome-caps/conditions.js +36 -0
  417. package/dist/features/chrome-caps/conditions.js.map +1 -0
  418. package/dist/features/chrome-caps/defaults.js +26 -0
  419. package/dist/features/chrome-caps/defaults.js.map +1 -0
  420. package/dist/features/chrome-caps/index.js +7 -0
  421. package/dist/features/chrome-caps/resolve.js +23 -0
  422. package/dist/features/chrome-caps/resolve.js.map +1 -0
  423. package/dist/features/chrome-caps/useHoverTracking.js +27 -0
  424. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
  425. package/dist/features/cursor/paintedCursorLayer.js +60 -0
  426. package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
  427. package/dist/features/focus/gateLayer.js +14 -0
  428. package/dist/features/focus/gateLayer.js.map +1 -0
  429. package/dist/features/focus/useCanvasFocus.js +29 -0
  430. package/dist/features/focus/useCanvasFocus.js.map +1 -0
  431. package/dist/features/groups/children.js +23 -0
  432. package/dist/features/groups/children.js.map +1 -0
  433. package/dist/features/groups/composePose.js +67 -0
  434. package/dist/features/groups/composePose.js.map +1 -0
  435. package/dist/features/groups/nestedHit.js +40 -0
  436. package/dist/features/groups/nestedHit.js.map +1 -0
  437. package/dist/features/groups/unionOfChildren.js +15 -0
  438. package/dist/features/groups/unionOfChildren.js.map +1 -0
  439. package/dist/features/images/imageCache.js +94 -0
  440. package/dist/features/images/imageCache.js.map +1 -0
  441. package/dist/features/ingestion/contentHandlers.js +37 -0
  442. package/dist/features/ingestion/contentHandlers.js.map +1 -0
  443. package/dist/features/ingestion/imageHandler.js +45 -0
  444. package/dist/features/ingestion/imageHandler.js.map +1 -0
  445. package/dist/features/ingestion/index.js +8 -0
  446. package/dist/features/ingestion/openFilePicker.js +15 -0
  447. package/dist/features/ingestion/openFilePicker.js.map +1 -0
  448. package/dist/features/ingestion/registerKitHandlers.js +26 -0
  449. package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
  450. package/dist/features/ingestion/svgHandler.js +58 -0
  451. package/dist/features/ingestion/svgHandler.js.map +1 -0
  452. package/dist/features/ingestion/weaselJsonHandler.js +39 -0
  453. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
  454. package/dist/features/longPress/longPressFeedback.js +96 -0
  455. package/dist/features/longPress/longPressFeedback.js.map +1 -0
  456. package/dist/features/meshPaint/bake.js +79 -0
  457. package/dist/features/meshPaint/bake.js.map +1 -0
  458. package/dist/features/meshPaint/bakeCache.js +59 -0
  459. package/dist/features/meshPaint/bakeCache.js.map +1 -0
  460. package/dist/features/meshPaint/handles.js +86 -0
  461. package/dist/features/meshPaint/handles.js.map +1 -0
  462. package/dist/features/meshPaint/lazyKind.js +1298 -0
  463. package/dist/features/meshPaint/lazyKind.js.map +1 -0
  464. package/dist/features/meshPaint/meshPaint.js +236 -0
  465. package/dist/features/meshPaint/meshPaint.js.map +1 -0
  466. package/dist/features/meshPaint/meshShader.js +6 -0
  467. package/dist/features/meshPaint/meshShader.js.map +1 -0
  468. package/dist/features/meshPaint/register.js +7 -0
  469. package/dist/features/meshPaint/register.js.map +1 -0
  470. package/dist/features/meshPaint/surface.js +110 -0
  471. package/dist/features/meshPaint/surface.js.map +1 -0
  472. package/dist/features/minimap/actions.js +53 -0
  473. package/dist/features/minimap/actions.js.map +1 -0
  474. package/dist/features/minimap/createMinimapContribution.js +96 -0
  475. package/dist/features/minimap/createMinimapContribution.js.map +1 -0
  476. package/dist/features/minimap/layers.js +103 -0
  477. package/dist/features/minimap/layers.js.map +1 -0
  478. package/dist/features/modes/modeLayers.js +113 -0
  479. package/dist/features/modes/modeLayers.js.map +1 -0
  480. package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
  481. package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
  482. package/dist/features/parallax/createParallaxLayer.js +26 -0
  483. package/dist/features/parallax/createParallaxLayer.js.map +1 -0
  484. package/dist/features/parallax/createParallaxPlane.js +26 -0
  485. package/dist/features/parallax/createParallaxPlane.js.map +1 -0
  486. package/dist/features/paths/anchorEdits.js +156 -0
  487. package/dist/features/paths/anchorEdits.js.map +1 -0
  488. package/dist/features/paths/anchors.js +154 -0
  489. package/dist/features/paths/anchors.js.map +1 -0
  490. package/dist/features/paths/booleans.js +2 -0
  491. package/dist/features/paths/index.js +15 -0
  492. package/dist/features/paths/markerCommands.js +116 -0
  493. package/dist/features/paths/markerCommands.js.map +1 -0
  494. package/dist/features/paths/markerSites.js +59 -0
  495. package/dist/features/paths/markerSites.js.map +1 -0
  496. package/dist/features/paths/markers.js +95 -0
  497. package/dist/features/paths/markers.js.map +1 -0
  498. package/dist/features/paths/nearestAnchor.js +36 -0
  499. package/dist/features/paths/nearestAnchor.js.map +1 -0
  500. package/dist/features/paths/originProjection.js +16 -0
  501. package/dist/features/paths/originProjection.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
  504. package/dist/features/paths/pathInWorld.js +41 -0
  505. package/dist/features/paths/pathInWorld.js.map +1 -0
  506. package/dist/features/paths/pathLayer.js +44 -0
  507. package/dist/features/paths/pathLayer.js.map +1 -0
  508. package/dist/features/paths/penPreviewLayer.js +220 -0
  509. package/dist/features/paths/penPreviewLayer.js.map +1 -0
  510. package/dist/features/paths/poseDescriptor.js +44 -0
  511. package/dist/features/paths/poseDescriptor.js.map +1 -0
  512. package/dist/features/paths/tessellate/stroke.js +230 -0
  513. package/dist/features/paths/tessellate/stroke.js.map +1 -0
  514. package/dist/features/patterns/index.js +23 -0
  515. package/dist/features/patterns/index.js.map +1 -0
  516. package/dist/features/patterns/patterns-builtin.js +38 -0
  517. package/dist/features/patterns/patterns-builtin.js.map +1 -0
  518. package/dist/features/patterns/resolveSpec.js +57 -0
  519. package/dist/features/patterns/resolveSpec.js.map +1 -0
  520. package/dist/features/patterns/tileGeometry.js +158 -0
  521. package/dist/features/patterns/tileGeometry.js.map +1 -0
  522. package/dist/features/pointer/PointerContext.js +45 -0
  523. package/dist/features/pointer/PointerContext.js.map +1 -0
  524. package/dist/features/poseRun/usePoseRun.js +70 -0
  525. package/dist/features/poseRun/usePoseRun.js.map +1 -0
  526. package/dist/features/selection/SelectionContext.js +46 -0
  527. package/dist/features/selection/SelectionContext.js.map +1 -0
  528. package/dist/features/selection/overlay.js +442 -0
  529. package/dist/features/selection/overlay.js.map +1 -0
  530. package/dist/features/simulation/createSimulation.js +61 -0
  531. package/dist/features/simulation/createSimulation.js.map +1 -0
  532. package/dist/features/simulation/types.js +6 -0
  533. package/dist/features/simulation/types.js.map +1 -0
  534. package/dist/features/simulation/useSimulation.js +74 -0
  535. package/dist/features/simulation/useSimulation.js.map +1 -0
  536. package/dist/features/text/domRuns.js +258 -0
  537. package/dist/features/text/domRuns.js.map +1 -0
  538. package/dist/features/text/fitTextPose.js +38 -0
  539. package/dist/features/text/fitTextPose.js.map +1 -0
  540. package/dist/features/text/hitTest.js +45 -0
  541. package/dist/features/text/hitTest.js.map +1 -0
  542. package/dist/features/text/renderLabel.js +14 -0
  543. package/dist/features/text/renderLabel.js.map +1 -0
  544. package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
  545. package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
  546. package/dist/features/text/runs/flagRange.js +53 -0
  547. package/dist/features/text/runs/flagRange.js.map +1 -0
  548. package/dist/features/text/runs/rangeStyle.js +135 -0
  549. package/dist/features/text/runs/rangeStyle.js.map +1 -0
  550. package/dist/features/text/textCommand.js +59 -0
  551. package/dist/features/text/textCommand.js.map +1 -0
  552. package/dist/features/text/textLayer.js +35 -0
  553. package/dist/features/text/textLayer.js.map +1 -0
  554. package/dist/features/text/textToPath.js +181 -0
  555. package/dist/features/text/textToPath.js.map +1 -0
  556. package/dist/features/text/useSceneTextEdit.js +138 -0
  557. package/dist/features/text/useSceneTextEdit.js.map +1 -0
  558. package/dist/features/text/useTextEdit.js +465 -0
  559. package/dist/features/text/useTextEdit.js.map +1 -0
  560. package/dist/features/tiling/createTiledLayer.js +63 -0
  561. package/dist/features/tiling/createTiledLayer.js.map +1 -0
  562. package/dist/features/tiling/tiledProject.js +14 -0
  563. package/dist/features/tiling/tiledProject.js.map +1 -0
  564. package/dist/features/viewports/viewResolver.js +59 -0
  565. package/dist/features/viewports/viewResolver.js.map +1 -0
  566. package/dist/features/viewports/viewportLayer.js +58 -0
  567. package/dist/features/viewports/viewportLayer.js.map +1 -0
  568. package/dist/icons/ArrowIcon.js +23 -0
  569. package/dist/icons/ArrowIcon.js.map +1 -0
  570. package/dist/icons/EllipseIcon.js +21 -0
  571. package/dist/icons/EllipseIcon.js.map +1 -0
  572. package/dist/icons/EyedropperIcon.js +49 -0
  573. package/dist/icons/EyedropperIcon.js.map +1 -0
  574. package/dist/icons/HandIcon.js +59 -0
  575. package/dist/icons/HandIcon.js.map +1 -0
  576. package/dist/icons/ImageIcon.js +34 -0
  577. package/dist/icons/ImageIcon.js.map +1 -0
  578. package/dist/icons/LassoIcon.js +22 -0
  579. package/dist/icons/LassoIcon.js.map +1 -0
  580. package/dist/icons/LineIcon.js +22 -0
  581. package/dist/icons/LineIcon.js.map +1 -0
  582. package/dist/icons/PenIcon.js +36 -0
  583. package/dist/icons/PenIcon.js.map +1 -0
  584. package/dist/icons/PencilIcon.js +25 -0
  585. package/dist/icons/PencilIcon.js.map +1 -0
  586. package/dist/icons/PolygonIcon.js +19 -0
  587. package/dist/icons/PolygonIcon.js.map +1 -0
  588. package/dist/icons/RectIcon.js +37 -0
  589. package/dist/icons/RectIcon.js.map +1 -0
  590. package/dist/icons/SelectIcon.js +20 -0
  591. package/dist/icons/SelectIcon.js.map +1 -0
  592. package/dist/icons/StarIcon.js +19 -0
  593. package/dist/icons/StarIcon.js.map +1 -0
  594. package/dist/icons/TextIcon.js +19 -0
  595. package/dist/icons/TextIcon.js.map +1 -0
  596. package/dist/icons/UnknownIcon.js +33 -0
  597. package/dist/icons/UnknownIcon.js.map +1 -0
  598. package/dist/icons/_base.js +12 -0
  599. package/dist/icons/_base.js.map +1 -0
  600. package/dist/index.css +2 -62
  601. package/dist/index.d.ts +1955 -1891
  602. package/dist/index.js +312 -13
  603. package/dist/input/keyState.js +76 -0
  604. package/dist/input/keyState.js.map +1 -0
  605. package/dist/input/useKeyState.js +22 -0
  606. package/dist/input/useKeyState.js.map +1 -0
  607. package/dist/interactions/actions/actionShortcuts.js +32 -0
  608. package/dist/interactions/actions/actionShortcuts.js.map +1 -0
  609. package/dist/interactions/actions/align/align.js +81 -0
  610. package/dist/interactions/actions/align/align.js.map +1 -0
  611. package/dist/interactions/actions/booleans/booleans.js +120 -0
  612. package/dist/interactions/actions/booleans/booleans.js.map +1 -0
  613. package/dist/interactions/actions/booleans/useBooleans.js +20 -0
  614. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
  615. package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
  616. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
  617. package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
  618. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
  619. package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
  620. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
  621. package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
  622. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
  623. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
  624. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
  625. package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
  626. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
  627. package/dist/interactions/actions/defaults/align.js +71 -0
  628. package/dist/interactions/actions/defaults/align.js.map +1 -0
  629. package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
  630. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
  631. package/dist/interactions/actions/defaults/areaSelect.js +75 -0
  632. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
  633. package/dist/interactions/actions/defaults/booleans.js +52 -0
  634. package/dist/interactions/actions/defaults/booleans.js.map +1 -0
  635. package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
  636. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
  637. package/dist/interactions/actions/defaults/clearSelection.js +19 -0
  638. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
  639. package/dist/interactions/actions/defaults/clipboard.js +78 -0
  640. package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
  641. package/dist/interactions/actions/defaults/clone.js +96 -0
  642. package/dist/interactions/actions/defaults/clone.js.map +1 -0
  643. package/dist/interactions/actions/defaults/createOutlines.js +47 -0
  644. package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
  645. package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
  646. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
  647. package/dist/interactions/actions/defaults/delete.js +61 -0
  648. package/dist/interactions/actions/defaults/delete.js.map +1 -0
  649. package/dist/interactions/actions/defaults/distribute.js +66 -0
  650. package/dist/interactions/actions/defaults/distribute.js.map +1 -0
  651. package/dist/interactions/actions/defaults/duplicate.js +83 -0
  652. package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
  653. package/dist/interactions/actions/defaults/editAnchors.js +100 -0
  654. package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
  655. package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
  656. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
  657. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
  658. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
  659. package/dist/interactions/actions/defaults/escape.js +26 -0
  660. package/dist/interactions/actions/defaults/escape.js.map +1 -0
  661. package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
  662. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
  663. package/dist/interactions/actions/defaults/flip.js +119 -0
  664. package/dist/interactions/actions/defaults/flip.js.map +1 -0
  665. package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
  666. package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
  667. package/dist/interactions/actions/defaults/group.js +131 -0
  668. package/dist/interactions/actions/defaults/group.js.map +1 -0
  669. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
  670. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
  671. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
  672. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
  673. package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
  674. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
  675. package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
  676. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
  677. package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
  678. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
  679. package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
  680. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
  681. package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
  682. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
  683. package/dist/interactions/actions/defaults/ingest.js +58 -0
  684. package/dist/interactions/actions/defaults/ingest.js.map +1 -0
  685. package/dist/interactions/actions/defaults/insert.js +288 -0
  686. package/dist/interactions/actions/defaults/insert.js.map +1 -0
  687. package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
  688. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
  689. package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
  690. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
  691. package/dist/interactions/actions/defaults/move.js +656 -0
  692. package/dist/interactions/actions/defaults/move.js.map +1 -0
  693. package/dist/interactions/actions/defaults/nudge.js +110 -0
  694. package/dist/interactions/actions/defaults/nudge.js.map +1 -0
  695. package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
  696. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
  697. package/dist/interactions/actions/defaults/reorder.js +143 -0
  698. package/dist/interactions/actions/defaults/reorder.js.map +1 -0
  699. package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
  700. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
  701. package/dist/interactions/actions/defaults/resize.js +332 -0
  702. package/dist/interactions/actions/defaults/resize.js.map +1 -0
  703. package/dist/interactions/actions/defaults/rotate.js +181 -0
  704. package/dist/interactions/actions/defaults/rotate.js.map +1 -0
  705. package/dist/interactions/actions/defaults/selectAll.js +27 -0
  706. package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
  707. package/dist/interactions/actions/defaults/setFill.js +27 -0
  708. package/dist/interactions/actions/defaults/setFill.js.map +1 -0
  709. package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
  710. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
  711. package/dist/interactions/actions/defaults/setStroke.js +36 -0
  712. package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
  713. package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
  714. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
  715. package/dist/interactions/actions/defaults/slice.js +39 -0
  716. package/dist/interactions/actions/defaults/slice.js.map +1 -0
  717. package/dist/interactions/actions/defaults/sliceOps.js +60 -0
  718. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
  719. package/dist/interactions/actions/defaults/toolActivate.js +35 -0
  720. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
  721. package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
  722. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
  723. package/dist/interactions/actions/defaults/undoRedo.js +51 -0
  724. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
  725. package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
  726. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
  727. package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
  728. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
  729. package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
  730. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
  731. package/dist/interactions/actions/distribute/distribute.js +42 -0
  732. package/dist/interactions/actions/distribute/distribute.js.map +1 -0
  733. package/dist/interactions/actions/distribute/plan.js +29 -0
  734. package/dist/interactions/actions/distribute/plan.js.map +1 -0
  735. package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
  736. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
  737. package/dist/interactions/actions/edit-anchors/handles.js +43 -0
  738. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
  739. package/dist/interactions/actions/flip/helpers.js +35 -0
  740. package/dist/interactions/actions/flip/helpers.js.map +1 -0
  741. package/dist/interactions/actions/geometryProjection.js +18 -0
  742. package/dist/interactions/actions/geometryProjection.js.map +1 -0
  743. package/dist/interactions/actions/gestureLifecycle.js +44 -0
  744. package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
  745. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
  746. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
  747. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
  748. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
  749. package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
  750. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
  751. package/dist/interactions/actions/move/gestureAdapter.js +37 -0
  752. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
  753. package/dist/interactions/actions/outlines/createOutlines.js +84 -0
  754. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
  756. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
  757. package/dist/interactions/actions/planeInput.js +168 -0
  758. package/dist/interactions/actions/planeInput.js.map +1 -0
  759. package/dist/interactions/actions/poseDescriptorDep.js +9 -0
  760. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
  761. package/dist/interactions/actions/poseFrame.js +38 -0
  762. package/dist/interactions/actions/poseFrame.js.map +1 -0
  763. package/dist/interactions/actions/previewOverrides.js +25 -0
  764. package/dist/interactions/actions/previewOverrides.js.map +1 -0
  765. package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
  766. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
  768. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
  769. package/dist/interactions/actions/resize/behaviors/index.js +8 -0
  770. package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
  771. package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
  772. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
  773. package/dist/interactions/actions/resize/cornerHandles.js +72 -0
  774. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
  775. package/dist/interactions/actions/resolveOverlays.js +60 -0
  776. package/dist/interactions/actions/resolveOverlays.js.map +1 -0
  777. package/dist/interactions/actions/resolvePreviews.js +61 -0
  778. package/dist/interactions/actions/resolvePreviews.js.map +1 -0
  779. package/dist/interactions/actions/rotate/geometry.js +46 -0
  780. package/dist/interactions/actions/rotate/geometry.js.map +1 -0
  781. package/dist/interactions/actions/rotate/handle.js +27 -0
  782. package/dist/interactions/actions/rotate/handle.js.map +1 -0
  783. package/dist/interactions/actions/spatialReference.js +42 -0
  784. package/dist/interactions/actions/spatialReference.js.map +1 -0
  785. package/dist/interactions/actions/useStandardActions.js +142 -0
  786. package/dist/interactions/actions/useStandardActions.js.map +1 -0
  787. package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
  788. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
  789. package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
  790. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
  791. package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
  792. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
  793. package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
  794. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
  795. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
  796. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
  797. package/dist/interactions/gestures/shared/originProjection.js +42 -0
  798. package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
  799. package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
  800. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
  801. package/dist/interactions/gestures/shared/snap.js +24 -0
  802. package/dist/interactions/gestures/shared/snap.js.map +1 -0
  803. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
  804. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
  805. package/dist/layout/arrivals.js +36 -0
  806. package/dist/layout/arrivals.js.map +1 -0
  807. package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
  808. package/dist/math.d.ts +4 -5
  809. package/dist/math.js +6 -4
  810. package/dist/mesh.d.ts +268 -0
  811. package/dist/mesh.js +7 -0
  812. package/dist/move.d.ts +7 -49
  813. package/dist/move.js +3 -142
  814. package/dist/originProjection-BSn4xiEy.d.ts +57 -0
  815. package/dist/patterns-builtin.js +3 -3
  816. package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
  817. package/dist/registerProgram-ateHDGjw.d.ts +193 -0
  818. package/dist/renderer/DrawCommand.js +6 -0
  819. package/dist/renderer/DrawCommand.js.map +1 -0
  820. package/dist/renderer/WeaselRenderer.js +328 -0
  821. package/dist/renderer/WeaselRenderer.js.map +1 -0
  822. package/dist/renderer/cache/GLImageCache.js +64 -0
  823. package/dist/renderer/cache/GLImageCache.js.map +1 -0
  824. package/dist/renderer/cache/GLMeshCache.js +102 -0
  825. package/dist/renderer/cache/GLMeshCache.js.map +1 -0
  826. package/dist/renderer/cache/GLTextureCache.js +51 -0
  827. package/dist/renderer/cache/GLTextureCache.js.map +1 -0
  828. package/dist/renderer/cache/GradientRampAtlas.js +82 -0
  829. package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
  830. package/dist/renderer/cache/cache.js +13 -0
  831. package/dist/renderer/cache/cache.js.map +1 -0
  832. package/dist/renderer/cache/markerCommandCache.js +59 -0
  833. package/dist/renderer/cache/markerCommandCache.js.map +1 -0
  834. package/dist/renderer/cache/outlineMeshCache.js +15 -0
  835. package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
  836. package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
  837. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
  838. package/dist/renderer/cache/strokeMeshCache.js +44 -0
  839. package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
  840. package/dist/renderer/cullDrawCommands.js +89 -0
  841. package/dist/renderer/cullDrawCommands.js.map +1 -0
  842. package/dist/renderer/draw.js +1109 -0
  843. package/dist/renderer/draw.js.map +1 -0
  844. package/dist/renderer/drawBatch.js +168 -0
  845. package/dist/renderer/drawBatch.js.map +1 -0
  846. package/dist/renderer/effects/EffectTargets.js +45 -0
  847. package/dist/renderer/effects/EffectTargets.js.map +1 -0
  848. package/dist/renderer/effects/builtins.js +31 -0
  849. package/dist/renderer/effects/builtins.js.map +1 -0
  850. package/dist/renderer/effects/composite.js +9 -0
  851. package/dist/renderer/effects/composite.js.map +1 -0
  852. package/dist/renderer/effects/effectPrelude.js +10 -0
  853. package/dist/renderer/effects/effectPrelude.js.map +1 -0
  854. package/dist/renderer/effects/types.js +10 -0
  855. package/dist/renderer/effects/types.js.map +1 -0
  856. package/dist/renderer/index.js +19 -0
  857. package/dist/renderer/math/color.js +341 -0
  858. package/dist/renderer/math/color.js.map +1 -0
  859. package/dist/renderer/math/mat3.js +71 -0
  860. package/dist/renderer/math/mat3.js.map +1 -0
  861. package/dist/renderer/math/patternSpace.js +22 -0
  862. package/dist/renderer/math/patternSpace.js.map +1 -0
  863. package/dist/renderer/math/viewToMat3.js +19 -0
  864. package/dist/renderer/math/viewToMat3.js.map +1 -0
  865. package/dist/renderer/paintResources.js +18 -0
  866. package/dist/renderer/paintResources.js.map +1 -0
  867. package/dist/renderer/paintScratch.js +37 -0
  868. package/dist/renderer/paintScratch.js.map +1 -0
  869. package/dist/renderer/shaders/ShaderProgram.js +74 -0
  870. package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
  871. package/dist/renderer/shaders/batchFill.js +118 -0
  872. package/dist/renderer/shaders/batchFill.js.map +1 -0
  873. package/dist/renderer/shaders/customPrelude.js +34 -0
  874. package/dist/renderer/shaders/customPrelude.js.map +1 -0
  875. package/dist/renderer/shaders/extractUniformNames.js +184 -0
  876. package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
  877. package/dist/renderer/shaders/glyphPaint.js +61 -0
  878. package/dist/renderer/shaders/glyphPaint.js.map +1 -0
  879. package/dist/renderer/shaders/gradFill.js +30 -0
  880. package/dist/renderer/shaders/gradFill.js.map +1 -0
  881. package/dist/renderer/shaders/imageFill.js +14 -0
  882. package/dist/renderer/shaders/imageFill.js.map +1 -0
  883. package/dist/renderer/shaders/pathFill.js +13 -0
  884. package/dist/renderer/shaders/pathFill.js.map +1 -0
  885. package/dist/renderer/shaders/patternFill.js +24 -0
  886. package/dist/renderer/shaders/patternFill.js.map +1 -0
  887. package/dist/renderer/shaders/registerProgram.js +18 -0
  888. package/dist/renderer/shaders/registerProgram.js.map +1 -0
  889. package/dist/renderer/spriteSheet.js +14 -0
  890. package/dist/renderer/spriteSheet.js.map +1 -0
  891. package/dist/renderer/state/GroupState.js +77 -0
  892. package/dist/renderer/state/GroupState.js.map +1 -0
  893. package/dist/renderer/syntheticItalic.js +6 -0
  894. package/dist/renderer/syntheticItalic.js.map +1 -0
  895. package/dist/renderer/textures/registerTexture.js +14 -0
  896. package/dist/renderer/textures/registerTexture.js.map +1 -0
  897. package/dist/renderer.d.ts +11 -21
  898. package/dist/renderer.js +18 -13
  899. package/dist/resize.d.ts +10 -46
  900. package/dist/resize.js +7 -5
  901. package/dist/routing.js +2 -3
  902. package/dist/scheduling/useVisibleRaf.js +69 -0
  903. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  904. package/dist/test-hook/createTestHook.js +39 -0
  905. package/dist/test-hook/createTestHook.js.map +1 -0
  906. package/dist/test-hook/install.js +12 -0
  907. package/dist/test-hook/install.js.map +1 -0
  908. package/dist/test-seams-fYf6m5pu.d.ts +356 -0
  909. package/dist/test-seams.d.ts +6 -0
  910. package/dist/test-seams.js +3 -0
  911. package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
  912. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
  913. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
  914. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
  915. package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
  916. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
  917. package/dist/tools/builtin/hand/useHandTool.js +31 -0
  918. package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
  919. package/dist/tools/builtin/image/useImageTool.js +41 -0
  920. package/dist/tools/builtin/image/useImageTool.js.map +1 -0
  921. package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
  922. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
  923. package/dist/tools/builtin/line/useLineTool.js +33 -0
  924. package/dist/tools/builtin/line/useLineTool.js.map +1 -0
  925. package/dist/tools/builtin/pen/usePenTool.js +414 -0
  926. package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
  927. package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
  928. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
  929. package/dist/tools/builtin/pickTopMostHit.js +45 -0
  930. package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
  931. package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
  932. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
  933. package/dist/tools/builtin/rect/useRectTool.js +32 -0
  934. package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
  935. package/dist/tools/builtin/select/selectionContributions.js +109 -0
  936. package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
  937. package/dist/tools/builtin/select/useSelectTool.js +162 -0
  938. package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
  939. package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
  940. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
  941. package/dist/tools/builtin/slice/useSliceTool.js +263 -0
  942. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
  943. package/dist/tools/builtin/star/useStarTool.js +82 -0
  944. package/dist/tools/builtin/star/useStarTool.js.map +1 -0
  945. package/dist/tools/builtin/text/useTextTool.js +177 -0
  946. package/dist/tools/builtin/text/useTextTool.js.map +1 -0
  947. package/dist/tools/overlayBinding.js +8 -0
  948. package/dist/tools/overlayBinding.js.map +1 -0
  949. package/dist/tools/prefs.js +47 -0
  950. package/dist/tools/prefs.js.map +1 -0
  951. package/dist/tools/useKeybindings.js +66 -0
  952. package/dist/tools/useKeybindings.js.map +1 -0
  953. package/dist/{types-D-9QWBy5.d.ts → types-CA54-mAZ.d.ts} +181 -13
  954. package/dist/{types-qYpyTAiZ.d.ts → types-DSjd6W3n.d.ts} +32 -6
  955. package/dist/util/color.js +26 -0
  956. package/dist/util/color.js.map +1 -0
  957. package/dist/util/constrainTo45.js +17 -0
  958. package/dist/util/constrainTo45.js.map +1 -0
  959. package/dist/util/paint.js +72 -0
  960. package/dist/util/paint.js.map +1 -0
  961. package/dist/version.js +6 -0
  962. package/dist/version.js.map +1 -0
  963. package/package.json +29 -19
  964. package/dist/chunk-3TY6FHAF.js +0 -170
  965. package/dist/chunk-3TY6FHAF.js.map +0 -1
  966. package/dist/chunk-DGWNNKGD.js +0 -248
  967. package/dist/chunk-DGWNNKGD.js.map +0 -1
  968. package/dist/chunk-G4ZGQMY7.js +0 -33372
  969. package/dist/chunk-G4ZGQMY7.js.map +0 -1
  970. package/dist/chunk-L5YNZYEG.js +0 -648
  971. package/dist/chunk-L5YNZYEG.js.map +0 -1
  972. package/dist/chunk-LU4IJ52W.js +0 -111
  973. package/dist/chunk-LU4IJ52W.js.map +0 -1
  974. package/dist/chunk-M24CLARN.js +0 -28
  975. package/dist/chunk-M24CLARN.js.map +0 -1
  976. package/dist/chunk-NE27EOLP.js +0 -146
  977. package/dist/chunk-NE27EOLP.js.map +0 -1
  978. package/dist/chunk-PNNZSYRD.js +0 -318
  979. package/dist/chunk-PNNZSYRD.js.map +0 -1
  980. package/dist/chunk-UPZY4ART.js +0 -29
  981. package/dist/chunk-UPZY4ART.js.map +0 -1
  982. package/dist/chunk-WPNA6L5O.js +0 -250
  983. package/dist/chunk-WPNA6L5O.js.map +0 -1
  984. package/dist/chunk-XMAWPGTK.js +0 -128
  985. package/dist/chunk-XMAWPGTK.js.map +0 -1
  986. package/dist/clipboard.js.map +0 -1
  987. package/dist/clone.js.map +0 -1
  988. package/dist/grid-CY5UKlZh.d.ts +0 -98
  989. package/dist/index.css.map +0 -1
  990. package/dist/index.js.map +0 -1
  991. package/dist/insert.d.ts +0 -36
  992. package/dist/insert.js +0 -81
  993. package/dist/insert.js.map +0 -1
  994. package/dist/math.js.map +0 -1
  995. package/dist/move.js.map +0 -1
  996. package/dist/path-JEV2c5If.d.ts +0 -48
  997. package/dist/patterns-builtin.js.map +0 -1
  998. package/dist/renderer.css +0 -62
  999. package/dist/renderer.css.map +0 -1
  1000. package/dist/renderer.js.map +0 -1
  1001. package/dist/resize.js.map +0 -1
  1002. package/dist/routing.js.map +0 -1
  1003. package/dist/types-D2tTKEU0.d.ts +0 -18
@@ -0,0 +1,66 @@
1
+ import { enumerateAnchors as e } from "../interactions/actions/edit-anchors/geometry.js";
2
+ //#region src/affordances/pathAnchors.ts
3
+ var t = "path-edit.anchors";
4
+ function n(n, r = {}) {
5
+ let { hitRadius: i = 8, cursor: a = "pointer" } = r, o = (e) => {
6
+ let t = n();
7
+ if (!t) return [];
8
+ let r = [];
9
+ for (let n of e.selection) {
10
+ let e = t.getPose(n);
11
+ e && e.kind === "polygon" && r.push({
12
+ id: n,
13
+ path: e
14
+ });
15
+ }
16
+ return r;
17
+ }, s = (e, t, n, r, o, s) => ({
18
+ id: e,
19
+ targetId: null,
20
+ shape: {
21
+ kind: "point",
22
+ x: n,
23
+ y: r,
24
+ hitRadiusPx: i
25
+ },
26
+ hitKind: s,
27
+ cursor: a,
28
+ bind: () => ({ initialScratch: {
29
+ ...o,
30
+ targetId: t
31
+ } })
32
+ });
33
+ return [{
34
+ id: t,
35
+ regions(t) {
36
+ let r = n()?.editingId ?? null, i = [];
37
+ for (let { id: n, path: a } of o(t)) if (r === null || n === r) for (let t of e(a)) i.push(s(`${n}:anchor:${t.anchorIndex}`, n, t.x, t.y, {
38
+ targetId: n,
39
+ anchorIndex: t.anchorIndex,
40
+ part: "anchor"
41
+ }, `anchor:${t.anchorIndex}`));
42
+ return i;
43
+ }
44
+ }, {
45
+ id: t,
46
+ regions(t) {
47
+ let r = n()?.editingId ?? null;
48
+ if (r === null) return [];
49
+ let i = [];
50
+ for (let { id: n, path: a } of o(t)) if (n === r) for (let t of e(a)) t.controlIn && i.push(s(`${n}:controlIn:${t.anchorIndex}`, n, t.controlIn.x, t.controlIn.y, {
51
+ targetId: n,
52
+ anchorIndex: t.anchorIndex,
53
+ part: "controlIn"
54
+ }, `controlIn:${t.anchorIndex}`)), t.controlOut && i.push(s(`${n}:controlOut:${t.anchorIndex}`, n, t.controlOut.x, t.controlOut.y, {
55
+ targetId: n,
56
+ anchorIndex: t.anchorIndex,
57
+ part: "controlOut"
58
+ }, `controlOut:${t.anchorIndex}`));
59
+ return i;
60
+ }
61
+ }];
62
+ }
63
+ //#endregion
64
+ export { t as PATH_ANCHOR_CHROME_ID, n as createPathAnchorAffordances };
65
+
66
+ //# sourceMappingURL=pathAnchors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathAnchors.js","names":["PATH_ANCHOR_CHROME_ID","createPathAnchorAffordances","opts","editablePaths","anchorState","getAnchorState","out","id","state","pose","point","hitRadius","scratch","editingId","a","enumerateAnchors","path"],"sources":["../../src/affordances/pathAnchors.ts"],"sourcesContent":["/**\n * Path anchor + control-handle affordances.\n *\n * These were the last piece of selection chrome whose geometry lived only\n * inside `canvas/affordanceAt.ts`'s hand-written classifier. Expressing them\n * as regions puts every kit affordance behind one hit-test walk, which is\n * what lets `AffordanceRegion.cursor` and nearest-region picking apply here\n * too rather than only to the chrome that happened to be declarative already.\n */\n\nimport type { CursorSpec } from '@weasel-js/cursor';\nimport type { Affordance, AffordanceBinding, AffordanceRegion, CommonAffordanceScratch } from './types';\nimport type { ChromeState } from 'core/selection/chromeState';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { enumerateAnchors } from 'interactions/actions/edit-anchors/geometry';\n\n/**\n * Live anchor-editing state, read fresh on every hit-test.\n *\n * Anchors are not derivable from `ChromeState` — they come off the editable\n * path behind whatever the consumer's `editAnchors` dep exposes — so this\n * thunk is the seam. It's called on every pointer event, so it must be cheap\n * (O(1) field reads); enumeration happens inside `regions()`.\n */\nexport interface AnchorState {\n /** Id of the path currently in anchor-edit mode, or `null`. Control handles\n * are only hittable on the path that is being edited. */\n editingId: string | null;\n /** Current editable path for a node id. Non-polygon values are ignored. */\n getPose(id: string): unknown;\n}\n\n/** Options for the path-anchor affordances. */\nexport interface PathAnchorAffordanceOptions {\n /** Hit radius (screen-px) for anchor and control points. Default 8. */\n hitRadius?: number;\n /** Cursor while hovering an anchor or control. Defaults to `'pointer'`. */\n cursor?: CursorSpec;\n}\n\n/** What an anchor hit hands to the action that follows: which path, which\n * anchor, and whether the grab was on the anchor itself or one of its two\n * control points. */\nexport interface AnchorScratch extends CommonAffordanceScratch {\n /** Node id of the path the anchor belongs to. */\n targetId: string;\n /** Sequential anchor index in path walk order. */\n anchorIndex: number;\n /** Which of the anchor's three grabbable points this is. */\n part: 'anchor' | 'controlIn' | 'controlOut';\n}\n\n/** Chrome-caps id gating both returned affordances. */\nexport const PATH_ANCHOR_CHROME_ID = 'path-edit.anchors';\n\n/**\n * Anchor + control affordances for the selected paths, bottom → top.\n *\n * Returns **two** affordances rather than one so that a control handle beats\n * an anchor regardless of which is nearer — the same preference `hitAnchor`\n * encodes, and the same one the rendering has (controls draw on top). Within\n * each of the two, nearest wins. They deliberately share one id: chrome-caps\n * gates anchor editing as a single piece of chrome, and splitting the id\n * would invent a visibility rule nothing asked for.\n *\n * Order matters — spread this into an affordance list in the returned order.\n */\nexport function createPathAnchorAffordances(\n getAnchorState: () => AnchorState | null,\n opts: PathAnchorAffordanceOptions = {},\n): Affordance[] {\n const { hitRadius = 8, cursor = 'pointer' } = opts;\n\n /** Selected polygon paths, paired with their node id. */\n const editablePaths = (state: ChromeState): Array<{ id: string; path: PolygonPath }> => {\n const anchorState = getAnchorState();\n if (!anchorState) return [];\n const out: Array<{ id: string; path: PolygonPath }> = [];\n for (const id of state.selection) {\n const pose = anchorState.getPose(id);\n if (!pose || (pose as { kind?: string }).kind !== 'polygon') continue;\n out.push({ id, path: pose as PolygonPath });\n }\n return out;\n };\n\n const point = (\n id: string,\n targetId: string,\n x: number,\n y: number,\n scratch: AnchorScratch,\n hitKind: string,\n ): AffordanceRegion => ({\n id,\n // Anchor coordinates are already in the path's own space, which for an\n // editable path is world space — the pose rotation that `targetId` would\n // introduce is baked into the coords. Anchoring to `null` keeps the\n // framework from applying it twice.\n targetId: null,\n shape: { kind: 'point', x, y, hitRadiusPx: hitRadius },\n hitKind,\n cursor,\n bind: (): AffordanceBinding => ({ initialScratch: { ...scratch, targetId } }),\n });\n\n const anchors: Affordance = {\n id: PATH_ANCHOR_CHROME_ID,\n regions(state) {\n const editingId = getAnchorState()?.editingId ?? null;\n const out: AffordanceRegion[] = [];\n for (const { id, path } of editablePaths(state)) {\n // `editAnchorsAction` edits whatever path the dep says is in edit\n // mode, ignoring which one was hit — so once a path IS being edited,\n // only its own anchors may claim the press. The overlay paints only\n // that path's anchors too.\n if (editingId !== null && id !== editingId) continue;\n for (const a of enumerateAnchors(path)) {\n out.push(point(\n `${id}:anchor:${a.anchorIndex}`,\n id, a.x, a.y,\n { targetId: id, anchorIndex: a.anchorIndex, part: 'anchor' },\n `anchor:${a.anchorIndex}`,\n ));\n }\n }\n return out;\n },\n };\n\n const controls: Affordance = {\n id: PATH_ANCHOR_CHROME_ID,\n regions(state) {\n const anchorState = getAnchorState();\n const editingId = anchorState?.editingId ?? null;\n if (editingId === null) return [];\n const out: AffordanceRegion[] = [];\n for (const { id, path } of editablePaths(state)) {\n // Controls are grabbable only on the path actually in edit mode.\n if (id !== editingId) continue;\n for (const a of enumerateAnchors(path)) {\n if (a.controlIn) {\n out.push(point(\n `${id}:controlIn:${a.anchorIndex}`,\n id, a.controlIn.x, a.controlIn.y,\n { targetId: id, anchorIndex: a.anchorIndex, part: 'controlIn' },\n `controlIn:${a.anchorIndex}`,\n ));\n }\n if (a.controlOut) {\n out.push(point(\n `${id}:controlOut:${a.anchorIndex}`,\n id, a.controlOut.x, a.controlOut.y,\n { targetId: id, anchorIndex: a.anchorIndex, part: 'controlOut' },\n `controlOut:${a.anchorIndex}`,\n ));\n }\n }\n }\n return out;\n },\n };\n\n return [anchors, controls];\n}\n"],"mappings":";;AAqDA,IAAaA,IAAwB;AAcrC,SAAgBC,EACd,GACA,IAAoC,CAAC,GACvB;CACd,IAAM,EAAE,eAAY,GAAG,YAAS,cAAcC,GAGxCC,KAAiB,MAAiE;EACtF,IAAMC,IAAcC,EAAe;EACnC,IAAI,CAACD,GAAa,OAAO,CAAC;EAC1B,IAAME,IAAgD,CAAC;EACvD,KAAK,IAAMC,KAAMC,EAAM,WAAW;GAChC,IAAMC,IAAOL,EAAY,QAAQG,CAAE;GACnC,AAAKE,KAASA,EAA2B,SAAS,aAClDH,EAAI,KAAK;IAAE;IAAI,MAAMG;GAAoB,CAAC;EAC5C;EACA,OAAOH;CACT,GAEMI,KACJ,GACA,GACA,GACA,GACA,GACA,OACsB;EACtB;EAKA,UAAU;EACV,OAAO;GAAE,MAAM;GAAS;GAAG;GAAG,aAAaC;EAAU;EACrD;EACA;EACA,aAAgC,EAAE,gBAAgB;GAAE,GAAGC;GAAS;EAAS,EAAE;CAC7E;CA2DA,OAAO,CAAC;EAxDN,IAAIZ;EACJ,QAAQ,GAAO;GACb,IAAMa,IAAYR,EAAe,CAAC,EAAE,aAAa,MAC3CC,IAA0B,CAAC;GACjC,KAAK,IAAM,EAAE,OAAI,aAAUH,EAAcK,CAAK,GAK5C,IAAIK,MAAc,QAAQN,MAAOM,GACjC,KAAK,IAAMC,KAAKC,EAAiBC,CAAI,GACnC,EAAI,KAAKN,EACP,GAAGH,EAAG,UAAUO,EAAE,eAClBP,GAAIO,EAAE,GAAGA,EAAE,GACX;IAAE,UAAUP;IAAI,aAAaO,EAAE;IAAa,MAAM;GAAS,GAC3D,UAAUA,EAAE,aACd,CAAC;GAGL,OAAOR;EACT;CAoCM,GAAS;EAhCf,IAAIN;EACJ,QAAQ,GAAO;GAEb,IAAMa,IADcR,EACF,CAAA,EAAa,aAAa;GAC5C,IAAIQ,MAAc,MAAM,OAAO,CAAC;GAChC,IAAMP,IAA0B,CAAC;GACjC,KAAK,IAAM,EAAE,OAAI,aAAUH,EAAcK,CAAK,GAE5C,IAAID,MAAOM,GACX,KAAK,IAAMC,KAAKC,EAAiBC,CAAI,GASnC,AARIF,EAAE,aACJR,EAAI,KAAKI,EACP,GAAGH,EAAG,aAAaO,EAAE,eACrBP,GAAIO,EAAE,UAAU,GAAGA,EAAE,UAAU,GAC/B;IAAE,UAAUP;IAAI,aAAaO,EAAE;IAAa,MAAM;GAAY,GAC9D,aAAaA,EAAE,aACjB,CAAC,GAECA,EAAE,cACJR,EAAI,KAAKI,EACP,GAAGH,EAAG,cAAcO,EAAE,eACtBP,GAAIO,EAAE,WAAW,GAAGA,EAAE,WAAW,GACjC;IAAE,UAAUP;IAAI,aAAaO,EAAE;IAAa,MAAM;GAAa,GAC/D,cAAcA,EAAE,aAClB,CAAC;GAIP,OAAOR;EACT;CAGe,CAAQ;AAC3B"}
@@ -0,0 +1,103 @@
1
+ import { MULTI_RESIZE_TARGET_ID as e } from "../core/selection/selectionTarget.js";
2
+ import { angleOf as t, transformOf as n } from "./hitAffordanceRegions.js";
3
+ //#region src/affordances/rotationHandle.ts
4
+ var r = (e) => "fill" in e || "stroke" in e || "insetPx" in e, i = {
5
+ fill: {
6
+ fill: "solid",
7
+ color: "rgba(26, 19, 13, 0.12)"
8
+ },
9
+ insetPx: 10
10
+ };
11
+ function a(e = {}) {
12
+ let { bandPx: a = 24, paint: s = i, cursor: c, handle: l } = e, u = s ? r(s) ? {
13
+ kind: "annulus",
14
+ ...s.fill ? { fill: s.fill } : {},
15
+ ...s.stroke ? { stroke: s.stroke } : {},
16
+ ...s.insetPx === void 0 ? {} : { insetPx: s.insetPx }
17
+ } : {
18
+ kind: "annulus",
19
+ stroke: s
20
+ } : null;
21
+ return {
22
+ id: "selection.rotation-handle",
23
+ regions(e) {
24
+ let r = o(e);
25
+ if (!r) return [];
26
+ let i = r.bounds, s = i.width / 2, d = i.height / 2, f = c ?? {
27
+ glyph: "rotate",
28
+ angle: t(n(e, r.id)),
29
+ fallback: "grab"
30
+ }, p = () => ({ initialScratch: {
31
+ targetId: r.id,
32
+ fixedPoint: {
33
+ x: i.x + s,
34
+ y: i.y + d
35
+ }
36
+ } }), m = {
37
+ id: "selection.rotation-handle",
38
+ targetId: r.id,
39
+ shape: {
40
+ kind: "annulus",
41
+ cx: i.x + s,
42
+ cy: i.y + d,
43
+ rx: s * Math.SQRT2,
44
+ ry: d * Math.SQRT2,
45
+ innerX: i.x,
46
+ innerY: i.y,
47
+ innerWidth: i.width,
48
+ innerHeight: i.height,
49
+ minBandPx: a
50
+ },
51
+ ...u ? { paint: u } : {},
52
+ hitKind: "rotate-handle",
53
+ cursor: f,
54
+ bind: p
55
+ };
56
+ return l ? [m, {
57
+ id: "rotation-badge",
58
+ targetId: r.id,
59
+ shape: {
60
+ kind: "point",
61
+ x: i.x + s,
62
+ y: i.y,
63
+ hitRadiusPx: l.hitRadiusPx,
64
+ standoff: {
65
+ px: l.distancePx,
66
+ normal: {
67
+ x: 0,
68
+ y: -1
69
+ }
70
+ }
71
+ },
72
+ hitKind: "rotate-handle",
73
+ cursor: f,
74
+ bind: p
75
+ }] : [m];
76
+ }
77
+ };
78
+ }
79
+ function o(t) {
80
+ if (t.selection.length === 1) {
81
+ let e = t.selection[0];
82
+ if (t.canRotate && !t.canRotate(e)) return null;
83
+ let n = t.boundsOf(e);
84
+ return n ? {
85
+ id: e,
86
+ bounds: n
87
+ } : null;
88
+ }
89
+ if (t.multiActive && t.unionBounds) {
90
+ if (t.canRotate) {
91
+ for (let e of t.selection) if (!t.canRotate(e)) return null;
92
+ }
93
+ return {
94
+ id: e,
95
+ bounds: t.unionBounds
96
+ };
97
+ }
98
+ return null;
99
+ }
100
+ //#endregion
101
+ export { a as createRotationAffordance };
102
+
103
+ //# sourceMappingURL=rotationHandle.js.map
@@ -0,0 +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 { FillStyle, Stroke } 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 | Stroke\n | { fill?: FillStyle; stroke?: Stroke; 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?: FillStyle; stroke?: Stroke; insetPx?: number };\n\nconst isAnnulusForm = (paint: Stroke | 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 invisible elliptical ring\n * that wraps the selection: the smallest ellipse containing the AABB,\n * minus the AABB itself. Hovering the ring sets the cursor (default\n * `'grab'`) 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 `paint` option drives optional dev-time ring stroke; production\n * defaults to invisible (the cursor change is the only on-hover 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?: FillStyle; stroke?: Stroke; 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"}
@@ -0,0 +1,118 @@
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";
4
+ import { getScratch as r, scratchKey as i, setScratch as a } from "@weasel-js/routing";
5
+ //#region src/animation/behaviors/momentum.ts
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.bounds, f = i.boundary ?? "stop", p = i.poseDescriptor ?? n, m = (e, t, n, r) => {
9
+ let i = e + n, a = t + r;
10
+ if (!d) return {
11
+ nx: i,
12
+ ny: a,
13
+ hit: !1
14
+ };
15
+ let o = !1;
16
+ return i < d.x ? (i = d.x, o = !0) : i > d.x + d.width && (i = d.x + d.width, o = !0), a < d.y ? (a = d.y, o = !0) : a > d.y + d.height && (a = d.y + d.height, o = !0), {
17
+ nx: i,
18
+ ny: a,
19
+ hit: o
20
+ };
21
+ }, h = (e) => {
22
+ let t = r(e.scratch, o);
23
+ t || (t = [], a(e.scratch, o, t)), t.push({
24
+ t: u(),
25
+ x: e.pointer.worldX,
26
+ y: e.pointer.worldY
27
+ });
28
+ let n = u() - l * 4;
29
+ for (; t.length > 1 && t[0].t < n;) t.shift();
30
+ };
31
+ return {
32
+ onStart(e) {
33
+ a(e.scratch, o, []), h(e);
34
+ },
35
+ onMove(e) {
36
+ h(e);
37
+ },
38
+ onEnd(n, a) {
39
+ if (a.answered) return;
40
+ let u = r(n.scratch, o) ?? [];
41
+ if (u.length < 2) return;
42
+ let h = u[u.length - 1], g = h.t - l, _ = u[0];
43
+ for (let e of u) if (e.t >= g) {
44
+ _ = e;
45
+ break;
46
+ }
47
+ let v = (h.t - _.t) / 1e3;
48
+ if (v <= 0) return;
49
+ let y = (h.x - _.x) / v, b = (h.y - _.y) / v;
50
+ if (Math.hypot(y, b) < c) return;
51
+ let x = new Map(n.current), S = {
52
+ x: 0,
53
+ y: 0
54
+ }, C = n.adapter, w = /* @__PURE__ */ new Map(), T = null;
55
+ T = i.animator.decay({
56
+ from: {
57
+ x: 0,
58
+ y: 0
59
+ },
60
+ velocity: {
61
+ x: y,
62
+ y: b
63
+ },
64
+ friction: s,
65
+ add: (e, t) => ({
66
+ x: e.x + t.x,
67
+ y: e.y + t.y
68
+ }),
69
+ scale: (e, t) => ({
70
+ x: e.x * t,
71
+ y: e.y * t
72
+ }),
73
+ magnitude: (e) => Math.hypot(e.x, e.y),
74
+ onTick: (e) => {
75
+ S = e;
76
+ let r = d !== void 0;
77
+ for (let i of n.draggedIds) {
78
+ let n = x.get(i);
79
+ if (!n) continue;
80
+ let a = p.getBounds(n), { nx: o, ny: s, hit: c } = m(a.x, a.y, e.x, e.y);
81
+ c || (r = !1), w.set(i, {
82
+ x: o,
83
+ y: s
84
+ }), C.setPose(i, t(n, o - a.x, s - a.y, p));
85
+ }
86
+ f === "stop" && r && T && (T.cancel(), E());
87
+ },
88
+ onDone: () => {
89
+ E();
90
+ }
91
+ });
92
+ function E() {
93
+ if (!C.applyOps) return;
94
+ let r = [];
95
+ for (let i of n.draggedIds) {
96
+ let n = x.get(i);
97
+ if (!n) continue;
98
+ let a = p.getBounds(n), o = w.get(i) ?? {
99
+ x: a.x + S.x,
100
+ y: a.y + S.y
101
+ }, s = t(n, o.x - a.x, o.y - a.y, p);
102
+ r.push(e({
103
+ id: i,
104
+ from: n,
105
+ to: s,
106
+ label: "flick"
107
+ }));
108
+ }
109
+ r.length > 0 && C.applyOps(r, "flick");
110
+ }
111
+ return null;
112
+ }
113
+ };
114
+ }
115
+ //#endregion
116
+ export { s as momentum };
117
+
118
+ //# sourceMappingURL=momentum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"momentum.js","names":["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","end","last","first","s","dt","vx","vy","startPoses","lastValue","adapter","finalPositions","decayHandle","a","b","v","k","delta","allHit","id","start","o","translatePoseViaDescriptor","commitFlick","ops","fp","finalPose","createTransformOp"],"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 { 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 px/sec\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 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 travelling, until friction brings it below\n * `threshold`.\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.\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 return {\n onStart(ctx) {\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 as { setPose(id: string, p: TPose): void; applyOps?(ops: Op[], label: string): void };\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 let decayHandle: { cancel(): void } | null = null;\n decayHandle = opts.animator.decay<RectLike>({\n from: { x: 0, y: 0 },\n velocity: { x: vx, y: vy },\n friction,\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 for (const id of ctx.draggedIds) {\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 adapter.setPose(id, translatePoseViaDescriptor(start, nx - o.x, ny - o.y, d));\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 && decayHandle) {\n decayHandle.cancel();\n // Manually fire onDone since cancel() bypasses it.\n commitFlick();\n }\n },\n onDone: () => {\n commitFlick();\n },\n });\n\n function commitFlick(): void {\n if (!adapter.applyOps) return;\n const ops: Op[] = [];\n for (const id of ctx.draggedIds) {\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 ops.push(createTransformOp<TPose>({ id, from: start, to: finalPose, label: 'flick' }));\n }\n if (ops.length > 0) adapter.applyOps(ops, 'flick');\n }\n\n return null;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import { hslToRgb as e } from "../renderer/math/color.js";
2
+ import { lerpColorArray as t } from "@weasel-js/paint";
3
+ import { resolveEasing as n } from "@weasel-js/geom";
4
+ //#region src/animation/colorHelpers.ts
5
+ function r(e, t) {
6
+ if (e.length !== t.length) throw Error(`vertex colors: length mismatch (from=${e.length}, to=${t.length})`);
7
+ if (e.length === 0 || e.length % 4 != 0) throw Error(`vertex colors: length ${e.length} must be a positive multiple of 4`);
8
+ }
9
+ function i(e) {
10
+ if (e.interpolate) return e.interpolate;
11
+ let n = e.interpolation ?? "rgb";
12
+ return (e, r, i) => t(e, r, i, n);
13
+ }
14
+ var a = (e, t) => `colors:${e}:${t}`;
15
+ function o(e, t) {
16
+ r(t.from, t.to);
17
+ let n = i(t), { id: o, channel: s } = t;
18
+ return e.tween({
19
+ from: 0,
20
+ to: 1,
21
+ ms: t.ms,
22
+ easing: t.easing,
23
+ cancelKey: a(o, s),
24
+ interpolate: (e, t, n) => e + (t - e) * n,
25
+ onTick: (r) => {
26
+ e.colorOverrides.set(o, s, n(t.from, t.to, r));
27
+ },
28
+ onDone: () => {
29
+ e.colorOverrides.clear(o, s), t.onDone?.();
30
+ }
31
+ });
32
+ }
33
+ function s(e, t) {
34
+ r(t.from, t.to);
35
+ let n = i(t), { id: o, channel: s } = t;
36
+ return e.spring({
37
+ from: 0,
38
+ to: 1,
39
+ preset: t.preset,
40
+ stiffness: t.stiffness,
41
+ damping: t.damping,
42
+ mass: t.mass,
43
+ cancelKey: a(o, s),
44
+ interpolate: (e, t, n) => e + (t - e) * n,
45
+ onTick: (r) => {
46
+ let i = Math.max(0, Math.min(1, r));
47
+ e.colorOverrides.set(o, s, n(t.from, t.to, i));
48
+ },
49
+ onDone: () => {
50
+ e.colorOverrides.clear(o, s), t.onDone?.();
51
+ }
52
+ });
53
+ }
54
+ function c(e, t) {
55
+ let r = i(t), { id: a, channel: o } = t, s = t.direction ?? 1, c = n(t.easing);
56
+ e.colorOverrides.set(a, o, (e, n) => {
57
+ let i = e.length / 4;
58
+ if (i === 0) return e.slice();
59
+ let a = n / t.msPerCycle * i * s / i, o = a - Math.floor(a), l = c(o), u = ((Math.floor(a) + l) * i % i + i) % i, d = Math.floor(u), f = u - d, p = Array(e.length);
60
+ for (let t = 0; t < i; t++) {
61
+ let n = (t + d) % i * 4, a = (t + d + 1) % i * 4, o = [
62
+ e[n],
63
+ e[n + 1],
64
+ e[n + 2],
65
+ e[n + 3]
66
+ ], s = [
67
+ e[a],
68
+ e[a + 1],
69
+ e[a + 2],
70
+ e[a + 3]
71
+ ], c = r(o, s, f), l = t * 4;
72
+ p[l] = c[0], p[l + 1] = c[1], p[l + 2] = c[2], p[l + 3] = c[3];
73
+ }
74
+ return p;
75
+ });
76
+ let l = e.keepAlive();
77
+ return { cancel() {
78
+ e.colorOverrides.clear(a, o), l();
79
+ } };
80
+ }
81
+ function l(e, t) {
82
+ r(t.from, t.to);
83
+ let o = i(t), { id: s, channel: c, from: l, to: u, anchorMs: d, perAnchorDelay: f } = t, p = l.length / 4, m = n(t.easing), h = t.origin === "last" ? p - 1 : typeof t.origin == "number" ? Math.max(0, Math.min(p - 1, t.origin)) : 0, g = Math.max(h, p - 1 - h) * f + d, _ = (e) => {
84
+ let t = Array(l.length);
85
+ for (let n = 0; n < p; n++) {
86
+ let r = Math.abs(n - h) * f, i = Math.max(0, Math.min(1, (e - r) / d)), a = m(i), s = n * 4, c = [
87
+ l[s],
88
+ l[s + 1],
89
+ l[s + 2],
90
+ l[s + 3]
91
+ ], p = [
92
+ u[s],
93
+ u[s + 1],
94
+ u[s + 2],
95
+ u[s + 3]
96
+ ], g = o(c, p, a);
97
+ t[s] = g[0], t[s + 1] = g[1], t[s + 2] = g[2], t[s + 3] = g[3];
98
+ }
99
+ return t;
100
+ };
101
+ return e.colorOverrides.set(s, c, _(0)), e.tween({
102
+ from: 0,
103
+ to: 1,
104
+ ms: g,
105
+ easing: (e) => e,
106
+ cancelKey: a(s, c),
107
+ interpolate: (e, t, n) => e + (t - e) * n,
108
+ onTick: (t) => {
109
+ e.colorOverrides.set(s, c, _(t * g));
110
+ },
111
+ onDone: () => {
112
+ e.colorOverrides.clear(s, c), t.onDone?.();
113
+ }
114
+ });
115
+ }
116
+ function u(e, t = {}) {
117
+ let n = t.saturation ?? .8, r = t.lightness ?? .6, i = t.alpha ?? 1, a = [];
118
+ for (let t = 0; t < e; t++) {
119
+ let [o, s, c] = f(t * 360 / Math.max(1, e), n, r);
120
+ a.push(o, s, c, i);
121
+ }
122
+ return a;
123
+ }
124
+ function d(e, t, n, r, i = 1) {
125
+ let a = [];
126
+ for (let o = 0; o < e; o++) a.push(t, n, r, i);
127
+ return a;
128
+ }
129
+ function f(t, n, r) {
130
+ return e(t, n, r);
131
+ }
132
+ //#endregion
133
+ export { c as cycleVertexColors, u as rainbowVertexColors, d as solidVertexColors, s as springVertexColors, l as staggerVertexColors, o as tweenVertexColors };
134
+
135
+ //# sourceMappingURL=colorHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorHelpers.js","names":["validateLengths","from","to","resolveInterpolator","opts","space","lerpColorArray","a","b","t","cancelKeyFor","id","channel","tweenVertexColors","interp","animator","springVertexColors","clamped","cycleVertexColors","direction","easing","resolveEasing","n","base","cycles","tMs","cycleFrac","easedFrac","phase","phaseInt","phaseFrac","out","i","aIdx","bIdx","blended","k","releaseKeepAlive","staggerVertexColors","originIndex","totalMs","perAnchorDelay","anchorMs","colorsAt","startMs","localT","elapsedMs","eased","fSlice","tSlice","rainbowVertexColors","saturation","lightness","alpha","r","g","hslToRgbUnit","solidVertexColors","hslToRgb","h","s","l"],"sources":["../../src/animation/colorHelpers.ts"],"sourcesContent":["import { resolveEasing } from '@weasel-js/geom';\nimport type {\n AnimationHandle,\n Animator,\n EasingSpec,\n SpringPresetName,\n} from './types';\nimport type { VertexColorChannel } from './colorRegistry';\nimport { lerpColorArray, type ColorSpace } from '@weasel-js/paint';\nimport { hslToRgb } from '../renderer/math/color';\n\n/**\n * Color interpolator: receives two flat RGBA float arrays (values in\n * 0..1, the renderer's color space — same shape as\n * `stroke.vertexColors`) and a normalized progress `t` in 0..1.\n * Returns the same-length blended array, also in 0..1 floats. Override\n * the default per-channel lerp via `TweenVertexColorsOptions.interpolate`\n * when a custom color-space or shaping is needed.\n */\nexport type ColorInterpolate = (\n from: readonly number[],\n to: readonly number[],\n t: number,\n) => number[];\n\n/** Options for `tweenVertexColors`. */\nexport interface TweenVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA, flat, in 0..1 floats (matches the renderer's\n * `stroke.vertexColors` / `PathDrawCommand.vertexColors` color space).\n * Length must equal `from.length`. */\n to: readonly number[];\n /** Per-anchor RGBA, flat, in 0..1 floats. Length must equal `to.length`\n * and be a positive multiple of 4. */\n from: readonly number[];\n ms: number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\nfunction validateLengths(from: readonly number[], to: readonly number[]): void {\n if (from.length !== to.length) {\n throw new Error(\n `vertex colors: length mismatch (from=${from.length}, to=${to.length})`,\n );\n }\n if (from.length === 0 || from.length % 4 !== 0) {\n throw new Error(\n `vertex colors: length ${from.length} must be a positive multiple of 4`,\n );\n }\n}\n\nfunction resolveInterpolator(\n opts: { interpolation?: ColorSpace; interpolate?: ColorInterpolate },\n): ColorInterpolate {\n if (opts.interpolate) return opts.interpolate;\n const space: ColorSpace = opts.interpolation ?? 'rgb';\n return (a, b, t) => lerpColorArray(a, b, t, space);\n}\n\nconst cancelKeyFor = (id: string, channel: VertexColorChannel): string =>\n `colors:${id}:${channel}`;\n\n/**\n * Animate one node's per-anchor colors from `from` to `to` over `ms`.\n *\n * The colors are published to the animator's `colorOverrides` registry rather\n * than written into the scene, so nothing is recorded in history and the\n * node's own data is untouched; the override is dropped when the animation\n * finishes. Starting another color animation on the same node and channel\n * cancels this one.\n */\nexport function tweenVertexColors(\n animator: Animator,\n opts: TweenVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n const { id, channel } = opts;\n return animator.tween<number>({\n from: 0,\n to: 1,\n ms: opts.ms,\n easing: opts.easing,\n cancelKey: cancelKeyFor(id, channel),\n interpolate: (a, b, t) => a + (b - a) * t,\n onTick: (t) => {\n animator.colorOverrides.set(id, channel, interp(opts.from, opts.to, t));\n },\n onDone: () => {\n animator.colorOverrides.clear(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/** Options for `springVertexColors`. */\nexport interface SpringVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n preset?: SpringPresetName;\n stiffness?: number;\n damping?: number;\n mass?: number;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\n/** `tweenVertexColors` driven by a spring instead of a duration. Same override\n * semantics. */\nexport function springVertexColors(\n animator: Animator,\n opts: SpringVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n const { id, channel } = opts;\n return animator.spring<number>({\n from: 0,\n to: 1,\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n cancelKey: cancelKeyFor(id, channel),\n interpolate: (a, b, t) => a + (b - a) * t,\n onTick: (t) => {\n const clamped = Math.max(0, Math.min(1, t));\n animator.colorOverrides.set(id, channel, interp(opts.from, opts.to, clamped));\n },\n onDone: () => {\n animator.colorOverrides.clear(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n/** Options for `cycleVertexColors`. */\nexport interface CycleVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n msPerCycle: number;\n direction?: 1 | -1;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n /** Custom interpolator. Receives two RGBA arrays in 0..1 floats and a\n * progress `t` in 0..1; returns the blended array in 0..1 floats. */\n interpolate?: ColorInterpolate;\n}\n\n/** Removes an installed color cycle. Unlike the other color helpers this is\n * not an `AnimationHandle`, because a cycle has no progress to pause or\n * scale — it only ends. */\nexport interface CycleHandle {\n cancel(): void;\n}\n\n/** Register a function override that phase-rotates the base color array\n * along the path index. Returns a handle whose `cancel()` removes the\n * override.\n *\n * The override computes its value purely from `performance.now()`, so\n * there's no per-frame progress to register with the animator's tick\n * loop. To keep the loop alive (so `<SceneCanvas animator>`'s onTick\n * subscription continues firing redraws while the cycle is installed),\n * cycleVertexColors holds an `animator.keepAlive()` entry for the\n * lifetime of the cycle; `cancel()` releases it. */\nexport function cycleVertexColors(\n animator: Animator,\n opts: CycleVertexColorsOptions,\n): CycleHandle {\n const interp = resolveInterpolator(opts);\n const { id, channel } = opts;\n const direction = opts.direction ?? 1;\n const easing = resolveEasing(opts.easing);\n\n const override = (base: readonly number[], tMs: number): number[] => {\n const n = base.length / 4;\n if (n === 0) return base.slice();\n const raw = (tMs / opts.msPerCycle) * n * direction;\n const cycles = raw / n;\n const cycleFrac = cycles - Math.floor(cycles);\n const easedFrac = easing(cycleFrac);\n const easedRaw = (Math.floor(cycles) + easedFrac) * n;\n const phase = ((easedRaw % n) + n) % n;\n const phaseInt = Math.floor(phase);\n const phaseFrac = phase - phaseInt;\n\n const out = new Array<number>(base.length);\n for (let i = 0; i < n; i++) {\n const aIdx = ((i + phaseInt) % n) * 4;\n const bIdx = ((i + phaseInt + 1) % n) * 4;\n const a = [base[aIdx], base[aIdx + 1], base[aIdx + 2], base[aIdx + 3]];\n const b = [base[bIdx], base[bIdx + 1], base[bIdx + 2], base[bIdx + 3]];\n const blended = interp(a, b, phaseFrac);\n const k = i * 4;\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n animator.colorOverrides.set(id, channel, override);\n // Cycle's \"value\" is a function of wall-clock time, not a tween-style\n // progress. We don't register a per-frame ticking animation, so without\n // an explicit keep-alive entry the animator's RAF loop would idle and\n // SceneCanvas's onTick redraw subscription would never fire. Keep the\n // loop running until cancel().\n const releaseKeepAlive = animator.keepAlive();\n\n return {\n cancel(): void {\n animator.colorOverrides.clear(id, channel);\n releaseKeepAlive();\n },\n };\n}\n\n/** Options for `staggerVertexColors`. `origin` picks which anchor the wave\n * starts from and `perAnchorDelay` how far behind each successive anchor\n * runs. */\nexport interface StaggerVertexColorsOptions {\n id: string;\n channel: VertexColorChannel;\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.to`. */\n to: readonly number[];\n /** Per-anchor RGBA in 0..1 floats. See `TweenVertexColorsOptions.from`. */\n from: readonly number[];\n anchorMs: number;\n perAnchorDelay: number;\n origin?: 'first' | 'last' | number;\n easing?: EasingSpec;\n interpolation?: ColorSpace;\n interpolate?: ColorInterpolate;\n onDone?: () => void;\n}\n\n/** Run the same color change across a node's anchors as a wave, each anchor\n * starting later than the one before it. Same override semantics as\n * `tweenVertexColors`. */\nexport function staggerVertexColors(\n animator: Animator,\n opts: StaggerVertexColorsOptions,\n): AnimationHandle {\n validateLengths(opts.from, opts.to);\n const interp = resolveInterpolator(opts);\n const { id, channel, from, to, anchorMs, perAnchorDelay } = opts;\n const n = from.length / 4;\n const easing = resolveEasing(opts.easing);\n\n const originIndex =\n opts.origin === 'last' ? n - 1 :\n typeof opts.origin === 'number' ? Math.max(0, Math.min(n - 1, opts.origin)) :\n 0;\n\n const maxDistance = Math.max(originIndex, n - 1 - originIndex);\n const totalMs = maxDistance * perAnchorDelay + anchorMs;\n\n const colorsAt = (elapsedMs: number): number[] => {\n const out = new Array<number>(from.length);\n for (let i = 0; i < n; i++) {\n const distance = Math.abs(i - originIndex);\n const startMs = distance * perAnchorDelay;\n const localT = Math.max(0, Math.min(1, (elapsedMs - startMs) / anchorMs));\n const eased = easing(localT);\n const k = i * 4;\n const fSlice = [from[k], from[k + 1], from[k + 2], from[k + 3]];\n const tSlice = [to[k], to[k + 1], to[k + 2], to[k + 3]];\n const blended = interp(fSlice, tSlice, eased);\n out[k] = blended[0];\n out[k + 1] = blended[1];\n out[k + 2] = blended[2];\n out[k + 3] = blended[3];\n }\n return out;\n };\n\n // A plain array, not a function override: painters call those with their\n // own clock (`performance.now()`), not time since this stagger began.\n animator.colorOverrides.set(id, channel, colorsAt(0));\n\n return animator.tween<number>({\n from: 0,\n to: 1,\n ms: totalMs,\n easing: (t) => t,\n cancelKey: cancelKeyFor(id, channel),\n interpolate: (a, b, t) => a + (b - a) * t,\n onTick: (t) => {\n animator.colorOverrides.set(id, channel, colorsAt(t * totalMs));\n },\n onDone: () => {\n animator.colorOverrides.clear(id, channel);\n opts.onDone?.();\n },\n });\n}\n\n// ─── Color-array constructors ───────────────────────────────────────\n//\n// Helpers that build the per-anchor RGBA arrays the tween/cycle/stagger\n// helpers above (and `stroke.vertexColors` on draw commands) consume.\n// Values are in the 0..1 range the renderer expects — emitting bytes\n// (0..255) clamps every channel to 1.0 on the GPU and renders white.\n\n/** Build an n-anchor rainbow RGBA array sweeping the hue wheel. The\n * output is suitable to pass directly into `stroke.vertexColors`,\n * `tweenVertexColors({ from: rainbowVertexColors(n) })`, or any\n * other API that wants per-anchor color floats. */\nexport function rainbowVertexColors(\n n: number,\n opts: { saturation?: number; lightness?: number; alpha?: number } = {},\n): number[] {\n const saturation = opts.saturation ?? 0.8;\n const lightness = opts.lightness ?? 0.6;\n const alpha = opts.alpha ?? 1;\n const out: number[] = [];\n for (let i = 0; i < n; i++) {\n const h = (i * 360) / Math.max(1, n);\n const [r, g, b] = hslToRgbUnit(h, saturation, lightness);\n out.push(r, g, b, alpha);\n }\n return out;\n}\n\n/** Build an n-anchor solid RGBA array. Shorthand for\n * `[r, g, b, a, r, g, b, a, …]` — the array a `tweenVertexColors`\n * `to`-target typically needs. */\nexport function solidVertexColors(\n n: number,\n r: number,\n g: number,\n b: number,\n a = 1,\n): number[] {\n const out: number[] = [];\n for (let i = 0; i < n; i++) out.push(r, g, b, a);\n return out;\n}\n\n/** HSL → RGB in 0..1 (hue in degrees). Delegates to the single internal\n * implementation in `renderer/math/color.ts` so there's only one HSL→RGB\n * formula in the package. Kept local so consumers building hue-cycled\n * color arrays via `huesweepVertexColors` don't have to roll their own. */\nfunction hslToRgbUnit(h: number, s: number, l: number): [number, number, number] {\n return hslToRgb(h, s, l);\n}\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ //#region src/animation/colorRegistry.ts
2
+ var e = class {
3
+ map = /* @__PURE__ */ new Map();
4
+ _version = 0;
5
+ set(e, t, n) {
6
+ let r = this.map.get(e);
7
+ r || (r = {}, this.map.set(e, r)), r[t] = n, this._version++;
8
+ }
9
+ clear(e, t) {
10
+ let n = this.map.get(e);
11
+ n && t in n && (delete n[t], !n.fill && !n.stroke && this.map.delete(e), this._version++);
12
+ }
13
+ clearAll() {
14
+ this.map.size !== 0 && (this.map.clear(), this._version++);
15
+ }
16
+ get(e, t) {
17
+ return this.map.get(e)?.[t];
18
+ }
19
+ has(e) {
20
+ return this.map.has(e);
21
+ }
22
+ resolve(e, t, n, r) {
23
+ let i = this.get(e, t);
24
+ if (i === void 0) return n;
25
+ if (typeof i != "function") return i;
26
+ if (n === void 0) return;
27
+ let a = i(n, r);
28
+ return a.length === n.length ? a : n;
29
+ }
30
+ version() {
31
+ return this._version;
32
+ }
33
+ };
34
+ //#endregion
35
+ export { e as ColorOverrideRegistry };
36
+
37
+ //# sourceMappingURL=colorRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorRegistry.js","names":["ColorOverrideRegistry","entry","id","channel","override","base","result","tMs"],"sources":["../../src/animation/colorRegistry.ts"],"sourcesContent":["/** Which of a node's two per-anchor color arrays an override applies to. */\nexport type VertexColorChannel = 'fill' | 'stroke';\n\n/** Function-form override: receives the consumer-supplied base color\n * array and the current animation timestamp (ms, from the animator's\n * clock). Returns a flat RGBA float array (values in 0..1, matching\n * the renderer's `stroke.vertexColors` / `PathDrawCommand.vertexColors`\n * color space) of the same length as `base`. */\nexport type ColorOverrideFn = (base: readonly number[], tMs: number) => number[];\n\n/** Either a static per-anchor RGBA float array (0..1) or a function-form\n * override (see {@link ColorOverrideFn}). */\nexport type ColorOverride = readonly number[] | ColorOverrideFn;\n\ninterface NodeOverrides {\n fill?: ColorOverride;\n stroke?: ColorOverride;\n}\n\n/** Per-node, per-channel store of color overrides. Attached to `useAnimator` as\n * `animator.colorOverrides`; painted onto scene nodes by `<SceneCanvas animator>`\n * and onto a `createPathLayer`'s nodes by its `colorOverrides` option. */\nexport class ColorOverrideRegistry {\n private readonly map = new Map<string, NodeOverrides>();\n private _version = 0;\n\n set(id: string, channel: VertexColorChannel, override: ColorOverride): void {\n let entry = this.map.get(id);\n if (!entry) {\n entry = {};\n this.map.set(id, entry);\n }\n entry[channel] = override;\n this._version++;\n }\n\n clear(id: string, channel: VertexColorChannel): void {\n const entry = this.map.get(id);\n if (!entry) return;\n if (!(channel in entry)) return;\n delete entry[channel];\n if (!entry.fill && !entry.stroke) this.map.delete(id);\n this._version++;\n }\n\n clearAll(): void {\n if (this.map.size === 0) return;\n this.map.clear();\n this._version++;\n }\n\n get(id: string, channel: VertexColorChannel): ColorOverride | undefined {\n return this.map.get(id)?.[channel];\n }\n\n /** Whether anything overrides `id`, on either channel. */\n has(id: string): boolean {\n return this.map.has(id);\n }\n\n /**\n * The colors to paint on `id`'s `channel`, given the colors the painter would\n * otherwise paint and the frame's timestamp. A function override needs that\n * `base` and must return an array of its length; failing either, `base`\n * stands.\n */\n resolve(\n id: string,\n channel: VertexColorChannel,\n base: readonly number[] | undefined,\n tMs: number,\n ): readonly number[] | undefined {\n const override = this.get(id, channel);\n if (override === undefined) return base;\n if (typeof override !== 'function') return override;\n if (base === undefined) return undefined;\n const result = override(base, tMs);\n return result.length === base.length ? result : base;\n }\n\n version(): number {\n return this._version;\n }\n}\n"],"mappings":";AAsBA,IAAaA,IAAb,MAAmC;CACjC,sBAAuB,IAAI,IAA2B;CACtD,WAAmB;CAEnB,IAAI,GAAY,GAA6B,GAA+B;EAC1E,IAAIC,IAAQ,KAAK,IAAI,IAAIC,CAAE;EAM3B,AALKD,MACH,IAAQ,CAAC,GACT,KAAK,IAAI,IAAIC,GAAID,CAAK,IAExB,EAAME,KAAWC,GACjB,KAAK;CACP;CAEA,MAAM,GAAY,GAAmC;EACnD,IAAMH,IAAQ,KAAK,IAAI,IAAIC,CAAE;EAC7B,AAAKD,KACCE,KAAWF,MACjB,OAAOA,EAAME,IACT,CAACF,EAAM,QAAQ,CAACA,EAAM,UAAQ,KAAK,IAAI,OAAOC,CAAE,GACpD,KAAK;CACP;CAEA,WAAiB;EACf,AAAI,KAAK,IAAI,SAAS,MACtB,KAAK,IAAI,MAAM,GACf,KAAK;CACP;CAEA,IAAI,GAAY,GAAwD;EACtE,OAAO,KAAK,IAAI,IAAIA,CAAE,CAAC,GAAGC;CAC5B;CAGA,IAAI,GAAqB;EACvB,OAAO,KAAK,IAAI,IAAID,CAAE;CACxB;CAQA,QACE,GACA,GACA,GACA,GAC+B;EAC/B,IAAME,IAAW,KAAK,IAAIF,GAAIC,CAAO;EACrC,IAAIC,MAAa,KAAA,GAAW,OAAOC;EACnC,IAAI,OAAOD,KAAa,YAAY,OAAOA;EAC3C,IAAIC,MAAS,KAAA,GAAW;EACxB,IAAMC,IAASF,EAASC,GAAME,CAAG;EACjC,OAAOD,EAAO,WAAWD,EAAK,SAASC,IAASD;CAClD;CAEA,UAAkB;EAChB,OAAO,KAAK;CACd;AACF"}
@@ -0,0 +1,20 @@
1
+ import { springPose as e, tweenPose as t } from "./poseHelpers.js";
2
+ import { sampleTrack as n } from "./timeline/sampleTrack.js";
3
+ import { ColorOverrideRegistry as r } from "./colorRegistry.js";
4
+ import { useAnimator as i } from "./useAnimator.js";
5
+ import { animateOnSetPose as a } from "./wrappers/animateOnSetPose.js";
6
+ import { animateLifecycle as o } from "./wrappers/animateLifecycle.js";
7
+ import { createReflowTransition as s, useAnimatedReflow as c } from "./reflow.js";
8
+ import { momentum as l } from "./behaviors/momentum.js";
9
+ import { createSlew as u, slewToward as d } from "./slew.js";
10
+ import { cycleVertexColors as f, rainbowVertexColors as p, solidVertexColors as m, springVertexColors as h, staggerVertexColors as g, tweenVertexColors as _ } from "./colorHelpers.js";
11
+ import { IDENTITY_JOINT as v } from "./rig/types.js";
12
+ import { blendPoses as y } from "./rig/blendPoses.js";
13
+ import { mirrorPose as b } from "./rig/mirrorPose.js";
14
+ import { resolveSkeleton as x } from "./rig/resolveSkeleton.js";
15
+ import { bindRig as S, rigidRigApply as C } from "./rig/bindRig.js";
16
+ import { solveIk as w } from "./rig/solveIk.js";
17
+ import { useRig as T } from "./rig/useRig.js";
18
+ import { hexToOklchDeg as E, hslToSrgb as D, interpolateSrgb as O, lerpColorArray as k, lerpOklab as A, lerpOklch as j, linearSrgbToOklab as M, linearToSrgb as N, oklabToLinearSrgb as P, oklabToOklch as F, oklabToSrgbU8 as I, oklchDegToHex as L, oklchToOklab as R, srgbFloatToOklab as z, srgbToHsl as B, srgbToLinear as V, srgbU8ToOklab as H } from "@weasel-js/paint";
19
+ import { EASINGS as U, SPRING_PRESETS as W, cubicBezierEasing as G, easeIn as K, easeInBack as q, easeInBounce as J, easeInCirc as Y, easeInCubic as X, easeInElastic as Z, easeInExpo as Q, easeInOut as $, easeInOutBack as ee, easeInOutBounce as te, easeInOutCirc as ne, easeInOutCubic as re, easeInOutElastic as ie, easeInOutExpo as ae, easeInOutQuad as oe, easeInOutQuart as se, easeInOutQuint as ce, easeInOutSine as le, easeInQuad as ue, easeInQuart as de, easeInQuint as fe, easeInSine as pe, easeOut as me, easeOutBack as he, easeOutBounce as ge, easeOutCirc as _e, easeOutCubic as ve, easeOutElastic as ye, easeOutExpo as be, easeOutQuad as xe, easeOutQuart as Se, easeOutQuint as Ce, easeOutSine as we, linear as Te, resolveEasing as Ee } from "@weasel-js/geom";
20
+ export { r as ColorOverrideRegistry, U as EASINGS, v as IDENTITY_JOINT, W as SPRING_PRESETS, o as animateLifecycle, a as animateOnSetPose, S as bindRig, y as blendPoses, s as createReflowTransition, u as createSlew, G as cubicBezierEasing, f as cycleVertexColors, K as easeIn, q as easeInBack, J as easeInBounce, Y as easeInCirc, X as easeInCubic, Z as easeInElastic, Q as easeInExpo, $ as easeInOut, ee as easeInOutBack, te as easeInOutBounce, ne as easeInOutCirc, re as easeInOutCubic, ie as easeInOutElastic, ae as easeInOutExpo, oe as easeInOutQuad, se as easeInOutQuart, ce as easeInOutQuint, le as easeInOutSine, ue as easeInQuad, de as easeInQuart, fe as easeInQuint, pe as easeInSine, me as easeOut, he as easeOutBack, ge as easeOutBounce, _e as easeOutCirc, ve as easeOutCubic, ye as easeOutElastic, be as easeOutExpo, xe as easeOutQuad, Se as easeOutQuart, Ce as easeOutQuint, we as easeOutSine, E as hexToOklchDeg, D as hslToSrgb, O as interpolateSrgb, k as lerpColorArray, A as lerpOklab, j as lerpOklch, Te as linear, M as linearSrgbToOklab, N as linearToSrgb, b as mirrorPose, l as momentum, P as oklabToLinearSrgb, F as oklabToOklch, I as oklabToSrgbU8, L as oklchDegToHex, R as oklchToOklab, p as rainbowVertexColors, Ee as resolveEasing, x as resolveSkeleton, C as rigidRigApply, n as sampleTrack, d as slewToward, m as solidVertexColors, w as solveIk, e as springPose, h as springVertexColors, z as srgbFloatToOklab, B as srgbToHsl, V as srgbToLinear, H as srgbU8ToOklab, g as staggerVertexColors, t as tweenPose, _ as tweenVertexColors, c as useAnimatedReflow, i as useAnimator, T as useRig };