@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 @@
1
+ {"version":3,"file":"solveIk.js","names":["TAU","wrap","a","clampAngle","limit","v","c","cross","ax","by","ay","bx","solveIk","options","maxIterations","tolerance","byName","joint","skeleton","chain","name","i","n","pose","rootParent","base","mat3","resolveSkeleton","rot","limits","worlds","resolve","parent","toMat3","compose","pivot","tipWorld","tip","next","aim","inv","ox","oy","ex","ey","effector","gx","gy","goal","want","distance","x","y","target","result","out","d","rx","ry","reach","toTarget","start","mx","my","tx","ty","b","dx","dy","side","inner","heading","bend","elbow","s","cut","iterations"],"sources":["../../../src/animation/rig/solveIk.ts"],"sourcesContent":["import { mat3, type GlMat3 } from '../../renderer/math/mat3';\nimport { compose, resolveSkeleton, toMat3 } from './resolveSkeleton';\nimport type { Joint, Pose, Skeleton } from './types';\n\nconst TAU = Math.PI * 2;\n\n/** A point in the skeleton's space — the space `resolveSkeleton` resolves into. */\nexport interface IkPoint {\n x: number;\n y: number;\n}\n\n/** Bounds on a joint's rotation delta from its bind, in radians, with\n * `-PI <= min <= max <= PI`. */\nexport interface IkLimit {\n min: number;\n max: number;\n}\n\n/** Options for {@link solveIk}. */\nexport interface SolveIkOptions {\n /** The joints the solver may rotate, root first, each the parent of the next. */\n joints: readonly string[];\n /** The end effector, in the last joint's local frame — the forearm's length\n * along its +x for an arm, or a hand joint's bind offset. */\n tip: IkPoint;\n /** Where the tip should go, in skeleton space. A rig posed with a `root`\n * wants the target carried back through that root's inverse first. */\n target: IkPoint;\n /** Per-joint limits, keyed by joint name. A joint without one turns freely. */\n limits?: Readonly<Record<string, IkLimit>>;\n /** Two-joint chains only: the middle joint bends toward this point, in\n * skeleton space. Without it the chain keeps the bend the input pose has. */\n pole?: IkPoint;\n /** Most CCD sweeps to run. Default 32. */\n iterations?: number;\n /** Tip-to-target distance that counts as reached, in skeleton units.\n * Default 0.01. */\n tolerance?: number;\n}\n\n/** What {@link solveIk} returns. */\nexport interface IkResult {\n /** The input pose with each chain joint's rotation replaced. */\n pose: Pose;\n /** Tip-to-target distance the solve ended at. */\n distance: number;\n /** Whether `distance` is within the tolerance. False for a target out of\n * reach, which leaves the chain pointing straight at it. */\n reached: boolean;\n /** CCD sweeps run; 0 when the two-joint solution or the straight-line\n * answer for an unreachable target settled it. */\n iterations: number;\n}\n\nfunction wrap(a: number): number {\n return a - TAU * Math.round(a / TAU);\n}\n\n/** `v` held to `limit`, where out of range means the nearer bound around the circle. */\nfunction clampAngle(v: number, limit: IkLimit | undefined): number {\n if (!limit) return v;\n for (const c of [v, v - TAU, v + TAU]) if (c >= limit.min && c <= limit.max) return c;\n return Math.abs(wrap(v - limit.min)) <= Math.abs(wrap(v - limit.max)) ? limit.min : limit.max;\n}\n\nconst cross = (ax: number, ay: number, bx: number, by: number) => ax * by - ay * bx;\n\n/**\n * Rotate a joint chain so its tip reaches `target`, returning the result as an\n * ordinary {@link Pose} — so it blends with `blendPoses` (weighting the IK\n * against an animated pose is `blendPoses([anim, solved], [1 - w, w])`),\n * samples on a `SampledTrack<Pose>` and drives a rig through `Rig.pose`.\n *\n * The solver is cyclic coordinate descent: each step turns one joint so the\n * tip lies on the ray from that joint to the target. A joint's rotation is the\n * one term the rig lets it change, and a CCD step is exactly a change to it, so\n * limits clamp the value the pose stores and nothing has to be converted back\n * from positions. Each step is solved in the joint's parent frame, which makes\n * it exact under any parent transform the skeleton composes, mirrors included.\n *\n * A two-joint chain is solved analytically first: of the two bends that reach\n * the target it takes the one on `pole`'s side, or the input pose's side, and\n * falls back to the other bend and then to CCD when limits refuse it. A target\n * beyond the chain's reach straightens the chain toward it.\n */\nexport function solveIk(skeleton: Skeleton, pose: Pose, options: SolveIkOptions): IkResult {\n const { tip, target, limits } = options;\n const maxIterations = options.iterations ?? 32;\n const tolerance = options.tolerance ?? 0.01;\n\n const byName = new Map<string, Joint>();\n for (const joint of skeleton.joints) byName.set(joint.name, joint);\n const chain = options.joints.map((name, i) => {\n const joint = byName.get(name);\n if (!joint) throw new Error(`solveIk: the skeleton has no joint \"${name}\".`);\n if (i > 0 && joint.parent !== options.joints[i - 1]) {\n throw new Error(\n `solveIk: chain joint \"${name}\" names parent \"${joint.parent}\", not \"${options.joints[i - 1]}\". ` +\n 'Each chain joint must be the parent of the next.',\n );\n }\n return joint;\n });\n const n = chain.length;\n if (n === 0) return { pose: { ...pose }, distance: Infinity, reached: false, iterations: 0 };\n\n const rootParent = chain[0].parent;\n const base = rootParent == null ? mat3.identity() : resolveSkeleton(skeleton, pose).get(rootParent)!;\n const rot = chain.map((joint) => clampAngle(wrap(pose[joint.name]?.rotation ?? 0), limits?.[joint.name]));\n\n let worlds: GlMat3[] = [];\n const resolve = () => {\n worlds = [];\n let parent = base;\n for (let i = 0; i < n; i += 1) {\n const joint = chain[i];\n parent = mat3.multiply(parent, toMat3(compose(joint.bind, { ...pose[joint.name], rotation: rot[i] })));\n worlds.push(parent);\n }\n };\n const pivot = (i: number) => mat3.apply(worlds[i], 0, 0);\n const tipWorld = () => mat3.apply(worlds[n - 1], tip.x, tip.y);\n /** The point joint `i` swings: the next joint's pivot, or the tip. */\n const next = (i: number) => (i + 1 < n ? pivot(i + 1) : tipWorld());\n\n /** Turn joint `i` so `effector` lies on the ray toward `goal`. True when a\n * limit cut the turn short. */\n const aim = (i: number, effector: [number, number], goal: IkPoint): boolean => {\n const inv = mat3.invert(i === 0 ? base : worlds[i - 1]);\n if (!inv) return false;\n const [ox, oy] = mat3.apply(inv, ...pivot(i));\n const [ex, ey] = mat3.apply(inv, ...effector);\n const [gx, gy] = mat3.apply(inv, goal.x, goal.y);\n if (Math.hypot(ex - ox, ey - oy) < 1e-9 || Math.hypot(gx - ox, gy - oy) < 1e-9) return false;\n const want = wrap(rot[i] + Math.atan2(gy - oy, gx - ox) - Math.atan2(ey - oy, ex - ox));\n rot[i] = clampAngle(want, limits?.[chain[i].name]);\n resolve();\n return Math.abs(wrap(rot[i] - want)) > 1e-9;\n };\n\n const distance = () => {\n const [x, y] = tipWorld();\n return Math.hypot(x - target.x, y - target.y);\n };\n const result = (iterations: number): IkResult => {\n const out: Pose = { ...pose };\n chain.forEach((joint, i) => { out[joint.name] = { ...pose[joint.name], rotation: rot[i] }; });\n const d = distance();\n return { pose: out, distance: d, reached: d <= tolerance, iterations };\n };\n\n resolve();\n const [rx, ry] = pivot(0);\n let reach = 0;\n for (let i = 0; i < n; i += 1) {\n const [ax, ay] = pivot(i);\n const [bx, by] = next(i);\n reach += Math.hypot(bx - ax, by - ay);\n }\n const toTarget = Math.hypot(target.x - rx, target.y - ry);\n\n if (toTarget >= reach) {\n for (let i = 0; i < n; i += 1) aim(i, next(i), target);\n return result(0);\n }\n\n if (n === 2 && toTarget > 1e-9) {\n const start = rot.slice();\n const [mx, my] = pivot(1);\n const [tx, ty] = tipWorld();\n const a = Math.hypot(mx - rx, my - ry);\n const b = Math.hypot(tx - mx, ty - my);\n const dx = target.x - rx;\n const dy = target.y - ry;\n const bendSide = options.pole\n ? cross(dx, dy, options.pole.x - rx, options.pole.y - ry)\n : cross(dx, dy, mx - rx, my - ry);\n const side = bendSide < 0 ? -1 : 1;\n const inner = Math.acos(Math.max(-1, Math.min(1, (a * a + toTarget * toTarget - b * b) / (2 * a * toTarget))));\n const heading = Math.atan2(dy, dx);\n\n const bend = (s: number): boolean => {\n rot.splice(0, 2, ...start);\n resolve();\n const elbow = { x: rx + a * Math.cos(heading + s * inner), y: ry + a * Math.sin(heading + s * inner) };\n const cut = aim(0, pivot(1), elbow);\n return aim(1, tipWorld(), target) || cut;\n };\n if (!bend(side) || !bend(-side)) {\n if (distance() <= tolerance) return result(0);\n } else {\n bend(side);\n }\n }\n\n let iterations = 0;\n while (iterations < maxIterations && distance() > tolerance) {\n for (let i = n - 1; i >= 0; i -= 1) aim(i, tipWorld(), target);\n iterations += 1;\n }\n return result(iterations);\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ //#region src/animation/rig/types.ts
2
+ var e = {
3
+ x: 0,
4
+ y: 0,
5
+ rotation: 0,
6
+ scaleX: 1,
7
+ scaleY: 1
8
+ };
9
+ //#endregion
10
+ export { e as IDENTITY_JOINT };
11
+
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":["IDENTITY_JOINT"],"sources":["../../../src/animation/rig/types.ts"],"sourcesContent":["/** A joint's local transform. Deliberately NOT the scene's generic `TPose`:\n * `TPose` is consumer-defined and may be a bare AABB with no rotation term,\n * which a joint chain cannot compose through. */\nexport interface JointTransform {\n x: number;\n y: number;\n /** Radians. */\n rotation: number;\n scaleX: number;\n scaleY: number;\n}\n\n/** One joint of a `Skeleton`. */\nexport interface Joint {\n name: string;\n /** Parent joint name, or null for a root. */\n parent: string | null;\n /** Local transform at rest. */\n bind: JointTransform;\n}\n\n/** Joints in topological order: every joint appears after its parent. */\nexport interface Skeleton {\n joints: Joint[];\n}\n\n/** Local deltas from the bind pose, keyed by joint name. Absent joints and\n * absent fields mean \"no change from bind\". */\nexport type Pose = Record<string, Partial<JointTransform>>;\n\n/** The transform that changes nothing: origin, no rotation, unit scale. */\nexport const IDENTITY_JOINT: JointTransform = {\n x: 0, y: 0, rotation: 0, scaleX: 1, scaleY: 1,\n};\n"],"mappings":";AA+BA,IAAaA,IAAiC;CAC5C,GAAG;CAAG,GAAG;CAAG,UAAU;CAAG,QAAQ;CAAG,QAAQ;AAC9C"}
@@ -0,0 +1,23 @@
1
+ import { bindRig as e } from "./bindRig.js";
2
+ import { useEffect as t, useMemo as n } from "react";
3
+ //#region src/animation/rig/useRig.ts
4
+ function r(r) {
5
+ let { scene: i, skeleton: a, bindings: o, apply: s, descriptor: c } = r, l = n(() => e({
6
+ scene: i,
7
+ skeleton: a,
8
+ bindings: o,
9
+ apply: s,
10
+ descriptor: c
11
+ }), [
12
+ i,
13
+ a,
14
+ o,
15
+ s,
16
+ c
17
+ ]);
18
+ return t(() => () => l.release(), [l]), l;
19
+ }
20
+ //#endregion
21
+ export { r as useRig };
22
+
23
+ //# sourceMappingURL=useRig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRig.js","names":["useRig","options","rig","useMemo","bindRig","scene","skeleton","bindings","apply","descriptor","useEffect"],"sources":["../../../src/animation/rig/useRig.ts"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { bindRig, type BindRigOptions, type Rig } from './bindRig';\n\n/**\n * A {@link Rig} bound for the component's lifetime, its overrides dropped on\n * unmount. Rebinds — re-reading every node's rest pose — whenever an option's\n * identity changes, so hoist or memoize `skeleton` and `bindings`.\n */\nexport function useRig<TPose>(options: BindRigOptions<TPose>): Rig {\n const { scene, skeleton, bindings, apply, descriptor } = options;\n const rig = useMemo(\n () => bindRig({ scene, skeleton, bindings, apply, descriptor }),\n [scene, skeleton, bindings, apply, descriptor],\n );\n useEffect(() => () => rig.release(), [rig]);\n return rig;\n}\n"],"mappings":";;;AAQA,SAAgBA,EAAc,GAAqC;CACjE,IAAM,EAAE,UAAO,aAAU,aAAU,UAAO,kBAAeC,GACnDC,IAAMC,QACJC,EAAQ;EAAE;EAAO;EAAU;EAAU;EAAO;CAAW,CAAC,GAC9D;EAACC;EAAOC;EAAUC;EAAUC;EAAOC;CAAU,CAC/C;CAEA,OADAC,cAAsBR,EAAI,QAAQ,GAAG,CAACA,CAAG,CAAC,GACnCA;AACT"}
@@ -0,0 +1,27 @@
1
+ //#region src/animation/slew.ts
2
+ function e(e, t) {
3
+ if (t === void 0) return Infinity;
4
+ if (!(t >= 0)) throw RangeError(`slew: ${e} must be a rate >= 0, got ${t}`);
5
+ return t;
6
+ }
7
+ function t(t, n, r, i) {
8
+ let a = e("rise", i.rise), o = e("fall", i.fall);
9
+ return n > t ? Math.min(n, t + a * r) : n < t ? Math.max(n, t - o * r) : t;
10
+ }
11
+ function n(n = {}) {
12
+ let r = {
13
+ rise: e("rise", n.rise),
14
+ fall: e("fall", n.fall)
15
+ }, i = n.value ?? 0, a = {
16
+ value: i,
17
+ target: n.target ?? i,
18
+ step(e) {
19
+ return a.value = t(a.value, a.target, e, r), a.value;
20
+ }
21
+ };
22
+ return a;
23
+ }
24
+ //#endregion
25
+ export { n as createSlew, t as slewToward };
26
+
27
+ //# sourceMappingURL=slew.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slew.js","names":["checkRate","rate","name","slewToward","rise","rates","fall","target","value","dt","createSlew","options","slew"],"sources":["../../src/animation/slew.ts"],"sourcesContent":["/** Most a slewed value may change per second, in its own units, in each\n * direction. A direction left out is unlimited: the value jumps to a target\n * on that side. `0` holds the value where it is. */\nexport interface SlewRates {\n rise?: number;\n fall?: number;\n}\n\nfunction checkRate(name: string, rate: number | undefined): number {\n if (rate === undefined) return Infinity;\n if (!(rate >= 0)) throw new RangeError(`slew: ${name} must be a rate >= 0, got ${rate}`);\n return rate;\n}\n\n/**\n * One step of a slew limiter: `value` moved toward `target` by at most the\n * rate for that direction times `dt` seconds, landing on `target` rather than\n * passing it. A fast `rise` with a slow `fall` is an attack/release envelope.\n */\nexport function slewToward(value: number, target: number, dt: number, rates: SlewRates): number {\n const rise = checkRate('rise', rates.rise);\n const fall = checkRate('fall', rates.fall);\n if (target > value) return Math.min(target, value + rise * dt);\n if (target < value) return Math.max(target, value - fall * dt);\n return value;\n}\n\n/** A value that follows `target` at limited rates. Both fields are writable:\n * set `target` to steer it, or write `value` to jump it and let it slew on\n * from there. Nothing moves until `step` is called. */\nexport interface Slew {\n value: number;\n target: number;\n /** Advance `dt` seconds and return the new value. */\n step(dt: number): number;\n}\n\n/** A stateful {@link slewToward}. `target` defaults to `value`, so a new slew\n * is at rest. */\nexport function createSlew(options: SlewRates & { value?: number; target?: number } = {}): Slew {\n const rates: SlewRates = { rise: checkRate('rise', options.rise), fall: checkRate('fall', options.fall) };\n const value = options.value ?? 0;\n const slew: Slew = {\n value,\n target: options.target ?? value,\n step(dt) {\n slew.value = slewToward(slew.value, slew.target, dt, rates);\n return slew.value;\n },\n };\n return slew;\n}\n"],"mappings":";AAQA,SAASA,EAAU,GAAc,GAAkC;CACjE,IAAIC,MAAS,KAAA,GAAW,OAAO;CAC/B,IAAI,EAAEA,KAAQ,IAAI,MAAU,WAAW,SAASC,EAAK,4BAA4BD,GAAM;CACvF,OAAOA;AACT;AAOA,SAAgBE,EAAW,GAAe,GAAgB,GAAY,GAA0B;CAC9F,IAAMC,IAAOJ,EAAU,QAAQK,EAAM,IAAI,GACnCC,IAAON,EAAU,QAAQK,EAAM,IAAI;CAGzC,OAFIE,IAASC,IAAc,KAAK,IAAID,GAAQC,IAAQJ,IAAOK,CAAE,IACzDF,IAASC,IAAc,KAAK,IAAID,GAAQC,IAAQF,IAAOG,CAAE,IACtDD;AACT;AAcA,SAAgBE,EAAW,IAA2D,CAAC,GAAS;CAC9F,IAAML,IAAmB;EAAE,MAAML,EAAU,QAAQW,EAAQ,IAAI;EAAG,MAAMX,EAAU,QAAQW,EAAQ,IAAI;CAAE,GAClGH,IAAQG,EAAQ,SAAS,GACzBC,IAAa;EACjB;EACA,QAAQD,EAAQ,UAAUH;EAC1B,KAAK,GAAI;GAEP,OADA,EAAK,QAAQL,EAAWS,EAAK,OAAOA,EAAK,QAAQH,GAAIJ,CAAK,GACnDO,EAAK;EACd;CACF;CACA,OAAOA;AACT"}
@@ -0,0 +1,138 @@
1
+ import { springPose as e } from "./poseHelpers.js";
2
+ //#region src/animation/stagger.ts
3
+ var t = class {
4
+ timers;
5
+ supervisor;
6
+ id;
7
+ cancelled = !1;
8
+ paused_ = !1;
9
+ timeScale_ = 1;
10
+ children = [];
11
+ pending = [];
12
+ outstanding;
13
+ finished = !1;
14
+ constructor(e, t, n) {
15
+ this.timers = e, this.supervisor = t, this.id = t.id, this.outstanding = n, t.setOnCancel(() => this.handleSupervisorCancel());
16
+ }
17
+ handleSupervisorCancel() {
18
+ if (this.cancelled) return;
19
+ this.cancelled = !0;
20
+ for (let e of this.pending) e.timer != null && this.timers.clearTimer(e.timer);
21
+ this.pending = [];
22
+ let e = this.children.slice();
23
+ this.children = [];
24
+ for (let t of e) t.cancel();
25
+ }
26
+ noteChildDone() {
27
+ this.cancelled || this.finished || (--this.outstanding, this.outstanding <= 0 && (this.finished = !0, this.children = [], this.supervisor.finish()));
28
+ }
29
+ addChild(e) {
30
+ if (this.cancelled) {
31
+ e.cancel();
32
+ return;
33
+ }
34
+ this.children.push(e), this.paused_ && e.pause(), this.timeScale_ !== 1 && e.setTimeScale(this.timeScale_);
35
+ }
36
+ schedule(e, t) {
37
+ if (this.cancelled) return;
38
+ let n = {
39
+ timer: null,
40
+ resolvedAt: this.timers.now() + e,
41
+ fire: () => {},
42
+ remainingMs: e,
43
+ paused: !1
44
+ };
45
+ n.fire = () => {
46
+ if (this.cancelled) return;
47
+ let e = this.pending.indexOf(n);
48
+ e >= 0 && this.pending.splice(e, 1), t();
49
+ }, this.paused_ ? n.paused = !0 : n.timer = this.timers.setTimer(n.fire, e), this.pending.push(n);
50
+ }
51
+ cancel() {
52
+ this.supervisor.cancel();
53
+ }
54
+ pause() {
55
+ if (this.paused_) return;
56
+ this.paused_ = !0;
57
+ let e = this.timers.now();
58
+ for (let t of this.pending) t.timer != null && (t.remainingMs = Math.max(0, t.resolvedAt - e), this.timers.clearTimer(t.timer), t.timer = null, t.paused = !0);
59
+ for (let e of this.children) e.pause();
60
+ }
61
+ resume() {
62
+ if (!this.paused_) return;
63
+ this.paused_ = !1;
64
+ let e = this.timers.now();
65
+ for (let t of this.pending) t.paused &&= (t.resolvedAt = e + t.remainingMs, t.timer = this.timers.setTimer(t.fire, t.remainingMs), !1);
66
+ for (let e of this.children) e.resume();
67
+ }
68
+ setTimeScale(e) {
69
+ this.timeScale_ = e;
70
+ for (let t of this.children) t.setTimeScale(e);
71
+ }
72
+ timeScale() {
73
+ return this.timeScale_;
74
+ }
75
+ isPaused() {
76
+ return this.paused_;
77
+ }
78
+ };
79
+ function n(e, t) {
80
+ return typeof e == "function" ? e(t) : e * t;
81
+ }
82
+ function r(e, t, n, r, a, o, c, l) {
83
+ return c ? i(t, n, r, a, o, c, l) : s(e, t, n, r, a, o);
84
+ }
85
+ function i(e, r, i, a, o, s, c) {
86
+ let l = r({
87
+ kind: "stagger",
88
+ cancelKey: c?.cancelKey,
89
+ label: c?.label
90
+ }), u = new t(e, l, a.length);
91
+ return a.length === 0 ? (l.finish(), u) : (a.forEach((e, t) => {
92
+ let r = n(o, t), a = () => {
93
+ let n = s(e, t);
94
+ i(n.id, () => u.noteChildDone()), u.addChild(n);
95
+ };
96
+ r <= 0 ? a() : u.schedule(r, a);
97
+ }), u);
98
+ }
99
+ function a(e, t, n) {
100
+ return typeof e == "function" ? e(t, n) : e;
101
+ }
102
+ function o(e) {
103
+ if (typeof e == "object" && e && "id" in e) {
104
+ let t = e.id;
105
+ if (typeof t == "string") return t;
106
+ }
107
+ if (typeof e == "string" || typeof e == "number") return String(e);
108
+ throw Error("stagger().springPose: each item must either be a primitive (string/number) or have a string `id` field. Otherwise pose ids would collide.");
109
+ }
110
+ function s(t, n, r, s, c, l) {
111
+ return {
112
+ each: (e, t) => i(n, r, s, c, l, e, t),
113
+ tween: (e) => i(n, r, s, c, l, (n, r) => t.tween({
114
+ from: a(e.from, n, r),
115
+ to: a(e.to, n, r),
116
+ ms: a(e.ms, n, r),
117
+ easing: e.easing,
118
+ interpolate: e.interpolate,
119
+ onTick: (t) => e.onTick(t, n, r),
120
+ onDone: e.onDone ? () => e.onDone(n, r) : void 0
121
+ }), e),
122
+ springPose: (a, u, d = {}) => i(n, r, s, c, l, (n, r) => e(t, a, {
123
+ id: o(n),
124
+ to: u(n, r),
125
+ preset: d.preset,
126
+ stiffness: d.stiffness,
127
+ damping: d.damping,
128
+ mass: d.mass,
129
+ geometry: d.geometry,
130
+ recordOp: d.recordOp,
131
+ opLabel: d.opLabel
132
+ }), d)
133
+ };
134
+ }
135
+ //#endregion
136
+ export { r as createStagger };
137
+
138
+ //# sourceMappingURL=stagger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stagger.js","names":["CompositeHandle","timers","supervisor","totalItems","p","kids","c","h","entry","delayMs","idx","fire","now","s","delayFor","delay","i","createStagger","factory","runStagger","createSupervisor","watchCompletion","items","opts","makeBuilder","animator","composite","ms","child","item","resolvePerItem","v","itemId","id","springPose","adapter","poseFn"],"sources":["../../src/animation/stagger.ts"],"sourcesContent":["import { springPose } from './poseHelpers';\nimport type { Supervisor, SupervisorFactory, WatchCompletion } from './supervisor';\nimport type {\n AnimationHandle,\n Animator,\n StaggerBuilder,\n StaggerDelay,\n StaggerFactory,\n StaggerOptions,\n StaggerPerItem,\n StaggerSpringPoseOptions,\n StaggerTweenOptions,\n} from './types';\nimport type { SceneAdapter } from 'core/adapters/types';\n\n/** Resolved timer-pair + clock, supplied by `useAnimator` so stagger picks\n * up the same test-time injection points the rAF loop uses. `now` is used\n * by pause/resume to freeze pending timers at their remaining time. */\nexport interface StaggerTimers {\n setTimer: (cb: () => void, ms: number) => unknown;\n clearTimer: (handle: unknown) => void;\n now: () => number;\n}\n\ninterface PendingEntry {\n /** Active host-scheduler timer handle, or null while paused. */\n timer: unknown | null;\n /** Absolute virtual-time at which the entry should fire. */\n resolvedAt: number;\n /** Wrapped callback (drops itself from `pending` before invoking the user fire). */\n fire: () => void;\n /** Remaining ms when paused; ignored while running. */\n remainingMs: number;\n /** True while the timer is suspended by `composite.pause()`. */\n paused: boolean;\n}\n\n/**\n * Composite handle returned by `createStagger`. Owns a list of in-flight\n * child handles and a list of pending timer entries; cancel cancels both.\n * Pause/resume/setTimeScale propagate to in-flight children; pause/resume\n * also freeze and thaw pending per-item timers, preserving each entry's\n * remaining time across the pause.\n *\n * Registered with the animator via a supervisor so animator.cancel /\n * cancelKey / isActive all work for it.\n */\nclass CompositeHandle implements AnimationHandle {\n readonly id: number;\n private cancelled = false;\n private paused_ = false;\n private timeScale_ = 1;\n private children: AnimationHandle[] = [];\n private pending: PendingEntry[] = [];\n private outstanding: number;\n private finished = false;\n\n constructor(\n private timers: StaggerTimers,\n private supervisor: Supervisor,\n totalItems: number,\n ) {\n this.id = supervisor.id;\n this.outstanding = totalItems;\n supervisor.setOnCancel(() => this.handleSupervisorCancel());\n }\n\n /** Invoked when the supervisor is cancelled externally (animator.cancel /\n * cancelKey) OR via this composite's own `cancel`. */\n private handleSupervisorCancel(): void {\n if (this.cancelled) return;\n this.cancelled = true;\n for (const p of this.pending) {\n if (p.timer != null) this.timers.clearTimer(p.timer);\n }\n this.pending = [];\n // Snapshot children first: child.cancel() may synchronously invoke our\n // own noteChildDone path via the animator's completion listener, which\n // would mutate this.children mid-iteration.\n const kids = this.children.slice();\n this.children = [];\n for (const c of kids) c.cancel();\n }\n\n noteChildDone(): void {\n if (this.cancelled || this.finished) return;\n this.outstanding -= 1;\n if (this.outstanding <= 0) {\n this.finished = true;\n this.children = [];\n this.supervisor.finish();\n }\n }\n\n addChild(h: AnimationHandle): void {\n if (this.cancelled) {\n h.cancel();\n return;\n }\n this.children.push(h);\n if (this.paused_) h.pause();\n if (this.timeScale_ !== 1) h.setTimeScale(this.timeScale_);\n }\n\n schedule(delayMs: number, fire: () => void): void {\n if (this.cancelled) return;\n const entry: PendingEntry = {\n timer: null,\n resolvedAt: this.timers.now() + delayMs,\n fire: () => {},\n remainingMs: delayMs,\n paused: false,\n };\n entry.fire = (): void => {\n if (this.cancelled) return;\n const idx = this.pending.indexOf(entry);\n if (idx >= 0) this.pending.splice(idx, 1);\n fire();\n };\n if (this.paused_) {\n entry.paused = true;\n } else {\n entry.timer = this.timers.setTimer(entry.fire, delayMs);\n }\n this.pending.push(entry);\n }\n\n cancel(): void {\n // Route through the supervisor so the animator's id table is kept in\n // sync. The supervisor's onCancel forwards back to\n // handleSupervisorCancel which actually tears down children + timers.\n this.supervisor.cancel();\n }\n\n pause(): void {\n if (this.paused_) return;\n this.paused_ = true;\n const now = this.timers.now();\n for (const p of this.pending) {\n if (p.timer != null) {\n p.remainingMs = Math.max(0, p.resolvedAt - now);\n this.timers.clearTimer(p.timer);\n p.timer = null;\n p.paused = true;\n }\n }\n for (const c of this.children) c.pause();\n }\n\n resume(): void {\n if (!this.paused_) return;\n this.paused_ = false;\n const now = this.timers.now();\n for (const p of this.pending) {\n if (p.paused) {\n p.resolvedAt = now + p.remainingMs;\n p.timer = this.timers.setTimer(p.fire, p.remainingMs);\n p.paused = false;\n }\n }\n for (const c of this.children) c.resume();\n }\n\n setTimeScale(s: number): void {\n this.timeScale_ = s;\n for (const c of this.children) c.setTimeScale(s);\n }\n\n timeScale(): number {\n return this.timeScale_;\n }\n\n isPaused(): boolean {\n return this.paused_;\n }\n}\n\nfunction delayFor(delay: StaggerDelay, i: number): number {\n return typeof delay === 'function' ? delay(i) : delay * i;\n}\n\n/**\n * Stagger primitive. With `factory`, returns the composite handle directly.\n * Without `factory`, returns a `StaggerBuilder` whose `.each` runs the\n * stagger with a factory.\n */\nexport function createStagger<TItem>(\n animator: Animator,\n timers: StaggerTimers,\n createSupervisor: SupervisorFactory,\n watchCompletion: WatchCompletion,\n items: readonly TItem[],\n delay: StaggerDelay,\n factory: StaggerFactory<TItem>,\n opts?: StaggerOptions,\n): AnimationHandle;\nexport function createStagger<TItem>(\n animator: Animator,\n timers: StaggerTimers,\n createSupervisor: SupervisorFactory,\n watchCompletion: WatchCompletion,\n items: readonly TItem[],\n delay: StaggerDelay,\n): StaggerBuilder<TItem>;\nexport function createStagger<TItem>(\n animator: Animator,\n timers: StaggerTimers,\n createSupervisor: SupervisorFactory,\n watchCompletion: WatchCompletion,\n items: readonly TItem[],\n delay: StaggerDelay,\n factory?: StaggerFactory<TItem>,\n opts?: StaggerOptions,\n): AnimationHandle | StaggerBuilder<TItem> {\n if (factory) return runStagger(timers, createSupervisor, watchCompletion, items, delay, factory, opts);\n return makeBuilder(animator, timers, createSupervisor, watchCompletion, items, delay);\n}\n\nfunction runStagger<TItem>(\n timers: StaggerTimers,\n createSupervisor: SupervisorFactory,\n watchCompletion: WatchCompletion,\n items: readonly TItem[],\n delay: StaggerDelay,\n factory: StaggerFactory<TItem>,\n opts?: StaggerOptions,\n): AnimationHandle {\n const supervisor = createSupervisor({ kind: 'stagger', cancelKey: opts?.cancelKey, label: opts?.label });\n const composite = new CompositeHandle(timers, supervisor, items.length);\n if (items.length === 0) {\n supervisor.finish();\n return composite;\n }\n items.forEach((item, i) => {\n const ms = delayFor(delay, i);\n const fire = (): void => {\n const child = factory(item, i);\n // Hook into the child's deregistration (natural OR cancel). If the\n // composite is already cancelled, the watcher fires immediately on\n // cancel and the noteChildDone branch is a no-op (cancelled guard).\n watchCompletion(child.id, () => composite.noteChildDone());\n composite.addChild(child);\n };\n if (ms <= 0) fire();\n else composite.schedule(ms, fire);\n });\n return composite;\n}\n\nfunction resolvePerItem<T, TItem>(\n v: StaggerPerItem<T, TItem>,\n item: TItem,\n i: number,\n): T {\n return typeof v === 'function'\n ? (v as (item: TItem, index: number) => T)(item, i)\n : v;\n}\n\nfunction itemId(item: unknown): string {\n if (item != null && typeof item === 'object' && 'id' in item) {\n const id = (item as { id: unknown }).id;\n if (typeof id === 'string') return id;\n }\n if (typeof item === 'string' || typeof item === 'number') return String(item);\n throw new Error(\n 'stagger().springPose: each item must either be a primitive (string/number) ' +\n 'or have a string `id` field. Otherwise pose ids would collide.',\n );\n}\n\nfunction makeBuilder<TItem>(\n animator: Animator,\n timers: StaggerTimers,\n createSupervisor: SupervisorFactory,\n watchCompletion: WatchCompletion,\n items: readonly TItem[],\n delay: StaggerDelay,\n): StaggerBuilder<TItem> {\n return {\n each: (factory, opts) =>\n runStagger(timers, createSupervisor, watchCompletion, items, delay, factory, opts),\n tween: <T,>(opts: StaggerTweenOptions<T, TItem>) =>\n runStagger(timers, createSupervisor, watchCompletion, items, delay, (item, i) =>\n animator.tween<T>({\n from: resolvePerItem(opts.from, item, i),\n to: resolvePerItem(opts.to, item, i),\n ms: resolvePerItem(opts.ms, item, i),\n easing: opts.easing,\n interpolate: opts.interpolate,\n onTick: (v) => opts.onTick(v, item, i),\n onDone: opts.onDone ? () => opts.onDone!(item, i) : undefined,\n }),\n opts,\n ),\n springPose: <TPose,>(\n adapter: SceneAdapter<{ id: string }, TPose>,\n poseFn: (item: TItem, index: number) => TPose,\n opts: StaggerSpringPoseOptions<TPose> = {},\n ) =>\n runStagger(timers, createSupervisor, watchCompletion, items, delay, (item, i) =>\n springPose(animator, adapter, {\n id: itemId(item),\n to: poseFn(item, i),\n preset: opts.preset,\n stiffness: opts.stiffness,\n damping: opts.damping,\n mass: opts.mass,\n geometry: opts.geometry,\n recordOp: opts.recordOp,\n opLabel: opts.opLabel,\n }),\n opts,\n ),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ function e(e, t) {
2
+ let n = 0, r = e.length;
3
+ for (; n < r;) {
4
+ let i = n + r >> 1;
5
+ e[i].t > t ? r = i : n = i + 1;
6
+ }
7
+ return n;
8
+ }
9
+ var t = (e, t) => e.lap > t.lap || e.lap === t.lap && e.r > t.r;
10
+ function n(n, r) {
11
+ let i = n.lookahead ?? 100, a = n.maxLate ?? Infinity, o = /* @__PURE__ */ new Map(), s = {
12
+ lap: 0,
13
+ r: -Infinity
14
+ }, c = [], l = null, u = 0, d = 0, f = () => ({
15
+ lap: r.lap(),
16
+ r: r.playhead()
17
+ }), p = (e) => (e.lap - r.lap()) * r.duration() + e.r, m = (e) => t(e, f()), h = (e, n) => {
18
+ c = c.filter((t) => {
19
+ if (!t.handle || t.when <= e || !m(t) || !n(t)) return !0;
20
+ try {
21
+ t.handle.stop();
22
+ } catch (e) {
23
+ console.error("timeline: booking stop threw", e);
24
+ }
25
+ return !1;
26
+ });
27
+ let r = f();
28
+ for (let [e, n] of o) t(n, r) && o.set(e, r);
29
+ t(s, r) && (s = r);
30
+ }, g = (e, t, n, r) => Math.max(l + (e - t) / n, r), _ = (t, n, i, l, u, d) => {
31
+ let f = r.lap(), p = r.duration(), m = r.playhead(), { events: h } = t, _ = o.get(t) ?? s;
32
+ for (;;) {
33
+ let t = (_.lap - f) * p;
34
+ if (t > i) break;
35
+ let r = e(h, _.r - n);
36
+ if (r >= h.length || n + h[r].t > p) {
37
+ if (_.lap >= l) break;
38
+ _ = {
39
+ lap: Math.max(_.lap + 1, f),
40
+ r: -Infinity
41
+ };
42
+ continue;
43
+ }
44
+ let o = n + h[r].t, s = t + o;
45
+ if (s > i) break;
46
+ _ = {
47
+ lap: _.lap,
48
+ r: o
49
+ };
50
+ for (let e = r; e < h.length && h[e].t === h[r].t; e += 1) {
51
+ let t = h[e];
52
+ if (!t.book || c.some((e) => e.event === t && e.lap === _.lap) || (m - s) / d > a) continue;
53
+ let n = g(s, m, d, u), r;
54
+ try {
55
+ r = t.book(n) ?? void 0;
56
+ } catch (e) {
57
+ console.error("timeline: book threw", e);
58
+ }
59
+ c.push({
60
+ event: t,
61
+ lap: _.lap,
62
+ r: o,
63
+ when: n,
64
+ handle: r
65
+ });
66
+ }
67
+ }
68
+ o.set(t, _);
69
+ }, v = (e, t, n, r, i, a) => {
70
+ for (let o of e) o.kind === "event" ? _(o, t, n, r, i, a) : o.kind === "timeline" && v(o.timeline.tracks, t + o.at, n, r, i, a);
71
+ };
72
+ return {
73
+ tick(e, t) {
74
+ let a = n.clock.now();
75
+ if (c = c.filter(m), !(t > 0)) {
76
+ d > 0 && h(a, () => !0), d = 0, l = null;
77
+ return;
78
+ }
79
+ let o = d > 0 && t !== d;
80
+ if (l === null) l = a;
81
+ else {
82
+ l += (e - u) / t;
83
+ let n = a - l;
84
+ Math.abs(n) > 50 ? (l = a, o = !0) : l += n * .05;
85
+ }
86
+ u = e, d = t;
87
+ let s = r.playhead();
88
+ o && h(a, (e) => Math.abs(g(p(e), s, t, a) - e.when) > 1);
89
+ let f = r.duration(), _ = r.lap() + (f > 0 ? r.lapsLeft() : 0);
90
+ v(r.tracks, 0, s + i * t, _, a, t);
91
+ },
92
+ retract() {
93
+ h(n.clock.now(), () => !0);
94
+ },
95
+ seek() {
96
+ c = [], o.clear(), s = f();
97
+ },
98
+ rearm() {
99
+ l = null;
100
+ }
101
+ };
102
+ }
103
+ //#endregion
104
+ export { n as createBooker, e as firstAfter };
105
+
106
+ //# sourceMappingURL=booking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking.js","names":["firstAfter","lo","hi","events","mid","isAfter","a","b","createBooker","lookahead","opts","maxLate","cursors","start","bookings","est","mapVirtual","lastScale","playheadCursor","host","unwrapped","ahead","stopWhere","now","pred","err","at","track","c","whenFor","u","playhead","scale","scanTrack","lap","duration","lapStart","horizon","i","lastLap","r","j","ev","when","handle","visit","tracks","moved","virtualNow","residual"],"sources":["../../../src/animation/timeline/booking.ts"],"sourcesContent":["import type { EventBooking, EventBookingHandle, EventTrack, TimelineEvent, Track } from './types';\n\n/** A clock read further than this from the frame clock's prediction is taken\n * as a discontinuity — a hidden tab, a suspended context — not as jitter. */\nconst RESYNC_MS = 50;\n/** Share of each frame's clock residual folded into the estimate. Small enough\n * to average out a per-frame read that lands a render quantum early or late;\n * large enough to follow ppm-scale drift with well under a millisecond of lag. */\nconst SLEW = 0.05;\n/** A pending booking a rate change or resync moves by more than this is\n * retracted and booked again; anything less is left standing. */\nconst RETIME_MS = 1;\n\n/** Index of the first event after `t`. Binary search: tracks may be long. */\nexport function firstAfter(events: EventTrack['events'], t: number): number {\n let lo = 0;\n let hi = events.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (events[mid].t > t) hi = mid; else lo = mid + 1;\n }\n return lo;\n}\n\n/** The timeline state a booker reads. `lap` counts wraps since creation and is\n * never reset, so a (lap, root time) pair names one crossing for good. */\nexport interface BookerHost {\n tracks: Track[];\n duration(): number;\n /** Laps still allowed after the current one; `Infinity` when endless. */\n lapsLeft(): number;\n lap(): number;\n playhead(): number;\n}\n\nexport interface Booker {\n /** After the frame's wraps and crossings. `scale` is the effective one this\n * frame's virtual time advanced at, zero while paused. */\n tick(virtualNow: number, scale: number): void;\n /** Stop every booking still ahead of both the playhead and the clock, and\n * let the next tick book that span again. */\n retract(): void;\n /** After the playhead jumped. Call `retract` first, while it still reads the\n * old playhead. */\n seek(): void;\n /** After the animator restarted the timeline's virtual clock at zero. */\n rearm(): void;\n}\n\n/** Every event at root time `<= r` in lap `lap` has been taken. */\ninterface Cursor { lap: number; r: number }\n\ninterface Booking {\n event: TimelineEvent;\n lap: number;\n r: number;\n when: number;\n handle?: EventBookingHandle;\n}\n\nconst isAfter = (a: Cursor, b: Cursor): boolean => a.lap > b.lap || (a.lap === b.lap && a.r > b.r);\n\nexport function createBooker(opts: EventBooking, host: BookerHost): Booker {\n const lookahead = opts.lookahead ?? 100;\n const maxLate = opts.maxLate ?? Infinity;\n const cursors = new Map<EventTrack, Cursor>();\n let start: Cursor = { lap: 0, r: -Infinity };\n let bookings: Booking[] = [];\n /** Clock time of the current frame, smoothed. Null until anchored. */\n let est: number | null = null;\n let mapVirtual = 0;\n let lastScale = 0;\n\n const playheadCursor = (): Cursor => ({ lap: host.lap(), r: host.playhead() });\n\n const unwrapped = (b: { lap: number; r: number }): number =>\n (b.lap - host.lap()) * host.duration() + b.r;\n\n const ahead = (b: Booking): boolean => isAfter(b, playheadCursor());\n\n const stopWhere = (now: number, pred: (b: Booking) => boolean): void => {\n bookings = bookings.filter((b) => {\n if (!b.handle || b.when <= now || !ahead(b) || !pred(b)) return true;\n try { b.handle.stop(); } catch (err) { console.error('timeline: booking stop threw', err); }\n return false;\n });\n // Back to the playhead, not to each retracted booking: whatever still\n // stands is skipped by identity, and an edit may have added events behind\n // the cursor that only a rescan finds.\n const at = playheadCursor();\n for (const [track, c] of cursors) if (isAfter(c, at)) cursors.set(track, at);\n if (isAfter(start, at)) start = at;\n };\n\n const whenFor = (u: number, playhead: number, scale: number, now: number): number =>\n Math.max(est! + (u - playhead) / scale, now);\n\n const scanTrack = (\n track: EventTrack, at: number, horizon: number, lastLap: number, now: number, scale: number,\n ): void => {\n const lap = host.lap();\n const duration = host.duration();\n const playhead = host.playhead();\n const { events } = track;\n let c = cursors.get(track) ?? start;\n for (;;) {\n const lapStart = (c.lap - lap) * duration;\n if (lapStart > horizon) break;\n const i = firstAfter(events, c.r - at);\n if (i >= events.length || at + events[i].t > duration) {\n if (c.lap >= lastLap) break;\n // A frame that skipped whole laps books the outgoing lap's tail and\n // nothing of the laps in between, as crossings do.\n c = { lap: Math.max(c.lap + 1, lap), r: -Infinity };\n continue;\n }\n const r = at + events[i].t;\n const u = lapStart + r;\n if (u > horizon) break;\n c = { lap: c.lap, r };\n for (let j = i; j < events.length && events[j].t === events[i].t; j += 1) {\n const ev = events[j];\n if (!ev.book || bookings.some((b) => b.event === ev && b.lap === c.lap)) continue;\n if ((playhead - u) / scale > maxLate) continue;\n const when = whenFor(u, playhead, scale, now);\n let handle: EventBookingHandle | undefined;\n try {\n handle = ev.book(when) ?? undefined;\n } catch (err) {\n console.error('timeline: book threw', err);\n }\n bookings.push({ event: ev, lap: c.lap, r, when, handle });\n }\n }\n cursors.set(track, c);\n };\n\n const visit = (\n tracks: Track[], at: number, horizon: number, lastLap: number, now: number, scale: number,\n ): void => {\n for (const track of tracks) {\n if (track.kind === 'event') scanTrack(track, at, horizon, lastLap, now, scale);\n else if (track.kind === 'timeline') {\n visit(track.timeline.tracks, at + track.at, horizon, lastLap, now, scale);\n }\n }\n };\n\n return {\n tick(virtualNow, scale) {\n const now = opts.clock.now();\n bookings = bookings.filter(ahead);\n if (!(scale > 0)) {\n if (lastScale > 0) stopWhere(now, () => true);\n lastScale = 0;\n est = null;\n return;\n }\n\n let moved = lastScale > 0 && scale !== lastScale;\n if (est === null) {\n est = now;\n } else {\n est += (virtualNow - mapVirtual) / scale;\n const residual = now - est;\n if (Math.abs(residual) > RESYNC_MS) {\n est = now;\n moved = true;\n } else {\n est += residual * SLEW;\n }\n }\n mapVirtual = virtualNow;\n lastScale = scale;\n\n const playhead = host.playhead();\n if (moved) {\n stopWhere(now, (b) => Math.abs(whenFor(unwrapped(b), playhead, scale, now) - b.when) > RETIME_MS);\n }\n\n const duration = host.duration();\n const lastLap = host.lap() + (duration > 0 ? host.lapsLeft() : 0);\n visit(host.tracks, 0, playhead + lookahead * scale, lastLap, now, scale);\n },\n retract() {\n stopWhere(opts.clock.now(), () => true);\n },\n seek() {\n bookings = [];\n cursors.clear();\n start = playheadCursor();\n },\n rearm() {\n est = null;\n },\n };\n}\n"],"mappings":"AAcA,SAAgBA,EAAW,GAA8B,GAAmB;CAC1E,IAAIC,IAAK,GACLC,IAAKC,EAAO;CAChB,OAAOF,IAAKC,IAAI;EACd,IAAME,IAAOH,IAAKC,KAAO;EACzB,AAAIC,EAAOC,EAAI,CAAC,IAAI,IAAG,IAAKA,IAAU,IAAKA,IAAM;CACnD;CACA,OAAOH;AACT;AAsCA,IAAMI,KAAW,GAAW,MAAuBC,EAAE,MAAMC,EAAE,OAAQD,EAAE,QAAQC,EAAE,OAAOD,EAAE,IAAIC,EAAE;AAEhG,SAAgBC,EAAa,GAAoB,GAA0B;CACzE,IAAMC,IAAYC,EAAK,aAAa,KAC9BC,IAAUD,EAAK,WAAW,UAC1BE,oBAAU,IAAI,IAAwB,GACxCC,IAAgB;EAAE,KAAK;EAAG,GAAG;CAAU,GACvCC,IAAsB,CAAC,GAEvBC,IAAqB,MACrBC,IAAa,GACbC,IAAY,GAEVC,WAAgC;EAAE,KAAKC,EAAK,IAAI;EAAG,GAAGA,EAAK,SAAS;CAAE,IAEtEC,KAAa,OAChBb,EAAE,MAAMY,EAAK,IAAI,KAAKA,EAAK,SAAS,IAAIZ,EAAE,GAEvCc,KAAS,MAAwBhB,EAAQE,GAAGW,EAAe,CAAC,GAE5DI,KAAa,GAAa,MAAwC;EACtE,IAAWR,EAAS,QAAQ,MAAM;GAChC,IAAI,CAACP,EAAE,UAAUA,EAAE,QAAQgB,KAAO,CAACF,EAAMd,CAAC,KAAK,CAACiB,EAAKjB,CAAC,GAAG,OAAO;GAChE,IAAI;IAAE,EAAE,OAAO,KAAK;GAAG,SAASkB,GAAK;IAAE,QAAQ,MAAM,gCAAgCA,CAAG;GAAG;GAC3F,OAAO;EACT,CAAC;EAID,IAAMC,IAAKR,EAAe;EAC1B,KAAK,IAAM,CAACS,GAAOC,MAAMhB,GAAS,AAAIP,EAAQuB,GAAGF,CAAE,KAAGd,EAAQ,IAAIe,GAAOD,CAAE;EAC3E,AAAIrB,EAAQQ,GAAOa,CAAE,MAAG,IAAQA;CAClC,GAEMG,KAAW,GAAW,GAAkB,GAAe,MAC3D,KAAK,IAAId,KAAQe,IAAIC,KAAYC,GAAOT,CAAG,GAEvCU,KACJ,GAAmB,GAAY,GAAiB,GAAiB,GAAa,MACrE;EACT,IAAMC,IAAMf,EAAK,IAAI,GACfgB,IAAWhB,EAAK,SAAS,GACzBY,IAAWZ,EAAK,SAAS,GACzB,EAAE,cAAWQ,GACfC,IAAIhB,EAAQ,IAAIe,CAAK,KAAKd;EAC9B,SAAS;GACP,IAAMuB,KAAYR,EAAE,MAAMM,KAAOC;GACjC,IAAIC,IAAWC,GAAS;GACxB,IAAMC,IAAItC,EAAWG,GAAQyB,EAAE,IAAIF,CAAE;GACrC,IAAIY,KAAKnC,EAAO,UAAUuB,IAAKvB,EAAOmC,EAAE,CAAC,IAAIH,GAAU;IACrD,IAAIP,EAAE,OAAOW,GAAS;IAGtB,IAAI;KAAE,KAAK,KAAK,IAAIX,EAAE,MAAM,GAAGM,CAAG;KAAG,GAAG;IAAU;IAClD;GACF;GACA,IAAMM,IAAId,IAAKvB,EAAOmC,EAAE,CAAC,GACnBR,IAAIM,IAAWI;GACrB,IAAIV,IAAIO,GAAS;GACjB,IAAI;IAAE,KAAKT,EAAE;IAAK;GAAE;GACpB,KAAK,IAAIa,IAAIH,GAAGG,IAAItC,EAAO,UAAUA,EAAOsC,EAAE,CAAC,MAAMtC,EAAOmC,EAAE,CAAC,GAAG,KAAK,GAAG;IACxE,IAAMI,IAAKvC,EAAOsC;IAElB,IADI,CAACC,EAAG,QAAQ5B,EAAS,MAAM,MAAMP,EAAE,UAAUmC,KAAMnC,EAAE,QAAQqB,EAAE,GAAG,MACjEG,IAAWD,KAAKE,IAAQrB,GAAS;IACtC,IAAMgC,IAAOd,EAAQC,GAAGC,GAAUC,GAAOT,CAAG,GACxCqB;IACJ,IAAI;KACF,IAASF,EAAG,KAAKC,CAAI,KAAK,KAAA;IAC5B,SAASlB,GAAK;KACZ,QAAQ,MAAM,wBAAwBA,CAAG;IAC3C;IACA,EAAS,KAAK;KAAE,OAAOiB;KAAI,KAAKd,EAAE;KAAK;KAAG;KAAM;IAAO,CAAC;GAC1D;EACF;EACA,EAAQ,IAAID,GAAOC,CAAC;CACtB,GAEMiB,KACJ,GAAiB,GAAY,GAAiB,GAAiB,GAAa,MACnE;EACT,KAAK,IAAMlB,KAASmB,GAClB,AAAInB,EAAM,SAAS,UAASM,EAAUN,GAAOD,GAAIW,GAASE,GAAShB,GAAKS,CAAK,IACpEL,EAAM,SAAS,cACtBkB,EAAMlB,EAAM,SAAS,QAAQD,IAAKC,EAAM,IAAIU,GAASE,GAAShB,GAAKS,CAAK;CAG9E;CAEA,OAAO;EACL,KAAK,GAAY,GAAO;GACtB,IAAMT,IAAMb,EAAK,MAAM,IAAI;GAE3B,IADA,IAAWI,EAAS,OAAOO,CAAK,GAC5B,EAAEW,IAAQ,IAAI;IAGhB,AAFIf,IAAY,KAAGK,EAAUC,SAAW,EAAI,GAC5C,IAAY,GACZ,IAAM;IACN;GACF;GAEA,IAAIwB,IAAQ9B,IAAY,KAAKe,MAAUf;GACvC,IAAIF,MAAQ,MACV,IAAMQ;QACD;IACL,MAAQyB,IAAahC,KAAcgB;IACnC,IAAMiB,IAAW1B,IAAMR;IACvB,AAAI,KAAK,IAAIkC,CAAQ,IAAI,MACvB,IAAM1B,GACN,IAAQ,MAER,KAAO0B,IAAW;GAEtB;GAEA,AADA,IAAaD,GACb,IAAYhB;GAEZ,IAAMD,IAAWZ,EAAK,SAAS;GAC/B,AAAI4B,KACFzB,EAAUC,IAAM,MAAM,KAAK,IAAIM,EAAQT,EAAUb,CAAC,GAAGwB,GAAUC,GAAOT,CAAG,IAAIhB,EAAE,IAAI,IAAI,CAAS;GAGlG,IAAM4B,IAAWhB,EAAK,SAAS,GACzBoB,IAAUpB,EAAK,IAAI,KAAKgB,IAAW,IAAIhB,EAAK,SAAS,IAAI;GAC/D,EAAMA,EAAK,QAAQ,GAAGY,IAAWtB,IAAYuB,GAAOO,GAAShB,GAAKS,CAAK;EACzE;EACA,UAAU;GACR,EAAUtB,EAAK,MAAM,IAAI,SAAS,EAAI;EACxC;EACA,OAAO;GAGL,AAFA,IAAW,CAAC,GACZE,EAAQ,MAAM,GACd,IAAQM,EAAe;EACzB;EACA,QAAQ;GACN,IAAM;EACR;CACF;AACF"}
@@ -0,0 +1,116 @@
1
+ import { createBooker as e, firstAfter as t } from "./booking.js";
2
+ import { sampleTrack as n } from "./sampleTrack.js";
3
+ //#region src/animation/timeline/createTimeline.ts
4
+ function r(e) {
5
+ switch (e.kind) {
6
+ case "sampled": return e.keys.length ? e.keys[e.keys.length - 1].t : 0;
7
+ case "event": return e.events.length ? e.events[e.events.length - 1].t : 0;
8
+ case "timeline": return e.at + i(e.timeline.tracks, e.timeline.duration);
9
+ }
10
+ }
11
+ function i(e, t) {
12
+ if (t != null) return t;
13
+ let n = 0;
14
+ for (let t of e) n = Math.max(n, r(t));
15
+ return n;
16
+ }
17
+ function a(r, a, o, s) {
18
+ let c = i(o.tracks, o.duration), l = 0, u = 0, d = 0, f = -Infinity, p = !1, m = !0, h = !1, g = o.autoplay === !1, _ = 1, v = /* @__PURE__ */ new Set(), y = o.loop ?? !1, b = y === !0 ? Infinity : y === !1 ? 0 : y, x = 0, S = o.booking ? e(o.booking, {
19
+ tracks: o.tracks,
20
+ duration: () => c,
21
+ lapsLeft: () => b,
22
+ lap: () => x,
23
+ playhead: () => d
24
+ }) : null, C = !1, w = /* @__PURE__ */ new WeakMap(), T = (e) => {
25
+ let t = w.get(e);
26
+ return t || (t = /* @__PURE__ */ new Map(), w.set(e, t)), t;
27
+ }, E = (e, t) => {
28
+ for (let r of e) if (r.kind === "sampled") {
29
+ let e = r, i = n(e, t, T(e));
30
+ i !== void 0 && e.onTick(i);
31
+ } else r.kind === "timeline" && E(r.timeline.tracks, t - r.at);
32
+ }, D = [], O = (e, n, r) => {
33
+ for (let i = 0; i < e.length; i += 1) {
34
+ let a = e[i];
35
+ if (a.kind === "event") {
36
+ let e = t(a.events, r);
37
+ for (let o = t(a.events, n); o < e; o += 1) {
38
+ let e = a.events[o];
39
+ e.fire?.(r - e.t), s?.watched && (D.push(i), s.fire(a, D, e, r - e.t), D.pop()), e.book && !S && !C && (C = !0, console.warn("timeline: an event has `book` but the timeline has no `booking` clock; it never books."));
40
+ }
41
+ } else a.kind === "timeline" && (D.push(i), O(a.timeline.tracks, n - a.at, r - a.at), D.pop());
42
+ }
43
+ }, k = () => {
44
+ O(o.tracks, f, c), f = -Infinity, s?.watched && s.lap(x);
45
+ }, A = (e, t) => {
46
+ if (u = e, d = e + l, c > 0 && d >= c) {
47
+ if (b === Infinity) {
48
+ let e = Math.floor(d / c);
49
+ l -= e * c, d -= e * c, x += e, k();
50
+ } else for (; d >= c && b > 0;) --b, l -= c, d -= c, x += 1, k();
51
+ }
52
+ let n = d >= c;
53
+ return d = Math.min(d, c), E(o.tracks, d), O(o.tracks, f, d), f = d, S?.tick(e, t ?? (N.isPaused() ? 0 : N.timeScale())), n && !p && (p = !0, o.onDone?.()), d < c ? !1 : (m = !1, !0);
54
+ }, j = () => {
55
+ h = !0, m = !1, S?.retract();
56
+ }, M = {
57
+ id: a,
58
+ cancelKey: o.cancelKey,
59
+ tick: A,
60
+ onCancel: j,
61
+ kind: "timeline",
62
+ label: o.label,
63
+ progress: () => c > 0 ? d / c : 1
64
+ }, N = r(M);
65
+ o.autoplay === !1 && N.pause();
66
+ let P = () => {
67
+ h || d >= c || (p = !1, !m && (S?.rearm(), u = 0, l = d, m = !0, r({
68
+ ...M,
69
+ keepExisting: !0
70
+ }), g && N.pause(), N.setTimeScale(_)));
71
+ };
72
+ return {
73
+ ...N,
74
+ cancel() {
75
+ j(), N.cancel();
76
+ },
77
+ pause() {
78
+ g = !0, N.pause(), S?.retract();
79
+ },
80
+ resume() {
81
+ g = !1, N.resume();
82
+ },
83
+ setTimeScale(e) {
84
+ _ = e, N.setTimeScale(e);
85
+ },
86
+ timeScale: () => m ? N.timeScale() : _,
87
+ isPaused: () => m ? N.isPaused() : g,
88
+ seek(e) {
89
+ S?.retract(), l = e - u, d = e, f = e, S?.seek(), P();
90
+ },
91
+ time: () => d,
92
+ duration: () => c,
93
+ tracks: () => o.tracks,
94
+ setLoop(e) {
95
+ b = e === !0 ? Infinity : e === !1 ? 0 : e, S?.retract();
96
+ },
97
+ loop: () => b === Infinity || b !== 0 && b,
98
+ edit(e) {
99
+ e(), w = /* @__PURE__ */ new WeakMap(), c = i(o.tracks, o.duration), S?.retract(), P();
100
+ for (let e of v) try {
101
+ e();
102
+ } catch (e) {
103
+ console.error("timeline: subscriber threw", e);
104
+ }
105
+ },
106
+ subscribe(e) {
107
+ return v.add(e), () => {
108
+ v.delete(e);
109
+ };
110
+ }
111
+ };
112
+ }
113
+ //#endregion
114
+ export { a as createTimeline };
115
+
116
+ //# sourceMappingURL=createTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTimeline.js","names":["trackEnd","track","tracksEnd","explicit","max","tracks","createTimeline","duration","opts","offset","lastVirtual","playhead","prevPlayhead","done","live","cancelled","wantPaused","wantScale","subscribers","loopOpt","loopsLeft","lap","booker","createBooker","warnedUnbooked","caches","cacheFor","c","applySampled","st","v","sampleTrack","path","fireEvents","k","end","firstAfter","to","i","from","ev","report","onWrap","tick","virtualNow","laps","finished","scale","base","onCancel","seed","register","rearm","s","t","loop","fn","cb","err"],"sources":["../../../src/animation/timeline/createTimeline.ts"],"sourcesContent":["import type { AnimationHandle } from '../types';\nimport { createBooker, firstAfter } from './booking';\nimport { sampleTrack } from './sampleTrack';\nimport type { EventTrack, SampledTrack, TimelineEvent, TimelineHandle, TimelineOptions, Track } from './types';\n\n/** The animator's internal `register`, narrowed to what a timeline needs. */\nexport type TimelineRegister = (seed: {\n id: number;\n cancelKey?: string;\n /** Registers under an existing `cancelKey` without cancelling whoever holds\n * it. A revived timeline is the same animation, not a new claim on the key. */\n keepExisting?: boolean;\n /** `scale` is the effective time scale this frame advanced at, zero while\n * paused at any level. */\n tick: (virtualNow: number, scale?: number) => boolean;\n onCancel?: () => void;\n kind: 'timeline';\n label?: string;\n progress?: () => number;\n}) => AnimationHandle;\n\n/** Where a timeline reports its crossings and laps to `animator.watch`. Each\n * call site checks `watched` first, so an unwatched timeline builds nothing. */\nexport interface TimelineReport {\n readonly watched: boolean;\n /** `path` is a scratch stack the timeline goes on mutating; copy it to keep it. */\n fire(track: EventTrack, path: readonly number[], event: TimelineEvent, lateBy: number): void;\n lap(lap: number): void;\n}\n\n/** End time of a track: its last key/event, or a nested timeline's own end. */\nfunction trackEnd(track: Track): number {\n switch (track.kind) {\n case 'sampled': return track.keys.length ? track.keys[track.keys.length - 1].t : 0;\n case 'event': return track.events.length ? track.events[track.events.length - 1].t : 0;\n case 'timeline': return track.at + tracksEnd(track.timeline.tracks, track.timeline.duration);\n }\n}\n\nfunction tracksEnd(tracks: Track[], explicit?: number): number {\n if (explicit != null) return explicit;\n let max = 0;\n for (const t of tracks) max = Math.max(max, trackEnd(t));\n return max;\n}\n\n/**\n * Create a timeline as a registered animator animation.\n *\n * The playhead is NOT the entry's `virtualNow` directly — it is\n * `virtualNow + offset`, where `offset` is what `seek` and looping move. That\n * keeps seek and wrap-around entirely inside the timeline and needs no setter\n * on the animator's entry.\n *\n * A finished timeline leaves the animator's table, so `seek` and a\n * duration-extending `edit` re-register it. Staying registered instead would\n * hold a slot — and the rAF loop — open for every timeline ever created.\n */\nexport function createTimeline(\n register: TimelineRegister,\n id: number,\n opts: TimelineOptions,\n report?: TimelineReport,\n): TimelineHandle {\n let duration = tracksEnd(opts.tracks, opts.duration);\n let offset = 0;\n let lastVirtual = 0;\n let playhead = 0;\n let prevPlayhead = -Infinity;\n let done = false;\n let live = true;\n let cancelled = false;\n let wantPaused = opts.autoplay === false;\n let wantScale = 1;\n\n const subscribers = new Set<() => void>();\n\n const loopOpt = opts.loop ?? false;\n let loopsLeft = loopOpt === true ? Infinity : loopOpt === false ? 0 : loopOpt;\n let lap = 0;\n\n const booker = opts.booking\n ? createBooker(opts.booking, {\n tracks: opts.tracks,\n duration: () => duration,\n lapsLeft: () => loopsLeft,\n lap: () => lap,\n playhead: () => playhead,\n })\n : null;\n let warnedUnbooked = false;\n\n // Per-sampled-track interpolator-factory caches, dropped wholesale by `edit`.\n let caches = new WeakMap<object, Map<number, (u: number) => unknown>>();\n const cacheFor = (track: object): Map<number, (u: number) => unknown> => {\n let c = caches.get(track);\n if (!c) { c = new Map(); caches.set(track, c); }\n return c;\n };\n\n const applySampled = (tracks: Track[], t: number): void => {\n for (const track of tracks) {\n if (track.kind === 'sampled') {\n const st = track as SampledTrack<unknown>;\n const v = sampleTrack(st, t, cacheFor(st));\n if (v !== undefined) st.onTick(v);\n } else if (track.kind === 'timeline') {\n applySampled(track.timeline.tracks, t - track.at);\n }\n }\n };\n\n // Track indexes from the root down to the track being fired, for `report`.\n const path: number[] = [];\n const fireEvents = (tracks: Track[], from: number, to: number): void => {\n for (let k = 0; k < tracks.length; k += 1) {\n const track = tracks[k];\n if (track.kind === 'event') {\n const end = firstAfter(track.events, to);\n for (let i = firstAfter(track.events, from); i < end; i += 1) {\n const ev = track.events[i];\n ev.fire?.(to - ev.t);\n if (report?.watched) {\n path.push(k);\n report.fire(track, path, ev, to - ev.t);\n path.pop();\n }\n if (ev.book && !booker && !warnedUnbooked) {\n warnedUnbooked = true;\n console.warn('timeline: an event has `book` but the timeline has no `booking` clock; it never books.');\n }\n }\n } else if (track.kind === 'timeline') {\n path.push(k);\n fireEvents(track.timeline.tracks, from - track.at, to - track.at);\n path.pop();\n }\n }\n };\n\n // Flush the outgoing pass's tail before re-arming, or an event between the\n // last tick and `duration` is dropped whenever a frame straddles the seam.\n const onWrap = (): void => {\n fireEvents(opts.tracks, prevPlayhead, duration);\n prevPlayhead = -Infinity;\n if (report?.watched) report.lap(lap);\n };\n\n const tick = (virtualNow: number, scale?: number): boolean => {\n lastVirtual = virtualNow;\n playhead = virtualNow + offset;\n\n // A far seek can skip a billion laps of a short duration, so an endless\n // loop takes them in one modulo rather than one iteration each.\n if (duration > 0 && playhead >= duration) {\n if (loopsLeft === Infinity) {\n const laps = Math.floor(playhead / duration);\n offset -= laps * duration;\n playhead -= laps * duration;\n lap += laps;\n onWrap();\n } else {\n while (playhead >= duration && loopsLeft > 0) {\n loopsLeft -= 1;\n offset -= duration;\n playhead -= duration;\n lap += 1;\n onWrap();\n }\n }\n }\n\n const finished = playhead >= duration;\n playhead = Math.min(playhead, duration);\n\n // Sampled before fired, so a handler reads the current frame's values.\n applySampled(opts.tracks, playhead);\n fireEvents(opts.tracks, prevPlayhead, playhead);\n prevPlayhead = playhead;\n booker?.tick(virtualNow, scale ?? (base.isPaused() ? 0 : base.timeScale()));\n\n if (finished && !done) { done = true; opts.onDone?.(); }\n // Re-read: `onDone` may have seeked back or extended the duration, and\n // retiring the entry would strand the replay its own handler just started.\n if (playhead < duration) return false;\n live = false;\n return true;\n };\n\n // Every cancel path inside the animator routes through here, so a timeline\n // cancelled by key or by `cancelAll` is as dead as one cancelled by hand.\n const onCancel = (): void => { cancelled = true; live = false; booker?.retract(); };\n\n const progress = (): number => (duration > 0 ? playhead / duration : 1);\n const seed = { id, cancelKey: opts.cancelKey, tick, onCancel, kind: 'timeline' as const, label: opts.label, progress };\n const base = register(seed);\n\n // A paused entry's scale is zero, so `virtualNow` never advances and the\n // playhead holds at 0 until the consumer resumes.\n if (opts.autoplay === false) base.pause();\n\n /** Put a finished timeline back on the animator's table. A re-registered\n * entry's `virtualNow` restarts at 0, so `offset` carries the playhead. */\n const rearm = (): void => {\n if (cancelled || playhead >= duration) return;\n done = false;\n if (live) return;\n booker?.rearm();\n lastVirtual = 0;\n offset = playhead;\n live = true;\n register({ ...seed, keepExisting: true });\n if (wantPaused) base.pause();\n base.setTimeScale(wantScale);\n };\n\n return {\n ...base,\n // Not just `onCancel`: cancelling a finished timeline never reaches the\n // animator, and must still keep a later seek from reviving it.\n cancel() { onCancel(); base.cancel(); },\n // Playback intent is tracked here, not read back from the entry: a revived\n // one is a fresh registration, and defaults to running at scale 1.\n pause() { wantPaused = true; base.pause(); booker?.retract(); },\n resume() { wantPaused = false; base.resume(); },\n setTimeScale(s) { wantScale = s; base.setTimeScale(s); },\n timeScale: () => (live ? base.timeScale() : wantScale),\n isPaused: () => (live ? base.isPaused() : wantPaused),\n seek(t) {\n booker?.retract();\n offset = t - lastVirtual;\n playhead = t;\n prevPlayhead = t;\n booker?.seek();\n rearm();\n },\n time: () => playhead,\n duration: () => duration,\n tracks: () => opts.tracks,\n setLoop(loop) {\n loopsLeft = loop === true ? Infinity : loop === false ? 0 : loop;\n booker?.retract();\n },\n loop: () => (loopsLeft === Infinity ? true : loopsLeft === 0 ? false : loopsLeft),\n edit(fn) {\n fn();\n caches = new WeakMap();\n duration = tracksEnd(opts.tracks, opts.duration);\n booker?.retract();\n rearm();\n for (const cb of subscribers) {\n try { cb(); } catch (err) { console.error('timeline: subscriber threw', err); }\n }\n },\n subscribe(cb) {\n subscribers.add(cb);\n return () => { subscribers.delete(cb); };\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { resolveEasing as e } from "@weasel-js/geom";
2
+ //#region src/animation/timeline/sampleTrack.ts
3
+ function t(e, t) {
4
+ let n = 0, r = e.length - 1, i = -1;
5
+ for (; n <= r;) {
6
+ let a = n + r >> 1;
7
+ e[a].t <= t ? (i = a, n = a + 1) : r = a - 1;
8
+ }
9
+ return i;
10
+ }
11
+ function n(n, r, i) {
12
+ let { keys: a } = n;
13
+ if (a.length === 0) return;
14
+ let o = t(a, r);
15
+ if (o < 0) return a[0].value;
16
+ if (o >= a.length - 1) return a[a.length - 1].value;
17
+ let s = a[o], c = a[o + 1], l = c.t - s.t, u = l <= 0 ? 1 : (r - s.t) / l, d = c.easing ? e(c.easing)(u) : u;
18
+ if (n.interpolator) {
19
+ let e = i?.get(o + 1);
20
+ return e || (e = n.interpolator(s.value, c.value), i?.set(o + 1, e)), e(d);
21
+ }
22
+ if (n.interpolate) return n.interpolate(s.value, c.value, d);
23
+ if (typeof s.value == "number" && typeof c.value == "number") return s.value + (c.value - s.value) * d;
24
+ throw Error("sampleTrack: interpolate or interpolator is required for non-numeric keyframe values");
25
+ }
26
+ //#endregion
27
+ export { n as sampleTrack };
28
+
29
+ //# sourceMappingURL=sampleTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleTrack.js","names":["floorKeyIndex","lo","hi","keys","found","mid","sampleTrack","track","i","t","a","b","span","raw","u","resolveEasing","fn","segmentCache"],"sources":["../../../src/animation/timeline/sampleTrack.ts"],"sourcesContent":["import { resolveEasing } from '@weasel-js/geom';\nimport type { SampledTrack } from './types';\n\n/** Index of the last key at or before `t`, or -1 when `t` precedes all keys.\n * Binary search: tracks are sorted and may be long. */\nfunction floorKeyIndex<T>(keys: SampledTrack<T>['keys'], t: number): number {\n let lo = 0;\n let hi = keys.length - 1;\n let found = -1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (keys[mid].t <= t) {\n found = mid;\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n return found;\n}\n\n/**\n * Sample a track at `t`. Pure: no state, no side effects, safe to call for any\n * `t` in any order — which is what makes scrubbing free.\n *\n * `segmentCache` memoizes `interpolator` factories by the index of the segment's\n * later key. Callers that mutate keys must drop the cache; `createTimeline`\n * drops it wholesale on `edit`.\n */\nexport function sampleTrack<T>(\n track: SampledTrack<T>,\n t: number,\n segmentCache?: Map<number, (u: number) => T>,\n): T | undefined {\n const { keys } = track;\n if (keys.length === 0) return undefined;\n\n const i = floorKeyIndex(keys, t);\n if (i < 0) return keys[0].value;\n if (i >= keys.length - 1) return keys[keys.length - 1].value;\n\n const a = keys[i];\n const b = keys[i + 1];\n const span = b.t - a.t;\n const raw = span <= 0 ? 1 : (t - a.t) / span;\n // `easing` belongs to the key being approached, so `b` supplies it.\n const u = b.easing ? resolveEasing(b.easing)(raw) : raw;\n\n if (track.interpolator) {\n let fn = segmentCache?.get(i + 1);\n if (!fn) {\n fn = track.interpolator(a.value, b.value);\n segmentCache?.set(i + 1, fn);\n }\n return fn(u);\n }\n if (track.interpolate) return track.interpolate(a.value, b.value, u);\n\n if (typeof a.value === 'number' && typeof b.value === 'number') {\n return ((a.value as number) + ((b.value as number) - (a.value as number)) * u) as unknown as T;\n }\n throw new Error('sampleTrack: interpolate or interpolator is required for non-numeric keyframe values');\n}\n"],"mappings":";;AAKA,SAASA,EAAiB,GAA+B,GAAmB;CAC1E,IAAIC,IAAK,GACLC,IAAKC,EAAK,SAAS,GACnBC,IAAQ;CACZ,OAAOH,KAAMC,IAAI;EACf,IAAMG,IAAOJ,IAAKC,KAAO;EACzB,AAAIC,EAAKE,EAAI,CAAC,KAAK,KACjB,IAAQA,GACR,IAAKA,IAAM,KAEX,IAAKA,IAAM;CAEf;CACA,OAAOD;AACT;AAUA,SAAgBE,EACd,GACA,GACA,GACe;CACf,IAAM,EAAE,YAASC;CACjB,IAAIJ,EAAK,WAAW,GAAG;CAEvB,IAAMK,IAAIR,EAAcG,GAAMM,CAAC;CAC/B,IAAID,IAAI,GAAG,OAAOL,EAAK,EAAE,CAAC;CAC1B,IAAIK,KAAKL,EAAK,SAAS,GAAG,OAAOA,EAAKA,EAAK,SAAS,EAAE,CAAC;CAEvD,IAAMO,IAAIP,EAAKK,IACTG,IAAIR,EAAKK,IAAI,IACbI,IAAOD,EAAE,IAAID,EAAE,GACfG,IAAMD,KAAQ,IAAI,KAAKH,IAAIC,EAAE,KAAKE,GAElCE,IAAIH,EAAE,SAASI,EAAcJ,EAAE,MAAM,CAAC,CAACE,CAAG,IAAIA;CAEpD,IAAIN,EAAM,cAAc;EACtB,IAAIS,IAAKC,GAAc,IAAIT,IAAI,CAAC;EAKhC,OAJKQ,MACH,IAAKT,EAAM,aAAaG,EAAE,OAAOC,EAAE,KAAK,GACxCM,GAAc,IAAIT,IAAI,GAAGQ,CAAE,IAEtBA,EAAGF,CAAC;CACb;CACA,IAAIP,EAAM,aAAa,OAAOA,EAAM,YAAYG,EAAE,OAAOC,EAAE,OAAOG,CAAC;CAEnE,IAAI,OAAOJ,EAAE,SAAU,YAAY,OAAOC,EAAE,SAAU,UACpD,OAASD,EAAE,SAAqBC,EAAE,QAAoBD,EAAE,SAAoBI;CAE9E,MAAU,MAAM,sFAAsF;AACxG"}