@twick/core 0.14.21 → 0.15.0

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 (376) hide show
  1. package/dist/index.cjs +6465 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +3919 -0
  4. package/dist/index.d.ts +3919 -0
  5. package/dist/index.js +6225 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +28 -18
  8. package/tsconfig.project.json +1 -0
  9. package/lib/app/Logger.d.ts +0 -105
  10. package/lib/app/Logger.d.ts.map +0 -1
  11. package/lib/app/Logger.js +0 -77
  12. package/lib/app/PlaybackManager.d.ts +0 -55
  13. package/lib/app/PlaybackManager.d.ts.map +0 -1
  14. package/lib/app/PlaybackManager.js +0 -179
  15. package/lib/app/PlaybackStatus.d.ts +0 -30
  16. package/lib/app/PlaybackStatus.d.ts.map +0 -1
  17. package/lib/app/PlaybackStatus.js +0 -46
  18. package/lib/app/Player.d.ts +0 -130
  19. package/lib/app/Player.d.ts.map +0 -1
  20. package/lib/app/Player.js +0 -375
  21. package/lib/app/Project.d.ts +0 -145
  22. package/lib/app/Project.d.ts.map +0 -1
  23. package/lib/app/Project.js +0 -10
  24. package/lib/app/Renderer.d.ts +0 -90
  25. package/lib/app/Renderer.d.ts.map +0 -1
  26. package/lib/app/Renderer.js +0 -318
  27. package/lib/app/SharedWebGLContext.d.ts +0 -24
  28. package/lib/app/SharedWebGLContext.d.ts.map +0 -1
  29. package/lib/app/SharedWebGLContext.js +0 -200
  30. package/lib/app/Stage.d.ts +0 -30
  31. package/lib/app/Stage.d.ts.map +0 -1
  32. package/lib/app/Stage.js +0 -75
  33. package/lib/app/TimeEstimator.d.ts +0 -53
  34. package/lib/app/TimeEstimator.d.ts.map +0 -1
  35. package/lib/app/TimeEstimator.js +0 -70
  36. package/lib/app/index.d.ts +0 -16
  37. package/lib/app/index.d.ts.map +0 -1
  38. package/lib/app/index.js +0 -16
  39. package/lib/app/makeProject.d.ts +0 -15
  40. package/lib/app/makeProject.d.ts.map +0 -1
  41. package/lib/app/makeProject.js +0 -72
  42. package/lib/app/project-settings.d.ts +0 -8
  43. package/lib/app/project-settings.d.ts.map +0 -1
  44. package/lib/app/project-settings.js +0 -13
  45. package/lib/decorators/decorate.d.ts +0 -2
  46. package/lib/decorators/decorate.d.ts.map +0 -1
  47. package/lib/decorators/decorate.js +0 -10
  48. package/lib/decorators/deprecated.d.ts +0 -5
  49. package/lib/decorators/deprecated.d.ts.map +0 -1
  50. package/lib/decorators/deprecated.js +0 -23
  51. package/lib/decorators/index.d.ts +0 -9
  52. package/lib/decorators/index.d.ts.map +0 -1
  53. package/lib/decorators/index.js +0 -9
  54. package/lib/decorators/lazy.d.ts +0 -14
  55. package/lib/decorators/lazy.d.ts.map +0 -1
  56. package/lib/decorators/lazy.js +0 -27
  57. package/lib/decorators/threadable.d.ts +0 -2
  58. package/lib/decorators/threadable.d.ts.map +0 -1
  59. package/lib/decorators/threadable.js +0 -9
  60. package/lib/events/AsyncEventDispatcher.d.ts +0 -45
  61. package/lib/events/AsyncEventDispatcher.d.ts.map +0 -1
  62. package/lib/events/AsyncEventDispatcher.js +0 -33
  63. package/lib/events/EventDispatcher.d.ts +0 -38
  64. package/lib/events/EventDispatcher.d.ts.map +0 -1
  65. package/lib/events/EventDispatcher.js +0 -29
  66. package/lib/events/EventDispatcherBase.d.ts +0 -55
  67. package/lib/events/EventDispatcherBase.d.ts.map +0 -1
  68. package/lib/events/EventDispatcherBase.js +0 -68
  69. package/lib/events/FlagDispatcher.d.ts +0 -54
  70. package/lib/events/FlagDispatcher.d.ts.map +0 -1
  71. package/lib/events/FlagDispatcher.js +0 -63
  72. package/lib/events/ValueDispatcher.d.ts +0 -81
  73. package/lib/events/ValueDispatcher.d.ts.map +0 -1
  74. package/lib/events/ValueDispatcher.js +0 -97
  75. package/lib/events/index.d.ts +0 -11
  76. package/lib/events/index.d.ts.map +0 -1
  77. package/lib/events/index.js +0 -11
  78. package/lib/exporter/Exporter.d.ts +0 -101
  79. package/lib/exporter/Exporter.d.ts.map +0 -1
  80. package/lib/exporter/Exporter.js +0 -2
  81. package/lib/exporter/FFmpegExporter.d.ts +0 -50
  82. package/lib/exporter/FFmpegExporter.d.ts.map +0 -1
  83. package/lib/exporter/FFmpegExporter.js +0 -140
  84. package/lib/exporter/ImageExporter.d.ts +0 -34
  85. package/lib/exporter/ImageExporter.d.ts.map +0 -1
  86. package/lib/exporter/ImageExporter.js +0 -80
  87. package/lib/exporter/WasmExporter.d.ts +0 -19
  88. package/lib/exporter/WasmExporter.d.ts.map +0 -1
  89. package/lib/exporter/WasmExporter.js +0 -78
  90. package/lib/exporter/download-videos.d.ts +0 -3
  91. package/lib/exporter/download-videos.d.ts.map +0 -1
  92. package/lib/exporter/download-videos.js +0 -45
  93. package/lib/exporter/index.d.ts +0 -5
  94. package/lib/exporter/index.d.ts.map +0 -1
  95. package/lib/exporter/index.js +0 -5
  96. package/lib/flow/all.d.ts +0 -18
  97. package/lib/flow/all.d.ts.map +0 -1
  98. package/lib/flow/all.js +0 -25
  99. package/lib/flow/any.d.ts +0 -18
  100. package/lib/flow/any.d.ts.map +0 -1
  101. package/lib/flow/any.js +0 -25
  102. package/lib/flow/chain.d.ts +0 -36
  103. package/lib/flow/chain.d.ts.map +0 -1
  104. package/lib/flow/chain.js +0 -46
  105. package/lib/flow/delay.d.ts +0 -29
  106. package/lib/flow/delay.d.ts.map +0 -1
  107. package/lib/flow/delay.js +0 -39
  108. package/lib/flow/every.d.ts +0 -41
  109. package/lib/flow/every.d.ts.map +0 -1
  110. package/lib/flow/every.js +0 -61
  111. package/lib/flow/index.d.ts +0 -17
  112. package/lib/flow/index.d.ts.map +0 -1
  113. package/lib/flow/index.js +0 -17
  114. package/lib/flow/join.d.ts +0 -35
  115. package/lib/flow/join.d.ts.map +0 -1
  116. package/lib/flow/join.js +0 -33
  117. package/lib/flow/loop.d.ts +0 -58
  118. package/lib/flow/loop.d.ts.map +0 -1
  119. package/lib/flow/loop.js +0 -51
  120. package/lib/flow/loopFor.d.ts +0 -25
  121. package/lib/flow/loopFor.d.ts.map +0 -1
  122. package/lib/flow/loopFor.js +0 -42
  123. package/lib/flow/names.d.ts +0 -3
  124. package/lib/flow/names.d.ts.map +0 -1
  125. package/lib/flow/names.js +0 -11
  126. package/lib/flow/run.d.ts +0 -45
  127. package/lib/flow/run.d.ts.map +0 -1
  128. package/lib/flow/run.js +0 -14
  129. package/lib/flow/scheduling.d.ts +0 -18
  130. package/lib/flow/scheduling.d.ts.map +0 -1
  131. package/lib/flow/scheduling.js +0 -33
  132. package/lib/flow/sequence.d.ts +0 -22
  133. package/lib/flow/sequence.d.ts.map +0 -1
  134. package/lib/flow/sequence.js +0 -31
  135. package/lib/index.d.ts +0 -16
  136. package/lib/index.d.ts.map +0 -1
  137. package/lib/index.js +0 -16
  138. package/lib/media/index.d.ts +0 -7
  139. package/lib/media/index.d.ts.map +0 -1
  140. package/lib/media/index.js +0 -7
  141. package/lib/media/loadImage.d.ts +0 -8
  142. package/lib/media/loadImage.d.ts.map +0 -1
  143. package/lib/media/loadImage.js +0 -29
  144. package/lib/plugin/DefaultPlugin.d.ts +0 -10
  145. package/lib/plugin/DefaultPlugin.d.ts.map +0 -1
  146. package/lib/plugin/DefaultPlugin.js +0 -17
  147. package/lib/plugin/Plugin.d.ts +0 -53
  148. package/lib/plugin/Plugin.d.ts.map +0 -1
  149. package/lib/plugin/Plugin.js +0 -2
  150. package/lib/plugin/index.d.ts +0 -3
  151. package/lib/plugin/index.d.ts.map +0 -1
  152. package/lib/plugin/index.js +0 -3
  153. package/lib/plugin/makePlugin.d.ts +0 -15
  154. package/lib/plugin/makePlugin.d.ts.map +0 -1
  155. package/lib/plugin/makePlugin.js +0 -16
  156. package/lib/scenes/GeneratorScene.d.ts +0 -95
  157. package/lib/scenes/GeneratorScene.d.ts.map +0 -1
  158. package/lib/scenes/GeneratorScene.js +0 -273
  159. package/lib/scenes/Inspectable.d.ts +0 -71
  160. package/lib/scenes/Inspectable.d.ts.map +0 -1
  161. package/lib/scenes/Inspectable.js +0 -4
  162. package/lib/scenes/LifecycleEvents.d.ts +0 -18
  163. package/lib/scenes/LifecycleEvents.d.ts.map +0 -1
  164. package/lib/scenes/LifecycleEvents.js +0 -45
  165. package/lib/scenes/Random.d.ts +0 -66
  166. package/lib/scenes/Random.d.ts.map +0 -1
  167. package/lib/scenes/Random.js +0 -101
  168. package/lib/scenes/Scene.d.ts +0 -298
  169. package/lib/scenes/Scene.d.ts.map +0 -1
  170. package/lib/scenes/Scene.js +0 -25
  171. package/lib/scenes/SceneState.d.ts +0 -34
  172. package/lib/scenes/SceneState.d.ts.map +0 -1
  173. package/lib/scenes/SceneState.js +0 -35
  174. package/lib/scenes/Shaders.d.ts +0 -63
  175. package/lib/scenes/Shaders.d.ts.map +0 -1
  176. package/lib/scenes/Shaders.js +0 -158
  177. package/lib/scenes/Slides.d.ts +0 -33
  178. package/lib/scenes/Slides.d.ts.map +0 -1
  179. package/lib/scenes/Slides.js +0 -115
  180. package/lib/scenes/Threadable.d.ts +0 -19
  181. package/lib/scenes/Threadable.d.ts.map +0 -1
  182. package/lib/scenes/Threadable.js +0 -4
  183. package/lib/scenes/Variables.d.ts +0 -24
  184. package/lib/scenes/Variables.d.ts.map +0 -1
  185. package/lib/scenes/Variables.js +0 -39
  186. package/lib/scenes/index.d.ts +0 -16
  187. package/lib/scenes/index.d.ts.map +0 -1
  188. package/lib/scenes/index.js +0 -16
  189. package/lib/signals/CompoundSignalContext.d.ts +0 -21
  190. package/lib/signals/CompoundSignalContext.d.ts.map +0 -1
  191. package/lib/signals/CompoundSignalContext.js +0 -73
  192. package/lib/signals/ComputedContext.d.ts +0 -14
  193. package/lib/signals/ComputedContext.d.ts.map +0 -1
  194. package/lib/signals/ComputedContext.js +0 -36
  195. package/lib/signals/DependencyContext.d.ts +0 -32
  196. package/lib/signals/DependencyContext.d.ts.map +0 -1
  197. package/lib/signals/DependencyContext.js +0 -87
  198. package/lib/signals/SignalContext.d.ts +0 -120
  199. package/lib/signals/SignalContext.d.ts.map +0 -1
  200. package/lib/signals/SignalContext.js +0 -245
  201. package/lib/signals/createComputed.d.ts +0 -3
  202. package/lib/signals/createComputed.d.ts.map +0 -1
  203. package/lib/signals/createComputed.js +0 -5
  204. package/lib/signals/createComputedAsync.d.ts +0 -4
  205. package/lib/signals/createComputedAsync.d.ts.map +0 -1
  206. package/lib/signals/createComputedAsync.js +0 -15
  207. package/lib/signals/createSignal.d.ts +0 -5
  208. package/lib/signals/createSignal.d.ts.map +0 -1
  209. package/lib/signals/createSignal.js +0 -6
  210. package/lib/signals/index.d.ts +0 -16
  211. package/lib/signals/index.d.ts.map +0 -1
  212. package/lib/signals/index.js +0 -16
  213. package/lib/signals/symbols.d.ts +0 -2
  214. package/lib/signals/symbols.d.ts.map +0 -1
  215. package/lib/signals/symbols.js +0 -2
  216. package/lib/signals/types.d.ts +0 -51
  217. package/lib/signals/types.d.ts.map +0 -1
  218. package/lib/signals/types.js +0 -2
  219. package/lib/signals/utils.d.ts +0 -5
  220. package/lib/signals/utils.d.ts.map +0 -1
  221. package/lib/signals/utils.js +0 -10
  222. package/lib/threading/Thread.d.ts +0 -77
  223. package/lib/threading/Thread.d.ts.map +0 -1
  224. package/lib/threading/Thread.js +0 -169
  225. package/lib/threading/ThreadGenerator.d.ts +0 -39
  226. package/lib/threading/ThreadGenerator.d.ts.map +0 -1
  227. package/lib/threading/ThreadGenerator.js +0 -17
  228. package/lib/threading/cancel.d.ts +0 -17
  229. package/lib/threading/cancel.d.ts.map +0 -1
  230. package/lib/threading/cancel.js +0 -26
  231. package/lib/threading/index.d.ts +0 -11
  232. package/lib/threading/index.d.ts.map +0 -1
  233. package/lib/threading/index.js +0 -11
  234. package/lib/threading/spawn.d.ts +0 -28
  235. package/lib/threading/spawn.d.ts.map +0 -1
  236. package/lib/threading/spawn.js +0 -30
  237. package/lib/threading/threads.d.ts +0 -46
  238. package/lib/threading/threads.d.ts.map +0 -1
  239. package/lib/threading/threads.js +0 -89
  240. package/lib/transitions/fadeTransition.d.ts +0 -8
  241. package/lib/transitions/fadeTransition.d.ts.map +0 -1
  242. package/lib/transitions/fadeTransition.js +0 -16
  243. package/lib/transitions/index.d.ts +0 -11
  244. package/lib/transitions/index.d.ts.map +0 -1
  245. package/lib/transitions/index.js +0 -11
  246. package/lib/transitions/slideTransition.d.ts +0 -18
  247. package/lib/transitions/slideTransition.d.ts.map +0 -1
  248. package/lib/transitions/slideTransition.js +0 -14
  249. package/lib/transitions/useTransition.d.ts +0 -10
  250. package/lib/transitions/useTransition.d.ts.map +0 -1
  251. package/lib/transitions/useTransition.js +0 -27
  252. package/lib/transitions/zoomInTransition.d.ts +0 -10
  253. package/lib/transitions/zoomInTransition.d.ts.map +0 -1
  254. package/lib/transitions/zoomInTransition.js +0 -33
  255. package/lib/transitions/zoomOutTransition.d.ts +0 -10
  256. package/lib/transitions/zoomOutTransition.d.ts.map +0 -1
  257. package/lib/transitions/zoomOutTransition.js +0 -33
  258. package/lib/tsconfig.build.tsbuildinfo +0 -1
  259. package/lib/tweening/helpers.d.ts +0 -5
  260. package/lib/tweening/helpers.d.ts.map +0 -1
  261. package/lib/tweening/helpers.js +0 -16
  262. package/lib/tweening/index.d.ts +0 -11
  263. package/lib/tweening/index.d.ts.map +0 -1
  264. package/lib/tweening/index.js +0 -11
  265. package/lib/tweening/interpolationFunctions.d.ts +0 -38
  266. package/lib/tweening/interpolationFunctions.d.ts.map +0 -1
  267. package/lib/tweening/interpolationFunctions.js +0 -107
  268. package/lib/tweening/spring.d.ts +0 -20
  269. package/lib/tweening/spring.d.ts.map +0 -1
  270. package/lib/tweening/spring.js +0 -103
  271. package/lib/tweening/timingFunctions.d.ts +0 -46
  272. package/lib/tweening/timingFunctions.d.ts.map +0 -1
  273. package/lib/tweening/timingFunctions.js +0 -233
  274. package/lib/tweening/tween.d.ts +0 -3
  275. package/lib/tweening/tween.d.ts.map +0 -1
  276. package/lib/tweening/tween.js +0 -21
  277. package/lib/types/BBox.d.ts +0 -73
  278. package/lib/types/BBox.d.ts.map +0 -1
  279. package/lib/types/BBox.js +0 -249
  280. package/lib/types/Canvas.d.ts +0 -3
  281. package/lib/types/Canvas.d.ts.map +0 -1
  282. package/lib/types/Canvas.js +0 -2
  283. package/lib/types/Color.d.ts +0 -65
  284. package/lib/types/Color.d.ts.map +0 -1
  285. package/lib/types/Color.js +0 -185
  286. package/lib/types/Matrix.d.ts +0 -3
  287. package/lib/types/Matrix.d.ts.map +0 -1
  288. package/lib/types/Matrix.js +0 -10
  289. package/lib/types/Matrix2D.d.ts +0 -363
  290. package/lib/types/Matrix2D.d.ts.map +0 -1
  291. package/lib/types/Matrix2D.js +0 -554
  292. package/lib/types/Origin.d.ts +0 -17
  293. package/lib/types/Origin.d.ts.map +0 -1
  294. package/lib/types/Origin.js +0 -53
  295. package/lib/types/Spacing.d.ts +0 -36
  296. package/lib/types/Spacing.d.ts.map +0 -1
  297. package/lib/types/Spacing.js +0 -70
  298. package/lib/types/Type.d.ts +0 -9
  299. package/lib/types/Type.d.ts.map +0 -1
  300. package/lib/types/Type.js +0 -5
  301. package/lib/types/Vector.d.ts +0 -203
  302. package/lib/types/Vector.d.ts.map +0 -1
  303. package/lib/types/Vector.js +0 -355
  304. package/lib/types/alignment-enums.d.ts +0 -22
  305. package/lib/types/alignment-enums.d.ts.map +0 -1
  306. package/lib/types/alignment-enums.js +0 -25
  307. package/lib/types/index.d.ts +0 -17
  308. package/lib/types/index.d.ts.map +0 -1
  309. package/lib/types/index.js +0 -17
  310. package/lib/types/vector-transformations.d.ts +0 -20
  311. package/lib/types/vector-transformations.d.ts.map +0 -1
  312. package/lib/types/vector-transformations.js +0 -31
  313. package/lib/utils/DetailedError.d.ts +0 -24
  314. package/lib/utils/DetailedError.d.ts.map +0 -1
  315. package/lib/utils/DetailedError.js +0 -16
  316. package/lib/utils/ExperimentalError.d.ts +0 -10
  317. package/lib/utils/ExperimentalError.d.ts.map +0 -1
  318. package/lib/utils/ExperimentalError.js +0 -32
  319. package/lib/utils/Semaphore.d.ts +0 -12
  320. package/lib/utils/Semaphore.d.ts.map +0 -1
  321. package/lib/utils/Semaphore.js +0 -25
  322. package/lib/utils/beginSlide.d.ts +0 -3
  323. package/lib/utils/beginSlide.d.ts.map +0 -1
  324. package/lib/utils/beginSlide.js +0 -12
  325. package/lib/utils/capitalize.d.ts +0 -2
  326. package/lib/utils/capitalize.d.ts.map +0 -1
  327. package/lib/utils/capitalize.js +0 -4
  328. package/lib/utils/createRef.d.ts +0 -15
  329. package/lib/utils/createRef.d.ts.map +0 -1
  330. package/lib/utils/createRef.js +0 -21
  331. package/lib/utils/createRefArray.d.ts +0 -27
  332. package/lib/utils/createRefArray.d.ts.map +0 -1
  333. package/lib/utils/createRefArray.js +0 -49
  334. package/lib/utils/createRefMap.d.ts +0 -50
  335. package/lib/utils/createRefMap.d.ts.map +0 -1
  336. package/lib/utils/createRefMap.js +0 -77
  337. package/lib/utils/debug.d.ts +0 -24
  338. package/lib/utils/debug.d.ts.map +0 -1
  339. package/lib/utils/debug.js +0 -47
  340. package/lib/utils/deprecate.d.ts +0 -9
  341. package/lib/utils/deprecate.d.ts.map +0 -1
  342. package/lib/utils/deprecate.js +0 -15
  343. package/lib/utils/errorToLog.d.ts +0 -3
  344. package/lib/utils/errorToLog.d.ts.map +0 -1
  345. package/lib/utils/errorToLog.js +0 -8
  346. package/lib/utils/experimentalLog.d.ts +0 -3
  347. package/lib/utils/experimentalLog.d.ts.map +0 -1
  348. package/lib/utils/experimentalLog.js +0 -10
  349. package/lib/utils/getContext.d.ts +0 -2
  350. package/lib/utils/getContext.d.ts.map +0 -1
  351. package/lib/utils/getContext.js +0 -8
  352. package/lib/utils/index.d.ts +0 -26
  353. package/lib/utils/index.d.ts.map +0 -1
  354. package/lib/utils/index.js +0 -26
  355. package/lib/utils/math.d.ts +0 -15
  356. package/lib/utils/math.d.ts.map +0 -1
  357. package/lib/utils/math.js +0 -15
  358. package/lib/utils/range.d.ts +0 -40
  359. package/lib/utils/range.d.ts.map +0 -1
  360. package/lib/utils/range.js +0 -18
  361. package/lib/utils/useContext.d.ts +0 -13
  362. package/lib/utils/useContext.d.ts.map +0 -1
  363. package/lib/utils/useContext.js +0 -18
  364. package/lib/utils/usePlayback.d.ts +0 -8
  365. package/lib/utils/usePlayback.d.ts.map +0 -1
  366. package/lib/utils/usePlayback.js +0 -20
  367. package/lib/utils/useScene.d.ts +0 -17
  368. package/lib/utils/useScene.d.ts.map +0 -1
  369. package/lib/utils/useScene.js +0 -33
  370. package/lib/utils/useThread.d.ts +0 -8
  371. package/lib/utils/useThread.d.ts.map +0 -1
  372. package/lib/utils/useThread.js +0 -24
  373. package/lib/utils/useTime.d.ts +0 -19
  374. package/lib/utils/useTime.d.ts.map +0 -1
  375. package/lib/utils/useTime.js +0 -22
  376. package/project.d.ts +0 -24
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/events/EventDispatcherBase.ts","../src/events/AsyncEventDispatcher.ts","../src/events/EventDispatcher.ts","../src/events/FlagDispatcher.ts","../src/events/ValueDispatcher.ts","../src/app/Logger.ts","../src/exporter/download-videos.ts","../src/exporter/FFmpegExporter.ts","../src/tweening/helpers.ts","../src/utils/useScene.ts","../src/utils/DetailedError.ts","../src/utils/useThread.ts","../src/utils/beginSlide.ts","../src/utils/capitalize.ts","../src/utils/createRef.ts","../src/utils/createRefArray.ts","../src/utils/createRefMap.ts","../src/utils/debug.ts","../src/utils/deprecate.ts","../src/utils/errorToLog.ts","../src/utils/ExperimentalError.ts","../src/utils/experimentalLog.ts","../src/utils/getContext.ts","../src/utils/math.ts","../src/utils/range.ts","../src/utils/Semaphore.ts","../src/utils/useContext.ts","../src/utils/usePlayback.ts","../src/utils/useTime.ts","../src/tweening/interpolationFunctions.ts","../src/decorators/decorate.ts","../src/decorators/lazy.ts","../src/decorators/threadable.ts","../src/tweening/spring.ts","../src/tweening/timingFunctions.ts","../src/tweening/tween.ts","../src/exporter/ImageExporter.ts","../src/exporter/WasmExporter.ts","../src/plugin/makePlugin.ts","../src/plugin/DefaultPlugin.ts","../src/types/alignment-enums.ts","../src/flow/join.ts","../src/flow/all.ts","../src/flow/any.ts","../src/flow/chain.ts","../src/flow/scheduling.ts","../src/flow/delay.ts","../src/flow/every.ts","../src/flow/loop.ts","../src/flow/loopFor.ts","../src/flow/names.ts","../src/flow/run.ts","../src/flow/sequence.ts","../src/signals/DependencyContext.ts","../src/signals/symbols.ts","../src/signals/utils.ts","../src/signals/SignalContext.ts","../src/signals/CompoundSignalContext.ts","../src/signals/ComputedContext.ts","../src/signals/createComputed.ts","../src/signals/createSignal.ts","../src/signals/createComputedAsync.ts","../src/types/Spacing.ts","../src/types/Type.ts","../src/types/Vector.ts","../src/types/Matrix2D.ts","../src/types/vector-transformations.ts","../src/types/BBox.ts","../src/types/Color.ts","../src/types/Matrix.ts","../src/types/Origin.ts","../src/app/Project.ts","../src/app/makeProject.ts","../src/app/PlaybackManager.ts","../src/app/PlaybackStatus.ts","../src/app/SharedWebGLContext.ts","../src/app/Player.ts","../src/app/project-settings.ts","../src/app/Stage.ts","../src/app/TimeEstimator.ts","../src/app/Renderer.ts","../src/media/loadImage.ts","../src/threading/cancel.ts","../src/threading/spawn.ts","../src/threading/ThreadGenerator.ts","../src/threading/Thread.ts","../src/threading/threads.ts","../src/scenes/Scene.ts","../src/scenes/LifecycleEvents.ts","../src/scenes/SceneState.ts","../src/scenes/Shaders.ts","../src/scenes/Slides.ts","../src/scenes/Variables.ts","../src/scenes/GeneratorScene.ts","../src/scenes/Inspectable.ts","../src/scenes/Random.ts","../src/scenes/Threadable.ts","../src/transitions/useTransition.ts","../src/transitions/fadeTransition.ts","../src/transitions/slideTransition.ts","../src/transitions/zoomInTransition.ts","../src/transitions/zoomOutTransition.ts"],"sourcesContent":["export * from './app';\nexport * from './decorators';\nexport * from './events';\nexport * from './exporter';\nexport * from './flow';\nexport * from './media';\nexport * from './plugin';\nexport {default as DefaultPlugin} from './plugin/DefaultPlugin';\nexport * from './scenes';\nexport * from './signals';\nexport * from './threading';\nexport * from './transitions';\nexport * from './tweening';\nexport * from './types';\nexport * from './utils';\n","export interface EventHandler<T> {\n (value: T): any;\n}\n\n/**\n * A base for dispatching {@link Subscribable}s.\n *\n * @typeParam TValue - The type of the argument passed to subscribers.\n * @typeParam THandler - The type of the callback function.\n */\nexport abstract class EventDispatcherBase<\n TValue,\n THandler extends EventHandler<TValue> = EventHandler<TValue>,\n> {\n public readonly subscribable: Subscribable<TValue, THandler> =\n new Subscribable(this);\n\n private subscribers = new Set<THandler>();\n\n /**\n * {@inheritDoc Subscribable.subscribe}\n */\n public subscribe(handler: THandler) {\n this.subscribers.add(handler);\n return () => this.unsubscribe(handler);\n }\n\n /**\n * {@inheritDoc Subscribable.unsubscribe}\n */\n public unsubscribe(handler: THandler) {\n this.subscribers.delete(handler);\n }\n\n /**\n * Unsubscribe all subscribers from the event.\n */\n public clear() {\n this.subscribers.clear();\n }\n\n protected notifySubscribers(value: TValue): ReturnType<THandler>[] {\n return [...this.subscribers].map(handler => handler(value));\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link EventDispatcherBase}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam TValue - The type of the argument passed to subscribers.\n * @typeParam THandler - The type of the callback function.\n */\nexport class Subscribable<\n TValue,\n THandler extends EventHandler<TValue> = EventHandler<TValue>,\n> {\n public constructor(\n protected dispatcher: EventDispatcherBase<TValue, THandler>,\n ) {}\n\n /**\n * Subscribe to the event.\n *\n * @param handler - The handler to invoke when the event occurs.\n *\n * @returns A callback function that cancels the subscription.\n */\n public subscribe(handler: THandler) {\n return this.dispatcher.subscribe(handler);\n }\n\n /**\n * Unsubscribe from the event.\n *\n * @param handler - The handler to unsubscribe.\n */\n public unsubscribe(handler: THandler) {\n this.dispatcher.unsubscribe(handler);\n }\n}\n","import type {Subscribable} from './EventDispatcherBase';\nimport {EventDispatcherBase} from './EventDispatcherBase';\n\nexport interface AsyncEventHandler<T> {\n (value: T): Promise<void>;\n}\n\n/**\n * Dispatches an asynchronous {@link SubscribableEvent}.\n *\n * @remarks\n * The {@link dispatch} method returns a promise that resolves when all the\n * handlers resolve.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new AsyncEventDispatcher<number>();\n *\n * private async dispatchExample() {\n * // dispatching returns a Promise.\n * await this.value.dispatch(0);\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport class AsyncEventDispatcher<T> extends EventDispatcherBase<\n T,\n AsyncEventHandler<T>\n> {\n public async dispatch(value: T): Promise<void> {\n await Promise.all(this.notifySubscribers(value));\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link AsyncEventDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport type SubscribableAsyncEvent<T> = Subscribable<T, AsyncEventHandler<T>>;\n","import type {Subscribable} from './EventDispatcherBase';\nimport {EventDispatcherBase} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableEvent}.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new EventDispatcher<number>();\n *\n * private dispatchExample() {\n * // dispatching will notify all subscribers.\n * this.value.dispatch(0);\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the value argument to subscribers.\n */\nexport class EventDispatcher<T> extends EventDispatcherBase<T> {\n public dispatch(value: T) {\n this.notifySubscribers(value);\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link EventDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the argument passed to subscribers.\n */\nexport type SubscribableEvent<T> = Subscribable<T>;\n","import type {EventHandler, Subscribable} from './EventDispatcherBase';\nimport {EventDispatcherBase} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableFlagEvent}.\n *\n * @remarks\n * Subscribers are notified only when the flag is set.\n * Subsequent calls to {@link raise} don't trigger anything.\n * Any handlers added while the flag is raised are immediately invoked.\n *\n * Resetting the flag doesn't notify the subscribers, but raising it again does.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onChanged {\n * return this.flag.subscribable;\n * }\n * // create a private dispatcher\n * private flag = new FlagDispatcher();\n *\n * private dispatchExample() {\n * // setting the flag will notify all subscribers\n * this.flag.raise();\n * }\n * }\n * ```\n */\nexport class FlagDispatcher extends EventDispatcherBase<void> {\n private value = false;\n\n /**\n * Notify all current and future subscribers.\n */\n public raise() {\n if (!this.value) {\n this.value = true;\n this.notifySubscribers();\n }\n }\n\n /**\n * Stop notifying future subscribers.\n */\n public reset() {\n this.value = false;\n }\n\n /**\n * Are subscribers being notified?\n */\n public isRaised() {\n return this.value;\n }\n\n public subscribe(handler: EventHandler<void>) {\n const unsubscribe = super.subscribe(handler);\n if (this.value) {\n handler();\n }\n return unsubscribe;\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link FlagDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n */\nexport type SubscribableFlagEvent = Subscribable<void>;\n","import type {EventHandler} from './EventDispatcherBase';\nimport {EventDispatcherBase, Subscribable} from './EventDispatcherBase';\n\n/**\n * Dispatches a {@link SubscribableValueEvent}\n *\n * @remarks\n * Changing the value stored by a value dispatcher will immediately notify all\n * its subscribers.\n *\n * @example\n * ```ts\n * class Example {\n * // expose the event to external classes\n * public get onValueChanged {\n * return this.value.subscribable;\n * }\n * // create a private dispatcher\n * private value = new ValueDispatcher(0);\n *\n * private changingValueExample() {\n * // changing the value will notify all subscribers.\n * this.value.current = 7;\n * }\n * }\n * ```\n *\n * @typeParam T - The type of the value passed to subscribers.\n */\nexport class ValueDispatcher<T> extends EventDispatcherBase<T> {\n public readonly subscribable: SubscribableValueEvent<T> =\n new SubscribableValueEvent(this);\n\n /**\n * {@inheritDoc SubscribableValueEvent.current}\n */\n public get current() {\n return this.value;\n }\n\n /**\n * Set the current value of this dispatcher.\n *\n * @remarks\n * Setting the value will immediately notify all subscribers.\n *\n * @param value - The new value.\n */\n public set current(value: T) {\n this.value = value;\n this.notifySubscribers(value);\n }\n\n /**\n * @param value - The initial value.\n */\n public constructor(private value: T) {\n super();\n }\n\n /**\n * {@inheritDoc SubscribableValueEvent.subscribe}\n */\n public subscribe(handler: EventHandler<T>, dispatchImmediately = true) {\n const unsubscribe = super.subscribe(handler);\n if (dispatchImmediately) {\n handler(this.value);\n }\n return unsubscribe;\n }\n}\n\n/**\n * Provides safe access to the public interface of {@link ValueDispatcher}.\n *\n * @remarks\n * External classes can use it to subscribe to an event without being able to\n * dispatch it.\n *\n * @typeParam T - The type of the value passed to subscribers.\n */\nexport class SubscribableValueEvent<T> extends Subscribable<\n T,\n EventHandler<T>\n> {\n /**\n * Get the most recent value of this dispatcher.\n */\n public get current() {\n return (<ValueDispatcher<T>>this.dispatcher).current;\n }\n\n /**\n * Subscribe to the event.\n *\n * Subscribing will immediately invoke the handler with the most recent value.\n *\n * @param handler - The handler to invoke when the event occurs.\n * @param dispatchImmediately - Whether the handler should be immediately\n * invoked with the most recent value.\n *\n * @returns Callback function that cancels the subscription.\n */\n public subscribe(\n handler: EventHandler<T>,\n dispatchImmediately = true,\n ): () => void {\n return (<ValueDispatcher<T>>this.dispatcher).subscribe(\n handler,\n dispatchImmediately,\n );\n }\n}\n","import {EventDispatcher} from '../events';\n\nexport enum LogLevel {\n Error = 'error',\n Warn = 'warn',\n Info = 'info',\n Http = 'http',\n Verbose = 'verbose',\n Debug = 'debug',\n Silly = 'silly',\n}\n\n/**\n * Represents an individual log entry.\n *\n * @remarks\n * When displayed in the editor, the log entry will have the following format:\n * ```\n * inspect node ┐\n * ┌ expand more duration ┐ │\n * ▼ ▼ ▼\n * ┌────────────────────────────────────────────┐\n * │ ▶ message 300 ms (+) │\n * ├────────────────────────────────────────────┤\n * │ remarks │\n * │ object │\n * │ stacktrace │\n * └────────────────────────────────────────────┘\n * ```\n */\nexport interface LogPayload {\n /**\n * The log level.\n */\n level?: LogLevel;\n\n /**\n * The main message of the log.\n *\n * @remarks\n * Always visible.\n */\n message: string;\n\n /**\n * Additional information about the log.\n *\n * @remarks\n * Visible only when the log is expanded.\n */\n remarks?: string;\n\n /**\n * An object that will be serialized as JSON and displayed under the message.\n *\n * @remarks\n * Visible only when the log is expanded.\n */\n object?: any;\n\n /**\n * The stack trace of the log.\n *\n * @remarks\n * Visible only when the log is expanded.\n * The current stack trace can be obtained using `new Error().stack`.\n * Both Chromium and Firefox stack traces are supported.\n */\n stack?: string;\n\n /**\n * An optional duration in milliseconds.\n *\n * @remarks\n * Can be used to display any duration related to the log.\n * The value is always visible next to the message.\n */\n durationMs?: number;\n\n /**\n * An optional key used to inspect a related object.\n *\n * @remarks\n * This will be used together with the {@link scenes.Inspectable} interface to\n * display additional information about the inspected object.\n * When specified, the log will have an \"inspect\" button that will open the\n * \"Properties\" tab and select the inspected object.\n */\n inspect?: string;\n\n /**\n * Any additional information that the log may contain.\n */\n [K: string]: any;\n}\n\nexport class Logger {\n /**\n * Triggered when a new message is logged.\n */\n public get onLogged() {\n return this.logged.subscribable;\n }\n private readonly logged = new EventDispatcher<LogPayload>();\n public readonly history: LogPayload[] = [];\n\n private profilers: Record<string, number> = {};\n\n public log(payload: LogPayload) {\n this.logged.dispatch(payload);\n this.history.push(payload);\n }\n\n public error(payload: string | LogPayload) {\n console.error(\n 'error from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Error, payload);\n\n if ((window as any).browserError) {\n (window as any).browserError(\n typeof payload === 'string' ? payload : payload.message,\n );\n }\n }\n\n public warn(payload: string | LogPayload) {\n console.warn(\n 'warning from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Warn, payload);\n }\n\n public info(payload: string | LogPayload) {\n console.info(\n 'info from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Info, payload);\n }\n\n public http(payload: string | LogPayload) {\n console.log(\n 'http log from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Http, payload);\n }\n\n public verbose(payload: string | LogPayload) {\n console.log(\n 'verbose log from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Verbose, payload);\n }\n\n public debug(payload: string | LogPayload) {\n this.logLevel(LogLevel.Debug, payload);\n }\n\n public silly(payload: string | LogPayload) {\n console.log(\n 'silly log from browser process:',\n typeof payload === 'string' ? payload : payload.message,\n );\n this.logLevel(LogLevel.Silly, payload);\n }\n\n protected logLevel(level: LogLevel, payload: string | LogPayload) {\n const result = typeof payload === 'string' ? {message: payload} : payload;\n result.level = level;\n this.log(result);\n }\n\n public profile(id: string, payload?: LogPayload) {\n const time = performance.now();\n if (this.profilers[id]) {\n const timeEnd = this.profilers[id];\n delete this.profilers[id];\n\n const result = payload ?? {message: id};\n result.level ??= LogLevel.Debug;\n result.durationMs = time - timeEnd;\n this.log(result);\n\n return;\n }\n\n this.profilers[id] = time;\n }\n}\n","import type {AssetInfo} from '../app';\n\nexport async function download(assets: AssetInfo[][]): Promise<void> {\n const videoRanges: Map<string, {start: number; end: number}> = new Map();\n\n assets.forEach(frameAssets => {\n frameAssets.forEach(asset => {\n if (asset.type !== 'video' || asset.decoder !== 'ffmpeg') {\n return;\n }\n\n if (videoRanges.has(asset.src)) {\n const range = videoRanges.get(asset.src)!;\n range.start = Math.min(range.start, asset.currentTime);\n range.end = Math.max(range.end, asset.currentTime);\n return;\n }\n\n videoRanges.set(asset.src, {\n start: asset.currentTime,\n end: asset.currentTime,\n });\n });\n });\n\n const videoDurations = Array.from(videoRanges.entries()).map(\n ([src, {start, end}]) => ({\n src,\n startTime: start,\n endTime: end,\n }),\n );\n\n videoDurations.forEach(({src, startTime, endTime}) => {\n console.log(`downloading ${src} from ${startTime}s to ${endTime}s`);\n });\n\n const response = await fetch(\n '/twick-ffmpeg-decoder/download-video-chunks',\n {\n method: 'POST',\n headers: {\n // eslint-disable-next-line\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(videoDurations),\n },\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n const result = await response.json();\n\n if (!result.success) {\n throw new Error(`Error downloading video chunks: ${result.error}`);\n }\n\n console.log('finished downloading');\n}\n","import type {Project} from '../app/Project';\nimport type {\n AssetInfo,\n RendererResult,\n RendererSettings,\n} from '../app/Renderer';\nimport {EventDispatcher} from '../events';\nimport type {Exporter} from './Exporter';\nimport {download} from './download-videos';\n\ntype ServerResponse =\n | {\n status: 'success';\n method: string;\n data: unknown;\n }\n | {\n status: 'error';\n method: string;\n message?: string;\n };\n\nexport interface FfmpegExporterOptions {\n format: 'mp4' | 'webm' | 'proRes';\n}\n\n/**\n * FFmpeg video exporter.\n *\n * @remarks\n * Most of the export logic is handled on the server. This class communicates\n * with the FFmpegBridge through a WebSocket connection which lets it invoke\n * methods on the FFmpegExporterServer class.\n *\n * For example, calling the following method:\n * ```ts\n * async this.invoke('process', 7);\n * ```\n * Will invoke the `process` method on the FFmpegExporterServer class with `7`\n * as the argument. The result of the method will be returned as a Promise.\n *\n * Before any methods can be invoked, the FFmpegExporterServer class must be\n * initialized by invoking `start`.\n */\nexport class FFmpegExporterClient implements Exporter {\n public static readonly id = '@twick/core/ffmpeg';\n public static readonly displayName = 'Video (FFmpeg)';\n\n private readonly settings: RendererSettings;\n private readonly exporterOptions: FfmpegExporterOptions;\n\n public static async create(_: Project, settings: RendererSettings) {\n return new FFmpegExporterClient(settings);\n }\n\n private static readonly response = new EventDispatcher<ServerResponse>();\n\n static {\n if (import.meta.hot) {\n import.meta.hot.on(\n `twick:ffmpeg-exporter-ack`,\n (response: ServerResponse) => this.response.dispatch(response),\n );\n }\n }\n\n public constructor(settings: RendererSettings) {\n if (settings.exporter.name !== FFmpegExporterClient.id) {\n throw new Error('Invalid exporter');\n }\n this.settings = settings;\n this.exporterOptions = settings.exporter.options;\n }\n\n public async start(): Promise<void> {\n await this.invoke('start', this.settings);\n }\n\n public async handleFrame(canvas: HTMLCanvasElement): Promise<void> {\n const blob = await new Promise<Blob | null>(resolve =>\n canvas.toBlob(resolve, 'image/png'),\n );\n\n if (!blob) {\n throw Error('Failed to convert canvas to Blob.');\n }\n\n const dataUrl = await this.blobToDataUrl(blob);\n await this.invoke('handleFrame', {\n data: dataUrl,\n });\n }\n\n private async blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n }\n\n public async stop(result: RendererResult): Promise<void> {\n await this.invoke('end', result);\n await fetch('/twick-ffmpeg-decoder/finished', {\n method: 'POST',\n headers: {\n // eslint-disable-next-line\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n });\n }\n\n public async kill(): Promise<void> {\n await this.invoke('kill', {});\n }\n\n public async downloadVideos(assets: AssetInfo[][]): Promise<void> {\n await download(assets);\n }\n\n public async generateAudio(\n assets: AssetInfo[][],\n startFrame: number,\n endFrame: number,\n ): Promise<void> {\n await fetch('/audio-processing/generate-audio', {\n method: 'POST',\n body: JSON.stringify({\n tempDir: `twick-${this.settings.name}-${this.settings.hiddenFolderId}`,\n assets,\n startFrame,\n endFrame,\n fps: this.settings.fps,\n }),\n });\n }\n\n public async mergeMedia(): Promise<void> {\n const outputFilename = this.settings.name;\n const tempDir = `twick-${this.settings.name}-${this.settings.hiddenFolderId}`;\n const format = this.exporterOptions.format;\n\n await fetch('/audio-processing/merge-media', {\n method: 'POST',\n body: JSON.stringify({\n outputFilename,\n tempDir,\n format,\n }),\n });\n }\n\n /**\n * Remotely invoke a method on the server and wait for a response.\n *\n * @param method - The method name to execute on the server.\n * @param data - The data that will be passed as an argument to the method.\n * Should be serializable.\n */\n private invoke<TResponse = unknown, TData = unknown>(\n method: string,\n data: TData,\n ): Promise<TResponse> {\n if (import.meta.hot) {\n return new Promise((resolve, reject) => {\n const handle = (response: ServerResponse) => {\n if (response.method !== method) {\n return;\n }\n\n FFmpegExporterClient.response.unsubscribe(handle);\n if (response.status === 'success') {\n resolve(response.data as TResponse);\n } else {\n reject({\n message: `An error occurred while exporting the video: ${response.message}`,\n remarks: `Method: ${method}<br>Server error: ${response.message}`,\n object: data,\n });\n }\n };\n FFmpegExporterClient.response.subscribe(handle);\n import.meta.hot!.send('twick:ffmpeg-exporter', {method, data});\n });\n } else {\n throw new Error('FFmpegExporter can only be used locally.');\n }\n }\n}\n","export function map(from: number, to: number, value: number) {\n return from + (to - from) * value;\n}\n\nexport function remap(\n fromIn: number,\n toIn: number,\n fromOut: number,\n toOut: number,\n value: number,\n) {\n return fromOut + ((value - fromIn) * (toOut - fromOut)) / (toIn - fromIn);\n}\n\nexport function clamp(min: number, max: number, value: number) {\n return value < min ? min : value > max ? max : value;\n}\n\nexport function clampRemap(\n fromIn: number,\n toIn: number,\n fromOut: number,\n toOut: number,\n value: number,\n) {\n const remappedValue = remap(fromIn, toIn, fromOut, toOut, value);\n if (fromOut > toOut) [fromOut, toOut] = [toOut, fromOut];\n\n return clamp(fromOut, toOut, remappedValue);\n}\n","import type {Scene} from '../scenes';\n\nconst SceneStack: Scene[] = [];\n\n/**\n * Get a reference to the current scene.\n */\nexport function useScene(): Scene {\n const scene = SceneStack.at(-1);\n if (!scene) {\n throw new Error('The scene is not available in the current context.');\n }\n return scene;\n}\n\nexport function startScene(scene: Scene) {\n SceneStack.push(scene);\n}\n\nexport function endScene(scene: Scene) {\n if (SceneStack.pop() !== scene) {\n throw new Error('startScene/endScene were called out of order.');\n }\n}\n\nexport function useLogger() {\n return SceneStack.at(-1)?.logger ?? console;\n}\n\n/**\n * Mark the current scene as ready to transition out.\n *\n * @remarks\n * Usually used together with transitions. When a scene is marked as finished,\n * the transition will start but the scene generator will continue running.\n */\nexport function finishScene() {\n useScene().enterCanTransitionOut();\n}\n","import type {LogPayload} from '../app';\n\ntype DetailedErrorProps = Pick<\n LogPayload,\n 'message' | 'remarks' | 'object' | 'durationMs' | 'inspect'\n>;\n\nexport class DetailedError extends Error {\n /**\n * {@inheritDoc app.LogPayload.message}\n */\n public readonly remarks?: string;\n /**\n * {@inheritDoc app.LogPayload.object}\n */\n public readonly object?: any;\n /**\n * {@inheritDoc app.LogPayload.durationMs}\n */\n public readonly durationMs?: number;\n /**\n * {@inheritDoc app.LogPayload.inspect}\n */\n public readonly inspect?: string;\n\n public constructor(message: string, remarks?: string);\n public constructor(props: DetailedErrorProps);\n public constructor(props: string | DetailedErrorProps, remarks?: string) {\n if (typeof props === 'string') {\n super(props);\n this.remarks = remarks;\n } else {\n super(props.message);\n this.remarks = props.remarks;\n this.object = props.object;\n this.durationMs = props.durationMs;\n this.inspect = props.inspect;\n }\n }\n}\n","import type {Thread} from '../threading';\nimport {DetailedError} from './DetailedError';\n\nconst ThreadStack: Thread[] = [];\n\n/**\n * Get a reference to the current thread.\n */\nexport function useThread(): Thread {\n const thread = ThreadStack.at(-1);\n if (!thread) {\n throw new DetailedError(\n 'The thread is not available in the current context.',\n // language=markdown\n `\\`useThread()\\` can only be called from within generator functions.\n It's not available during rendering.`,\n );\n }\n return thread;\n}\n\nexport function startThread(thread: Thread) {\n ThreadStack.push(thread);\n}\n\nexport function endThread(thread: Thread) {\n if (ThreadStack.pop() !== thread) {\n throw new Error('startThread/endThread was called out of order.');\n }\n}\n","import type {ThreadGenerator} from '../threading';\nimport {useScene} from './useScene';\nimport {useThread} from './useThread';\n\nexport function* beginSlide(name: string): ThreadGenerator {\n const {slides} = useScene();\n const thread = useThread();\n slides.register(name, thread.fixed);\n yield;\n\n while (slides.shouldWait(name)) {\n yield;\n }\n}\n","export function capitalize<T extends string>(value: T): Capitalize<T> {\n return <Capitalize<T>>(value[0].toUpperCase() + value.slice(1));\n}\n","export interface ReferenceReceiver<T> {\n (reference: T): void;\n}\n\nexport interface Reference<T> extends ReferenceReceiver<T> {\n (): T;\n}\n\nexport function createRef<T>(): Reference<T> {\n let value: T;\n const ref = (newValue?: T) => {\n if (newValue !== undefined) {\n value = newValue;\n } else {\n return value;\n }\n };\n\n return ref as Reference<T>;\n}\n\nexport function makeRef<TObject, TKey extends keyof TObject>(\n object: TObject,\n key: TKey,\n): ReferenceReceiver<TObject[TKey]> {\n return newValue => {\n object[key] = newValue;\n };\n}\n\nexport type RefsProperty<TValue> = TValue extends (config: {\n refs?: infer TReference;\n}) => void\n ? TReference\n : never;\n\nexport function makeRefs<\n T extends (config: {refs?: any}) => void,\n>(): RefsProperty<T> {\n return {} as RefsProperty<T>;\n}\n","import type {Reference} from './createRef';\n\ntype ProxyTarget<T> = {\n (): void;\n array: T[];\n};\n\nexport type ReferenceArray<T> = T[] & Reference<T>;\n\n/**\n * Create an array of references.\n *\n * @remarks\n * The returned object is both an array and a reference that can be passed\n * directly to the `ref` property of a node.\n *\n * @example\n * ```tsx\n * const labels = createRefArray<Txt>();\n *\n * view.add(['A', 'B'].map(text => <Txt ref={labels}>{text}</Txt>));\n * view.add(<Txt ref={labels}>C</Txt>);\n *\n * // accessing the references individually:\n * yield* labels[0].text('A changes', 0.3);\n * yield* labels[1].text('B changes', 0.3);\n * yield* labels[2].text('C changes', 0.3);\n *\n * // accessing all references at once:\n * yield* all(...labels.map(label => label.fill('white', 0.3)));\n * ```\n */\nexport function createRefArray<T>(): ReferenceArray<T> {\n const target = function () {\n // do nothing\n } as ProxyTarget<T>;\n target.array = [];\n return new Proxy(target, Handler) as unknown as ReferenceArray<T>;\n}\n\nconst Handler: ProxyHandler<ProxyTarget<any>> = {\n apply(target, _, argArray) {\n if (argArray.length === 0) {\n return target.array[0];\n }\n\n target.array.push(...argArray);\n },\n\n get(target, property, receiver) {\n const value = Reflect.get(target.array, property, receiver);\n if (typeof value === 'function') {\n return value.bind(target.array);\n }\n\n return value;\n },\n\n set(target, property, value, receiver) {\n return Reflect.set(target.array, property, value, receiver);\n },\n};\n","import type {Reference} from './createRef';\nimport {createRef} from './createRef';\n\nexport type ReferenceMap<T> = Map<string, Reference<T>> &\n Record<string, Reference<T>> & {\n /**\n * Maps the references in this group to a new array.\n *\n * @param callback - The function to transform each reference.\n *\n * @returns An array of the transformed references.\n */\n mapRefs<TValue>(callback: (value: T, index: number) => TValue): TValue[];\n };\n\n/**\n * Create a group of references.\n *\n * @remarks\n * The returned object lets you easily create multiple references to the same\n * type without initializing them individually.\n *\n * You can retrieve references by accessing the object's properties. If the\n * reference for a given property does not exist, it will be created\n * automatically.\n *\n * @example\n * ```tsx\n * const labels = createRefMap<Txt>();\n *\n * view.add(\n * <>\n * <Txt ref={labels.a}>A</Txt>\n * <Txt ref={labels.b}>B</Txt>\n * <Txt ref={labels.c}>C</Txt>\n * </>,\n * );\n *\n * // accessing the references individually:\n * yield* labels.a().text('A changes', 0.3);\n * yield* labels.b().text('B changes', 0.3);\n * yield* labels.c().text('C changes', 0.3);\n *\n * // checking if the given reference exists:\n * if ('d' in labels) {\n * yield* labels.d().text('D changes', 0.3);\n * }\n *\n * // accessing all references at once:\n * yield* all(...labels.mapRefs(label => label.fill('white', 0.3)));\n * ```\n */\nexport function createRefMap<T>(): ReferenceMap<T> {\n const group = new Map<string, Reference<T>>();\n group.entries();\n return new Proxy(group, Handler) as ReferenceMap<T>;\n}\n\nconst Handler: ProxyHandler<Map<string, Reference<any>>> = {\n get(target, property) {\n if (Reflect.has(target, property)) {\n return Reflect.get(target, property);\n }\n\n if (property === 'mapRefs') {\n return function <TValue>(\n callback: (value: any, index: number) => TValue,\n ): TValue[] {\n const result: TValue[] = [];\n for (const value of target.values()) {\n result.push(callback(value(), result.length));\n }\n return result;\n };\n }\n\n if (typeof property === 'string') {\n let value = target.get(property);\n if (!value) {\n value = createRef();\n target.set(property, value);\n }\n return value;\n }\n },\n\n has(target, property) {\n if (Reflect.has(target, property)) {\n return true;\n }\n\n if (typeof property === 'string') {\n return target.has(property);\n }\n\n return false;\n },\n};\n","import type {LogPayload} from '../app';\nimport {useLogger} from './useScene';\n\nfunction stringify(value: any): string {\n switch (typeof value) {\n case 'string':\n // Prevent strings from getting quoted again\n return value;\n case 'undefined':\n // Prevent `undefined` from being turned into `null`\n return 'undefined';\n default:\n // Prevent `NaN` from being turned into `null`\n if (Number.isNaN(value)) {\n return 'NaN';\n }\n return JSON.stringify(value);\n }\n}\n\n/**\n * Logs a debug message with an arbitrary payload.\n *\n * @remarks\n * This method is a shortcut for calling `useLogger().debug()` which allows\n * you to more easily log non-string values as well.\n *\n * @example\n * ```ts\n * export default makeScene2D(function* (view) {\n * const circle = createRef<Circle>();\n *\n * view.add(\n * <Circle ref={circle} width={320} height={320} fill={'lightseagreen'} />,\n * );\n *\n * debug(circle().position());\n * });\n * ```\n *\n * @param payload - The payload to log\n */\nexport function debug(payload: any) {\n const result: LogPayload = {message: stringify(payload)};\n\n if (payload && typeof payload === 'object') {\n result.object = payload;\n }\n\n useLogger().debug(result);\n}\n","import {useLogger} from './useScene';\n\n/**\n * Mark the given function as deprecated.\n *\n * @param fn - The function to deprecate.\n * @param message - The log message.\n * @param remarks - The optional log remarks.\n */\nexport function deprecate<TArgs extends any[], TReturn>(\n fn: (...args: TArgs) => TReturn,\n message: string,\n remarks?: string,\n): (...args: TArgs) => TReturn {\n return function (this: any, ...args) {\n useLogger().warn({message, remarks, stack: new Error().stack});\n return fn.apply(this, args);\n };\n}\n","import type {LogPayload} from '../app';\n\nexport function errorToLog(error: any): LogPayload {\n return {\n message: error.message,\n stack: error.stack,\n remarks: error.remarks,\n };\n}\n","import type {LogPayload} from '../app';\nimport {DetailedError} from './DetailedError';\n\nexport const experimentalFeatures = `\nThis feature requires enabling the \\`experimentalFeatures\\` flag in your project\nconfiguration:\n\n\\`\\`\\`ts\nexport default makeProject({\n experimentalFeatures: true,\n // ...\n});\n\\`\\`\\`\n\n[Learn more](https://motioncanvas.io/docs/experimental) about experimental\nfeatures.\n`;\n\ntype ExperimentalErrorProps = Pick<\n LogPayload,\n 'message' | 'remarks' | 'object' | 'durationMs' | 'inspect'\n>;\n\nexport class ExperimentalError extends DetailedError {\n public constructor(message: string, remarks?: string);\n public constructor(props: ExperimentalErrorProps);\n public constructor(props: string | ExperimentalErrorProps, remarks?: string) {\n if (typeof props === 'string') {\n super({\n message: props,\n remarks: (remarks ?? '') + experimentalFeatures,\n });\n } else {\n super({\n ...props,\n remarks: (props.remarks ?? '') + experimentalFeatures,\n });\n }\n }\n}\n","import type {LogPayload} from '../app/Logger';\nimport {LogLevel} from '../app/Logger';\nimport {experimentalFeatures} from './ExperimentalError';\n\nexport function experimentalLog(message: string, remarks?: string): LogPayload {\n return {\n level: LogLevel.Error,\n message,\n remarks: (remarks ?? '') + experimentalFeatures,\n };\n}\n","export function getContext(\n options?: CanvasRenderingContext2DSettings,\n canvas: HTMLCanvasElement = document.createElement('canvas'),\n): CanvasRenderingContext2D {\n const context = canvas.getContext('2d', options);\n if (!context) {\n throw new Error('Could not create a 2D context.');\n }\n return context;\n}\n","/**\n * A constant for converting radians to degrees\n *\n * @example\n * const degrees = 0.6 * RAD2DEG;\n */\nexport const RAD2DEG = 180 / Math.PI;\n\n/**\n * A constant for converting degrees to radians\n *\n * @example\n * const radians = 30 * DEG2RAD;\n */\nexport const DEG2RAD = Math.PI / 180;\n","/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(3); // [0, 1, 2]\n * const array2 = range(-3); // [0, -1, -2]\n * ```\n *\n * @param length - The length of the array.\n */\nexport function range(length: number): number[];\n/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(3, 7); // [3, 4, 5, 6]\n * const array2 = range(7, 3); // [7, 6, 5, 4]\n * ```\n *\n * @param from - The start of the range.\n * @param to - The end of the range. `to` itself is not included in the result.\n */\nexport function range(from: number, to: number): number[];\n/**\n * Create an array containing a range of numbers.\n *\n * @example\n * ```ts\n * const array1 = range(1, 2, 0.25); // [1, 1.25, 1.5, 1.75]\n * const array2 = range(2, 1, -0.25); // [2, 1.75, 1.5, 1.25]\n * ```\n *\n * @param from - The start of the range.\n * @param to - The end of the range. `to` itself is not included in the result.\n * @param step - The value by which to increment or decrement.\n */\nexport function range(from: number, to: number, step: number): number[];\nexport function range(first: number, second?: number, step?: number): number[] {\n let from = 0;\n let to = first;\n if (second !== undefined) {\n from = first;\n to = second;\n }\n\n step = step === undefined ? (from < to ? 1 : -1) : step;\n\n const array = [];\n let length = Math.max(Math.ceil((to - from) / step), 0);\n let index = 0;\n\n while (length--) {\n array[index++] = from;\n from += step;\n }\n\n return array;\n}\n","/**\n * A simple semaphore implementation with a capacity of 1.\n *\n * @internal\n */\nexport class Semaphore {\n private resolveCurrent: (() => void) | null = null;\n private current: Promise<void> | null = null;\n\n public async acquire() {\n while (this.current) {\n await this.current;\n }\n this.current = new Promise(resolve => {\n this.resolveCurrent = resolve;\n });\n }\n\n public release() {\n this.current = null;\n this.resolveCurrent?.();\n this.resolveCurrent = null;\n }\n}\n","import {useScene} from './useScene';\n\n/**\n * Provide a function to access the Context2D before the scene is rendered.\n *\n * @param callback - The function that will be provided the context before render.\n */\nexport function useContext(\n callback: (ctx: CanvasRenderingContext2D) => void,\n): () => void {\n return useScene().lifecycleEvents.onBeginRender.subscribe(callback);\n}\n\n/**\n * Provide a function to access the Context2D after the scene is rendered.\n *\n * @param callback - The function that will be provided the context after render.\n */\nexport function useContextAfter(\n callback: (ctx: CanvasRenderingContext2D) => void,\n): () => void {\n return useScene().lifecycleEvents.onFinishRender.subscribe(callback);\n}\n","import type {PlaybackStatus} from '../app';\n\nconst PlaybackStack: PlaybackStatus[] = [];\n\n/**\n * Get a reference to the playback status.\n */\nexport function usePlayback() {\n const playback = PlaybackStack.at(-1);\n if (!playback) {\n throw new Error('The playback is not available in the current context.');\n }\n return playback;\n}\n\nexport function startPlayback(playback: PlaybackStatus) {\n PlaybackStack.push(playback);\n}\n\nexport function endPlayback(playback: PlaybackStatus) {\n if (PlaybackStack.pop() !== playback) {\n throw new Error('startPlayback/endPlayback were called out of order.');\n }\n}\n","import {useThread} from './useThread';\n\n/**\n * Get the real time since the start of the animation.\n *\n * @remarks\n * The returned value accounts for offsets caused by functions such as\n * {@link flow.waitFor}.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* waitFor(0.02);\n *\n * // current time: 0.016(6)s\n * // real time: 0.02s\n * const realTime = useTime();\n * ```\n */\nexport function useTime() {\n return useThread().time();\n}\n","import {useLogger} from '../utils';\nimport {clamp, map} from './helpers';\n\nexport interface InterpolationFunction<T, TRest extends any[] = any[]> {\n (from: T, to: T, value: number, ...args: TRest): T;\n}\n\nexport function textLerp(from: string, to: string, value: number) {\n // left to right\n if (to.length >= from.length) {\n const current = Math.floor(to.length * value);\n const currentLength = Math.floor(map(from.length - 1, to.length, value));\n let text = '';\n for (let i = 0; i < to.length; i++) {\n if (i < current) {\n text += to[i];\n } else if (from[i] || i <= currentLength) {\n text += from[i] ?? to[i];\n }\n }\n\n return text;\n }\n // right to left\n else {\n const current = Math.round(from.length * (1 - value));\n const currentLength = Math.floor(map(from.length + 1, to.length, value));\n const text = [];\n for (let i = from.length - 1; i >= 0; i--) {\n if (i < current) {\n text.unshift(from[i]);\n } else if (to[i] || i < currentLength) {\n text.unshift(to[i] ?? from[i]);\n }\n }\n\n return text.join('');\n }\n}\n\n/**\n * Interpolate between any two Records, including objects and Maps, even with\n * mismatched keys.\n *\n * @remarks\n * Any old key that is missing in `to` will be removed immediately once value is\n * not 0. Any new key that is missing in `from` will be added once value reaches\n * 1.\n *\n * @param from - The input to favor when value is 0.\n * @param to - The input to favor when value is 1.\n * @param value - On a scale between 0 and 1, how closely to favor from vs to.\n *\n * @returns A value matching the structure of from and to.\n */\nexport function deepLerp<\n TFrom extends Record<any, unknown>,\n TTo extends Record<any, unknown>,\n>(from: TFrom, to: TTo, value: number): TFrom | TTo;\nexport function deepLerp<\n TFrom extends Record<any, unknown>,\n TTo extends Record<any, unknown>,\n>(from: TFrom, to: TTo, value: number, suppressWarnings: boolean): TFrom | TTo;\n/**\n * Interpolate between any two values, including objects, arrays, and Maps.\n *\n * @param from - The input to favor when value is 0.\n * @param to - The input to favor when value is 1.\n * @param value - On a scale between 0 and 1, how closely to favor from vs to.\n *\n * @returns A value matching the structure of from and to.\n */\nexport function deepLerp<T>(from: T, to: T, value: number): T;\nexport function deepLerp<T>(\n from: T,\n to: T,\n value: number,\n suppressWarnings: boolean,\n): T;\nexport function deepLerp(\n from: any,\n to: any,\n value: number,\n suppressWarnings = false,\n): any {\n if (value === 0) return from;\n if (value === 1) return to;\n\n if (from == null || to == null) {\n if (!suppressWarnings) {\n useLogger().warn(\n `Attempting to lerp ${from} -> ${to} may result in unexpected behavior.`,\n );\n }\n return undefined;\n }\n\n if (typeof from === 'number' && typeof to === 'number') {\n return map(from, to, value);\n }\n\n if (typeof from === 'string' && typeof to === 'string') {\n return textLerp(from, to, value);\n }\n\n if (typeof from === 'boolean' && typeof to === 'boolean') {\n return value < 0.5 ? from : to;\n }\n\n if ('lerp' in from) {\n return from.lerp(to, value);\n }\n\n if (from && to && typeof from === 'object' && typeof to === 'object') {\n if (Array.isArray(from) && Array.isArray(to)) {\n if (from.length === to.length) {\n return from.map((f, i) => deepLerp(f, to[i], value));\n }\n } else {\n let toObject = false;\n if (!(from instanceof Map) && !(to instanceof Map)) {\n toObject = true;\n from = new Map(Object.entries(from));\n to = new Map(Object.entries(to));\n }\n\n if (from instanceof Map && to instanceof Map) {\n const result = new Map();\n for (const key of new Set([...from.keys(), ...to.keys()])) {\n const inter = deepLerp(from.get(key), to.get(key), value, true);\n if (inter !== undefined) result.set(key, inter);\n }\n return toObject ? Object.fromEntries(result) : result;\n }\n }\n }\n\n // fallback with an immediate jump to the new value\n return to;\n}\n\nexport function boolLerp<T>(from: T, to: T, value: number): T {\n return value < 0.5 ? from : to;\n}\n\nexport function arcLerp(value: number, reverse: boolean, ratio: number) {\n let flip = reverse;\n if (ratio > 1) {\n ratio = 1 / ratio;\n } else {\n flip = !flip;\n }\n\n const normalized = flip\n ? Math.acos(clamp(-1, 1, 1 - value))\n : Math.asin(value);\n const radians = map(normalized, map(0, Math.PI / 2, value), ratio);\n\n let xValue = Math.sin(radians);\n let yValue = 1 - Math.cos(radians);\n if (reverse) {\n [xValue, yValue] = [yValue, xValue];\n }\n\n return {x: xValue, y: yValue};\n}\n","export function decorate(fn: Callback, ...decorators: MethodDecorator[]) {\n const target = {[fn.name]: fn};\n const descriptor = Object.getOwnPropertyDescriptor(target, fn.name);\n if (descriptor) {\n for (let i = decorators.length - 1; i >= 0; i--) {\n decorators[i](target, fn.name, descriptor);\n }\n }\n}\n","const UNINITIALIZED = Symbol.for('@twick/core/decorators/UNINITIALIZED');\n\n/**\n * Create a lazy decorator.\n *\n * @remarks\n * A property marked as lazy will not be initialized until it's requested for\n * the first time. Lazy properties are read-only.\n *\n * Must be used for any static properties that require the DOM API to be\n * initialized.\n *\n * @param factory - A function that returns the value of this property.\n */\nexport function lazy(factory: () => unknown): PropertyDecorator {\n return (target, propertyKey) => {\n let value: unknown = UNINITIALIZED;\n Object.defineProperty(target, propertyKey, {\n get(): any {\n if (value === UNINITIALIZED) {\n value = factory.call(this);\n }\n return value;\n },\n });\n };\n}\n","export function threadable(customName?: string): MethodDecorator {\n return function (\n _: unknown,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor,\n ) {\n const value = descriptor?.value;\n\n // In some bundled environments (like CRA + certain babel runtimes),\n // touching prototype.name can throw (non‑writable / non‑configurable),\n // which used to surface as a hard runtime error.\n if (typeof value === 'function' && value.prototype) {\n const prototype: any = value.prototype;\n\n try {\n const nameDescriptor = Object.getOwnPropertyDescriptor(\n prototype,\n 'name',\n );\n\n // Only try to overwrite the name if it is writable or not defined at all.\n if (!nameDescriptor || nameDescriptor.writable) {\n prototype.name = customName ?? propertyKey;\n }\n } catch {\n // If anything goes wrong (frozen prototype, non‑writable name, etc.),\n // we silently ignore it instead of crashing the app.\n }\n\n // Mark the function as threadable regardless of whether we managed\n // to override the name. This is what the rest of the system relies on.\n prototype.threadable = true;\n }\n };\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {useLogger, useThread} from '../utils';\n\ntype ProgressFunction = (value: number, time: number) => void;\n\ndecorate(spring, threadable());\nexport function spring(\n spring: Spring | null,\n from: number,\n to: number,\n settleTolerance: number,\n onProgress: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator;\n\nexport function spring(\n spring: Spring | null,\n from: number,\n to: number,\n onProgress: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator;\n\nexport function* spring(\n spring: Spring | null,\n from: number,\n to: number,\n settleToleranceOrOnProgress: number | ProgressFunction,\n onProgressOrOnEnd?: ProgressFunction,\n onEnd?: ProgressFunction,\n): ThreadGenerator {\n const settleTolerance =\n typeof settleToleranceOrOnProgress === 'number'\n ? settleToleranceOrOnProgress\n : 0.001;\n\n onEnd =\n typeof settleToleranceOrOnProgress === 'number' ? onEnd : onProgressOrOnEnd;\n\n const onProgress: ProgressFunction = (value: number, time: number) => {\n if (typeof settleToleranceOrOnProgress === 'function') {\n settleToleranceOrOnProgress(value, time);\n } else if (typeof onProgressOrOnEnd === 'function') {\n onProgressOrOnEnd(value, time);\n }\n };\n\n spring = spring ?? {\n mass: 0.05,\n stiffness: 10,\n damping: 0.5,\n };\n\n if (spring.mass <= 0) {\n useLogger().error(new Error('Spring mass must be greater than 0.'));\n return;\n }\n if (spring.stiffness < 0) {\n useLogger().error(\n new Error('Spring stiffness must be greater or equal to 0.'),\n );\n return;\n }\n if (spring.damping < 0) {\n useLogger().error(\n new Error('Spring damping must be greater or equal to 0.'),\n );\n return;\n }\n\n const thread = useThread();\n\n let position = from;\n let velocity = spring.initialVelocity ?? 0;\n\n const update = (dt: number) => {\n if (spring === null) {\n return;\n }\n const positionDelta = position - to;\n\n // Using hooks law: F=-kx; with k being the spring constant and x the offset\n // to the settling position\n const force = -spring.stiffness * positionDelta - spring.damping * velocity;\n\n // Update the velocity based on the given timestep\n velocity += (force / spring.mass) * dt;\n\n position += velocity * dt;\n };\n\n // Set simulation constant framerate\n const simulationFrames = 120;\n\n // Calculate a timestep based on on the simulation framerate\n const timeStep = 1 / simulationFrames;\n\n onProgress(from, 0);\n\n const startTime = thread.time();\n let simulationTime = startTime;\n\n let settled = false;\n while (!settled) {\n while (simulationTime < thread.fixed) {\n const difference = thread.fixed - simulationTime;\n\n if (timeStep > difference) {\n update(difference);\n simulationTime = thread.fixed;\n } else {\n update(timeStep);\n simulationTime += timeStep;\n }\n\n // Perform the check during every iteration:\n if (\n Math.abs(to - position) < settleTolerance &&\n Math.abs(velocity) < settleTolerance\n ) {\n // Set the thread time to simulation time:\n thread.time(simulationTime);\n settled = true;\n // Break out when settled\n break;\n }\n }\n\n // Only yield if we haven't settled yet.\n if (!settled) {\n onProgress(position, thread.fixed - startTime);\n yield;\n }\n }\n\n onProgress(to, thread.fixed - startTime);\n onEnd?.(to, thread.fixed - startTime);\n}\n\nexport interface Spring {\n mass: number;\n stiffness: number;\n damping: number;\n initialVelocity?: number;\n}\n\nexport function makeSpring(\n mass: number,\n stiffness: number,\n damping: number,\n initialVelocity?: number,\n): Spring {\n return {\n mass,\n stiffness,\n damping,\n initialVelocity,\n };\n}\n\nexport const BeatSpring: Spring = makeSpring(0.13, 5.7, 1.2, 10.0);\nexport const PlopSpring: Spring = makeSpring(0.2, 20.0, 0.68, 0.0);\nexport const BounceSpring: Spring = makeSpring(0.08, 4.75, 0.05, 0.0);\nexport const SwingSpring: Spring = makeSpring(0.39, 19.85, 2.82, 0.0);\nexport const JumpSpring: Spring = makeSpring(0.04, 10.0, 0.7, 8.0);\nexport const StrikeSpring: Spring = makeSpring(0.03, 20.0, 0.9, 4.8);\nexport const SmoothSpring: Spring = makeSpring(0.16, 15.35, 1.88, 0.0);\n","import {map, remap} from './helpers';\n\nexport interface TimingFunction {\n (value: number, from?: number, to?: number): number;\n}\n\n/*\n * All easing implementations taken from https://easings.net/\n */\n\n// Sine\nexport function sin(value: number, from = 0, to = 1) {\n return remap(-1, 1, from, to, Math.sin(value));\n}\n\nexport function easeInSine(value: number, from = 0, to = 1): number {\n value = 1 - Math.cos((value * Math.PI) / 2);\n\n return map(from, to, value);\n}\n\nexport function easeOutSine(value: number, from = 0, to = 1): number {\n value = Math.sin((value * Math.PI) / 2);\n\n return map(from, to, value);\n}\n\nexport function easeInOutSine(value: number, from = 0, to = 1): number {\n value = -(Math.cos(Math.PI * value) - 1) / 2;\n\n return map(from, to, value);\n}\n\n// Quadratic\nexport function easeInQuad(value: number, from = 0, to = 1): number {\n value = value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuad(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 2);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuad(value: number, from = 0, to = 1) {\n value = value < 0.5 ? 2 * value * value : 1 - Math.pow(-2 * value + 2, 2) / 2;\n\n return map(from, to, value);\n}\n\n// Cubic\nexport function easeInCubic(value: number, from = 0, to = 1): number {\n value = value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutCubic(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 3);\n\n return map(from, to, value);\n}\n\nexport function easeInOutCubic(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 4 * value * value * value\n : 1 - Math.pow(-2 * value + 2, 3) / 2;\n\n return map(from, to, value);\n}\n\n// Quartic\nexport function easeInQuart(value: number, from = 0, to = 1): number {\n value = value * value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuart(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 4);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuart(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 8 * value * value * value * value\n : 1 - Math.pow(-2 * value + 2, 4) / 2;\n\n return map(from, to, value);\n}\n\n// Quintic\nexport function easeInQuint(value: number, from = 0, to = 1): number {\n value = value * value * value * value * value;\n\n return map(from, to, value);\n}\n\nexport function easeOutQuint(value: number, from = 0, to = 1): number {\n value = 1 - Math.pow(1 - value, 5);\n\n return map(from, to, value);\n}\n\nexport function easeInOutQuint(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? 16 * value * value * value * value * value\n : 1 - Math.pow(-2 * value + 2, 5) / 2;\n\n return map(from, to, value);\n}\n\n// Exponential\nexport function easeInExpo(value: number, from = 0, to = 1) {\n value = value === 0 ? 0 : Math.pow(2, 10 * value - 10);\n\n return map(from, to, value);\n}\n\nexport function easeOutExpo(value: number, from = 0, to = 1) {\n value = value === 1 ? 1 : 1 - Math.pow(2, -10 * value);\n\n return map(from, to, value);\n}\n\nexport function easeInOutExpo(value: number, from = 0, to = 1) {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : value < 0.5\n ? Math.pow(2, 20 * value - 10) / 2\n : (2 - Math.pow(2, -20 * value + 10)) / 2;\n\n return map(from, to, value);\n}\n\n// Circular\nexport function easeInCirc(value: number, from = 0, to = 1) {\n value = 1 - Math.sqrt(1 - Math.pow(value, 2));\n\n return map(from, to, value);\n}\n\nexport function easeOutCirc(value: number, from = 0, to = 1) {\n value = Math.sqrt(1 - Math.pow(value - 1, 2));\n\n return map(from, to, value);\n}\n\nexport function easeInOutCirc(value: number, from = 0, to = 1) {\n value =\n value < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * value, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * value + 2, 2)) + 1) / 2;\n\n return map(from, to, value);\n}\n\n// Back\nexport function createEaseInBack(s = 1.70158): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value = (s + 1) * value * value * value - s * value * value;\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseOutBack(s = 1.70158): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value = 1 + (s + 1) * Math.pow(value - 1, 3) + s * Math.pow(value - 1, 2);\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutBack(s = 1.70158, v = 1.525): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value < 0.5\n ? (Math.pow(2 * value, 2) * ((s * v + 1) * 2 * value - s * v)) / 2\n : (Math.pow(2 * value - 2, 2) *\n ((s * v + 1) * (value * 2 - 2) + s * v) +\n 2) /\n 2;\n\n return map(from, to, value);\n };\n}\n\n// Elastic\nexport function createEaseInElastic(s = 2.094395): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : -Math.pow(2, 10 * value - 10) * Math.sin((value * 10 - 10.75) * s);\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseOutElastic(s = 2.094395): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : Math.pow(2, -10 * value) * Math.sin((value * 10 - 0.75) * s) + 1;\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutElastic(s = 1.39626): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n value =\n value === 0\n ? 0\n : value === 1\n ? 1\n : value < 0.5\n ? -(\n Math.pow(2, 20 * value - 10) *\n Math.sin((20 * value - 11.125) * s)\n ) / 2\n : (Math.pow(2, -20 * value + 10) *\n Math.sin((20 * value - 11.125) * s)) /\n 2 +\n 1;\n\n return map(from, to, value);\n };\n}\n\n// Bounce\nexport function createEaseInBounce(n = 7.5625, d = 2.75): TimingFunction {\n const easeOutBounce = createEaseOutBounce(n, d);\n\n return (value: number, from = 0, to = 1) => {\n return 1 - easeOutBounce(1 - value, from, to);\n };\n}\n\nexport function createEaseOutBounce(n = 7.5625, d = 2.75): TimingFunction {\n return (value: number, from = 0, to = 1) => {\n if (value < 1 / d) {\n value = n * value * value;\n } else if (value < 2 / d) {\n value = n * (value -= 1.505 / d) * value + 0.75;\n } else if (value < 2.5 / d) {\n value = n * (value -= 2.25 / d) * value + 0.9375;\n } else {\n value = n * (value -= 2.625 / d) * value + 0.984375;\n }\n\n return map(from, to, value);\n };\n}\n\nexport function createEaseInOutBounce(n = 7.5625, d = 2.75): TimingFunction {\n const easeOutBounce = createEaseOutBounce(n, d);\n\n return (value: number, from = 0, to = 1) => {\n return value < 0.5\n ? (1 - easeOutBounce(1 - 2 * value, from, to)) / 2\n : (1 + easeOutBounce(2 * value - 1, from, to)) / 2;\n };\n}\n\n// Linear\nexport function linear(value: number, from = 0, to = 1) {\n return map(from, to, value);\n}\n\n// Cosine\nexport function cos(value: number, from = 0, to = 1) {\n return remap(-1, 1, from, to, Math.cos(value));\n}\n\n// Sensible defaults for functions with parameters that can be user defined\nexport const easeInBack: TimingFunction = createEaseInBack();\nexport const easeOutBack: TimingFunction = createEaseOutBack();\nexport const easeInOutBack: TimingFunction = createEaseInOutBack();\n\nexport const easeInBounce: TimingFunction = createEaseInBounce();\nexport const easeOutBounce: TimingFunction = createEaseOutBounce();\nexport const easeInOutBounce: TimingFunction = createEaseInOutBounce();\n\nexport const easeInElastic: TimingFunction = createEaseInElastic();\nexport const easeOutElastic: TimingFunction = createEaseOutElastic();\nexport const easeInOutElastic: TimingFunction = createEaseInOutElastic();\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {useThread} from '../utils';\n\ndecorate(tween, threadable());\nexport function* tween(\n seconds: number,\n onProgress: (value: number, time: number) => void,\n onEnd?: (value: number, time: number) => void,\n): ThreadGenerator {\n const thread = useThread();\n\n const startTime = thread.time();\n const endTime = thread.time() + seconds;\n\n onProgress(0, 0);\n while (endTime > thread.fixed) {\n const time = thread.fixed - startTime;\n const value = time / seconds;\n if (time > 0) {\n onProgress(value, time);\n }\n yield;\n }\n thread.time(endTime);\n\n onProgress(1, seconds);\n onEnd?.(1, seconds);\n}\n","import type {Logger} from '../app/Logger';\nimport type {Project} from '../app/Project';\nimport type {AssetInfo, RendererSettings} from '../app/Renderer';\nimport {EventDispatcher} from '../events';\nimport {clamp} from '../tweening';\nimport type {CanvasOutputMimeType} from '../types';\nimport type {Exporter} from './Exporter';\nimport {download} from './download-videos';\n\nconst EXPORT_FRAME_LIMIT = 256;\nconst EXPORT_RETRY_DELAY = 1000;\n\nexport interface ImageExporterOptions {\n quality: number;\n fileType: CanvasOutputMimeType;\n groupByScene: boolean;\n}\n\ninterface ServerResponse {\n frame: number;\n}\n\n/**\n * Image sequence exporter.\n *\n * @internal\n */\nexport class ImageExporter implements Exporter {\n public static readonly id = '@twick/core/image-sequence';\n public static readonly displayName = 'Image sequence';\n\n public static async create(\n project: Project,\n settings: RendererSettings,\n ): Promise<ImageExporter> {\n return new ImageExporter(project.logger, settings);\n }\n\n private static readonly response = new EventDispatcher<ServerResponse>();\n\n static {\n if (import.meta.hot) {\n import.meta.hot.on('twick:export-ack', response => {\n this.response.dispatch(response);\n });\n }\n }\n\n private readonly frameLookup = new Set<number>();\n private readonly projectName: string;\n private readonly quality: number;\n private readonly fileType: CanvasOutputMimeType;\n private readonly groupByScene: boolean;\n\n public constructor(\n private readonly logger: Logger,\n settings: RendererSettings,\n ) {\n if (settings.exporter.name !== ImageExporter.id) {\n throw new Error(\n `Invalid exporter name: ${settings.exporter.name}. Expected: ${ImageExporter.id}`,\n );\n }\n\n const options = settings.exporter.options as ImageExporterOptions;\n this.projectName = settings.name;\n this.quality = clamp(0, 1, options.quality / 100);\n this.fileType = options.fileType;\n this.groupByScene = options.groupByScene;\n }\n\n public async start() {\n ImageExporter.response.subscribe(this.handleResponse);\n }\n\n public async handleFrame(\n canvas: HTMLCanvasElement,\n frame: number,\n sceneFrame: number,\n sceneName: string,\n signal: AbortSignal,\n ) {\n if (this.frameLookup.has(frame)) {\n this.logger.warn(`Frame no. ${frame} is already being exported.`);\n return;\n }\n if (import.meta.hot) {\n while (this.frameLookup.size > EXPORT_FRAME_LIMIT) {\n await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));\n if (signal.aborted) {\n return;\n }\n }\n\n this.frameLookup.add(frame);\n import.meta.hot!.send('twick:export', {\n frame,\n sceneFrame,\n data: canvas.toDataURL(this.fileType, this.quality),\n mimeType: this.fileType,\n subDirectories: this.groupByScene\n ? [this.projectName, sceneName]\n : [this.projectName],\n groupByScene: this.groupByScene,\n });\n }\n }\n\n public async downloadVideos(assets: AssetInfo[][]): Promise<void> {\n await download(assets);\n }\n\n public async stop() {\n while (this.frameLookup.size > 0) {\n await new Promise(resolve => setTimeout(resolve, EXPORT_RETRY_DELAY));\n }\n ImageExporter.response.unsubscribe(this.handleResponse);\n }\n\n private handleResponse = ({frame}: ServerResponse) => {\n this.frameLookup.delete(frame);\n };\n}\n","import loadMp4Module from 'mp4-wasm';\nimport type {Project} from '../app/Project';\nimport type {AssetInfo, RendererSettings} from '../app/Renderer';\nimport type {Exporter} from './Exporter';\nimport {download} from './download-videos';\n\nexport class WasmExporter implements Exporter {\n public static readonly id = '@twick/core/wasm';\n public static readonly displayName = 'Video (Wasm)';\n\n public static async create(project: Project, settings: RendererSettings) {\n return new WasmExporter(project, settings);\n }\n\n public constructor(\n private readonly project: Project,\n private readonly settings: RendererSettings,\n ) {}\n\n public async start(): Promise<void> {\n const resp = await fetch('/@mp4-wasm');\n const buffer = await resp.arrayBuffer();\n\n const mp4 = await loadMp4Module({\n wasmBinary: buffer,\n });\n\n this.encoder = mp4.createWebCodecsEncoder({\n width: this.settings.size.x,\n height: this.settings.size.y,\n fps: this.project.settings.rendering.fps,\n });\n }\n\n private encoder: any;\n\n public async handleFrame(canvas: HTMLCanvasElement): Promise<void> {\n const frame = new VideoFrame(canvas, {timestamp: 0});\n await this.encoder.addFrame(frame);\n frame.close();\n }\n\n public async stop(): Promise<void> {\n const buf = await this.encoder.end();\n\n const formData = new FormData();\n formData.append('file', new Blob([buf], {type: 'video/mp4'}), 'video.mp4');\n formData.append(\n 'tempDir',\n `twick-${this.settings.name}-${this.settings.hiddenFolderId}`,\n );\n\n await fetch('/twick-ffmpeg-decoder/finished', {\n method: 'POST',\n headers: {\n // eslint-disable-next-line\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({}),\n });\n\n await fetch('/uploadVideoFile', {\n method: 'POST',\n body: formData,\n });\n }\n\n public async generateAudio(\n assets: AssetInfo[][],\n startFrame: number,\n endFrame: number,\n ): Promise<void> {\n await fetch('/audio-processing/generate-audio', {\n method: 'POST',\n // TODO: add type and validate on the other side\n body: JSON.stringify({\n tempDir: `twick-${this.settings.name}-${this.settings.hiddenFolderId}`,\n assets,\n startFrame,\n endFrame,\n fps: this.settings.fps,\n }),\n });\n }\n\n public async mergeMedia(): Promise<void> {\n const outputFilename = this.settings.name;\n const tempDir = `twick-${this.settings.name}-${this.settings.hiddenFolderId}`;\n\n await fetch('/audio-processing/merge-media', {\n method: 'POST',\n // TODO: add type and validate on the other side\n body: JSON.stringify({\n outputFilename,\n tempDir,\n format: 'mp4',\n }),\n });\n }\n\n public async downloadVideos(assets: AssetInfo[][]): Promise<void> {\n await download(assets);\n }\n}\n","import type {Plugin} from './Plugin';\n\n/**\n * A helper function for exporting Motion Canvas plugins.\n *\n * @param plugin - The plugin configuration.\n *\n * @example\n * ```ts\n * export default makePlugin({\n * name: 'my-custom-plugin',\n * });\n * ```\n */\nexport function makePlugin(plugin: Plugin | (() => Plugin)): () => Plugin {\n return typeof plugin === 'function' ? plugin : () => plugin;\n}\n","import {FFmpegExporterClient, ImageExporter} from '../exporter';\nimport {WasmExporter} from '../exporter/WasmExporter';\nimport {makePlugin} from './makePlugin';\n\n/**\n * The default plugin included in every Motion Canvas project.\n *\n * TODO(refactor): I don't think these are plugins anymore.\n *\n * @internal\n */\nexport default makePlugin({\n name: '@twick/core/default',\n exporters() {\n return [WasmExporter, FFmpegExporterClient, ImageExporter];\n },\n});\n","export enum Direction {\n Top = 4,\n Bottom = 8,\n Left = 16,\n Right = 32,\n}\n\nexport enum Center {\n Vertical = 1,\n Horizontal = 2,\n}\n\nexport enum Origin {\n Middle = 3,\n Top = 5,\n Bottom = 9,\n Left = 18,\n Right = 34,\n TopLeft = 20,\n TopRight = 36,\n BottomLeft = 24,\n BottomRight = 40,\n}\n","import {decorate, threadable} from '../decorators';\nimport type {Thread} from '../threading/Thread';\nimport type {ThreadGenerator} from '../threading/ThreadGenerator';\nimport {useThread} from '../utils';\n\ndecorate(join, threadable());\n/**\n * Pause the current generator until all listed tasks are finished.\n *\n * @example\n * ```ts\n * const task = yield generatorFunction();\n *\n * // do something concurrently\n *\n * yield* join(task);\n * ```\n *\n * @param tasks - A list of tasks to join.\n */\nexport function join(...tasks: ThreadGenerator[]): ThreadGenerator;\n/**\n * Pause the current generator until listed tasks are finished.\n *\n * @example\n * ```ts\n * const taskA = yield generatorFunctionA();\n * const taskB = yield generatorFunctionB();\n *\n * // do something concurrently\n *\n * // await any of the tasks\n * yield* join(false, taskA, taskB);\n * ```\n *\n * @param all - Whether we should wait for all tasks or for at least one.\n * @param tasks - A list of tasks to join.\n */\nexport function join(\n all: boolean,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator;\nexport function* join(\n first: ThreadGenerator | boolean,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator {\n let all = true;\n if (typeof first === 'boolean') {\n all = first;\n } else {\n tasks.push(first);\n }\n\n const parent = useThread();\n const threads = <Thread[]>(\n tasks\n .map(task => parent.children.find(thread => thread.runner === task))\n .filter(thread => thread)\n );\n\n const startTime = parent.time();\n let childTime;\n if (all) {\n while (threads.find(thread => !thread.canceled)) {\n yield;\n }\n childTime = Math.max(...threads.map(thread => thread.time()));\n } else {\n while (!threads.find(thread => thread.canceled)) {\n yield;\n }\n const canceled = threads.filter(thread => thread.canceled);\n childTime = Math.min(...canceled.map(thread => thread.time()));\n }\n\n parent.time(Math.max(startTime, childTime));\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {join} from './join';\n\ndecorate(all, threadable());\n/**\n * Run all tasks concurrently and wait for all of them to finish.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* all(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 2s\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* all(...tasks: ThreadGenerator[]): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n }\n yield* join(...tasks);\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {join} from './join';\n\ndecorate(any, threadable());\n/**\n * Run all tasks concurrently and wait for any of them to finish.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* any(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 1s\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* any(...tasks: ThreadGenerator[]): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n }\n yield* join(false, ...tasks);\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\n\ndecorate(chain, threadable());\n/**\n * Run tasks one after another.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield* chain(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * );\n * // current time: 3s\n * ```\n *\n * Note that the same animation can be written as:\n * ```ts\n * yield* rect.fill('#ff0000', 2),\n * yield* rect.opacity(1, 1),\n * ```\n *\n * The reason `chain` exists is to make it easier to pass it to other flow\n * functions. For example:\n * ```ts\n * yield* all(\n * rect.radius(20, 3),\n * chain(\n * rect.fill('#ff0000', 2),\n * rect.opacity(1, 1),\n * ),\n * );\n * ```\n *\n * @param tasks - A list of tasks to run.\n */\nexport function* chain(\n ...tasks: (ThreadGenerator | Callback)[]\n): ThreadGenerator {\n for (const generator of tasks) {\n if ('next' in generator) {\n yield* generator;\n } else {\n generator();\n }\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {usePlayback, useThread} from '../utils';\n\ndecorate(waitFor, threadable());\n/**\n * Wait for the given amount of time.\n *\n * @example\n * ```ts\n * // current time: 0s\n * yield waitFor(2);\n * // current time: 2s\n * yield waitFor(3);\n * // current time: 5s\n * ```\n *\n * @param seconds - The relative time in seconds.\n * @param after - An optional task to be run after the function completes.\n */\nexport function* waitFor(\n seconds = 0,\n after?: ThreadGenerator,\n): ThreadGenerator {\n const thread = useThread();\n const step = usePlayback().framesToSeconds(1);\n\n const targetTime = thread.time() + seconds;\n // subtracting the step is not necessary, but it keeps the thread time ahead\n // of the project time.\n while (targetTime - step > thread.fixed) {\n yield;\n }\n thread.time(targetTime);\n\n if (after) {\n yield* after;\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {waitFor} from './scheduling';\n\ndecorate(delay, threadable());\n/**\n * Run the given generator or callback after a specific amount of time.\n *\n * @example\n * ```ts\n * yield* delay(1, rect.fill('#ff0000', 2));\n * ```\n *\n * Note that the same animation can be written as:\n * ```ts\n * yield* waitFor(1),\n * yield* rect.fill('#ff0000', 2),\n * ```\n *\n * The reason `delay` exists is to make it easier to pass it to other flow\n * functions. For example:\n * ```ts\n * yield* all(\n * rect.opacity(1, 3),\n * delay(1, rect.fill('#ff0000', 2));\n * );\n * ```\n *\n * @param time - The delay in seconds\n * @param task - The task or callback to run after the delay.\n */\nexport function* delay(\n time: number,\n task: ThreadGenerator | Callback,\n): ThreadGenerator {\n yield* waitFor(time);\n if ('next' in task) {\n yield* task;\n } else {\n task();\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {usePlayback} from '../utils';\n\nexport interface EveryCallback {\n /**\n * A callback called by {@link EveryTimer} every N seconds.\n *\n * @param tick - The amount of times the timer has ticked.\n */\n (tick: number): void;\n}\n\nexport interface EveryTimer {\n /**\n * The generator responsible for running this timer.\n */\n runner: ThreadGenerator;\n setInterval(value: number): void;\n setCallback(value: EveryCallback): void;\n\n /**\n * Wait until the timer ticks.\n */\n sync(): ThreadGenerator;\n}\n\n/**\n * Call the given callback every N seconds.\n *\n * @example\n * ```ts\n * const timer = every(2, time => console.log(time));\n * yield timer.runner;\n *\n * // current time: 0s\n * yield* waitFor(5);\n * // current time: 5s\n * yield* timer.sync();\n * // current time: 6s\n * ```\n *\n * @param interval - The interval between subsequent calls.\n * @param callback - The callback to be called.\n */\nexport function every(interval: number, callback: EveryCallback): EveryTimer {\n let changed = false;\n decorate(everyRunner, threadable('every'));\n function* everyRunner(): ThreadGenerator {\n const project = usePlayback();\n let acc = 0;\n let tick = 0;\n callback(tick);\n changed = true;\n\n while (true) {\n if (acc >= project.secondsToFrames(interval)) {\n acc = 0;\n tick++;\n callback(tick);\n changed = true;\n } else {\n changed = false;\n }\n acc++;\n yield;\n }\n }\n\n return {\n runner: everyRunner(),\n setInterval(value) {\n interval = value;\n changed = false;\n },\n setCallback(value) {\n callback = value;\n changed = false;\n },\n *sync() {\n while (!changed) {\n yield;\n }\n },\n };\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {useLogger, useThread} from '../utils';\n\nconst infiniteLoop = `\nMake sure to use \\`yield\\` or \\`spawn()\\` to execute the loop concurrently in a\nseparate thread:\n\n\\`\\`\\`ts wrong\n// prettier-ignore\nyield* loop(() => rect().opacity(0).opacity(1, 1));\n\\`\\`\\`\n\n\\`\\`\\`ts correct\nyield loop(() => rect().opacity(0).opacity(1, 1));\n// or\nspawn(loop(() => rect().opacity(0).opacity(1, 1)));\n\\`\\`\\`\n\nIf you want to execute the loop a finite number of times, specify the iteration\ncount as the first argument:\n\n\\`\\`\\`ts\n// prettier-ignore\nyield* loop(10, () => rect().opacity(0).opacity(1, 1));\n// ^ iteration count\n\\`\\`\\`\n`;\n\nexport interface LoopCallback {\n /**\n * A callback called by {@link loop} during each iteration.\n *\n * @param i - The current iteration index.\n */\n (i: number): ThreadGenerator | void;\n}\n\ndecorate(loop, threadable());\n\n/**\n * Run the given generator in a loop.\n *\n * @remarks\n * Each iteration waits until the previous one is completed.\n * Because this loop never finishes it cannot be used in the main thread.\n * Instead, use `yield` or {@link threading.spawn} to run the loop concurrently.\n *\n * @example\n * Rotate the `rect` indefinitely:\n * ```ts\n * yield loop(\n * () => rect.rotation(0).rotation(360, 2, linear),\n * );\n * ```\n *\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function loop(factory: LoopCallback): ThreadGenerator;\n/**\n * Run the given generator N times.\n *\n * @remarks\n * Each iteration waits until the previous one is completed.\n *\n * @example\n * ```ts\n * const colors = [\n * '#ff6470',\n * '#ffc66d',\n * '#68abdf',\n * '#99c47a',\n * ];\n *\n * yield* loop(\n * colors.length,\n * i => rect.fill(colors[i], 2),\n * );\n * ```\n *\n * @param iterations - The number of iterations.\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function loop(\n iterations: number,\n factory: LoopCallback,\n): ThreadGenerator;\nexport function* loop(\n iterations: LoopCallback | number,\n factory?: LoopCallback,\n): ThreadGenerator {\n if (typeof iterations !== 'number') {\n factory = iterations;\n iterations = Infinity;\n }\n\n if (iterations === Infinity && useThread().parent === null) {\n useLogger().error({\n message: 'Tried to execute an infinite loop in the main thread.',\n remarks: infiniteLoop,\n stack: new Error().stack,\n });\n return;\n }\n\n for (let i = 0; i < iterations; i++) {\n const generator = factory!(i);\n if (generator) {\n yield* generator;\n } else {\n yield;\n }\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {usePlayback, useThread} from '../utils';\nimport type {LoopCallback} from './loop';\n\ndecorate(loopFor, threadable());\n/**\n * Run a generator in a loop for the given amount of time.\n *\n * @remarks\n * Generators are executed completely before the next iteration starts.\n * An iteration is allowed to finish even when the time is up. This means that\n * the actual duration of the loop may be longer than the given duration.\n *\n * @example\n * ```ts\n * yield* loopFor(\n * 3,\n * () => circle().position.x(-10, 0.1).to(10, 0.1)\n * );\n * ```\n *\n * @param seconds - The duration in seconds.\n * @param factory - A function creating the generator to run. Because generators\n * can't be reset, a new generator is created on each\n * iteration.\n */\nexport function* loopFor(\n seconds: number,\n factory: LoopCallback,\n): ThreadGenerator {\n const thread = useThread();\n const step = usePlayback().framesToSeconds(1);\n const targetTime = thread.time() + seconds;\n\n let iteration = 0;\n while (targetTime - step > thread.fixed) {\n const generator = factory(iteration);\n if (generator) {\n yield* generator;\n } else {\n yield;\n }\n iteration += 1;\n }\n thread.time(targetTime);\n}\n","export function setTaskName(task: Generator, source: Generator | string): void {\n const prototype = Object.getPrototypeOf(task);\n if (prototype && !(prototype as any).threadable) {\n (prototype as any).threadable = true;\n\n try {\n const resolvedName =\n typeof source === 'string' ? source : getTaskName(source);\n\n const nameDescriptor = Object.getOwnPropertyDescriptor(\n prototype,\n 'name',\n );\n\n if (!nameDescriptor || nameDescriptor.writable) {\n (prototype as any).name = resolvedName;\n }\n } catch {\n // Same rationale as in the threadable decorator: if the runtime\n // doesn't allow changing prototype.name (or the value is frozen),\n // we don't want to crash user apps – we simply skip renaming.\n }\n }\n}\n\nexport function getTaskName(task: Generator): string {\n return Object.getPrototypeOf(task).name ?? null;\n}\n","import type {ThreadGenerator} from '../threading';\nimport {setTaskName} from './names';\n/**\n * Turn the given generator function into a task.\n *\n * @remarks\n * If you want to immediately run the generator in its own thread, you can use\n * {@link threading.spawn} instead. This function is useful when you want to\n * pass the created task to other flow functions.\n *\n * @example\n * ```ts\n * yield* all(\n * run(function* () {\n * // do things\n * }),\n * rect.opacity(1, 1),\n * );\n * ```\n *\n * @param runner - A generator function or a factory that creates the generator.\n */\n\nexport function run(runner: () => ThreadGenerator): ThreadGenerator;\n/**\n * Turn the given generator function into a task.\n *\n * @remarks\n * If you want to immediately run the generator in its own thread, you can use\n * {@link threading.spawn} instead. This function is useful when you want to\n * pass the created task to other flow functions.\n *\n * @example\n * ```ts\n * yield* all(\n * run(function* () {\n * // do things\n * }),\n * rect.opacity(1, 1),\n * );\n * ```\n *\n * @param runner - A generator function or a factory that creates the generator.\n * @param name - An optional name used when displaying this generator in the UI.\n */\nexport function run(\n name: string,\n runner: () => ThreadGenerator,\n): ThreadGenerator;\nexport function run(\n firstArg: (() => ThreadGenerator) | string,\n runner?: () => ThreadGenerator,\n): ThreadGenerator {\n let task;\n if (typeof firstArg === 'string') {\n task = runner!();\n setTaskName(task, firstArg);\n } else {\n task = firstArg();\n setTaskName(task, task);\n }\n\n return task;\n}\n","import {decorate, threadable} from '../decorators';\nimport type {ThreadGenerator} from '../threading';\nimport {join} from './join';\nimport {waitFor} from './scheduling';\n\ndecorate(sequence, threadable());\n/**\n * Start all tasks one after another with a constant delay between.\n *\n * @remarks\n * The function doesn't wait until the previous task in the sequence has\n * finished. Once the delay has passed, the next task will start even if\n * the previous is still running.\n *\n * @example\n * ```ts\n * yield* sequence(\n * 0.1,\n * ...rects.map(rect => rect.x(100, 1))\n * );\n * ```\n *\n * @param delay - The delay between each of the tasks.\n * @param tasks - A list of tasks to be run in a sequence.\n */\nexport function* sequence(\n delay: number,\n ...tasks: ThreadGenerator[]\n): ThreadGenerator {\n for (const task of tasks) {\n yield task;\n yield* waitFor(delay);\n }\n\n yield* join(...tasks);\n}\n","import type {Subscribable} from '../events';\nimport {FlagDispatcher} from '../events';\nimport type {Promisable} from '../threading';\nimport {DetailedError} from '../utils';\n\nexport interface PromiseHandle<T> {\n promise: Promise<T>;\n value: T;\n stack?: string;\n owner?: any;\n}\n\nexport class DependencyContext<TOwner = void>\n implements Promisable<DependencyContext<TOwner>>\n{\n protected static collectionSet = new Set<DependencyContext<any>>();\n protected static collectionStack: DependencyContext<any>[] = [];\n protected static promises: PromiseHandle<any>[] = [];\n\n public static collectPromise<T>(promise: Promise<T>): PromiseHandle<T | null>;\n public static collectPromise<T>(\n promise: Promise<T>,\n initialValue: T,\n ): PromiseHandle<T>;\n public static collectPromise<T>(\n promise: Promise<T>,\n initialValue: T | null = null,\n ): PromiseHandle<T | null> {\n const handle: PromiseHandle<T | null> = {\n promise,\n value: initialValue,\n stack: new Error().stack,\n };\n\n const context = this.collectionStack.at(-1);\n if (context) {\n handle.owner = context.owner;\n }\n promise.then(value => {\n handle.value = value;\n context?.markDirty();\n });\n\n this.promises.push(handle);\n return handle;\n }\n\n public static hasPromises() {\n return this.promises.length > 0;\n }\n\n public static async consumePromises() {\n const promises = [...this.promises];\n await Promise.all(promises.map(handle => handle.promise));\n this.promises = this.promises.filter(v => !promises.includes(v));\n return promises;\n }\n\n protected readonly invokable: any;\n\n protected dependencies = new Set<Subscribable<void>>();\n protected event = new FlagDispatcher();\n protected markDirty = () => this.event.raise();\n\n public constructor(protected owner: TOwner) {\n this.invokable = this.invoke.bind(this);\n\n Object.defineProperty(this.invokable, 'context', {\n value: this,\n });\n\n Object.defineProperty(this.invokable, 'toPromise', {\n value: this.toPromise.bind(this),\n });\n }\n\n protected invoke() {\n // do nothing\n }\n\n protected startCollecting() {\n if (DependencyContext.collectionSet.has(this)) {\n throw new DetailedError(\n 'A circular dependency occurred between signals.',\n `This can happen when signals reference each other in a loop.\n Try using the attached stack trace to locate said loop.`,\n );\n }\n\n DependencyContext.collectionSet.add(this);\n DependencyContext.collectionStack.push(this);\n }\n\n protected finishCollecting() {\n DependencyContext.collectionSet.delete(this);\n if (DependencyContext.collectionStack.pop() !== this) {\n throw new Error('collectStart/collectEnd was called out of order.');\n }\n }\n\n protected clearDependencies() {\n this.dependencies.forEach(dep => dep.unsubscribe(this.markDirty));\n this.dependencies.clear();\n }\n\n protected collect() {\n const signal = DependencyContext.collectionStack.at(-1);\n if (signal) {\n signal.dependencies.add(this.event.subscribable);\n this.event.subscribe(signal.markDirty);\n }\n }\n\n public dispose() {\n this.clearDependencies();\n this.event.clear();\n this.owner = null as TOwner;\n }\n\n public async toPromise(): Promise<this> {\n do {\n await DependencyContext.consumePromises();\n this.invokable();\n } while (DependencyContext.hasPromises());\n return this.invokable;\n }\n}\n","export const DEFAULT = Symbol.for('@twick/core/signals/default');\n","import type {SignalValue} from './types';\n\nexport function isReactive<T>(value: SignalValue<T>): value is () => T {\n return typeof value === 'function';\n}\n\nexport function modify<TFrom, TTo>(\n value: SignalValue<TFrom>,\n modification: (value: TFrom) => TTo,\n): SignalValue<TTo> {\n return isReactive(value) ? () => modification(value()) : modification(value);\n}\n\nexport function unwrap<T>(value: SignalValue<T>): T {\n return isReactive(value) ? value() : value;\n}\n","import {run, waitFor} from '../flow';\nimport type {ThreadGenerator} from '../threading';\nimport type {InterpolationFunction, TimingFunction} from '../tweening';\nimport {easeInOutCubic, tween} from '../tweening';\nimport {errorToLog, useLogger} from '../utils';\nimport {DependencyContext} from './DependencyContext';\nimport {DEFAULT} from './symbols';\nimport type {\n SignalExtensions,\n SignalGenerator,\n SignalGetter,\n SignalSetter,\n SignalTween,\n SignalValue,\n} from './types';\nimport {isReactive, unwrap} from './utils';\n\nexport type SimpleSignal<TValue, TReturn = void> = Signal<\n TValue,\n TValue,\n TReturn\n>;\n\nexport interface Signal<\n TSetterValue,\n TValue extends TSetterValue,\n TOwner = void,\n TContext = SignalContext<TSetterValue, TValue, TOwner>,\n> extends SignalSetter<TSetterValue, TOwner>,\n SignalGetter<TValue>,\n SignalTween<TSetterValue, TValue> {\n /**\n * {@inheritDoc SignalContext.reset}\n */\n reset(): TOwner;\n\n /**\n * {@inheritDoc SignalContext.save}\n */\n save(): TOwner;\n\n /**\n * {@inheritDoc SignalContext.isInitial}\n */\n isInitial(): boolean;\n\n context: TContext;\n}\n\nexport class SignalContext<\n TSetterValue,\n TValue extends TSetterValue = TSetterValue,\n TOwner = void,\n> extends DependencyContext<TOwner> {\n protected extensions: SignalExtensions<TSetterValue, TValue>;\n protected current: SignalValue<TSetterValue> | undefined;\n protected last: TValue | undefined;\n protected tweening = false;\n\n public constructor(\n private initial: SignalValue<TSetterValue> | undefined,\n private readonly interpolation: InterpolationFunction<TValue>,\n owner: TOwner = <TOwner>(<unknown>undefined),\n protected parser: (value: TSetterValue) => TValue = value => <TValue>value,\n extensions: Partial<SignalExtensions<TSetterValue, TValue>> = {},\n ) {\n super(owner);\n\n Object.defineProperty(this.invokable, 'reset', {\n value: this.reset.bind(this),\n });\n Object.defineProperty(this.invokable, 'save', {\n value: this.save.bind(this),\n });\n Object.defineProperty(this.invokable, 'isInitial', {\n value: this.isInitial.bind(this),\n });\n\n if (this.initial !== undefined) {\n this.current = this.initial;\n this.markDirty();\n\n if (!isReactive(this.initial)) {\n this.last = this.parse(this.initial);\n }\n }\n\n this.extensions = {\n getter: this.getter.bind(this),\n setter: this.setter.bind(this),\n tweener: this.tweener.bind(this),\n ...extensions,\n };\n }\n\n public toSignal(): Signal<TSetterValue, TValue, TOwner> {\n return this.invokable;\n }\n\n public parse(value: TSetterValue): TValue {\n return this.parser(value);\n }\n\n public set(value: SignalValue<TSetterValue> | typeof DEFAULT): TOwner {\n this.extensions.setter(value);\n return this.owner;\n }\n\n public setter(value: SignalValue<TSetterValue> | typeof DEFAULT): TOwner {\n if (value === DEFAULT) {\n value = this.initial!;\n }\n\n if (this.current === value) {\n return this.owner;\n }\n\n this.current = value;\n this.markDirty();\n this.clearDependencies();\n\n if (!isReactive(value)) {\n this.last = this.parse(value);\n }\n\n return this.owner;\n }\n\n public get(): TValue {\n return this.extensions.getter();\n }\n\n public getter(): TValue {\n if (this.event.isRaised() && isReactive(this.current)) {\n this.clearDependencies();\n this.startCollecting();\n try {\n this.last = this.parse(this.current());\n } catch (e: any) {\n useLogger().error({\n ...errorToLog(e),\n inspect: (<any>this.owner)?.key,\n });\n }\n this.finishCollecting();\n }\n this.event.reset();\n this.collect();\n\n return this.last!;\n }\n\n protected override invoke(\n value?: SignalValue<TSetterValue> | typeof DEFAULT,\n duration?: number,\n timingFunction: TimingFunction = easeInOutCubic,\n interpolationFunction: InterpolationFunction<TValue> = this.interpolation,\n ) {\n if (value === undefined) {\n return this.get();\n }\n\n if (duration === undefined) {\n return this.set(value);\n }\n\n const queue = this.createQueue(timingFunction, interpolationFunction);\n return queue.to(value, duration);\n }\n\n protected createQueue(\n defaultTimingFunction: TimingFunction,\n defaultInterpolationFunction: InterpolationFunction<TValue>,\n ) {\n const initial = this.get();\n const queue: ThreadGenerator[] = [];\n\n const task = run('animation chain', function* animate() {\n while (queue.length > 0) {\n yield* queue.shift()!;\n }\n }) as SignalGenerator<TSetterValue, TValue>;\n\n task.to = (\n value: SignalValue<TSetterValue> | typeof DEFAULT,\n duration: number,\n timingFunction = defaultTimingFunction,\n interpolationFunction = defaultInterpolationFunction,\n ) => {\n defaultTimingFunction = timingFunction;\n defaultInterpolationFunction = interpolationFunction;\n queue.push(\n this.tween(value, duration, timingFunction, interpolationFunction),\n );\n return task;\n };\n\n task.back = (\n time: number,\n timingFunction = defaultTimingFunction,\n interpolationFunction = defaultInterpolationFunction,\n ) => {\n defaultTimingFunction = timingFunction;\n defaultInterpolationFunction = interpolationFunction;\n queue.push(\n this.tween(\n initial,\n time,\n defaultTimingFunction,\n defaultInterpolationFunction,\n ),\n );\n return task;\n };\n\n task.wait = (duration: number) => {\n queue.push(waitFor(duration));\n return task;\n };\n\n task.run = (generator: ThreadGenerator) => {\n queue.push(generator);\n return task;\n };\n\n task.do = (callback: () => void) => {\n queue.push(\n run(function* () {\n callback();\n }),\n );\n return task;\n };\n\n return task;\n }\n\n protected *tween(\n value: SignalValue<TSetterValue> | typeof DEFAULT,\n duration: number,\n timingFunction: TimingFunction,\n interpolationFunction: InterpolationFunction<TValue>,\n ): ThreadGenerator {\n if (value === DEFAULT) {\n value = this.initial!;\n }\n\n this.tweening = true;\n yield* this.extensions.tweener(\n value,\n duration,\n timingFunction,\n interpolationFunction,\n );\n this.set(value);\n this.tweening = false;\n }\n\n public *tweener(\n value: SignalValue<TSetterValue>,\n duration: number,\n timingFunction: TimingFunction,\n interpolationFunction: InterpolationFunction<TValue>,\n ): ThreadGenerator {\n const from = this.get();\n yield* tween(duration, v => {\n this.set(\n interpolationFunction(\n from,\n this.parse(unwrap(value)),\n timingFunction(v),\n ),\n );\n });\n }\n\n public override dispose() {\n super.dispose();\n this.initial = undefined;\n this.current = undefined;\n this.last = undefined;\n }\n\n /**\n * Reset the signal to its initial value (if one has been set).\n *\n * @example\n * ```ts\n * const signal = createSignal(7);\n *\n * signal.reset();\n * // same as:\n * signal(7);\n * ```\n */\n public reset() {\n if (this.initial !== undefined) {\n this.set(this.initial);\n }\n return this.owner;\n }\n\n /**\n * Compute the current value of the signal and immediately set it.\n *\n * @remarks\n * This method can be used to stop the signal from updating while keeping its\n * current value.\n *\n * @example\n * ```ts\n * signal.save();\n * // same as:\n * signal(signal());\n * ```\n */\n public save() {\n return this.set(this.get());\n }\n\n /**\n * Check if the signal is currently using its initial value.\n *\n * @example\n * ```ts\n *\n * const signal = createSignal(0);\n * signal.isInitial(); // true\n *\n * signal(5);\n * signal.isInitial(); // false\n *\n * signal(DEFAULT);\n * signal.isInitial(); // true\n * ```\n */\n public isInitial() {\n this.collect();\n return this.current === this.initial;\n }\n\n /**\n * Get the initial value of this signal.\n */\n public getInitial() {\n return this.initial;\n }\n\n /**\n * Get the raw value of this signal.\n *\n * @remarks\n * If the signal was provided with a factory function, the function itself\n * will be returned, without invoking it.\n *\n * This method can be used to create copies of signals.\n *\n * @example\n * ```ts\n * const a = createSignal(2);\n * const b = createSignal(() => a);\n * // b() == 2\n *\n * const bClone = createSignal(b.raw());\n * // bClone() == 2\n *\n * a(4);\n * // b() == 4\n * // bClone() == 4\n * ```\n */\n public raw() {\n return this.current;\n }\n\n /**\n * Is the signal undergoing a tween?\n */\n public isTweening() {\n return this.tweening;\n }\n}\n","import type {InterpolationFunction} from '../tweening';\nimport {map} from '../tweening/helpers';\nimport type {Signal} from './SignalContext';\nimport {SignalContext} from './SignalContext';\nimport type {SignalExtensions, SignalValue} from './types';\nimport {isReactive, modify} from './utils';\n\nexport type CompoundSignal<\n TSetterValue,\n TValue extends TSetterValue,\n TKeys extends keyof TValue = keyof TValue,\n TOwner = void,\n TContext = CompoundSignalContext<TSetterValue, TValue, TKeys, TOwner>,\n> = Signal<TSetterValue, TValue, TOwner, TContext> & {\n [K in TKeys]: Signal<\n TValue[K],\n TValue[K],\n TOwner extends void\n ? CompoundSignal<TSetterValue, TValue, TKeys, TOwner, TContext>\n : TOwner\n >;\n};\n\nexport class CompoundSignalContext<\n TSetterValue,\n TValue extends TSetterValue,\n TKeys extends keyof TValue = keyof TValue,\n TOwner = void,\n> extends SignalContext<TSetterValue, TValue, TOwner> {\n public readonly signals: [keyof TValue, Signal<any, any, TOwner>][] = [];\n\n public constructor(\n private readonly entries: (\n | TKeys\n | [keyof TValue, Signal<any, any, TOwner>]\n )[],\n parser: (value: TSetterValue) => TValue,\n initial: SignalValue<TSetterValue>,\n interpolation: InterpolationFunction<TValue>,\n owner: TOwner = <TOwner>(<unknown>undefined),\n extensions: Partial<SignalExtensions<TSetterValue, TValue>> = {},\n ) {\n super(undefined, interpolation, owner, parser, extensions);\n this.parser = parser;\n\n for (const entry of entries) {\n let key: keyof TValue;\n let signal: Signal<any, any, TOwner>;\n if (Array.isArray(entry)) {\n [key, signal] = entry;\n (signal.context as any).owner ??= this;\n } else {\n key = entry;\n signal = new SignalContext(\n modify(initial, value => parser(value)[entry]),\n <any>map,\n owner ?? this.invokable,\n ).toSignal();\n }\n this.signals.push([key, signal]);\n Object.defineProperty(this.invokable, key, {value: signal});\n }\n }\n\n public override toSignal(): CompoundSignal<\n TSetterValue,\n TValue,\n TKeys,\n TOwner\n > {\n return this.invokable;\n }\n\n public override parse(value: TSetterValue): TValue {\n return this.parser(value);\n }\n\n public override getter(): TValue {\n return this.parse(\n <TSetterValue>(\n Object.fromEntries(\n this.signals.map(([key, property]) => [key, property()]),\n )\n ),\n );\n }\n\n public override setter(value: SignalValue<TValue>): TOwner {\n if (isReactive(value)) {\n for (const [key, property] of this.signals) {\n property(() => this.parser(value())[key]);\n }\n } else {\n const parsed = this.parse(value);\n for (const [key, property] of this.signals) {\n property(parsed[key]);\n }\n }\n\n return this.owner;\n }\n\n public override reset(): TOwner {\n for (const [, signal] of this.signals) {\n signal.reset();\n }\n return this.owner;\n }\n\n public override save(): TOwner {\n for (const [, signal] of this.signals) {\n signal.save();\n }\n return this.owner;\n }\n\n public override isInitial(): boolean {\n for (const [, signal] of this.signals) {\n if (!signal.isInitial()) {\n return false;\n }\n }\n return true;\n }\n\n public override raw() {\n return Object.fromEntries(\n this.signals.map(([key, property]) => [key, property.context.raw()]),\n ) as TSetterValue;\n }\n}\n","import {errorToLog, useLogger} from '../utils';\nimport {DependencyContext} from './DependencyContext';\n\nexport interface Computed<TValue> {\n (...args: any[]): TValue;\n context: ComputedContext<TValue>;\n}\n\nexport class ComputedContext<TValue> extends DependencyContext<any> {\n private last: TValue | undefined;\n\n public constructor(\n private readonly factory: (...args: any[]) => TValue,\n owner?: any,\n ) {\n super(owner);\n this.markDirty();\n }\n\n public toSignal(): Computed<TValue> {\n return this.invokable;\n }\n\n public override dispose() {\n super.dispose();\n this.last = undefined;\n }\n\n protected override invoke(...args: any[]): TValue {\n if (this.event.isRaised()) {\n this.clearDependencies();\n this.startCollecting();\n try {\n this.last = this.factory(...args);\n } catch (e: any) {\n useLogger().error({\n ...errorToLog(e),\n inspect: this.owner?.key,\n });\n }\n this.finishCollecting();\n }\n this.event.reset();\n this.collect();\n\n return this.last!;\n }\n}\n","import type {Computed} from './ComputedContext';\nimport {ComputedContext} from './ComputedContext';\n\nexport function createComputed<TValue>(\n factory: (...args: any[]) => TValue,\n owner?: any,\n): Computed<TValue> {\n return new ComputedContext<TValue>(factory, owner).toSignal();\n}\n","import type {InterpolationFunction} from '../tweening';\nimport {deepLerp} from '../tweening';\nimport type {SimpleSignal} from './SignalContext';\nimport {SignalContext} from './SignalContext';\nimport type {SignalValue} from './types';\n\nexport function createSignal<TValue, TOwner = void>(\n initial?: SignalValue<TValue>,\n interpolation: InterpolationFunction<TValue> = deepLerp,\n owner?: TOwner,\n): SimpleSignal<TValue, TOwner> {\n return new SignalContext<TValue, TValue, TOwner>(\n initial,\n interpolation,\n owner,\n ).toSignal();\n}\n","import type {Computed, PromiseHandle} from '../signals';\nimport {ComputedContext} from './ComputedContext';\nimport {createComputed} from './createComputed';\nimport {createSignal} from './createSignal';\n\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n): Computed<T | null>;\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n initial: T,\n): Computed<T>;\nexport function createComputedAsync<T>(\n factory: () => Promise<T>,\n initial: T | null = null,\n): Computed<T | null> {\n let handle: PromiseHandle<T | null>;\n const signal = createSignal(factory);\n return createComputed(() => {\n const promise = signal();\n if (!handle || handle.promise !== promise) {\n handle = ComputedContext.collectPromise(\n promise,\n handle?.value ?? initial,\n );\n }\n\n return handle.value;\n });\n}\n","import type {CompoundSignal, SignalValue} from '../signals';\nimport {CompoundSignalContext} from '../signals';\nimport type {InterpolationFunction} from '../tweening';\nimport {map} from '../tweening';\nimport type {Type, WebGLConvertible} from './Type';\n\nexport type SerializedSpacing = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nexport type PossibleSpacing =\n | SerializedSpacing\n | number\n | [number, number]\n | [number, number, number]\n | [number, number, number, number]\n | undefined;\n\nexport type SpacingSignal<T> = CompoundSignal<\n PossibleSpacing,\n Spacing,\n 'top' | 'right' | 'bottom' | 'left',\n T\n>;\n\nexport class Spacing implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for('@twick/core/types/Spacing');\n\n public top = 0;\n public right = 0;\n public bottom = 0;\n public left = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleSpacing>,\n interpolation: InterpolationFunction<Spacing> = Spacing.lerp,\n ): SpacingSignal<void> {\n return new CompoundSignalContext(\n ['top', 'right', 'bottom', 'left'],\n (value: PossibleSpacing) => new Spacing(value),\n initial,\n interpolation,\n ).toSignal();\n }\n\n public static lerp(from: Spacing, to: Spacing, value: number): Spacing {\n return new Spacing(\n map(from.top, to.top, value),\n map(from.right, to.right, value),\n map(from.bottom, to.bottom, value),\n map(from.left, to.left, value),\n );\n }\n\n public get x(): number {\n return this.left + this.right;\n }\n\n public get y(): number {\n return this.top + this.bottom;\n }\n\n public constructor();\n public constructor(from: PossibleSpacing);\n public constructor(all: number);\n public constructor(vertical: number, horizontal: number);\n public constructor(top: number, horizontal: number, bottom: number);\n public constructor(top: number, right: number, bottom: number, left: number);\n public constructor(\n one: PossibleSpacing = 0,\n two?: number,\n three?: number,\n four?: number,\n ) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (Array.isArray(one)) {\n four = one[3];\n three = one[2];\n two = one[1];\n one = one[0];\n }\n\n if (typeof one === 'number') {\n this.top = one;\n this.right = two !== undefined ? two : one;\n this.bottom = three !== undefined ? three : one;\n this.left = four !== undefined ? four : two !== undefined ? two : one;\n return;\n }\n\n this.top = one.top;\n this.right = one.right;\n this.bottom = one.bottom;\n this.left = one.left;\n }\n\n public lerp(to: Spacing, value: number) {\n return Spacing.lerp(this, to, value);\n }\n\n public scale(value: number): Spacing {\n return new Spacing(\n this.top * value,\n this.right * value,\n this.bottom * value,\n this.left * value,\n );\n }\n\n public addScalar(value: number): Spacing {\n return new Spacing(\n this.top + value,\n this.right + value,\n this.bottom + value,\n this.left + value,\n );\n }\n\n public toSymbol(): symbol {\n return Spacing.symbol;\n }\n\n public toString() {\n return `Spacing(${this.top}, ${this.right}, ${this.bottom}, ${this.left})`;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4f(location, this.top, this.right, this.bottom, this.left);\n }\n\n public serialize(): SerializedSpacing {\n return {\n top: this.top,\n right: this.right,\n bottom: this.bottom,\n left: this.left,\n };\n }\n}\n","export const EPSILON = 0.000001;\n\nexport interface Type {\n toSymbol(): symbol;\n}\n\nexport interface WebGLConvertible {\n toUniform(gl: WebGL2RenderingContext, location: WebGLUniformLocation): void;\n}\n\nexport function isType(value: any): value is Type {\n return value && typeof value === 'object' && 'toSymbol' in value;\n}\n","import type {CompoundSignal, Signal, SignalValue} from '../signals';\nimport {CompoundSignalContext} from '../signals';\nimport type {InterpolationFunction} from '../tweening';\nimport {arcLerp, clamp, map} from '../tweening';\nimport {DEG2RAD, RAD2DEG} from '../utils';\nimport {Direction, Origin} from './alignment-enums';\nimport type {Type, WebGLConvertible} from './Type';\nimport {EPSILON} from './Type';\n\nexport type SerializedVector2<T = number> = {\n x: T;\n y: T;\n};\n\nexport type PossibleVector2<T = number> =\n | SerializedVector2<T>\n | {width: T; height: T}\n | T\n | [T, T]\n | undefined;\n\nexport type Vector2Signal<T> = CompoundSignal<\n PossibleVector2,\n Vector2,\n 'x' | 'y',\n T\n>;\n\nexport type SimpleVector2Signal<T> = Signal<PossibleVector2, Vector2, T>;\n\n/**\n * Represents a two-dimensional vector.\n */\nexport class Vector2 implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for('@twick/core/types/Vector2');\n\n public static readonly zero = new Vector2();\n public static readonly one = new Vector2(1, 1);\n public static readonly right = new Vector2(1, 0);\n public static readonly left = new Vector2(-1, 0);\n public static readonly up = new Vector2(0, 1);\n public static readonly down = new Vector2(0, -1);\n\n /**\n * A constant equal to `Vector2(0, -1)`\n */\n public static readonly top = new Vector2(0, -1);\n /**\n * A constant equal to `Vector2(0, 1)`\n */\n public static readonly bottom = new Vector2(0, 1);\n /**\n * A constant equal to `Vector2(-1, -1)`\n */\n public static readonly topLeft = new Vector2(-1, -1);\n /**\n * A constant equal to `Vector2(1, -1)`\n */\n public static readonly topRight = new Vector2(1, -1);\n /**\n * A constant equal to `Vector2(-1, 1)`\n */\n public static readonly bottomLeft = new Vector2(-1, 1);\n /**\n * A constant equal to `Vector2(1, 1)`\n */\n public static readonly bottomRight = new Vector2(1, 1);\n\n public x = 0;\n public y = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleVector2>,\n interpolation: InterpolationFunction<Vector2> = Vector2.lerp,\n owner?: any,\n ): Vector2Signal<void> {\n return new CompoundSignalContext(\n ['x', 'y'],\n (value: PossibleVector2) => new Vector2(value),\n initial,\n interpolation,\n owner,\n ).toSignal();\n }\n\n public static lerp(from: Vector2, to: Vector2, value: number | Vector2) {\n let valueX;\n let valueY;\n\n if (typeof value === 'number') {\n valueX = valueY = value;\n } else {\n valueX = value.x;\n valueY = value.y;\n }\n\n return new Vector2(map(from.x, to.x, valueX), map(from.y, to.y, valueY));\n }\n\n public static arcLerp(\n from: Vector2,\n to: Vector2,\n value: number,\n reverse = false,\n ratio?: number,\n ) {\n ratio ??= from.sub(to).ctg;\n return Vector2.lerp(from, to, new Vector2(arcLerp(value, reverse, ratio)));\n }\n\n public static createArcLerp(reverse?: boolean, ratio?: number) {\n return (from: Vector2, to: Vector2, value: number) =>\n Vector2.arcLerp(from, to, value, reverse, ratio);\n }\n\n /**\n * Interpolates between two vectors on the polar plane by interpolating\n * the angles and magnitudes of the vectors individually.\n *\n * @param from - The starting vector.\n * @param to - The target vector.\n * @param value - The t-value of the interpolation.\n * @param counterclockwise - Whether the vector should get rotated\n * counterclockwise. Defaults to `false`.\n * @param origin - The center of rotation. Defaults to the origin.\n *\n * @remarks\n * This function is useful when used in conjunction with {@link rotate} to\n * animate an object's position on a circular arc (see examples).\n *\n * @example\n * Animating an object in a circle around the origin\n * ```tsx\n * circle().position(\n * circle().position().rotate(180),\n * 1,\n * easeInOutCubic,\n * Vector2.polarLerp\n * );\n * ```\n * @example\n * Rotating an object around the point `[-200, 100]`\n * ```ts\n * circle().position(\n * circle().position().rotate(180, [-200, 100]),\n * 1,\n * easeInOutCubic,\n * Vector2.createPolarLerp(false, [-200, 100]),\n * );\n * ```\n * @example\n * Rotating an object counterclockwise around the origin\n * ```ts\n * circle().position(\n * circle().position().rotate(180),\n * 1,\n * easeInOutCubic,\n * Vector2.createPolarLerp(true),\n * );\n * ```\n */\n public static polarLerp(\n from: Vector2,\n to: Vector2,\n value: number,\n counterclockwise = false,\n origin = Vector2.zero,\n ) {\n from = from.sub(origin);\n to = to.sub(origin);\n\n const fromAngle = from.degrees;\n let toAngle = to.degrees;\n const isCounterclockwise = fromAngle > toAngle;\n\n if (isCounterclockwise !== counterclockwise) {\n toAngle = toAngle + (counterclockwise ? -360 : 360);\n }\n\n const angle = map(fromAngle, toAngle, value) * DEG2RAD;\n const magnitude = map(from.magnitude, to.magnitude, value);\n\n return new Vector2(\n magnitude * Math.cos(angle) + origin.x,\n magnitude * Math.sin(angle) + origin.y,\n );\n }\n\n /**\n * Helper function to create a {@link Vector2.polarLerp} interpolation\n * function with additional parameters.\n *\n * @param counterclockwise - Whether the point should get rotated\n * counterclockwise.\n * @param center - The center of rotation. Defaults to the origin.\n */\n public static createPolarLerp(\n counterclockwise = false,\n center: PossibleVector2 = Vector2.zero,\n ) {\n return (from: Vector2, to: Vector2, value: number) =>\n Vector2.polarLerp(from, to, value, counterclockwise, new Vector2(center));\n }\n\n public static fromOrigin(origin: Origin | Direction) {\n const position = new Vector2();\n\n if (origin === Origin.Middle) {\n return position;\n }\n\n if (origin & Direction.Left) {\n position.x = -1;\n } else if (origin & Direction.Right) {\n position.x = 1;\n }\n\n if (origin & Direction.Top) {\n position.y = -1;\n } else if (origin & Direction.Bottom) {\n position.y = 1;\n }\n\n return position;\n }\n\n public static fromScalar(value: number): Vector2 {\n return new Vector2(value, value);\n }\n\n public static fromRadians(radians: number) {\n return new Vector2(Math.cos(radians), Math.sin(radians));\n }\n\n public static fromDegrees(degrees: number) {\n return Vector2.fromRadians(degrees * DEG2RAD);\n }\n\n /**\n * Return the angle in radians between the vector described by x and y and the\n * positive x-axis.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n */\n public static radians(x: number, y: number) {\n return Math.atan2(y, x);\n }\n\n /**\n * Return the angle in degrees between the vector described by x and y and the\n * positive x-axis.\n *\n * @param x - The x component of the vector.\n * @param y - The y component of the vector.\n *\n * @remarks\n * The returned angle will be between -180 and 180 degrees.\n */\n public static degrees(x: number, y: number) {\n return Vector2.radians(x, y) * RAD2DEG;\n }\n\n public static magnitude(x: number, y: number) {\n return Math.sqrt(x * x + y * y);\n }\n\n public static squaredMagnitude(x: number, y: number) {\n return x * x + y * y;\n }\n\n public static angleBetween(u: Vector2, v: Vector2) {\n return (\n Math.acos(clamp(-1, 1, u.dot(v) / (u.magnitude * v.magnitude))) *\n (u.cross(v) >= 0 ? 1 : -1)\n );\n }\n\n public get width(): number {\n return this.x;\n }\n\n public set width(value: number) {\n this.x = value;\n }\n\n public get height(): number {\n return this.y;\n }\n\n public set height(value: number) {\n this.y = value;\n }\n\n public get magnitude(): number {\n return Vector2.magnitude(this.x, this.y);\n }\n\n public get squaredMagnitude(): number {\n return Vector2.squaredMagnitude(this.x, this.y);\n }\n\n public get normalized(): Vector2 {\n return this.scale(1 / Vector2.magnitude(this.x, this.y));\n }\n\n public get safe(): Vector2 {\n return new Vector2(isNaN(this.x) ? 0 : this.x, isNaN(this.y) ? 0 : this.y);\n }\n\n public get flipped(): Vector2 {\n return new Vector2(-this.x, -this.y);\n }\n\n public get floored(): Vector2 {\n return new Vector2(Math.floor(this.x), Math.floor(this.y));\n }\n\n public get perpendicular(): Vector2 {\n return new Vector2(this.y, -this.x);\n }\n\n /**\n * Return the angle in radians between the vector and the positive x-axis.\n */\n public get radians() {\n return Vector2.radians(this.x, this.y);\n }\n\n /**\n * Return the angle in degrees between the vector and the positive x-axis.\n *\n * @remarks\n * The returned angle will be between -180 and 180 degrees.\n */\n public get degrees() {\n return Vector2.degrees(this.x, this.y);\n }\n\n public get ctg(): number {\n return this.x / this.y;\n }\n public constructor();\n public constructor(from: PossibleVector2);\n public constructor(x: number, y: number);\n\n public constructor(one?: PossibleVector2 | number, two?: number) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (typeof one !== 'object') {\n this.x = one;\n this.y = two ?? one;\n return;\n }\n\n if (Array.isArray(one)) {\n this.x = one[0];\n this.y = one[1];\n return;\n }\n\n if ('width' in one) {\n this.x = one.width;\n this.y = one.height;\n return;\n }\n\n this.x = one.x;\n this.y = one.y;\n }\n\n public lerp(to: Vector2, value: Vector2 | number) {\n return Vector2.lerp(this, to, value);\n }\n\n public getOriginOffset(origin: Origin | Direction) {\n const offset = Vector2.fromOrigin(origin);\n offset.x *= this.x / 2;\n offset.y *= this.y / 2;\n\n return offset;\n }\n\n public scale(value: number) {\n return new Vector2(this.x * value, this.y * value);\n }\n\n public mul(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x * vector.x, this.y * vector.y);\n }\n\n public div(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x / vector.x, this.y / vector.y);\n }\n\n public add(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x + vector.x, this.y + vector.y);\n }\n\n public sub(possibleVector: PossibleVector2) {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x - vector.x, this.y - vector.y);\n }\n\n public dot(possibleVector: PossibleVector2): number {\n const vector = new Vector2(possibleVector);\n return this.x * vector.x + this.y * vector.y;\n }\n\n public cross(possibleVector: PossibleVector2): number {\n const vector = new Vector2(possibleVector);\n return this.x * vector.y - this.y * vector.x;\n }\n\n public mod(possibleVector: PossibleVector2): Vector2 {\n const vector = new Vector2(possibleVector);\n return new Vector2(this.x % vector.x, this.y % vector.y);\n }\n\n public addX(value: number) {\n return new Vector2(this.x + value, this.y);\n }\n\n public addY(value: number) {\n return new Vector2(this.x, this.y + value);\n }\n\n public toSymbol(): symbol {\n return Vector2.symbol;\n }\n\n public toString() {\n return `Vector2(${this.x}, ${this.y})`;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform2f(location, this.x, this.y);\n }\n\n public serialize(): SerializedVector2 {\n return {x: this.x, y: this.y};\n }\n\n /**\n * Check if two vectors are exactly equal to each other.\n *\n * @remarks\n * If you need to compensate for floating point inaccuracies, use the\n * {@link equals} method, instead.\n *\n * @param other - The vector to compare.\n */\n public exactlyEquals(other: Vector2): boolean {\n return this.x === other.x && this.y === other.y;\n }\n\n /**\n * Check if two vectors are equal to each other.\n *\n * @remarks\n * This method allows passing an allowed error margin when comparing vectors\n * to compensate for floating point inaccuracies. To check if two vectors are\n * exactly equal, use the {@link exactlyEquals} method, instead.\n *\n * @param other - The vector to compare.\n * @param threshold - The allowed error threshold when comparing the vectors.\n */\n public equals(other: Vector2, threshold = EPSILON): boolean {\n return (\n Math.abs(this.x - other.x) <= threshold + Number.EPSILON &&\n Math.abs(this.y - other.y) <= threshold + Number.EPSILON\n );\n }\n}\n","import {DEG2RAD} from '../utils';\nimport type {Type, WebGLConvertible} from './Type';\nimport {EPSILON} from './Type';\nimport type {PossibleVector2} from './Vector';\nimport {Vector2} from './Vector';\n\nexport type PossibleMatrix2D =\n | Matrix2D\n | DOMMatrix\n | [number, number, number, number, number, number]\n | [PossibleVector2, PossibleVector2, PossibleVector2]\n | undefined;\n\n/**\n * A specialized 2x3 Matrix representing a 2D transformation.\n *\n * A Matrix2D contains six elements defined as\n * [a, b,\n * c, d,\n * tx, ty]\n *\n * This is a shortcut for a 3x3 matrix of the form\n * [a, b, 0,\n * c, d, 0\n * tx, ty, 1]\n *\n * Note that because a Matrix2D ignores the z-values of each component vectors,\n * it does not satisfy all properties of a \"real\" 3x3 matrix.\n *\n * - A Matrix2D has no transpose\n * - A(B + C) = AB + AC does not hold for a Matrix2D\n * - (rA)^-1 = r^-1 A^-1, r != 0 does not hold for a Matrix2D\n * - r(AB) = (rA)B = A(rB) does not hold for a Matrix2D\n */\nexport class Matrix2D implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for('@twick/core/types/Matrix2D');\n\n public readonly values: Float32Array = new Float32Array(6);\n public static readonly identity: Matrix2D = new Matrix2D(1, 0, 0, 1, 0, 0);\n public static readonly zero: Matrix2D = new Matrix2D(0, 0, 0, 0, 0, 0);\n\n public static fromRotation(angle: number): Matrix2D {\n return Matrix2D.identity.rotate(angle);\n }\n\n public static fromTranslation(translation: PossibleVector2): Matrix2D {\n return Matrix2D.identity.translate(new Vector2(translation));\n }\n\n public static fromScaling(scale: PossibleVector2): Matrix2D {\n return Matrix2D.identity.scale(new Vector2(scale));\n }\n\n public get x(): Vector2 {\n return new Vector2(this.values[0], this.values[1]);\n }\n\n public get y(): Vector2 {\n return new Vector2(this.values[2], this.values[3]);\n }\n\n public get scaleX(): number {\n return this.values[0];\n }\n\n public set scaleX(value: number) {\n this.values[0] = this.x.normalized.scale(value).x;\n }\n\n public get skewX(): number {\n return this.values[1];\n }\n\n public set skewX(value: number) {\n this.values[1] = value;\n }\n\n public get scaleY(): number {\n return this.values[3];\n }\n\n public set scaleY(value: number) {\n this.values[3] = this.y.normalized.scale(value).y;\n }\n\n public get skewY(): number {\n return this.values[2];\n }\n\n public set skewY(value: number) {\n this.values[2] = value;\n }\n\n public get translateX(): number {\n return this.values[4];\n }\n\n public set translateX(value: number) {\n this.values[4] = value;\n }\n\n public get translateY(): number {\n return this.values[5];\n }\n\n public set translateY(value: number) {\n this.values[5] = value;\n }\n\n public get rotation(): number {\n return Vector2.degrees(this.values[0], this.values[1]);\n }\n\n public set rotation(angle: number) {\n const result = this.rotate(angle - this.rotation);\n\n this.values[0] = result.values[0];\n this.values[1] = result.values[1];\n this.values[2] = result.values[2];\n this.values[3] = result.values[3];\n }\n\n public get translation(): Vector2 {\n return new Vector2(this.values[4], this.values[5]);\n }\n\n public set translation(translation: PossibleVector2) {\n const vec = new Vector2(translation);\n this.values[4] = vec.x;\n this.values[5] = vec.y;\n }\n\n public get scaling(): Vector2 {\n return new Vector2(this.values[0], this.values[3]);\n }\n\n public set scaling(value: PossibleVector2) {\n const scale = new Vector2(value);\n\n const x = new Vector2(this.values[0], this.values[1]).normalized;\n const y = new Vector2(this.values[2], this.values[3]).normalized;\n\n this.values[0] = x.x * scale.x;\n this.values[1] = x.y * scale.y;\n this.values[2] = y.x * scale.x;\n this.values[3] = y.y * scale.y;\n }\n\n /**\n * Get the inverse of the matrix.\n *\n * @remarks\n * If the matrix is not invertible, i.e. its determinant is `0`, this will\n * return `null`, instead.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const inverse = matrix.inverse;\n * // => Matrix2D(\n * // [-2, 1],\n * // [1.5, -0.5],\n * // [1, -2],\n * // )\n * ```\n */\n public get inverse(): Matrix2D | null {\n const aa = this.values[0],\n ab = this.values[1],\n ac = this.values[2],\n ad = this.values[3];\n const atx = this.values[4],\n aty = this.values[5];\n\n let det = aa * ad - ab * ac;\n\n if (!det) {\n return null;\n }\n\n det = 1.0 / det;\n\n return new Matrix2D(\n ad * det,\n -ab * det,\n -ac * det,\n aa * det,\n (ac * aty - ad * atx) * det,\n (ab * atx - aa * aty) * det,\n );\n }\n\n /**\n * Get the determinant of the matrix.\n */\n public get determinant(): number {\n return this.values[0] * this.values[3] - this.values[1] * this.values[2];\n }\n\n public get domMatrix(): DOMMatrix {\n return new DOMMatrix([\n this.values[0],\n this.values[1],\n this.values[2],\n this.values[3],\n this.values[4],\n this.values[5],\n ]);\n }\n\n public constructor();\n public constructor(matrix: PossibleMatrix2D);\n public constructor(\n x: PossibleVector2,\n y: PossibleVector2,\n z: PossibleVector2,\n );\n public constructor(\n a: number,\n b: number,\n c: number,\n d: number,\n tx: number,\n ty: number,\n );\n public constructor(\n a?: PossibleMatrix2D | PossibleVector2,\n b?: PossibleVector2,\n c?: PossibleVector2,\n d?: number,\n tx?: number,\n ty?: number,\n ) {\n if (arguments.length === 0) {\n this.values = new Float32Array([1, 0, 0, 1, 0, 0]);\n return;\n }\n\n if (arguments.length === 6) {\n this.values[0] = a as number;\n this.values[1] = b as number;\n this.values[2] = c as number;\n this.values[3] = d as number;\n this.values[4] = tx as number;\n this.values[5] = ty as number;\n return;\n }\n\n if (a instanceof DOMMatrix) {\n this.values[0] = a.m11;\n this.values[1] = a.m12;\n this.values[2] = a.m21;\n this.values[3] = a.m22;\n this.values[4] = a.m41;\n this.values[5] = a.m42;\n return;\n }\n\n if (a instanceof Matrix2D) {\n this.values = a.values;\n return;\n }\n\n if (Array.isArray(a)) {\n if (a.length === 2) {\n this.values[0] = a[0];\n this.values[1] = a[1];\n this.values[2] = (b as number[])[0];\n this.values[3] = (b as number[])[1];\n this.values[4] = (c as number[])[0];\n this.values[5] = (c as number[])[1];\n return;\n }\n\n if (a.length === 3) {\n const x = new Vector2(a[0]);\n const y = new Vector2(a[1]);\n const z = new Vector2(a[2]);\n this.values[0] = x.x;\n this.values[1] = x.y;\n this.values[2] = y.x;\n this.values[3] = y.y;\n this.values[4] = z.x;\n this.values[5] = z.y;\n return;\n }\n\n this.values[0] = a[0];\n this.values[1] = a[1];\n this.values[2] = a[2];\n this.values[3] = a[3];\n this.values[4] = a[4];\n this.values[5] = a[5];\n return;\n }\n\n const x = new Vector2(a as PossibleVector2);\n const y = new Vector2(b);\n const z = new Vector2(c);\n this.values[0] = x.x;\n this.values[1] = x.y;\n this.values[2] = y.x;\n this.values[3] = y.y;\n this.values[4] = z.x;\n this.values[5] = z.y;\n }\n\n /**\n * Get the nth component vector of the matrix. Only defined for 0, 1, and 2.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 0],\n * [0, 0],\n * [1, 0],\n * );\n *\n * const x = matrix.column(0);\n * // Vector2(1, 0)\n *\n * const y = matrix.column(1);\n * // Vector2(0, 0)\n *\n * const z = matrix.column(1);\n * // Vector2(1, 0)\n * ```\n *\n * @param index - The index of the component vector to retrieve.\n */\n public column(index: number): Vector2 {\n return new Vector2(this.values[index * 2], this.values[index * 2 + 1]);\n }\n\n /**\n * Returns the nth row of the matrix. Only defined for 0 and 1.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 0],\n * [0, 0],\n * [1, 0],\n * );\n *\n * const firstRow = matrix.column(0);\n * // [1, 0, 1]\n *\n * const secondRow = matrix.column(1);\n * // [0, 0, 0]\n * ```\n *\n * @param index - The index of the row to retrieve.\n */\n public row(index: number): [number, number, number] {\n return [this.values[index], this.values[index + 2], this.values[index + 4]];\n }\n\n /**\n * Returns the matrix product of this matrix with the provided matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [0, 1],\n * [1, 1],\n * );\n * const b = new Matrix2D(\n * [2, 1],\n * [1, 1],\n * [1, 1],\n * );\n *\n * const result = a.mul(b);\n * // => Matrix2D(\n * // [2, 5],\n * // [1, 3],\n * // [2, 4],\n * // )\n * ```\n *\n * @param other - The matrix to multiply with\n */\n public mul(other: Matrix2D): Matrix2D {\n const a0 = this.values[0],\n a1 = this.values[1],\n a2 = this.values[2],\n a3 = this.values[3],\n a4 = this.values[4],\n a5 = this.values[5];\n const b0 = other.values[0],\n b1 = other.values[1],\n b2 = other.values[2],\n b3 = other.values[3],\n b4 = other.values[4],\n b5 = other.values[5];\n\n return new Matrix2D(\n a0 * b0 + a2 * b1,\n a1 * b0 + a3 * b1,\n a0 * b2 + a2 * b3,\n a1 * b2 + a3 * b3,\n a0 * b4 + a2 * b5 + a4,\n a1 * b4 + a3 * b5 + a5,\n );\n }\n\n /**\n * Rotate the matrix by the provided angle. By default, the angle is\n * provided in degrees.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result = a.rotate(90);\n * // => Matrix2D(\n * // [3, 4],\n * // [-1, -2],\n * // [5, 6],\n * // )\n *\n * // Provide the angle in radians\n * const result = a.rotate(Math.PI * 0.5, true);\n * // => Matrix2D(\n * // [3, 4],\n * // [-1, -2],\n * // [5, 6],\n * // )\n * ```\n *\n * @param angle - The angle by which to rotate the matrix.\n * @param degrees - Whether the angle is provided in degrees.\n */\n public rotate(angle: number, degrees = true): Matrix2D {\n if (degrees) {\n angle *= DEG2RAD;\n }\n\n const a0 = this.values[0],\n a1 = this.values[1],\n a2 = this.values[2],\n a3 = this.values[3],\n a4 = this.values[4],\n a5 = this.values[5];\n const s = Math.sin(angle);\n const c = Math.cos(angle);\n\n return new Matrix2D(\n a0 * c + a2 * s,\n a1 * c + a3 * s,\n a0 * -s + a2 * c,\n a1 * -s + a3 * c,\n a4,\n a5,\n );\n }\n\n /**\n * Scale the x and y component vectors of the matrix.\n *\n * @remarks\n * If `vec` is provided as a vector, the x and y component vectors of the\n * matrix will be scaled by the x and y parts of the vector, respectively.\n *\n * If `vec` is provided as a scalar, the x and y component vectors will be\n * scaled uniformly by this factor.\n *\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.scale([2, 3]);\n * // => new Matrix2D(\n * // [2, 4],\n * // [9, 12],\n * // [5, 6],\n * // )\n *\n * const result2 = matrix.scale(2);\n * // => new Matrix2D(\n * // [2, 4],\n * // [6, 8],\n * // [5, 6],\n * // )\n * ```\n *\n * @param vec - The factor by which to scale the matrix\n */\n public scale(vec: PossibleVector2): Matrix2D {\n const v = new Vector2(vec);\n\n return new Matrix2D(\n this.values[0] * v.x,\n this.values[1] * v.x,\n this.values[2] * v.y,\n this.values[3] * v.y,\n this.values[4],\n this.values[5],\n );\n }\n\n /**\n * Multiply each value of the matrix by a scalar.\n *\n * * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.mulScalar(2);\n * // => new Matrix2D(\n * // [2, 4],\n * // [6, 8],\n * // [10, 12],\n * // )\n * ```\n *\n * @param s - The value by which to scale each term\n */\n public mulScalar(s: number): Matrix2D {\n return new Matrix2D(\n this.values[0] * s,\n this.values[1] * s,\n this.values[2] * s,\n this.values[3] * s,\n this.values[4] * s,\n this.values[5] * s,\n );\n }\n\n /**\n * Translate the matrix by the dimensions of the provided vector.\n *\n * @remarks\n * If `vec` is provided as a scalar, matrix will be translated uniformly\n * by this factor.\n *\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const matrix = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n *\n * const result1 = matrix.translate([2, 3]);\n * // => new Matrix2D(\n * // [1, 2],\n * // [3, 4],\n * // [16, 22],\n * // )\n *\n * const result2 = matrix.translate(2);\n * // => new Matrix2D(\n * // [1, 2],\n * // [3, 4],\n * // [13, 18],\n * // )\n * ```\n *\n * @param vec - The vector by which to translate the matrix\n */\n public translate(vec: PossibleVector2): Matrix2D {\n const v = new Vector2(vec);\n\n return new Matrix2D(\n this.values[0],\n this.values[1],\n this.values[2],\n this.values[3],\n this.values[0] * v.x + this.values[2] * v.y + this.values[4],\n this.values[1] * v.x + this.values[3] * v.y + this.values[5],\n );\n }\n\n /**\n * Add the provided matrix to this matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n * const a = new Matrix2D(\n * [7, 8],\n * [9, 10],\n * [11, 12],\n * );\n *\n * const result = a.add(b);\n * // => Matrix2D(\n * // [8, 10],\n * // [12, 14],\n * // [16, 18],\n * // )\n * ```\n *\n * @param other - The matrix to add\n */\n public add(other: Matrix2D): Matrix2D {\n return new Matrix2D(\n this.values[0] + other.values[0],\n this.values[1] + other.values[1],\n this.values[2] + other.values[2],\n this.values[3] + other.values[3],\n this.values[4] + other.values[4],\n this.values[5] + other.values[5],\n );\n }\n\n /**\n * Subtract the provided matrix from this matrix.\n *\n * @remarks\n * This method returns a new matrix representing the result of the\n * computation. It will not modify the source matrix.\n *\n * @example\n * ```ts\n * const a = new Matrix2D(\n * [1, 2],\n * [3, 4],\n * [5, 6],\n * );\n * const a = new Matrix2D(\n * [7, 8],\n * [9, 10],\n * [11, 12],\n * );\n *\n * const result = a.sub(b);\n * // => Matrix2D(\n * // [-6, -6],\n * // [-6, -6],\n * // [-6, -6],\n * // )\n * ```\n *\n * @param other - The matrix to subract\n */\n public sub(other: Matrix2D): Matrix2D {\n return new Matrix2D(\n this.values[0] - other.values[0],\n this.values[1] - other.values[1],\n this.values[2] - other.values[2],\n this.values[3] - other.values[3],\n this.values[4] - other.values[4],\n this.values[5] - other.values[5],\n );\n }\n\n public toSymbol(): symbol {\n return Matrix2D.symbol;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniformMatrix3x2fv(location, false, this.values);\n }\n\n public equals(other: Matrix2D, threshold: number = EPSILON): boolean {\n return (\n Math.abs(this.values[0] - other.values[0]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[1] - other.values[1]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[2] - other.values[2]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[3] - other.values[3]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[4] - other.values[4]) <=\n threshold + Number.EPSILON &&\n Math.abs(this.values[5] - other.values[5]) <= threshold + Number.EPSILON\n );\n }\n\n public exactlyEquals(other: Matrix2D): boolean {\n return (\n this.values[0] === other.values[0] &&\n this.values[1] === other.values[1] &&\n this.values[2] === other.values[2] &&\n this.values[3] === other.values[3] &&\n this.values[4] === other.values[4] &&\n this.values[5] === other.values[5]\n );\n }\n}\n","/**\n * These are the functions that can be used to apply transformations to a vector.\n *\n * These can't be methods of the vector class because they depend on Matrix2D which\n * would create a circular dependency.\n */\n\nimport type {PossibleMatrix2D} from './Matrix2D';\nimport {Matrix2D} from './Matrix2D';\nimport type {PossibleVector2} from './Vector';\nimport {Vector2} from './Vector';\n\nexport function transformVectorAsPoint(\n vector: Vector2,\n matrix: PossibleMatrix2D,\n) {\n const m = new Matrix2D(matrix);\n\n return new Vector2(\n vector.x * m.scaleX + vector.y * m.skewY + m.translateX,\n vector.x * m.skewX + vector.y * m.scaleY + m.translateY,\n );\n}\n\nexport function transformVector(vector: Vector2, matrix: PossibleMatrix2D) {\n const m = new Matrix2D(matrix);\n\n return new Vector2(\n vector.x * m.scaleX + vector.y * m.skewY,\n vector.x * m.skewX + vector.y * m.scaleY,\n );\n}\n\n/**\n * Rotates the vector around a point by the provided angle.\n *\n * @param vector - The vector to rotate.\n * @param angle - The angle by which to rotate in degrees.\n * @param center - The center of rotation. Defaults to the origin.\n */\nexport function rotateVector(\n vector: Vector2,\n angle: number,\n center: PossibleVector2 = Vector2.zero,\n): Vector2 {\n const originVector = new Vector2(center);\n\n const matrix = Matrix2D.fromTranslation(originVector)\n .rotate(angle)\n .translate(originVector.flipped);\n\n return transformVectorAsPoint(vector, matrix);\n}\n","import type {CompoundSignal, SignalValue} from '../signals';\nimport {CompoundSignalContext} from '../signals';\nimport type {InterpolationFunction} from '../tweening';\nimport {arcLerp, map} from '../tweening';\nimport type {PossibleMatrix2D} from './Matrix2D';\nimport type {PossibleSpacing} from './Spacing';\nimport {Spacing} from './Spacing';\nimport type {Type, WebGLConvertible} from './Type';\nimport {Vector2} from './Vector';\nimport {\n transformVector,\n transformVectorAsPoint,\n} from './vector-transformations';\n\nexport type SerializedBBox = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type PossibleBBox =\n | SerializedBBox\n | [number, number, number, number]\n | Vector2\n | undefined;\n\nexport type RectSignal<T> = CompoundSignal<\n PossibleBBox,\n BBox,\n 'x' | 'y' | 'width' | 'height',\n T\n>;\n\nexport class BBox implements Type, WebGLConvertible {\n public static readonly symbol = Symbol.for('@twick/core/types/Rect');\n\n public x = 0;\n public y = 0;\n public width = 0;\n public height = 0;\n\n public static createSignal(\n initial?: SignalValue<PossibleBBox>,\n interpolation: InterpolationFunction<BBox> = BBox.lerp,\n ): RectSignal<void> {\n return new CompoundSignalContext(\n ['x', 'y', 'width', 'height'],\n (value: PossibleBBox) => new BBox(value),\n initial,\n interpolation,\n ).toSignal();\n }\n\n public static lerp(\n from: BBox,\n to: BBox,\n value: number | Vector2 | BBox,\n ): BBox {\n let valueX;\n let valueY;\n let valueWidth;\n let valueHeight;\n if (typeof value === 'number') {\n valueX = valueY = valueWidth = valueHeight = value;\n } else if (value instanceof Vector2) {\n valueX = valueWidth = value.x;\n valueY = valueHeight = value.y;\n } else {\n valueX = value.x;\n valueY = value.y;\n valueWidth = value.width;\n valueHeight = value.height;\n }\n\n return new BBox(\n map(from.x, to.x, valueX),\n map(from.y, to.y, valueY),\n map(from.width, to.width, valueWidth),\n map(from.height, to.height, valueHeight),\n );\n }\n\n public static arcLerp(\n from: BBox,\n to: BBox,\n value: number,\n reverse = false,\n ratio?: number,\n ) {\n ratio ??=\n (from.position.sub(to.position).ctg + from.size.sub(to.size).ctg) / 2;\n\n return BBox.lerp(from, to, new Vector2(arcLerp(value, reverse, ratio)));\n }\n\n public static fromSizeCentered(size: Vector2): BBox {\n return new BBox(-size.width / 2, -size.height / 2, size.width, size.height);\n }\n\n public static fromPoints(...points: Vector2[]): BBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const point of points) {\n if (point.x > maxX) {\n maxX = point.x;\n }\n if (point.x < minX) {\n minX = point.x;\n }\n if (point.y > maxY) {\n maxY = point.y;\n }\n if (point.y < minY) {\n minY = point.y;\n }\n }\n\n return new BBox(minX, minY, maxX - minX, maxY - minY);\n }\n\n public static fromBBoxes(...boxes: BBox[]): BBox {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const box of boxes) {\n const right = box.x + box.width;\n if (right > maxX) {\n maxX = right;\n }\n if (box.x < minX) {\n minX = box.x;\n }\n const bottom = box.y + box.height;\n if (bottom > maxY) {\n maxY = bottom;\n }\n if (box.y < minY) {\n minY = box.y;\n }\n }\n\n return new BBox(minX, minY, maxX - minX, maxY - minY);\n }\n\n public lerp(to: BBox, value: number | Vector2 | BBox) {\n return BBox.lerp(this, to, value);\n }\n\n public get position() {\n return new Vector2(this.x, this.y);\n }\n\n public set position(value: Vector2) {\n this.x = value.x;\n this.y = value.y;\n }\n\n public get size() {\n return new Vector2(this.width, this.height);\n }\n\n public get center() {\n return new Vector2(this.x + this.width / 2, this.y + this.height / 2);\n }\n\n public get left() {\n return this.x;\n }\n\n public set left(value: number) {\n this.width += this.x - value;\n this.x = value;\n }\n\n public get right() {\n return this.x + this.width;\n }\n\n public set right(value: number) {\n this.width = value - this.x;\n }\n\n public get top() {\n return this.y;\n }\n\n public set top(value: number) {\n this.height += this.y - value;\n this.y = value;\n }\n\n public get bottom() {\n return this.y + this.height;\n }\n\n public set bottom(value: number) {\n this.height = value - this.y;\n }\n\n public get topLeft(): Vector2 {\n return this.position;\n }\n\n public get topRight(): Vector2 {\n return new Vector2(this.x + this.width, this.y);\n }\n\n public get bottomLeft(): Vector2 {\n return new Vector2(this.x, this.y + this.height);\n }\n\n public get bottomRight(): Vector2 {\n return new Vector2(this.x + this.width, this.y + this.height);\n }\n\n public get corners(): [Vector2, Vector2, Vector2, Vector2] {\n return [this.topLeft, this.topRight, this.bottomRight, this.bottomLeft];\n }\n\n public get pixelPerfect() {\n return new BBox(\n Math.floor(this.x),\n Math.floor(this.y),\n Math.ceil(this.width + 1),\n Math.ceil(this.height + 1),\n );\n }\n\n public constructor();\n public constructor(from: PossibleBBox);\n public constructor(position: Vector2, size: Vector2);\n public constructor(x: number, y?: number, width?: number, height?: number);\n public constructor(\n one?: PossibleBBox | number,\n two: Vector2 | number = 0,\n three = 0,\n four = 0,\n ) {\n if (one === undefined || one === null) {\n return;\n }\n\n if (typeof one === 'number') {\n this.x = one;\n this.y = <number>two;\n this.width = three;\n this.height = four;\n return;\n }\n\n if (one instanceof Vector2) {\n this.x = one.x;\n this.y = one.y;\n\n if (two instanceof Vector2) {\n this.width = two.x;\n this.height = two.y;\n }\n\n return;\n }\n\n if (Array.isArray(one)) {\n this.x = one[0];\n this.y = one[1];\n this.width = one[2];\n this.height = one[3];\n return;\n }\n\n this.x = one.x;\n this.y = one.y;\n this.width = one.width;\n this.height = one.height;\n }\n\n public transform(matrix: PossibleMatrix2D): BBox {\n return new BBox(\n transformVectorAsPoint(this.position, matrix),\n transformVector(this.size, matrix),\n );\n }\n\n public transformCorners(matrix: PossibleMatrix2D) {\n return this.corners.map(corner => transformVectorAsPoint(corner, matrix));\n }\n\n /**\n * Expand the bounding box to accommodate the given spacing.\n *\n * @param value - The value to expand the bounding box by.\n */\n public expand(value: PossibleSpacing) {\n const spacing = new Spacing(value);\n const result = new BBox(this);\n result.left -= spacing.left;\n result.top -= spacing.top;\n result.right += spacing.right;\n result.bottom += spacing.bottom;\n\n return result;\n }\n\n /**\n * {@inheritDoc expand}\n *\n * @deprecated Use {@link expand} instead.\n */\n public addSpacing(value: PossibleSpacing) {\n return this.expand(value);\n }\n\n public includes(point: Vector2): boolean {\n return (\n point.x >= this.x &&\n point.x <= this.x + this.width &&\n point.y >= this.y &&\n point.y <= this.y + this.height\n );\n }\n\n public intersects(other: BBox): boolean {\n return (\n this.left < other.right &&\n this.right > other.left &&\n this.top < other.bottom &&\n this.bottom > other.top\n );\n }\n\n public intersection(other: BBox): BBox {\n const bbox = new BBox();\n\n if (this.intersects(other)) {\n bbox.left = Math.max(this.left, other.left);\n bbox.top = Math.max(this.top, other.top);\n bbox.right = Math.min(this.right, other.right);\n bbox.bottom = Math.min(this.bottom, other.bottom);\n }\n\n return bbox;\n }\n\n public union(other: BBox): BBox {\n const bbox = new BBox();\n\n bbox.left = Math.min(this.left, other.left);\n bbox.top = Math.min(this.top, other.top);\n bbox.right = Math.max(this.right, other.right);\n bbox.bottom = Math.max(this.bottom, other.bottom);\n\n return bbox;\n }\n\n public toSymbol(): symbol {\n return BBox.symbol;\n }\n\n public toString(): string {\n return `BBox(${this.x}, ${this.y}, ${this.width}, ${this.height})`;\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4f(location, this.x, this.y, this.width, this.height);\n }\n\n public serialize(): SerializedBBox {\n return {x: this.x, y: this.y, width: this.width, height: this.height};\n }\n}\n","import {converter, formatHex8, interpolate, parse} from 'culori';\nimport type {Signal, SignalValue} from '../signals';\nimport {SignalContext} from '../signals';\nimport type {InterpolationFunction} from '../tweening';\nimport {clamp} from '../tweening';\nimport type {Type, WebGLConvertible} from './Type';\n\nexport type SerializedColor = string;\n\nfunction parseNumber(num: number): [number, number, number, number] {\n const r = (num >> 16) & 255;\n const g = (num >> 8) & 255;\n const b = num & 255;\n return [r / 255, g / 255, b / 255, 1];\n}\n\nexport interface ColorObject {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\nexport type PossibleColor = SerializedColor | number | Color | ColorObject;\n\ntype CuloriInterpolatorMode =\n | 'a98'\n | 'cubehelix'\n | 'dlab'\n | 'dlch'\n | 'hsi'\n | 'hsl'\n | 'hsv'\n | 'hwb'\n | 'jab'\n | 'jch'\n | 'lab'\n | 'lab65'\n | 'lch'\n | 'lch65'\n | 'lchuv'\n | 'lrgb'\n | 'luv'\n | 'okhsl'\n | 'okhsv'\n | 'oklab'\n | 'oklch'\n | 'p3'\n | 'prophoto'\n | 'rec2020'\n | 'rgb'\n | 'xyz'\n | 'xyz50'\n | 'xyz65'\n | 'yiq';\n\nexport type ColorSignal<T> = Signal<PossibleColor, Color, T>;\n\n/**\n * Represents a color using RGBA values (0-1 range).\n */\nexport class Color implements Type, WebGLConvertible {\n public static symbol = Symbol.for('@twick/core/types/Color');\n public readonly symbol = Color.symbol;\n\n public readonly r: number;\n public readonly g: number;\n public readonly b: number;\n public readonly a: number;\n\n public constructor(value?: PossibleColor) {\n // Handle undefined/null case\n if (value === undefined || value === null) {\n this.r = 0;\n this.g = 0;\n this.b = 0;\n this.a = 1; // Default alpha for undefined is 1 (fully opaque black)\n return;\n }\n\n // Handle Color instance\n if (value instanceof Color) {\n this.r = value.r;\n this.g = value.g;\n this.b = value.b;\n this.a = value.a;\n return;\n }\n\n // Handle string parsing using culori\n if (typeof value === 'string') {\n const parsedColor = parse(value);\n if (!parsedColor) {\n throw new Error(`Invalid color string value provided: ${value}`);\n }\n\n // Convert parsed color to RGB if it's not already\n const rgbColor =\n parsedColor.mode === 'rgb'\n ? parsedColor\n : converter('rgb')(parsedColor);\n\n if (rgbColor) {\n this.r = clamp(0, 1, rgbColor.r);\n this.g = clamp(0, 1, rgbColor.g);\n this.b = clamp(0, 1, rgbColor.b);\n this.a = clamp(0, 1, rgbColor.alpha ?? 1);\n return;\n }\n }\n\n // Handle number parsing\n if (typeof value === 'number') {\n const [r, g, b, a] = parseNumber(value);\n this.r = clamp(0, 1, r);\n this.g = clamp(0, 1, g);\n this.b = clamp(0, 1, b);\n this.a = clamp(0, 1, a);\n return;\n }\n\n // Handle object parsing\n if (typeof value === 'object') {\n // Check for r, g, b properties to be reasonably sure it's a ColorObject\n if ('r' in value && 'g' in value && 'b' in value) {\n const obj = value as ColorObject; // Assume it matches the interface\n this.r = clamp(0, 1, obj.r / 255);\n this.g = clamp(0, 1, obj.g / 255);\n this.b = clamp(0, 1, obj.b / 255);\n this.a = clamp(0, 1, obj.a ?? 1);\n return;\n }\n }\n\n throw new Error(`Invalid color value provided: ${value}`);\n }\n\n /**\n * Interpolates between two colors using LCH color space.\n */\n public static lerp(\n from: PossibleColor | null,\n to: PossibleColor | null,\n value: number,\n mode: CuloriInterpolatorMode = 'lch', // Default to LCH\n ): Color {\n const fromColor =\n from instanceof Color ? from : new Color(from ?? undefined);\n const toColor = to instanceof Color ? to : new Color(to ?? undefined);\n\n // Define culori colors in {r, g, b} format (0-1 range)\n const startColorCulori = {\n mode: 'rgb',\n r: fromColor.r,\n g: fromColor.g,\n b: fromColor.b,\n } as const;\n const endColorCulori = {\n mode: 'rgb',\n r: toColor.r,\n g: toColor.g,\n b: toColor.b,\n } as const;\n\n // Create LCH interpolator using culori\n const interpolationMode = mode ?? 'lch'; // Ensure mode is not undefined\n const interpolator = interpolate(\n [startColorCulori, endColorCulori],\n interpolationMode as any, // Use specified interpolation space (casting to bypass TS error)\n );\n\n // Get the interpolated color in LCH mode from culori\n const interpolatedLch = interpolator(value);\n\n // Convert the interpolated LCH color back to RGB\n const rgbConverter = converter('rgb');\n const interpolatedRgb = rgbConverter(interpolatedLch);\n\n // Interpolate alpha linearly\n const a = fromColor.a + (toColor.a - fromColor.a) * value;\n\n // Create a new Color instance, clamping RGB values from culori\n // Check if interpolatedRgb is valid before accessing properties\n const finalR = interpolatedRgb ? clamp(0, 1, interpolatedRgb.r) : 0;\n const finalG = interpolatedRgb ? clamp(0, 1, interpolatedRgb.g) : 0;\n const finalB = interpolatedRgb ? clamp(0, 1, interpolatedRgb.b) : 0;\n\n return new Color({\n r: finalR * 255,\n g: finalG * 255,\n b: finalB * 255,\n a: clamp(0, 1, a), // Also clamp alpha just in case\n });\n }\n\n /**\n * Creates an interpolation function for colors (uses LCH space via culori).\n */\n public static createLerp(\n mode: CuloriInterpolatorMode = 'lch',\n ): InterpolationFunction<Color, any[]> {\n return (from: PossibleColor, to: PossibleColor, value) =>\n Color.lerp(from, to, value, mode);\n }\n\n /**\n * Creates a signal for the Color type.\n */\n public static createSignal(\n initial?: SignalValue<PossibleColor>,\n interpolation: InterpolationFunction<Color> = Color.lerp,\n ): ColorSignal<void> {\n return new SignalContext<PossibleColor, Color, void>(\n initial,\n interpolation,\n undefined,\n value => (value instanceof Color ? value : new Color(value)),\n ).toSignal();\n }\n\n public toSymbol(): symbol {\n return this.symbol;\n }\n\n /**\n * Returns the color components as a [r, g, b, a] array (0-1 range).\n */\n private gl(): [number, number, number, number] {\n return [this.r, this.g, this.b, this.a];\n }\n\n public toUniform(\n gl: WebGL2RenderingContext,\n location: WebGLUniformLocation,\n ): void {\n gl.uniform4fv(location, this.gl());\n }\n\n /**\n * Serializes the color to an `rgba()` CSS string.\n */\n public serialize(): SerializedColor {\n const r = Math.round(this.r * 255);\n const g = Math.round(this.g * 255);\n const b = Math.round(this.b * 255);\n // Use toFixed(3) for alpha like before, clamp to avoid -0\n const alphaStr = clamp(0, 1, this.a).toFixed(3);\n return `rgba(${r}, ${g}, ${b}, ${alphaStr})`;\n }\n\n /**\n * Serializes the color to an `rgb()` CSS string (omitting alpha).\n */\n public css(): SerializedColor {\n const r = Math.round(this.r * 255);\n const g = Math.round(this.g * 255);\n const b = Math.round(this.b * 255);\n return `rgb(${r},${g},${b})`;\n }\n\n /**\n * Returns the alpha value of the color (0-1 range).\n */\n public alpha(): number {\n return this.a;\n }\n\n /**\n * Serializes the color to an RRGGBBAA hex string using culori.\n */\n public hex(): string {\n // Use culori's formatter for consistency\n return formatHex8({\n mode: 'rgb',\n r: this.r,\n g: this.g,\n b: this.b,\n alpha: this.a,\n });\n }\n\n /**\n * Linearly interpolates from this color to another using LCH space.\n */\n public lerp(\n to: PossibleColor,\n value: number,\n mode: CuloriInterpolatorMode = 'lch',\n ): Color {\n return Color.lerp(this, to, value, mode);\n }\n}\n","import {Vector2} from './Vector';\nimport {transformVector} from './vector-transformations';\n\nexport function transformAngle(angle: number, matrix: DOMMatrix) {\n const degreeVector = Vector2.fromDegrees(angle);\n return transformVector(degreeVector, matrix).degrees;\n}\n\nexport function transformScalar(scalar: number, matrix: DOMMatrix) {\n return Vector2.magnitude(matrix.m11, matrix.m12) * scalar;\n}\n","import {Center, Direction, Origin} from './alignment-enums';\nimport {Vector2} from './Vector';\n\nexport function flipOrigin(origin: Direction, axis?: Center): Direction;\nexport function flipOrigin(origin: Origin, axis?: Center): Origin;\nexport function flipOrigin(\n origin: Origin | Direction,\n axis: Center = Center.Horizontal | Center.Vertical,\n): Origin | Direction {\n if (axis & Center.Vertical) {\n if (origin & Direction.Top) {\n origin = (origin & ~Direction.Top) | Direction.Bottom;\n } else if (origin & Direction.Bottom) {\n origin = (origin & ~Direction.Bottom) | Direction.Top;\n }\n }\n\n if (axis & Center.Horizontal) {\n if (origin & Direction.Left) {\n origin = (origin & ~Direction.Left) | Direction.Right;\n } else if (origin & Direction.Right) {\n origin = (origin & ~Direction.Right) | Direction.Left;\n }\n }\n\n return origin;\n}\n\n/**\n * Convert the given origin to a vector representing its offset.\n *\n * @example\n * ```ts\n * const bottomRight = originToOffset(Origin.TopRight);\n * // bottomRight = {x: 1, y: -1}\n * ```\n *\n * @param origin - The origin to convert.\n */\nexport function originToOffset(origin: Origin | Direction): Vector2 {\n if (origin === Origin.Middle) {\n return Vector2.zero;\n }\n\n let x = 0;\n if (origin & Direction.Left) {\n x = -1;\n } else if (origin & Direction.Right) {\n x = 1;\n }\n\n let y = 0;\n if (origin & Direction.Top) {\n y = -1;\n } else if (origin & Direction.Bottom) {\n y = 1;\n }\n\n return new Vector2(x, y);\n}\n","import type {FfmpegExporterOptions, ImageExporterOptions} from '../exporter';\nimport type {Plugin} from '../plugin';\nimport type {SceneDescription} from '../scenes';\nimport type {CanvasColorSpace, Color, Vector2} from '../types';\nimport type {Logger} from './Logger';\n\n// TODO(refactor): check if we can get rid of this\nexport interface Versions {\n core: string;\n two: string | null;\n ui: string | null;\n vitePlugin: string | null;\n}\n\n// TODO(refactor): check if we can get rid of this\nexport function createVersionObject(version: string) {\n return {\n core: version,\n two: version,\n ui: version,\n vitePlugin: version,\n };\n}\n\nexport type ExporterSettings =\n | {\n name: '@twick/core/image-sequence';\n options: ImageExporterOptions;\n }\n | {\n name: '@twick/core/ffmpeg';\n options: FfmpegExporterOptions;\n }\n | {\n name: '@twick/core/wasm';\n };\n\n// Project settings that are used internally\nexport interface ProjectSettings {\n shared: {\n background: Color;\n range: [number, number];\n size: Vector2;\n };\n rendering: {\n exporter: ExporterSettings;\n fps: number;\n resolutionScale: number;\n colorSpace: CanvasColorSpace;\n };\n preview: {\n fps: number;\n resolutionScale: number;\n };\n}\n\n// Project settings as they are provided by the user (can be serialized)\nexport interface UserProjectSettings {\n shared: {\n range: [number, number];\n background: string | null; // changed from Color to string\n size: {x: number; y: number}; // changed from Vector2 to object\n };\n rendering: {\n exporter: ExporterSettings;\n fps: number;\n resolutionScale: number;\n colorSpace: CanvasColorSpace;\n };\n preview: {\n fps: number;\n resolutionScale: number;\n };\n}\n\n/**\n * Settings that can be passed to the renderVideo / renderPartialVideo functions\n */\n\nexport type RenderVideoUserProjectSettings = {\n range?: UserProjectSettings['shared']['range'];\n background?: UserProjectSettings['shared']['background'];\n size?: UserProjectSettings['shared']['size'];\n\n exporter?: UserProjectSettings['rendering']['exporter'];\n};\n\n/**\n * Settings that can be passed to the createProject function\n */\n\nexport type PartialUserProjectSettings = {\n shared?: Partial<UserProjectSettings['shared']>;\n rendering?: Partial<UserProjectSettings['rendering']>;\n preview?: Partial<UserProjectSettings['preview']>;\n};\n\nexport interface UserProject {\n /**\n * The name of the project.\n */\n name?: string;\n\n /**\n * A list of scene descriptions that make up the project.\n */\n scenes: SceneDescription<any>[];\n\n /**\n * Default values for project variables.\n *\n * @see https://motioncanvas.io/docs/project-variables\n */\n variables?: Record<string, unknown>;\n\n /**\n * Enable experimental features.\n *\n * @see https://motioncanvas.io/docs/experimental\n *\n * @experimental\n */\n experimentalFeatures?: boolean;\n\n /**\n * Settings for the project. This includes shared settings, rendering settings\n * and preview settings.\n *\n * Includes things like the background color, the resolution, the frame rate,\n * and the exporter to use.\n */\n settings?: PartialUserProjectSettings;\n}\n\n/**\n * Internal project that includes legacy properties that can't be changed by the user\n * as well as defaulted properties in case the user didn't provide them.\n */\nexport interface Project extends Omit<UserProject, 'settings'> {\n name: string;\n settings: ProjectSettings;\n\n /**\n * @deprecated Not exposed in the public API. We set the exporters as plugins\n * which is why we can't delete this yet.\n *\n * // TODO(konsti): get rid of plugins\n *\n * A list of plugins to include in the project.\n *\n * @remarks\n * When a string is provided, the plugin will be imported dynamically using\n * the string as the module specifier. This is the preferred way to include\n * editor plugins because it makes sure that the plugin's source code gets\n * excluded from the production build.\n */\n plugins: Plugin[];\n\n /**\n * Not exposed in the public API.\n */\n logger: Logger;\n\n /**\n * Manually set via a constant. This should be automated by reading the\n * package.json files of the packages.\n */\n versions: Versions;\n}\n","import DefaultPlugin from '../plugin/DefaultPlugin';\nimport {Color, Vector2} from '../types';\nimport {Logger} from './Logger';\nimport type {Project, UserProject, UserProjectSettings} from './Project';\nimport {createVersionObject} from './Project';\n\nexport const defaultUserProjectSettings: UserProjectSettings = {\n shared: {\n background: 'FFFFFF00',\n range: [0, Infinity],\n size: {x: 1920, y: 1080},\n },\n rendering: {\n exporter: {\n name: '@twick/core/wasm',\n },\n fps: 30,\n resolutionScale: 1,\n colorSpace: 'srgb',\n },\n preview: {\n fps: 30,\n resolutionScale: 1,\n },\n};\n\nexport function makeProject(project: UserProject): Project {\n // Don't delete, has side effects\n // TODO(konsti): Figure out how to get rid of this\n void DefaultPlugin;\n\n const settings = {\n ...defaultUserProjectSettings,\n ...project.settings,\n shared: {\n ...defaultUserProjectSettings.shared,\n ...project.settings?.shared,\n },\n rendering: {\n ...defaultUserProjectSettings.rendering,\n ...project.settings?.rendering,\n },\n preview: {\n ...defaultUserProjectSettings.preview,\n ...project.settings?.preview,\n },\n };\n\n // Convert background and size to correct types\n const convertedSettings = {\n ...settings,\n shared: {\n ...settings.shared,\n background: new Color(settings.shared.background!),\n size: new Vector2(settings.shared.size),\n },\n };\n\n return {\n ...project,\n name: project.name ?? 'project',\n settings: convertedSettings,\n plugins: [],\n logger: new Logger(),\n versions: createVersionObject('0.10.4'),\n };\n}\n\nexport async function addEditorToProject(project: Project) {\n const url = '/@id/@twick/2d/editor';\n const imported = await import(\n /* webpackIgnore: true */ /* @vite-ignore */ url\n );\n const plugin = imported.default();\n\n return {\n ...project,\n plugins: [...project.plugins, plugin],\n };\n}\n","import {ValueDispatcher} from '../events';\nimport type {Scene, SceneDescriptionReload, Slide} from '../scenes';\n\nexport enum PlaybackState {\n Playing,\n Rendering,\n Paused,\n Presenting,\n}\n\n/**\n * A general class for managing a sequence of scenes.\n *\n * @remarks\n * This class provides primitive operations that can be executed on a scene\n * sequence, such as {@link progress} or {@link seek}.\n *\n * @internal\n */\nexport class PlaybackManager {\n /**\n * Triggered when the active scene changes.\n *\n * @eventProperty\n */\n public get onSceneChanged() {\n if (this.currentSceneReference === null) {\n throw new Error('PlaybackManager has not been properly initialized');\n }\n return this.currentSceneReference.subscribable;\n }\n\n /**\n * Triggered when the scenes get recalculated.\n *\n * @remarks\n * This event indicates that the timing of at least one scene has changed.\n *\n * @eventProperty\n */\n public get onScenesRecalculated() {\n return this.scenes.subscribable;\n }\n\n public frame = 0;\n public speed = 1;\n public fps = 30;\n public duration = 0;\n public finished = false;\n public slides: Slide[] = [];\n\n public previousScene: Scene | null = null;\n public state = PlaybackState.Paused;\n\n public get currentScene(): Scene {\n if (this.currentSceneReference === null) {\n throw new Error('PlaybackManager has not been properly initialized');\n }\n return this.currentSceneReference.current;\n }\n\n public set currentScene(scene: Scene) {\n if (!scene) {\n throw new Error('Invalid scene.');\n }\n this.currentSceneReference ??= new ValueDispatcher<Scene>(scene);\n this.currentSceneReference.current = scene;\n }\n\n private currentSceneReference: ValueDispatcher<Scene> | null = null;\n private scenes = new ValueDispatcher<Scene[]>([]);\n\n public setup(scenes: Scene[]) {\n this.scenes.current = scenes;\n this.currentScene = scenes[0];\n }\n\n public async progress() {\n this.finished = await this.next();\n return this.finished;\n }\n\n public async seek(frame: number): Promise<boolean> {\n if (\n frame <= this.frame ||\n (this.currentScene.isCached() && this.currentScene.lastFrame < frame)\n ) {\n const scene = this.findBestScene(frame);\n if (scene !== this.currentScene) {\n this.currentScene.stopAllMedia();\n this.previousScene = null;\n this.currentScene = scene;\n\n this.frame = this.currentScene.firstFrame;\n await this.currentScene.reset();\n } else if (this.frame >= frame) {\n this.previousScene = null;\n this.frame = this.currentScene.firstFrame;\n await this.currentScene.reset();\n }\n }\n\n this.finished = false;\n while (this.frame < frame && !this.finished) {\n this.finished = await this.next();\n }\n\n return this.finished;\n }\n\n public async reset() {\n this.previousScene = null;\n this.currentScene = this.scenes.current[0];\n this.frame = 0;\n await this.currentScene.reset();\n }\n\n public reload(description?: SceneDescriptionReload<never>) {\n this.scenes.current.forEach(scene => scene.reload(description));\n }\n\n public async recalculate() {\n this.previousScene = null;\n this.slides = [];\n\n const speed = this.speed;\n this.frame = 0;\n this.speed = 1;\n\n const scenes: Scene[] = [];\n try {\n for (const scene of this.scenes.current) {\n await scene.recalculate(frame => {\n this.frame = frame;\n });\n this.slides.push(...scene.slides.onChanged.current);\n scenes.push(scene);\n }\n } finally {\n this.speed = speed;\n }\n\n this.scenes.current = scenes;\n this.duration = this.frame;\n }\n\n private async next(): Promise<boolean> {\n if (this.previousScene) {\n await this.previousScene.next();\n if (this.currentScene.isFinished()) {\n this.previousScene = null;\n }\n }\n\n this.frame += this.speed;\n\n if (this.currentScene.isFinished()) {\n return true;\n }\n\n await this.currentScene.next();\n if (this.previousScene && this.currentScene.isAfterTransitionIn()) {\n this.previousScene = null;\n }\n\n if (this.currentScene.canTransitionOut()) {\n this.previousScene = this.currentScene;\n const nextScene = this.getNextScene(this.previousScene);\n if (nextScene) {\n this.previousScene.stopAllMedia();\n this.currentScene = nextScene;\n await this.currentScene.reset(this.previousScene);\n }\n if (!nextScene || this.currentScene.isAfterTransitionIn()) {\n this.previousScene = null;\n }\n }\n\n return this.currentScene.isFinished();\n }\n\n private findBestScene(frame: number): Scene {\n let lastScene = this.scenes.current[0];\n for (const scene of this.scenes.current) {\n if (!scene.isCached() || scene.lastFrame > frame) {\n return scene;\n }\n lastScene = scene;\n }\n\n return lastScene;\n }\n\n private getNextScene(scene?: Scene): Scene | null {\n const scenes = this.scenes.current;\n if (!scene) {\n return scenes[0];\n }\n\n const index = scenes.findIndex(s => s === scene);\n if (index < 0) {\n return null;\n }\n return scenes[index + 1] ?? null;\n }\n}\n","import type {PlaybackManager, PlaybackState} from './PlaybackManager';\n\n/**\n * A read-only representation of the playback.\n */\nexport class PlaybackStatus {\n public constructor(private readonly playback: PlaybackManager) {}\n\n /**\n * Convert seconds to frames using the current framerate.\n *\n * @param seconds - The seconds to convert.\n */\n public secondsToFrames(seconds: number) {\n return Math.ceil(seconds * this.playback.fps);\n }\n\n /**\n * Convert frames to seconds using the current framerate.\n *\n * @param frames - The frames to convert.\n */\n public framesToSeconds(frames: number) {\n return frames / this.playback.fps;\n }\n\n public get time(): number {\n return this.framesToSeconds(this.playback.frame);\n }\n\n public get frame(): number {\n return this.playback.frame;\n }\n\n public get speed(): number {\n return this.playback.speed;\n }\n\n public get fps(): number {\n return this.playback.fps;\n }\n\n public get state(): PlaybackState {\n return this.playback.state;\n }\n\n /**\n * The time passed since the last frame in seconds.\n */\n public get deltaTime(): number {\n return this.framesToSeconds(1) * this.speed;\n }\n}\n","import type {Logger} from './Logger';\n\nconst SOURCE_URL_REGEX = /^\\/\\/# sourceURL=(.*)$/gm;\nconst INFO_LOG_REGEX = /ERROR: \\d+:(\\d+): (.*)/g;\nconst INFO_TOKEN_REGEX = /^'([^']+)'/;\n\nconst includeWithoutPreprocessor = `\nThe \\`#include\\` directive requires the use of a preprocessor.\n\nMake sure to import the shader from a file:\n\n\\`\\`\\`ts\nimport shader from './shader.glsl';\n\\`\\`\\`\n\nDo **NOT** use the raw loader:\n\n\\`\\`\\`ts\nimport shader from './shader.glsl?raw';\n\\`\\`\\`\n\nDo **NOT** use \\`#include\\` in an inline string:\n\n\\`\\`\\`ts\nconst shader = \\`\\\\\n#include \"example.glsl\"\n\\`;\n\\`\\`\\`\n\n[Learn more](https://motioncanvas.io/docs/shaders) about working with shaders.\n`;\n\n/**\n * @internal\n */\nexport interface WebGLContextOwner {\n setup(gl: WebGL2RenderingContext): void;\n teardown(gl: WebGL2RenderingContext): void;\n}\n\ninterface WebGLProgramData {\n program: WebGLProgram;\n fragment: WebGLShader;\n vertex: WebGLShader;\n}\n\nexport class SharedWebGLContext {\n private gl: WebGL2RenderingContext | null = null;\n private currentOwner: WebGLContextOwner | null = null;\n private readonly programLookup = new Map<string, WebGLProgramData>();\n\n public constructor(private readonly logger: Logger) {}\n\n public borrow(owner: WebGLContextOwner): WebGL2RenderingContext {\n if (this.currentOwner === owner) {\n return this.gl!;\n }\n\n this.currentOwner?.teardown(this.gl!);\n this.currentOwner = owner;\n this.currentOwner.setup(this.getGL());\n return this.gl!;\n }\n\n /**\n * Dispose the WebGL context to free up resources.\n */\n public dispose() {\n if (!this.gl) {\n return;\n }\n\n this.currentOwner?.teardown(this.gl);\n this.currentOwner = null;\n\n this.gl.useProgram(null);\n for (const {program, fragment, vertex} of this.programLookup.values()) {\n this.gl.deleteProgram(program);\n this.gl.deleteShader(fragment);\n this.gl.deleteShader(vertex);\n }\n\n this.programLookup.clear();\n this.gl.getExtension('WEBGL_lose_context')?.loseContext();\n (this.gl.canvas as HTMLCanvasElement).remove();\n this.gl = null;\n }\n\n public getProgram(fragment: string, vertex: string): WebGLProgram | null {\n const key = `${fragment}#${vertex}`;\n if (this.programLookup.has(key)) {\n return this.programLookup.get(key)!.program;\n }\n\n const gl = this.getGL();\n const fragmentShader = this.getShader(gl.FRAGMENT_SHADER, fragment);\n const vertexShader = this.getShader(gl.VERTEX_SHADER, vertex);\n if (!fragmentShader || !vertexShader) {\n return null;\n }\n\n const program = gl.createProgram()!;\n gl.attachShader(program, fragmentShader);\n gl.attachShader(program, vertexShader);\n gl.linkProgram(program);\n\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n this.logger.error({\n message: 'Failed to initialize the shader program.',\n remarks: gl.getProgramInfoLog(program) ?? undefined,\n stack: new Error().stack,\n });\n gl.deleteProgram(program);\n return null;\n }\n\n this.programLookup.set(key, {\n program,\n fragment: fragmentShader,\n vertex: vertexShader,\n });\n\n return program;\n }\n\n private getShader(type: GLenum, source: string): WebGLShader | null {\n const gl = this.getGL();\n const shader = gl.createShader(type)!;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n const log = gl.getShaderInfoLog(shader);\n logGlslError(this.logger, log, source);\n gl.deleteShader(shader);\n return null;\n }\n\n return shader;\n }\n\n private getGL(): WebGL2RenderingContext {\n if (this.gl) {\n return this.gl;\n }\n\n this.gl = document.createElement('canvas').getContext('webgl2', {\n depth: false,\n premultipliedAlpha: false,\n stencil: false,\n powerPreference: 'high-performance',\n });\n if (!this.gl) {\n throw new Error('Failed to initialize WebGL.');\n }\n\n /* NOTE: Temporary debugging code\n const canvas = this.gl.canvas as HTMLCanvasElement;\n document.body.append(canvas);\n canvas.style.position = 'absolute';\n canvas.style.top = '16px';\n canvas.style.right = '16px';\n canvas.style.width = '300px';\n canvas.style.borderRadius = '4px';\n canvas.style.border = '1px solid #ccc';\n canvas.style.backgroundColor = '#141414';\n canvas.style.zIndex = '1000';\n */\n\n return this.gl;\n }\n}\n\nfunction logGlslError(logger: Logger, log: string | null, source: string) {\n let sourceUrl: string | null = null;\n\n SOURCE_URL_REGEX.lastIndex = 0;\n const sourceMatch = SOURCE_URL_REGEX.exec(source);\n if (sourceMatch) {\n const url = new URL(sourceMatch[1], window.location.origin);\n url.searchParams.set('t', Date.now().toString());\n sourceUrl = url.toString();\n }\n\n if (!log) {\n logger.error({\n message: `Unknown shader compilation error.`,\n stack: fakeStackTrace(sourceUrl, 1, 0),\n });\n return null;\n }\n\n let logged = false;\n let result;\n while ((result = INFO_LOG_REGEX.exec(log))) {\n const [, line, message] = result;\n let column = 0;\n const match = message.match(INFO_TOKEN_REGEX);\n if (match) {\n const tokenLine = source.split('\\n')[parseInt(line)! - 1];\n const index = tokenLine.indexOf(match[1]!);\n if (index !== -1) {\n column = index;\n }\n\n if (match[1] === 'include') {\n const line = source\n .split('\\n')\n .find(line => line.startsWith('#include'));\n if (line) {\n logged = true;\n logger.error({\n message: `Shader compilation error: ${message}`,\n remarks: includeWithoutPreprocessor,\n });\n break;\n }\n }\n }\n\n logged = true;\n logger.error({\n message: `Shader compilation error: ${message}`,\n stack: fakeStackTrace(sourceUrl, line, column),\n });\n }\n\n if (!logged) {\n logger.error({\n message: `Shader compilation error: ${log}`,\n stack: fakeStackTrace(sourceUrl, 1, 0),\n });\n }\n}\n\nfunction fakeStackTrace(\n file: string | null,\n line: string | number,\n column: string | number,\n): string | undefined {\n if (!file) {\n return undefined;\n }\n\n return navigator.userAgent.toLowerCase().includes('chrome')\n ? ` at (${file}:${line}:${column})`\n : `@${file}:${line}:${column}`;\n}\n","import {\n AsyncEventDispatcher,\n EventDispatcher,\n ValueDispatcher,\n} from '../events';\nimport type {Scene} from '../scenes';\nimport {clamp} from '../tweening';\nimport {Vector2} from '../types';\nimport {Semaphore} from '../utils';\nimport type {Logger} from './Logger';\nimport {PlaybackManager, PlaybackState} from './PlaybackManager';\nimport {PlaybackStatus} from './PlaybackStatus';\nimport type {Project} from './Project';\nimport {SharedWebGLContext} from './SharedWebGLContext';\n\nexport interface PlayerState extends Record<string, unknown> {\n paused: boolean;\n loop: boolean;\n muted: boolean;\n volume: number;\n speed: number;\n}\n\nexport interface PlayerSettings {\n range: [number, number];\n fps: number;\n size: Vector2;\n resolutionScale: number;\n}\n\n/**\n * The player logic used by the editor and embeddable player.\n *\n * @remarks\n * This class builds on top of the `PlaybackManager` to provide a simple\n * interface similar to other media players. It plays through the animation\n * using a real-time update loop.\n */\nexport class Player {\n /**\n * Triggered during each iteration of the update loop when the frame is ready\n * to be rendered.\n *\n * @remarks\n * Player does not perform any rendering on its own. For the animation to be\n * visible, another class must subscribe to this event and perform the\n * rendering itself. {@link Stage} can be used to display the animation.\n *\n * @eventProperty\n */\n public get onRender() {\n return this.render.subscribable;\n }\n private readonly render = new AsyncEventDispatcher<void>();\n\n public get onStateChanged() {\n return this.playerState.subscribable;\n }\n private readonly playerState: ValueDispatcher<PlayerState>;\n\n public get onFrameChanged() {\n return this.frame.subscribable;\n }\n private readonly frame = new ValueDispatcher(0);\n\n public get onDurationChanged() {\n return this.duration.subscribable;\n }\n private readonly duration = new ValueDispatcher(0);\n\n /**\n * Triggered right after recalculation finishes.\n *\n * @remarks\n * Can be used to provide visual feedback.\n *\n * @eventProperty\n */\n public get onRecalculated() {\n return this.recalculated.subscribable;\n }\n private readonly recalculated = new EventDispatcher<void>();\n\n public readonly playback: PlaybackManager;\n public readonly status: PlaybackStatus;\n public readonly logger: Logger;\n private readonly sharedWebGLContext: SharedWebGLContext;\n\n private readonly lock = new Semaphore();\n private startTime = 0;\n private endTime = Infinity;\n private requestId: number | null = null;\n private renderTime = 0;\n private requestedSeek = -1;\n private requestedRender = false;\n private requestedRecalculation = true;\n private size: Vector2;\n private resolutionScale: number;\n private active = false;\n\n private get startFrame() {\n return Math.min(\n this.playback.duration,\n this.status.secondsToFrames(this.startTime),\n );\n }\n\n private get endFrame() {\n return Math.min(\n this.playback.duration,\n this.status.secondsToFrames(this.endTime),\n );\n }\n\n private get finished() {\n return this.playback.finished || this.playback.frame >= this.endFrame;\n }\n\n public constructor(\n private project: Project,\n private settings: Partial<PlayerSettings> = {},\n private initialState: Partial<PlayerState> = {},\n private initialFrame = -1,\n ) {\n this.playerState = new ValueDispatcher<PlayerState>({\n loop: true,\n muted: true,\n volume: 1,\n speed: 1,\n ...initialState,\n paused: true,\n });\n\n this.sharedWebGLContext = new SharedWebGLContext(this.project.logger);\n this.requestedSeek = initialFrame;\n this.logger = this.project.logger;\n this.playback = new PlaybackManager();\n this.status = new PlaybackStatus(this.playback);\n this.size = settings.size ?? new Vector2(1920, 1080);\n this.resolutionScale = settings.resolutionScale ?? 1;\n this.startTime = settings.range?.[0] ?? 0;\n this.endTime = settings.range?.[1] ?? Infinity;\n this.playback.fps = settings.fps ?? 60;\n\n const scenes: Scene[] = [];\n for (const description of project.scenes) {\n const scene = new description.klass({\n ...description,\n playback: this.status,\n logger: this.project.logger,\n size: this.size,\n resolutionScale: this.resolutionScale,\n sharedWebGLContext: this.sharedWebGLContext,\n experimentalFeatures: project.experimentalFeatures,\n });\n scene.onReloaded.subscribe(() => this.requestRecalculation());\n scene.variables.updateSignals(project.variables ?? {});\n scenes.push(scene);\n }\n this.playback.setup(scenes);\n this.activate();\n }\n\n public async configure(settings: PlayerSettings) {\n await this.lock.acquire();\n let frame = this.playback.frame;\n let recalculate = false;\n this.startTime = settings.range[0];\n this.endTime = settings.range[1];\n const newFps = Math.max(1, settings.fps);\n if (this.playback.fps !== newFps) {\n const ratio = newFps / this.playback.fps;\n this.playback.fps = newFps;\n frame = Math.floor(frame * ratio);\n recalculate = true;\n }\n if (\n !settings.size.exactlyEquals(this.size) ||\n settings.resolutionScale !== this.resolutionScale\n ) {\n this.size = settings.size;\n this.resolutionScale = settings.resolutionScale;\n this.playback.reload({\n size: this.size,\n resolutionScale: this.resolutionScale,\n });\n }\n\n this.lock.release();\n if (recalculate) {\n this.playback.reload();\n this.frame.current = frame;\n this.requestRecalculation();\n this.requestedSeek = frame;\n }\n }\n\n /**\n * Whether the given frame is inside the animation range.\n *\n * @param frame - The frame to check.\n */\n public isInRange(frame: number): boolean {\n return frame >= 0 && frame <= this.playback.duration;\n }\n\n /**\n * Whether the given frame is inside the user-defined range.\n *\n * @param frame - The frame to check.\n */\n public isInUserRange(frame: number): boolean {\n return frame >= this.startFrame && frame <= this.endFrame;\n }\n\n public requestSeek(value: number): void {\n this.requestedSeek = this.clampRange(value);\n }\n\n public requestPreviousFrame(): void {\n this.requestedSeek = this.frame.current - this.playback.speed;\n }\n\n public requestNextFrame(): void {\n this.requestedSeek = this.frame.current + this.playback.speed;\n }\n\n public requestReset(): void {\n this.requestedSeek = 0;\n }\n\n public requestRender(): void {\n this.requestedRender = true;\n }\n\n public toggleLoop(value = !this.playerState.current.loop) {\n if (value !== this.playerState.current.loop) {\n this.playerState.current = {\n ...this.playerState.current,\n loop: value,\n };\n }\n }\n\n public togglePlayback(\n value: boolean = this.playerState.current.paused,\n ): void {\n if (value === this.playerState.current.paused) {\n this.playerState.current = {\n ...this.playerState.current,\n paused: !value,\n };\n\n // hitting play after the animation has finished should reset the\n // playback, even if looping is disabled.\n if (\n value &&\n !this.playerState.current.loop &&\n this.playback.frame === this.playback.duration\n ) {\n this.requestReset();\n }\n }\n }\n\n public toggleAudio(value: boolean = this.playerState.current.muted): void {\n if (value === this.playerState.current.muted) {\n this.playerState.current = {\n ...this.playerState.current,\n muted: !value,\n };\n }\n }\n\n public setAudioVolume(value: number): void {\n const clampedValue = clamp(0, 1, value);\n if (clampedValue !== this.playerState.current.volume) {\n this.playerState.current = {\n ...this.playerState.current,\n volume: clampedValue,\n };\n }\n }\n\n public addAudioVolume(value: number): void {\n this.setAudioVolume(this.playerState.current.volume + value);\n }\n\n public setSpeed(value: number) {\n if (value !== this.playerState.current.speed) {\n this.playback.speed = value;\n this.playback.reload();\n this.playerState.current = {\n ...this.playerState.current,\n speed: value,\n };\n this.requestRecalculation();\n }\n }\n\n public setVariables(variables: Record<string, unknown>) {\n for (const scene of this.playback.onScenesRecalculated.current) {\n scene.variables.updateSignals(variables);\n }\n }\n\n /**\n * Activate the player.\n *\n * @remarks\n * A player needs to be active in order for the update loop to run. Each\n * player is active by default.\n */\n public activate() {\n this.active = true;\n this.request();\n }\n\n /**\n * Deactivate the player.\n *\n * @remarks\n * Deactivating the player prevents its update loop from running. This should\n * be done before disposing the player, to prevent it from running in the\n * background.\n *\n * Just pausing the player does not stop the loop.\n */\n public deactivate() {\n this.active = false;\n this.sharedWebGLContext.dispose();\n this.playback.currentScene.stopAllMedia();\n if (this.requestId !== null) {\n cancelAnimationFrame(this.requestId);\n this.requestId = null;\n }\n }\n\n private requestRecalculation() {\n this.requestedRecalculation = true;\n this.request();\n }\n\n private async prepare(): Promise<\n PlayerState & {seek: number; render: boolean}\n > {\n const state = {\n ...this.playerState.current,\n seek: this.requestedSeek,\n render: this.requestedRender,\n };\n this.requestedSeek = -1;\n this.requestedRender = false;\n\n // Recalculate the project if necessary\n if (this.requestedRecalculation) {\n if (state.seek < 0) {\n state.seek = this.playback.frame;\n }\n try {\n await this.playback.recalculate();\n this.duration.current = this.playback.frame;\n this.recalculated.dispatch();\n } catch (e) {\n this.requestSeek(state.seek);\n throw e;\n } finally {\n this.requestedRecalculation = false;\n }\n }\n\n // Pause if reached the end or the range is 0\n // Seek to the beginning for non-empty scenes\n if (\n (!state.loop && this.finished && !state.paused && state.seek < 0) ||\n this.endFrame === this.startFrame\n ) {\n this.togglePlayback(false);\n state.paused = true;\n state.seek =\n this.endFrame === this.startFrame ? state.seek : this.startFrame;\n }\n\n // Seek to the beginning if looping is enabled\n if (\n state.loop &&\n (state.seek > this.endFrame || (this.finished && !state.paused)) &&\n this.startFrame !== this.endTime\n ) {\n state.seek = this.startFrame;\n }\n\n return state;\n }\n\n private async run() {\n const state = await this.prepare();\n const previousState = this.playback.state;\n this.playback.state = state.paused\n ? PlaybackState.Paused\n : PlaybackState.Playing;\n\n // Seek to the given frame\n if (state.seek >= 0 || !this.isInUserRange(this.status.frame)) {\n const seekFrame = state.seek < 0 ? this.status.frame : state.seek;\n const clampedFrame = this.clampRange(seekFrame);\n this.logger.profile('seek time');\n await this.playback.seek(clampedFrame);\n this.logger.profile('seek time');\n }\n // Do nothing if paused\n else if (state.paused) {\n if (\n state.render ||\n (state.paused && previousState !== PlaybackState.Paused)\n ) {\n // Tells the stage to render the current frame\n await this.render.dispatch();\n }\n\n this.request();\n return;\n }\n\n // Simply move forward one frame\n else if (this.status.frame < this.endFrame) {\n await this.playback.progress();\n }\n\n // Pause if a new slide has just started.\n if (!state.paused && this.playback.currentScene.slides.isWaiting()) {\n this.togglePlayback(false);\n state.paused = true;\n }\n\n // Draw the project\n await this.render.dispatch();\n this.frame.current = this.playback.frame;\n\n this.request();\n }\n\n private request() {\n if (!this.active) return;\n\n // TODO(konsti): make this loop not run when player is paused\n\n this.requestId ??= requestAnimationFrame(async time => {\n this.requestId = null;\n if (time - this.renderTime >= 1000 / (this.status.fps + 5)) {\n this.renderTime = time;\n await this.lock.acquire();\n try {\n await this.run();\n } catch (e: any) {\n this.logger.error(e);\n }\n this.lock.release();\n } else {\n this.request();\n }\n });\n }\n\n public clampRange(frame: number): number {\n return clamp(this.startFrame, this.endFrame, frame);\n }\n}\n","import type {Project} from './Project';\n\ntype SharedSettings = Project['settings']['shared'];\ntype PreviewSettings = Project['settings']['preview'];\ntype RenderingSettings = Project['settings']['rendering'];\n\nexport function getFullPreviewSettings(\n project: Project,\n): SharedSettings & PreviewSettings {\n return {\n ...project.settings.shared,\n ...project.settings.preview,\n };\n}\n\nexport function getFullRenderingSettings(\n project: Project,\n): SharedSettings & RenderingSettings {\n return {\n ...project.settings.shared,\n ...project.settings.rendering,\n };\n}\n","import type {Scene} from '../scenes';\nimport {unwrap} from '../signals';\nimport type {CanvasColorSpace, Color} from '../types';\nimport {Vector2} from '../types';\nimport {getContext} from '../utils';\n\nexport interface StageSettings {\n size: Vector2;\n resolutionScale: number;\n colorSpace: CanvasColorSpace;\n background: Color | string | null;\n}\n\n/**\n * Manages canvases on which an animation can be displayed.\n */\nexport class Stage {\n // TODO Consider adding pooling for canvases.\n\n private background: string | null = null;\n private resolutionScale = 1;\n private colorSpace: CanvasColorSpace = 'srgb';\n private size = Vector2.zero;\n\n public readonly finalBuffer: HTMLCanvasElement;\n private readonly currentBuffer: HTMLCanvasElement;\n private readonly previousBuffer: HTMLCanvasElement;\n\n private context: CanvasRenderingContext2D;\n private currentContext: CanvasRenderingContext2D;\n private previousContext: CanvasRenderingContext2D;\n\n private get canvasSize() {\n return this.size.scale(this.resolutionScale);\n }\n\n public constructor() {\n this.finalBuffer = document.createElement('canvas');\n this.currentBuffer = document.createElement('canvas');\n this.previousBuffer = document.createElement('canvas');\n\n const colorSpace = this.colorSpace;\n this.context = getContext({colorSpace}, this.finalBuffer);\n this.currentContext = getContext({colorSpace}, this.currentBuffer);\n this.previousContext = getContext({colorSpace}, this.previousBuffer);\n }\n\n public configure({\n colorSpace = this.colorSpace,\n size = this.size,\n resolutionScale = this.resolutionScale,\n background = this.background,\n }: Partial<StageSettings>) {\n if (colorSpace !== this.colorSpace) {\n this.colorSpace = colorSpace;\n this.context = getContext({colorSpace}, this.finalBuffer);\n this.currentContext = getContext({colorSpace}, this.currentBuffer);\n this.previousContext = getContext({colorSpace}, this.previousBuffer);\n }\n\n if (\n !size.exactlyEquals(this.size) ||\n resolutionScale !== this.resolutionScale\n ) {\n this.resolutionScale = resolutionScale;\n this.size = size;\n this.resizeCanvas(this.context);\n this.resizeCanvas(this.currentContext);\n this.resizeCanvas(this.previousContext);\n }\n\n this.background =\n typeof background === 'string'\n ? background\n : (background?.serialize() ?? null);\n }\n\n public async render(currentScene: Scene, previousScene: Scene | null) {\n const previousOnTop = previousScene\n ? unwrap(currentScene.previousOnTop)\n : false;\n\n if (previousScene) {\n await previousScene.render(this.previousContext);\n }\n\n await currentScene.render(this.currentContext);\n\n const size = this.canvasSize;\n this.context.clearRect(0, 0, size.width, size.height);\n if (this.background) {\n this.context.save();\n this.context.fillStyle = this.background;\n this.context.fillRect(0, 0, size.width, size.height);\n this.context.restore();\n }\n\n if (previousScene && !previousOnTop) {\n this.context.drawImage(this.previousBuffer, 0, 0);\n }\n this.context.drawImage(this.currentBuffer, 0, 0);\n if (previousOnTop) {\n this.context.drawImage(this.previousBuffer, 0, 0);\n }\n }\n\n public resizeCanvas(context: CanvasRenderingContext2D) {\n const size = this.canvasSize;\n context.canvas.width = size.width;\n context.canvas.height = size.height;\n }\n}\n","import {ValueDispatcher} from '../events';\nimport {clamp} from '../tweening';\n\n/**\n * An estimate of the time remaining until the process is finished.\n */\nexport interface TimeEstimate {\n /**\n * The completion percentage ranging from `0` to `1`.\n */\n completion: number;\n /**\n * The time passed since the beginning of the process in milliseconds.\n */\n elapsed: number;\n /**\n * The estimated time remaining until the process is finished in milliseconds.\n */\n eta: number;\n}\n\n/**\n * Calculates the estimated time remaining until a process is finished.\n */\nexport class TimeEstimator {\n public get onCompletionChanged() {\n return this.completion.subscribable;\n }\n private readonly completion = new ValueDispatcher(0);\n private startTimestamp = 0;\n private lastUpdateTimestamp = 0;\n private nextCompletion = 0;\n\n /**\n * Get the current time estimate.\n *\n * @param timestamp - The timestamp to calculate the estimate against.\n * Defaults to `performance.now()`.\n */\n public estimate(timestamp = performance.now()): TimeEstimate {\n const elapsed = timestamp - this.startTimestamp;\n const completion = this.completion.current;\n\n let eta = Infinity;\n if (completion >= 1) {\n eta = 0;\n } else if (completion > 0) {\n const lastUpdateDuration = this.lastUpdateTimestamp - this.startTimestamp;\n eta = lastUpdateDuration / completion - elapsed;\n eta = Math.max(0, eta);\n } else if (this.nextCompletion > 0) {\n eta = elapsed / this.nextCompletion - elapsed;\n }\n\n return {completion, elapsed, eta};\n }\n\n /**\n * Update the completion percentage.\n *\n * @param completion - The completion percentage ranging from `0` to `1`.\n * @param timestamp - A timestamp at which the process was updated.\n * Defaults to `performance.now()`.\n */\n public update(completion: number, timestamp = performance.now()) {\n this.completion.current = clamp(0, 1, completion);\n this.lastUpdateTimestamp = timestamp;\n }\n\n public reportProgress() {\n if ((window as any).logProgress) {\n (window as any).logProgress(this.completion.current);\n }\n }\n\n /**\n * Reset the estimator.\n *\n * @param nextCompletion - If known, the completion percentage of the next\n * update.\n * @param timestamp - A timestamp at which the process started.\n * Defaults to `performance.now()`.\n */\n public reset(nextCompletion = 0, timestamp = performance.now()) {\n this.startTimestamp = timestamp;\n this.lastUpdateTimestamp = timestamp;\n this.completion.current = 0;\n this.nextCompletion = nextCompletion;\n }\n}\n","import {EventDispatcher, ValueDispatcher} from '../events';\nimport type {ExporterClass} from '../exporter';\nimport {\n FFmpegExporterClient,\n ImageExporter,\n WasmExporter,\n type Exporter,\n} from '../exporter';\nimport type {Scene} from '../scenes';\nimport {clampRemap} from '../tweening';\nimport {Vector2} from '../types';\nimport {Semaphore} from '../utils';\nimport {PlaybackManager, PlaybackState} from './PlaybackManager';\nimport {PlaybackStatus} from './PlaybackStatus';\nimport type {ExporterSettings, Project} from './Project';\nimport {SharedWebGLContext} from './SharedWebGLContext';\nimport type {StageSettings} from './Stage';\nimport {Stage} from './Stage';\nimport {TimeEstimator} from './TimeEstimator';\n\nexport interface RendererSettings extends StageSettings {\n name: string;\n range: [number, number];\n fps: number;\n exporter: ExporterSettings;\n hiddenFolderId?: string;\n}\n\nexport interface AssetInfo {\n key: string;\n type: 'video' | 'audio';\n src: string;\n playbackRate: number;\n volume: number;\n currentTime: number;\n duration: number;\n decoder?: string | null;\n}\n\nexport enum RendererState {\n Initial,\n Working,\n Aborting,\n}\n\nexport enum RendererResult {\n Success,\n Error,\n Aborted,\n}\n\n/**\n * The rendering logic used by the editor to export animations.\n *\n * @remarks\n * This class uses the `PlaybackManager` to render animations. In contrast to a\n * player, a renderer does not use an update loop. It plays through the\n * animation as fast as it can, occasionally pausing to keep the UI responsive.\n *\n * The actual exporting is outsourced to an Exporter.\n */\nexport class Renderer {\n public get onStateChanged() {\n return this.state.subscribable;\n }\n private readonly state = new ValueDispatcher(RendererState.Initial);\n\n public get onFinished() {\n return this.finished.subscribable;\n }\n private readonly finished = new EventDispatcher<RendererResult>();\n\n public get onFrameChanged() {\n return this.frame.subscribable;\n }\n private readonly frame = new ValueDispatcher(0);\n\n public readonly stage = new Stage();\n public readonly estimator = new TimeEstimator();\n\n private readonly lock = new Semaphore();\n private readonly playback: PlaybackManager;\n private readonly status: PlaybackStatus;\n private readonly sharedWebGLContext: SharedWebGLContext;\n private exporter: Exporter | null = null;\n private abortController: AbortController | null = null;\n\n public constructor(private project: Project) {\n this.playback = new PlaybackManager();\n this.status = new PlaybackStatus(this.playback);\n this.sharedWebGLContext = new SharedWebGLContext(this.project.logger);\n const scenes: Scene[] = [];\n\n for (const description of project.scenes) {\n const scene = new description.klass({\n ...description,\n playback: this.status,\n logger: this.project.logger,\n size: new Vector2(1920, 1080),\n resolutionScale: 1,\n sharedWebGLContext: this.sharedWebGLContext,\n experimentalFeatures: project.experimentalFeatures,\n });\n scenes.push(scene);\n }\n this.playback.setup(scenes);\n }\n\n /**\n * Returns number of frames that a project will have.\n */\n public async getNumberOfFrames(settings: RendererSettings) {\n await this.lock.acquire();\n this.estimator.reset();\n this.state.current = RendererState.Working;\n\n await this.reloadScenes(settings);\n await this.playback.recalculate();\n await this.playback.reset();\n\n const frames = this.playback.duration;\n\n this.state.current = RendererState.Initial;\n this.sharedWebGLContext.dispose();\n this.lock.release();\n\n return frames;\n }\n\n public frameToTime(frame: number) {\n return this.status.framesToSeconds(frame);\n }\n\n public timeToFrame(second: number) {\n return this.status.secondsToFrames(second);\n }\n\n /**\n * Render the animation using the provided settings.\n *\n * @param settings - The rendering settings.\n */\n public async render(settings: RendererSettings) {\n if (this.state.current !== RendererState.Initial) return;\n await this.lock.acquire();\n this.estimator.reset();\n this.state.current = RendererState.Working;\n let result: RendererResult;\n try {\n this.abortController = new AbortController();\n result = await this.run(settings, this.abortController.signal);\n } catch (e: any) {\n this.project.logger.error(e);\n result = RendererResult.Error;\n if (this.exporter) {\n try {\n await this.exporter.stop?.(result);\n } catch (_) {\n throw Error(e.message);\n }\n this.exporter = null;\n throw Error(e.message);\n }\n }\n\n this.estimator.update(1);\n this.state.current = RendererState.Initial;\n this.finished.dispatch(result);\n this.sharedWebGLContext.dispose();\n this.lock.release();\n }\n\n /**\n * Abort the ongoing render process.\n */\n public abort() {\n if (this.state.current !== RendererState.Working) return;\n this.abortController?.abort();\n this.state.current = RendererState.Aborting;\n }\n\n /**\n * Export an individual frame.\n *\n * @remarks\n * This method always uses the default `ImageExporter`.\n *\n * @param settings - The rendering settings.\n * @param time - The timestamp to export.\n */\n public async renderFrame(settings: RendererSettings, time: number) {\n await this.lock.acquire();\n\n try {\n const frame = this.status.secondsToFrames(time);\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n this.playback.state = PlaybackState.Rendering;\n\n await this.reloadScenes(settings);\n await this.playback.reset();\n await this.playback.seek(frame);\n await this.stage.render(\n this.playback.currentScene!,\n this.playback.previousScene,\n );\n\n if (import.meta.hot) {\n import.meta.hot.send('twick:export', {\n frame,\n data: this.stage.finalBuffer.toDataURL('image/png'),\n mimeType: 'image/png',\n subDirectories: ['still', this.project.name],\n });\n }\n } catch (e: any) {\n this.project.logger.error(e);\n }\n\n this.lock.release();\n }\n\n private async run(\n settings: RendererSettings,\n signal: AbortSignal,\n ): Promise<RendererResult> {\n // Select exporter\n // TODO(refactor): check if i want to keep it this way\n const exporters: ExporterClass[] = [\n FFmpegExporterClient,\n ImageExporter,\n WasmExporter,\n ];\n\n const exporterClass = exporters.find(\n exporter => exporter.id === settings.exporter.name,\n );\n\n if (!exporterClass) {\n this.project.logger.error(\n `Could not find the \"${settings.exporter.name}\" exporter.`,\n );\n return RendererResult.Error;\n }\n\n // Instantiate exporter\n this.exporter = await exporterClass.create(this.project, settings);\n if (this.exporter.configuration) {\n settings = {\n ...settings,\n ...((await this.exporter.configuration()) ?? {}),\n };\n }\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n this.playback.state = PlaybackState.Rendering;\n const from = this.status.secondsToFrames(settings.range[0]);\n this.frame.current = from;\n\n // Reset\n await this.reloadScenes(settings);\n await this.playback.recalculate();\n await this.playback.reset();\n\n const to = Math.min(\n this.playback.duration,\n this.status.secondsToFrames(settings.range[1]),\n );\n await this.playback.seek(from);\n if (signal.aborted) return RendererResult.Aborted;\n\n await this.exporter.start?.();\n let lastRefresh = performance.now();\n let result = RendererResult.Success;\n\n const mediaByFrames = await this.getMediaByFrames(settings);\n\n // Start audio export\n let generateAudioPromise;\n if (this.exporter && this.exporter.generateAudio) {\n generateAudioPromise = this.exporter.generateAudio(\n mediaByFrames,\n from,\n to,\n );\n }\n\n if (this.exporter && this.exporter.downloadVideos) {\n await this.exporter.downloadVideos(mediaByFrames);\n }\n\n // Main rendering loop\n await this.playback.seek(from);\n try {\n this.estimator.reset(1 / (to - from));\n await this.exportFrame(signal);\n this.estimator.update(clampRemap(from, to, 0, 1, this.playback.frame));\n this.estimator.reportProgress();\n\n if (signal.aborted) {\n result = RendererResult.Aborted;\n } else {\n let finished = false;\n while (!finished) {\n await this.playback.progress();\n await this.exportFrame(signal);\n this.estimator.update(\n clampRemap(from, to, 0, 1, this.playback.frame),\n );\n this.estimator.reportProgress();\n if (performance.now() - lastRefresh > 1 / 30) {\n lastRefresh = performance.now();\n await new Promise(resolve => setTimeout(resolve, 0));\n }\n if (this.playback.finished || this.playback.frame >= to) {\n finished = true;\n }\n if (signal.aborted) {\n result = RendererResult.Aborted;\n finished = true;\n }\n }\n }\n } catch (e: any) {\n this.project.logger.error(e);\n result = RendererResult.Error;\n }\n\n await this.exporter.stop?.(result);\n\n // Only merge media when rendering images was actually successful.\n if (\n result === RendererResult.Success &&\n this.exporter &&\n this.exporter.mergeMedia &&\n generateAudioPromise\n ) {\n try {\n await generateAudioPromise;\n await this.exporter.mergeMedia();\n } catch (e: any) {\n this.project.logger.error(e);\n result = RendererResult.Error;\n }\n }\n\n await this.exporter?.kill?.();\n this.exporter = null;\n\n return result;\n }\n\n private async reloadScenes(settings: RendererSettings) {\n for (let i = 0; i < this.project.scenes.length; i++) {\n const scene = this.playback.onScenesRecalculated.current[i];\n scene.reload({\n size: settings.size,\n resolutionScale: settings.resolutionScale,\n });\n scene.variables.updateSignals(this.project.variables ?? {});\n }\n }\n\n private async exportFrame(signal: AbortSignal) {\n this.frame.current = this.playback.frame;\n await this.stage.render(\n this.playback.currentScene!,\n this.playback.previousScene,\n );\n\n const sceneFrame =\n this.playback.frame - this.playback.currentScene.firstFrame;\n\n await this.exporter!.handleFrame(\n this.stage.finalBuffer,\n this.playback.frame,\n sceneFrame,\n this.playback.currentScene.name,\n signal,\n );\n }\n\n private async getMediaByFrames(settings: RendererSettings) {\n this.stage.configure(settings);\n this.playback.fps = settings.fps;\n this.playback.state = PlaybackState.Rendering;\n const from = this.status.secondsToFrames(settings.range[0]);\n this.frame.current = from;\n\n await this.reloadScenes(settings);\n await this.playback.recalculate();\n await this.playback.reset();\n\n const to = Math.min(\n this.playback.duration,\n this.status.secondsToFrames(settings.range[1]),\n );\n await this.playback.seek(from);\n\n const mediaAssets: AssetInfo[][] = [];\n try {\n const currentMediaAssets = this.playback.currentScene.getMediaAssets();\n mediaAssets.push(currentMediaAssets);\n\n let finished = false;\n while (!finished) {\n await this.playback.progress();\n mediaAssets.push(this.playback.currentScene.getMediaAssets());\n\n if (this.playback.finished || this.playback.frame >= to) {\n finished = true;\n }\n }\n } catch (e: any) {\n this.project.logger.error(e);\n }\n\n return mediaAssets;\n }\n}\n","import {getContext} from '../utils';\n\nlet Canvas: HTMLCanvasElement;\nlet Context: CanvasRenderingContext2D;\n\nexport type ImageDataSource = CanvasImageSource & {\n width: number;\n height: number;\n};\n\nexport function loadImage(source: string): Promise<HTMLImageElement> {\n const image = new Image();\n image.src = source;\n return new Promise((resolve, reject) => {\n if (image.complete) {\n resolve(image);\n } else {\n image.onload = () => resolve(image);\n image.onerror = reject;\n }\n });\n}\n\nexport function loadAnimation(sources: string[]): Promise<HTMLImageElement[]> {\n return Promise.all(sources.map(loadImage));\n}\n\nexport function getImageData(image: ImageDataSource) {\n Canvas ??= document.createElement('canvas');\n Context ??= getContext({willReadFrequently: true}, Canvas);\n\n Canvas.width = image.width;\n Canvas.height = image.height;\n Context.clearRect(0, 0, image.width, image.height);\n Context.drawImage(image, 0, 0);\n\n return Context.getImageData(0, 0, image.width, image.height);\n}\n","import {useThread} from '../utils';\nimport type {ThreadGenerator} from './ThreadGenerator';\n\n/**\n * Cancel all listed tasks.\n *\n * Example:\n * ```ts\n * const task = yield generatorFunction();\n *\n * // do something concurrently\n *\n * yield* cancel(task);\n * ```\n *\n * @param tasks - A list of tasks to cancel.\n */\nexport function cancel(...tasks: ThreadGenerator[]) {\n const thread = useThread();\n for (const task of tasks) {\n const child = thread.children.find(thread => thread.runner === task);\n if (child && !child.canceled) {\n child.cancel();\n child.time(thread.time());\n }\n }\n}\n","import {useThread} from '../utils';\nimport type {ThreadGenerator} from './ThreadGenerator';\n\n/**\n * Run the given task concurrently.\n *\n * @example\n * Using an existing task:\n * ```ts\n * spawn(rect().opacity(1, 1));\n * ```\n * Using a generator function:\n * ```ts\n * spawn(function* () {\n * yield* rect().opacity(1, 1);\n * yield* waitFor('click');\n * yield* rect().opacity(0, 1);\n * });\n * ```\n * Await the spawned task:\n * ```ts\n * const task = spawn(rect().opacity(1, 1));\n * // do some other things\n * yield* join(task); // await the task\n * ```\n *\n * @param task - Either a generator function or a task to run.\n */\nexport function spawn(\n task: ThreadGenerator | (() => ThreadGenerator),\n): ThreadGenerator {\n return useThread().spawn(task);\n}\n","import type {Thread} from './Thread';\n\nexport interface Promisable<T> {\n toPromise(): Promise<T>;\n}\n\nexport function isPromisable(value: any): value is Promisable<any> {\n return (\n value &&\n (typeof value === 'object' || typeof value === 'function') &&\n 'toPromise' in value\n );\n}\n\n/**\n * The main generator type produced by all generator functions in Motion Canvas.\n *\n * @example\n * Yielded values can be used to control the flow of animation:\n *\n * Progress to the next frame:\n * ```ts\n * yield;\n * ```\n *\n * Run another generator synchronously:\n * ```ts\n * yield* generatorFunction();\n * ```\n *\n * Run another generator concurrently:\n * ```ts\n * const task = yield generatorFunction();\n * ```\n *\n * Await a Promise:\n * ```ts\n * const result = yield asyncFunction();\n * ```\n */\nexport type ThreadGenerator = Generator<\n ThreadGenerator | Promise<any> | Promisable<any> | void,\n void,\n Thread | any\n>;\n\n/**\n * Check if the given value is a {@link ThreadGenerator}.\n *\n * @param value - A possible thread {@link ThreadGenerator}.\n */\nexport function isThreadGenerator(value: unknown): value is ThreadGenerator {\n return (\n value !== null &&\n typeof value === 'object' &&\n Symbol.iterator in value &&\n 'next' in value\n );\n}\n","import {decorate, threadable} from '../decorators';\nimport {getTaskName, setTaskName} from '../flow';\nimport {createSignal} from '../signals';\nimport {endThread, startThread, useLogger} from '../utils';\nimport type {ThreadGenerator} from './ThreadGenerator';\nimport {isThreadGenerator} from './ThreadGenerator';\n\nconst reusedGenerator = `\nThis usually happens when you mistakenly reuse a generator that is already\nrunning.\n\nFor example, using \\`yield\\` here will run the opacity generator concurrently and\nstore it in the \\`task\\` variable (in case you want to cancel or await it later):\n\n\\`\\`\\`ts\nconst task = yield rect().opacity(1, 1);\n\\`\\`\\`\n\nTrying to \\`yield\\` this task again will cause the current error:\n\n\\`\\`\\`ts\nyield task;\n\\`\\`\\`\n\nPassing it to other flow functions will also cause the error:\n\n\\`\\`\\`ts\n// prettier-ignore\nyield* all(task);\n\\`\\`\\`\n\nTry to investigate your code looking for \\`yield\\` statements whose return value\nis reused in this way. Here's an example of a common mistake:\n\n\\`\\`\\`ts wrong\n// prettier-ignore\nyield* all(\n yield rect().opacity(1, 1), \n yield rect().x(200, 1),\n);\n\\`\\`\\`\n\n\\`\\`\\`ts correct\n// prettier-ignore\nyield* all(\n rect().opacity(1, 1), \n rect().x(200, 1),\n);\n\\`\\`\\`\n`;\n\ndecorate(noop, threadable());\nexport function* noop(): ThreadGenerator {\n // do nothing\n}\n\n/**\n * A class representing an individual thread.\n *\n * @remarks\n * Thread is a wrapper for a generator that can be executed concurrently.\n *\n * Aside from the main thread, all threads need to have a parent.\n * If a parent finishes execution, all of its child threads are terminated.\n */\nexport class Thread {\n public children: Thread[] = [];\n /**\n * The next value to be passed to the wrapped generator.\n */\n public value: unknown;\n\n /**\n * The current time of this thread.\n *\n * @remarks\n * Used by {@link flow.waitFor} and other time-based functions to properly\n * support durations shorter than one frame.\n */\n public readonly time = createSignal(0);\n\n /**\n * The fixed time of this thread.\n *\n * @remarks\n * Fixed time is a multiple of the frame duration. It can be used to account\n * for the difference between this thread's {@link time} and the time of the\n * current animation frame.\n */\n public get fixed() {\n return this.fixedTime;\n }\n\n /**\n * Check if this thread or any of its ancestors has been canceled.\n */\n public get canceled(): boolean {\n return this.isCanceled || (this.parent?.canceled ?? false);\n }\n\n public get paused(): boolean {\n return this.isPaused || (this.parent?.paused ?? false);\n }\n\n public parent: Thread | null = null;\n private isCanceled = false;\n private isPaused = false;\n private fixedTime = 0;\n private queue: ThreadGenerator[] = [];\n\n public constructor(\n /**\n * The generator wrapped by this thread.\n */\n public readonly runner: ThreadGenerator & {task?: Thread},\n ) {\n if (this.runner.task) {\n useLogger().error({\n message: `The generator \"${getTaskName(\n this.runner,\n )}\" is already being executed by another thread.`,\n remarks: reusedGenerator,\n });\n this.runner = noop();\n }\n this.runner.task = this;\n }\n\n /**\n * Progress the wrapped generator once.\n */\n public next() {\n if (this.paused) {\n return {\n value: null,\n done: false,\n };\n }\n\n startThread(this);\n const result = this.runner.next(this.value);\n endThread(this);\n this.value = null;\n return result;\n }\n\n /**\n * Prepare the thread for the next update cycle.\n *\n * @param dt - The delta time of the next cycle.\n */\n public update(dt: number) {\n if (!this.paused) {\n this.time(this.time() + dt);\n this.fixedTime += dt;\n }\n this.children = this.children.filter(child => !child.canceled);\n }\n\n public spawn(\n child: ThreadGenerator | (() => ThreadGenerator),\n ): ThreadGenerator {\n if (!isThreadGenerator(child)) {\n child = child();\n }\n this.queue.push(child);\n return child;\n }\n\n public add(child: Thread) {\n child.parent = this;\n child.isCanceled = false;\n child.time(this.time());\n child.fixedTime = this.fixedTime;\n this.children.push(child);\n\n setTaskName(child.runner, `unknown ${this.children.length}`);\n }\n\n public drain(callback: (task: ThreadGenerator) => void) {\n this.queue.forEach(callback);\n this.queue = [];\n }\n\n public cancel() {\n this.runner.return();\n this.isCanceled = true;\n this.parent = null;\n this.drain(task => task.return());\n }\n\n public pause(value: boolean) {\n this.isPaused = value;\n }\n}\n","import {decorate, threadable} from '../decorators';\nimport {setTaskName} from '../flow';\nimport {usePlayback} from '../utils';\nimport {Thread} from './Thread';\nimport type {ThreadGenerator} from './ThreadGenerator';\nimport {isThreadGenerator} from './ThreadGenerator';\n\n/**\n * Check if the given value is a [Promise][promise].\n *\n * @param value - A possible [Promise][promise].\n *\n * [promise]: https://developer.mozilla.org/en-US/docs/web/javascript/reference/global_objects/promise\n */\nexport function isPromise(value: any): value is Promise<any> {\n return typeof value?.then === 'function';\n}\n\n/**\n * A generator function or a normal function that returns a generator.\n */\nexport interface ThreadsFactory {\n (): ThreadGenerator;\n}\n\nexport interface ThreadsCallback {\n (root: Thread): void;\n}\n\ndecorate(threads, threadable());\n/**\n * Create a context in which generators can be run concurrently.\n *\n * @remarks\n * From the perspective of the external generator, `threads` is executed\n * synchronously. By default, each scene generator is wrapped in its own\n * `threads` generator.\n *\n * @example\n * ```ts\n * // first\n *\n * yield* threads(function* () {\n * const task = yield generatorFunction();\n * // second\n * }); // <- `task` will be terminated here because the scope\n * // of this `threads` generator has ended\n *\n * // third\n * ```\n *\n * @param factory - A function that returns the generator to run.\n * @param callback - Called whenever threads are created, canceled or finished.\n * Used for debugging purposes.\n */\nexport function* threads(\n factory: ThreadsFactory,\n callback?: ThreadsCallback,\n): ThreadGenerator {\n const playback = usePlayback();\n const root = factory();\n setTaskName(root, 'root');\n const rootThread = new Thread(root);\n callback?.(rootThread);\n\n let threads: Thread[] = [rootThread];\n while (threads.length > 0) {\n const newThreads = [];\n const queue = [...threads];\n const dt = playback.deltaTime;\n\n while (queue.length > 0) {\n const thread = queue.pop();\n if (!thread || thread.canceled) {\n continue;\n }\n\n const result = thread.next();\n if (result.done) {\n thread.cancel();\n continue;\n }\n\n if (isThreadGenerator(result.value)) {\n const child = new Thread(result.value);\n thread.value = result.value;\n thread.add(child);\n\n queue.push(thread);\n queue.push(child);\n } else if (result.value) {\n thread.value = yield result.value;\n queue.push(thread);\n } else {\n thread.update(dt);\n thread.drain(task => {\n const child = new Thread(task);\n thread.add(child);\n newThreads.unshift(child);\n });\n\n newThreads.unshift(thread);\n }\n }\n\n threads = newThreads.filter(thread => !thread.canceled);\n if (threads.length > 0) yield;\n }\n}\n","import type {\n AssetInfo,\n Logger,\n PlaybackStatus,\n SharedWebGLContext,\n} from '../app';\nimport type {SubscribableEvent, SubscribableValueEvent} from '../events';\nimport type {Plugin} from '../plugin';\nimport type {SignalValue} from '../signals';\nimport type {Vector2} from '../types';\nimport type {LifecycleEvents} from './LifecycleEvents';\nimport type {Shaders} from './Shaders';\nimport type {Slides} from './Slides';\nimport type {Variables} from './Variables';\n\n/**\n * The constructor used when creating new scenes.\n *\n * @remarks\n * Each class implementing the {@link Scene} interface should have a matching\n * constructor.\n *\n * @typeParam T - The type of the configuration object. This object will be\n * passed to the constructor from\n * {@link SceneDescription.config}.\n */\nexport interface SceneConstructor<T> {\n new (description: FullSceneDescription<T>): Scene;\n}\n\n/**\n * Describes a scene exposed by scene files.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface SceneDescription<T = unknown> {\n /**\n * Name of the scene.\n */\n name: string;\n /**\n * The class used to instantiate the scene.\n */\n klass: SceneConstructor<T>;\n /**\n * Configuration object.\n */\n config: T;\n /**\n * The stack trace at the moment of creation.\n */\n stack?: string;\n /**\n * A list of plugins to include in the project.\n */\n plugins?: (Plugin | string)[];\n}\n\n/**\n * Describes a complete scene together with the meta file.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface FullSceneDescription<T = unknown> extends SceneDescription<T> {\n size: Vector2;\n resolutionScale: number;\n playback: PlaybackStatus;\n logger: Logger;\n sharedWebGLContext: SharedWebGLContext;\n experimentalFeatures?: boolean;\n}\n\n/**\n * A part of the {@link SceneDescription} that can be updated during reload.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface SceneDescriptionReload<T = unknown> {\n size?: Vector2;\n resolutionScale?: number;\n config?: T;\n stack?: string;\n}\n\nexport type DescriptionOf<TScene> =\n TScene extends Scene<infer TConfig> ? SceneDescription<TConfig> : never;\n\n/**\n * Describes cached information about the timing of a scene.\n */\nexport interface CachedSceneData {\n firstFrame: number;\n lastFrame: number;\n transitionDuration: number;\n duration: number;\n}\n\n/**\n * Signifies the various stages of a {@link Scene}'s render lifecycle.\n */\nexport enum SceneRenderEvent {\n /**\n * Occurs before the render starts when the Scene transitions are applied.\n */\n BeforeRender,\n /**\n * Occurs at the beginning of a render when the Scene's\n * {@link utils.useContext} handlers are applied.\n */\n BeginRender,\n /**\n * Occurs at the end of a render when the Scene's\n * {@link utils.useContextAfter} handlers are applied.\n */\n FinishRender,\n /**\n * Occurs after a render ends.\n */\n AfterRender,\n}\n\n/**\n * The main interface for scenes.\n *\n * @remarks\n * Any class implementing this interface should have a constructor matching\n * {@link SceneConstructor}.\n *\n * @typeParam T - The type of the configuration object.\n */\nexport interface Scene<T = unknown> {\n /**\n * Name of the scene.\n *\n * @remarks\n * Will be passed as the second argument to the constructor.\n */\n readonly name: string;\n /**\n * Reference to the project.\n */\n readonly playback: PlaybackStatus;\n /**\n * @experimental\n */\n readonly shaders: Shaders;\n readonly slides: Slides;\n readonly logger: Logger;\n readonly variables: Variables;\n\n creationStack?: string;\n\n /**\n * The frame at which this scene starts.\n */\n get firstFrame(): number;\n\n /**\n * The frame at which this scene ends.\n */\n get lastFrame(): number;\n\n /**\n * Triggered when the cached data changes.\n *\n * @eventProperty\n */\n get onCacheChanged(): SubscribableValueEvent<CachedSceneData>;\n\n /**\n * Triggered when the scene is reloaded.\n *\n * @eventProperty\n */\n get onReloaded(): SubscribableEvent<void>;\n\n /**\n * Triggered after scene is recalculated.\n *\n * @eventProperty\n */\n get onRecalculated(): SubscribableEvent<void>;\n\n /**\n * The {@link scenes.LifecycleEvents} of this scene.\n */\n get lifecycleEvents(): LifecycleEvents;\n\n /**\n * The {@link scenes.LifecycleEvents} of this scene.\n *\n * @deprecated Use {@link lifecycleEvents} instead.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n get LifecycleEvents(): LifecycleEvents;\n\n /**\n * Triggered at various stages of the render lifecycle with an event title and a Context2D.\n *\n * @eventProperty\n */\n get onRenderLifecycle(): SubscribableEvent<\n [SceneRenderEvent, CanvasRenderingContext2D]\n >;\n\n /**\n * Triggered when the scene is reset.\n *\n * @eventProperty\n */\n get onReset(): SubscribableEvent<void>;\n\n /**\n * The scene directly before this scene, or null if omitted for performance.\n */\n get previous(): Scene | null;\n\n /**\n * Whether experimental features are enabled.\n */\n get experimentalFeatures(): boolean;\n\n /**\n * Render the scene onto a canvas.\n *\n * @param context - The context to used when rendering.\n */\n render(context: CanvasRenderingContext2D): Promise<void>;\n\n /**\n * Reload the scene.\n *\n * @remarks\n * This method is called whenever something related to this scene has changed:\n * time events, source code, metadata, etc.\n *\n * Should trigger {@link onReloaded}.\n *\n * @param description - If present, an updated version of the description.\n */\n reload(description?: SceneDescriptionReload<T>): void;\n\n /**\n * Recalculate the scene.\n *\n * @remarks\n * The task of this method is to calculate new timings stored in the cache.\n * When this method is invoked, `this.project.frame` is set to the frame at\n * which this scene should start ({@link firstFrame}).\n *\n * At the end of execution, this method should set `this.project.frame` to the\n * frame at which this scene ends ({@link lastFrame}).\n *\n * Should trigger {@link onRecalculated}.\n */\n recalculate(setFrame: (frame: number) => void): Promise<void>;\n\n /**\n * Progress this scene one frame forward.\n */\n next(): Promise<void>;\n\n /**\n * Reset this scene to its initial state.\n *\n * @param previous - If present, the previous scene.\n */\n reset(previous?: Scene): Promise<void>;\n\n /**\n * Get the size of this scene.\n *\n * @remarks\n * Usually returns `this.project.getSize()`.\n */\n getSize(): Vector2;\n\n /**\n * Get the real size of this scene.\n *\n * @remarks\n * Returns the size of the scene multiplied by the resolution scale.\n * This is the actual size of the canvas onto which the scene is rendered.\n */\n getRealSize(): Vector2;\n\n /**\n * Is this scene in the {@link SceneState.AfterTransitionIn} state?\n */\n isAfterTransitionIn(): boolean;\n\n /**\n * Is this scene in the {@link SceneState.CanTransitionOut} state?\n */\n canTransitionOut(): boolean;\n\n /**\n * Is this scene in the {@link SceneState.Finished} state?\n */\n isFinished(): boolean;\n\n /**\n * Enter the {@link SceneState.Initial} state.\n */\n enterInitial(): void;\n\n /**\n * Enter the {@link SceneState.AfterTransitionIn} state.\n */\n enterAfterTransitionIn(): void;\n\n /**\n * Enter the {@link SceneState.CanTransitionOut} state.\n */\n enterCanTransitionOut(): void;\n\n /**\n * Is this scene cached?\n *\n * @remarks\n * Used only by {@link GeneratorScene}. Seeking through a project that\n * contains at least one uncached scene will log a warning to the console.\n *\n * Should always return `true`.\n */\n isCached(): boolean;\n\n /**\n * Get all media assets\n */\n getMediaAssets(): Array<AssetInfo>;\n\n stopAllMedia(): void;\n\n adjustVolume(volumeScale: number): void;\n\n /**\n * Should this scene be rendered below the previous scene during a transition?\n */\n previousOnTop: SignalValue<boolean>;\n}\n","import {EventDispatcher} from '../events';\nimport type {Scene} from './Scene';\nimport {SceneRenderEvent} from './Scene';\n\n/**\n * Lifecycle events for {@link Scene} that are cleared on every reset.\n */\nexport class LifecycleEvents {\n public get onBeforeRender() {\n return this.beforeRender.subscribable;\n }\n protected readonly beforeRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onBeginRender() {\n return this.beginRender.subscribable;\n }\n protected readonly beginRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onFinishRender() {\n return this.finishRender.subscribable;\n }\n protected readonly finishRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public get onAfterRender() {\n return this.afterRender.subscribable;\n }\n protected readonly afterRender =\n new EventDispatcher<CanvasRenderingContext2D>();\n\n public constructor(private readonly scene: Scene) {\n this.scene.onRenderLifecycle.subscribe(([event, ctx]) => {\n switch (event) {\n case SceneRenderEvent.BeforeRender:\n return this.beforeRender.dispatch(ctx);\n case SceneRenderEvent.BeginRender:\n return this.beginRender.dispatch(ctx);\n case SceneRenderEvent.FinishRender:\n return this.finishRender.dispatch(ctx);\n case SceneRenderEvent.AfterRender:\n return this.afterRender.dispatch(ctx);\n }\n });\n this.scene.onReset.subscribe(() => {\n this.beforeRender.clear();\n this.beginRender.clear();\n this.finishRender.clear();\n this.afterRender.clear();\n });\n }\n}\n","/**\n * Describes the state of a scene.\n */\nexport enum SceneState {\n /**\n * The scene has just been created/reset.\n */\n Initial,\n\n /**\n * The scene has finished transitioning in.\n *\n * @remarks\n * Informs the Project that the previous scene is no longer necessary and can\n * be disposed of.\n */\n AfterTransitionIn,\n\n /**\n * The scene is ready to transition out.\n *\n * @remarks\n * Informs the project that the next scene can begin.\n * The {@link Scene.next} method will still be invoked until the next scene\n * enters {@link AfterTransitionIn}.\n */\n CanTransitionOut,\n\n /**\n * The scene has finished.\n *\n * @remarks\n * Invoking {@link Scene.next} won't have any effect.\n */\n Finished,\n}\n","import type {\n SharedWebGLContext,\n WebGLContextOwner,\n} from '../app/SharedWebGLContext';\nimport type {Scene} from './Scene';\n\n/**\n * @internal\n */\nexport const UNIFORM_RESOLUTION = 'resolution';\n/**\n * @internal\n */\nexport const UNIFORM_DESTINATION_TEXTURE = 'destinationTexture';\n/**\n * @internal\n */\nexport const UNIFORM_SOURCE_TEXTURE = 'sourceTexture';\n/**\n * @internal\n */\nexport const UNIFORM_TIME = 'time';\n/**\n * @internal\n */\nexport const UNIFORM_DELTA_TIME = 'deltaTime';\n/**\n * @internal\n */\nexport const UNIFORM_FRAMERATE = 'framerate';\n/**\n * @internal\n */\nexport const UNIFORM_FRAME = 'frame';\n/**\n * @internal\n */\nexport const UNIFORM_SOURCE_MATRIX = 'sourceMatrix';\n/**\n * @internal\n */\nexport const UNIFORM_DESTINATION_MATRIX = 'destinationMatrix';\n\n// language=glsl\nconst FragmentShader = `\\\n#version 300 es\n\nin vec2 position;\n\nout vec2 screenUV;\nout vec2 sourceUV;\nout vec2 destinationUV;\n\nuniform mat4 sourceMatrix;\nuniform mat4 destinationMatrix;\n\nvoid main() {\n vec2 position_source = position * 0.5 + 0.5;\n vec4 position_screen = sourceMatrix * vec4(position_source, 0, 1);\n\n screenUV = position_screen.xy;\n sourceUV = position_source;\n destinationUV = (destinationMatrix * position_screen).xy;\n\n gl_Position = (position_screen - 0.5) * 2.0;\n}\n`;\n\n/**\n * @internal\n */\nexport class Shaders implements WebGLContextOwner {\n private gl: WebGL2RenderingContext | null = null;\n private positionBuffer: WebGLBuffer | null = null;\n private sourceTexture: WebGLTexture | null = null;\n private destinationTexture: WebGLTexture | null = null;\n private positionLocation = 0;\n private readonly quadPositions = new Float32Array([\n -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0, -1.0,\n ]);\n\n public constructor(\n private readonly scene: Scene,\n private readonly sharedContext: SharedWebGLContext,\n ) {\n scene.onReloaded.subscribe(this.handleReload);\n }\n\n public setup(gl: WebGL2RenderingContext): void {\n this.gl = gl;\n this.updateViewport();\n this.positionBuffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, this.quadPositions, gl.STATIC_DRAW);\n gl.vertexAttribPointer(this.positionLocation, 2, gl.FLOAT, false, 0, 0);\n gl.enableVertexAttribArray(this.positionLocation);\n\n this.sourceTexture = gl.createTexture();\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, this.sourceTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n\n this.destinationTexture = gl.createTexture();\n gl.activeTexture(gl.TEXTURE1);\n gl.bindTexture(gl.TEXTURE_2D, this.destinationTexture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n }\n\n public teardown(gl: WebGL2RenderingContext): void {\n gl.deleteBuffer(this.positionBuffer);\n gl.disableVertexAttribArray(this.positionLocation);\n gl.deleteTexture(this.sourceTexture);\n gl.deleteTexture(this.destinationTexture);\n this.positionBuffer = null;\n this.sourceTexture = null;\n this.destinationTexture = null;\n this.gl = null;\n }\n\n private handleReload = () => {\n if (this.gl) {\n this.updateViewport();\n }\n };\n\n private updateViewport() {\n if (this.gl) {\n const size = this.scene.getRealSize();\n this.gl.canvas.width = size.width;\n this.gl.canvas.height = size.height;\n this.gl.viewport(0, 0, size.width, size.height);\n }\n }\n\n public getGL() {\n return this.gl ?? this.sharedContext.borrow(this);\n }\n\n public getProgram(fragment: string) {\n const program = this.sharedContext.getProgram(fragment, FragmentShader);\n if (!program) {\n return null;\n }\n\n const size = this.scene.getRealSize();\n const gl = this.getGL();\n gl.useProgram(program);\n gl.uniform1i(gl.getUniformLocation(program, UNIFORM_SOURCE_TEXTURE), 0);\n gl.uniform1i(\n gl.getUniformLocation(program, UNIFORM_DESTINATION_TEXTURE),\n 1,\n );\n gl.uniform2f(\n gl.getUniformLocation(program, UNIFORM_RESOLUTION),\n size.x,\n size.y,\n );\n gl.uniform1f(\n gl.getUniformLocation(program, UNIFORM_DELTA_TIME),\n this.scene.playback.deltaTime,\n );\n gl.uniform1f(\n gl.getUniformLocation(program, UNIFORM_FRAMERATE),\n this.scene.playback.fps,\n );\n\n return program;\n }\n\n public copyTextures(destination: TexImageSource, source: TexImageSource) {\n this.copyTexture(source, this.sourceTexture!);\n this.copyTexture(destination, this.destinationTexture!);\n }\n\n public clear() {\n const gl = this.getGL();\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n public render() {\n const gl = this.getGL();\n gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n }\n\n private copyTexture(source: TexImageSource, texture: WebGLTexture) {\n const gl = this.getGL();\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);\n gl.generateMipmap(gl.TEXTURE_2D);\n }\n}\n","import {PlaybackState} from '../app/PlaybackManager';\nimport {ValueDispatcher} from '../events';\nimport type {Scene} from './Scene';\n\nexport interface Slide {\n id: string;\n name: string;\n time: number;\n scene: Scene;\n stack?: string;\n}\n\nexport class Slides {\n public get onChanged() {\n return this.slides.subscribable;\n }\n private readonly slides = new ValueDispatcher<Slide[]>([]);\n\n private readonly lookup = new Map<string, Slide>();\n private readonly collisionLookup = new Set<string>();\n private current: Slide | null = null;\n private canResume = false;\n private waitsForId: string | null = null;\n private targetId: string | null = null;\n\n public constructor(private readonly scene: Scene) {\n this.scene.onReloaded.subscribe(this.handleReload);\n this.scene.onReset.subscribe(this.handleReset);\n this.scene.onRecalculated.subscribe(this.handleRecalculated);\n }\n\n public setTarget(target: string | null) {\n this.targetId = target;\n }\n\n public resume() {\n this.canResume = true;\n }\n\n public isWaitingFor(slide: string) {\n return this.waitsForId === slide;\n }\n\n public isWaiting() {\n return this.waitsForId !== null;\n }\n\n public didHappen(slide: string) {\n if (this.current === null) {\n return false;\n }\n\n for (const key of this.lookup.keys()) {\n if (key === slide) {\n return true;\n }\n if (key === this.current?.id) {\n return false;\n }\n }\n\n return false;\n }\n\n public getCurrent() {\n return this.current;\n }\n\n public register(name: string, initialTime: number) {\n if (this.waitsForId !== null) {\n throw new Error(\n `The animation already waits for a slide: ${this.waitsForId}.`,\n );\n }\n\n const id = this.toId(name);\n if (this.scene.playback.state !== PlaybackState.Presenting) {\n if (!this.lookup.has(id)) {\n this.lookup.set(id, {\n id,\n name,\n time: initialTime,\n scene: this.scene,\n stack: new Error().stack,\n });\n }\n\n if (this.collisionLookup.has(name)) {\n this.scene.logger.warn({\n message: `A slide named \"${name}\" already exists.`,\n stack: new Error().stack,\n });\n } else {\n this.collisionLookup.add(name);\n }\n }\n\n this.waitsForId = id;\n this.current = this.lookup.get(id) ?? null;\n this.canResume = false;\n }\n\n public shouldWait(name: string): boolean {\n const id = this.toId(name);\n if (this.waitsForId !== id) {\n throw new Error(\n `The animation waits for a different slide: ${this.waitsForId}.`,\n );\n }\n const data = this.lookup.get(id);\n if (!data) {\n throw new Error(`Could not find the \"${name}\" slide.`);\n }\n\n let canResume = this.canResume;\n if (this.scene.playback.state !== PlaybackState.Presenting) {\n canResume = id !== this.targetId;\n }\n\n if (canResume) {\n this.waitsForId = null;\n }\n return !canResume;\n }\n\n private handleReload = () => {\n this.lookup.clear();\n this.collisionLookup.clear();\n this.current = null;\n this.waitsForId = null;\n this.targetId = null;\n };\n\n private handleReset = () => {\n this.collisionLookup.clear();\n this.current = null;\n this.waitsForId = null;\n };\n\n private handleRecalculated = () => {\n this.slides.current = [...this.lookup.values()];\n };\n\n private toId(name: string) {\n return `${this.scene.name}:${name}`;\n }\n}\n","import type {SimpleSignal} from '../signals';\nimport {createSignal} from '../signals';\nimport type {Scene} from './Scene';\n\nexport class Variables {\n private signals: {[key: string]: SimpleSignal<any>} = {};\n private variables: Record<string, unknown> = {};\n\n public constructor(private readonly scene: Scene) {\n scene.onReset.subscribe(this.handleReset);\n }\n\n /**\n * Get variable signal if exists or create signal if not\n *\n * @param name - The name of the variable.\n * @param initial - The initial value of the variable. It will be used if the\n * variable was not configured from the outside.\n */\n public get<T>(name: string, initial: T): () => T {\n this.signals[name] ??= createSignal(this.variables[name] ?? initial);\n return () => this.signals[name]();\n }\n\n /**\n * Update all signals with new project variable values.\n */\n public updateSignals(variables: Record<string, unknown>) {\n this.variables = variables;\n Object.keys(variables).map(variableName => {\n if (variableName in this.signals) {\n this.signals[variableName](variables[variableName]);\n }\n });\n }\n\n /**\n * Reset all stored signals.\n */\n public handleReset = () => {\n this.signals = {};\n };\n}\n","import type {AssetInfo, Logger, PlaybackStatus} from '../app';\nimport {decorate, threadable} from '../decorators';\nimport {EventDispatcher, ValueDispatcher} from '../events';\nimport type {SignalValue} from '../signals';\nimport {DependencyContext} from '../signals';\nimport type {Thread, ThreadGenerator} from '../threading';\nimport {isPromisable, isPromise, threads} from '../threading';\nimport type {Vector2} from '../types';\nimport {endPlayback, endScene, startPlayback, startScene} from '../utils';\nimport {LifecycleEvents} from './LifecycleEvents';\nimport type {\n CachedSceneData,\n FullSceneDescription,\n Scene,\n SceneDescriptionReload,\n SceneRenderEvent,\n} from './Scene';\nimport {SceneState} from './SceneState';\nimport {Shaders} from './Shaders';\nimport {Slides} from './Slides';\nimport type {Threadable} from './Threadable';\nimport {Variables} from './Variables';\n\nexport interface ThreadGeneratorFactory<T> {\n (view: T): ThreadGenerator;\n}\n\n/**\n * The default implementation of the {@link Scene} interface.\n *\n * Uses generators to control the animation.\n */\nexport abstract class GeneratorScene<T>\n implements Scene<ThreadGeneratorFactory<T>>, Threadable\n{\n public readonly name: string;\n public readonly playback: PlaybackStatus;\n public readonly logger: Logger;\n public readonly shaders: Shaders;\n public readonly slides: Slides;\n public readonly variables: Variables;\n public creationStack?: string;\n public previousOnTop: SignalValue<boolean>;\n\n public get firstFrame() {\n return this.cache.current.firstFrame;\n }\n\n public get lastFrame() {\n return this.firstFrame + this.cache.current.duration;\n }\n\n public get onCacheChanged() {\n return this.cache.subscribable;\n }\n private readonly cache = new ValueDispatcher<CachedSceneData>({\n firstFrame: 0,\n transitionDuration: 0,\n duration: 0,\n lastFrame: 0,\n });\n\n public get onReloaded() {\n return this.reloaded.subscribable;\n }\n private readonly reloaded = new EventDispatcher<void>();\n\n public get onRecalculated() {\n return this.recalculated.subscribable;\n }\n private readonly recalculated = new EventDispatcher<void>();\n\n public get onThreadChanged() {\n return this.thread.subscribable;\n }\n private readonly thread = new ValueDispatcher<Thread | null>(null);\n\n public get onRenderLifecycle() {\n return this.renderLifecycle.subscribable;\n }\n protected readonly renderLifecycle = new EventDispatcher<\n [SceneRenderEvent, CanvasRenderingContext2D]\n >();\n\n public get onReset() {\n return this.afterReset.subscribable;\n }\n private readonly afterReset = new EventDispatcher<void>();\n\n public readonly lifecycleEvents: LifecycleEvents = new LifecycleEvents(this);\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get LifecycleEvents() {\n this.logger.warn(\n 'LifecycleEvents is deprecated. Use lifecycleEvents instead.',\n );\n return this.lifecycleEvents;\n }\n\n public get previous() {\n return this.previousScene;\n }\n\n public getMediaAssets(): Array<AssetInfo> {\n return [];\n }\n\n public stopAllMedia(): void {}\n\n public abstract adjustVolume(volumeScale: number): void;\n\n public readonly experimentalFeatures: boolean;\n\n protected resolutionScale: number;\n private runnerFactory: ThreadGeneratorFactory<T>;\n private previousScene: Scene | null = null;\n private runner: ThreadGenerator | null = null;\n private state: SceneState = SceneState.Initial;\n private cached = false;\n // TODO(refactor): seems to be unused\n private counters: Record<string, number> = {};\n private size: Vector2;\n\n public constructor(\n description: FullSceneDescription<ThreadGeneratorFactory<T>>,\n ) {\n this.name = description.name;\n this.size = description.size;\n this.resolutionScale = description.resolutionScale;\n this.logger = description.logger;\n this.playback = description.playback;\n this.runnerFactory = description.config;\n this.creationStack = description.stack;\n this.experimentalFeatures = description.experimentalFeatures ?? false;\n\n decorate(this.runnerFactory, threadable(this.name));\n this.variables = new Variables(this);\n this.shaders = new Shaders(this, description.sharedWebGLContext);\n this.slides = new Slides(this);\n\n this.previousOnTop = false;\n }\n\n public abstract getView(): T;\n\n /**\n * Update the view.\n *\n * Invoked after each step of the main generator.\n * Can be used for calculating layout.\n *\n * Can modify the state of the view.\n */\n public update() {\n // do nothing\n }\n\n public async render(context: CanvasRenderingContext2D): Promise<void> {\n let iterations = 0;\n do {\n iterations++;\n await DependencyContext.consumePromises();\n context.save();\n context.clearRect(0, 0, context.canvas.width, context.canvas.height);\n await this.draw(context);\n context.restore();\n } while (DependencyContext.hasPromises() && iterations < 10);\n\n if (iterations > 1) {\n this.logger.debug(`render iterations: ${iterations}`);\n }\n }\n\n protected abstract draw(context: CanvasRenderingContext2D): Promise<void>;\n\n public reload({\n config,\n size,\n stack,\n resolutionScale,\n }: SceneDescriptionReload<ThreadGeneratorFactory<T>> = {}) {\n if (config) {\n this.runnerFactory = config;\n }\n if (size) {\n this.size = size;\n }\n if (resolutionScale) {\n this.resolutionScale = resolutionScale;\n }\n if (stack) {\n this.creationStack = stack;\n }\n this.cached = false;\n this.reloaded.dispatch();\n }\n\n public async recalculate(setFrame: (frame: number) => void) {\n const cached = this.cache.current;\n cached.firstFrame = this.playback.frame;\n cached.lastFrame = cached.firstFrame + cached.duration;\n\n if (this.isCached()) {\n setFrame(cached.lastFrame);\n this.cache.current = {...cached};\n return;\n }\n\n cached.transitionDuration = -1;\n await this.reset();\n while (!this.canTransitionOut()) {\n if (\n cached.transitionDuration < 0 &&\n this.state === SceneState.AfterTransitionIn\n ) {\n cached.transitionDuration = this.playback.frame - cached.firstFrame;\n }\n setFrame(this.playback.frame + 1);\n await this.next();\n }\n\n if (cached.transitionDuration === -1) {\n cached.transitionDuration = 0;\n }\n\n cached.lastFrame = this.playback.frame;\n cached.duration = cached.lastFrame - cached.firstFrame;\n // Prevent the page from becoming unresponsive.\n await new Promise(resolve => setTimeout(resolve, 0));\n this.cached = true;\n this.cache.current = {...cached};\n this.recalculated.dispatch();\n }\n\n public async next() {\n if (!this.runner) {\n return;\n }\n\n let result = this.execute(() => this.runner!.next());\n this.update();\n while (result.value) {\n if (isPromisable(result.value)) {\n const value = await result.value.toPromise();\n result = this.execute(() => this.runner!.next(value));\n } else if (isPromise(result.value)) {\n const value = await result.value;\n result = this.execute(() => this.runner!.next(value));\n } else {\n this.logger.warn({\n message: 'Invalid value yielded by the scene.',\n object: result.value,\n });\n result = this.execute(() => this.runner!.next(result.value));\n }\n this.update();\n }\n\n if (DependencyContext.hasPromises()) {\n const promises = await DependencyContext.consumePromises();\n this.logger.warn({\n message:\n 'Tried to access an asynchronous property before the node was ready. ' +\n 'Make sure to yield the node before accessing the property.',\n stack: promises[0].stack,\n inspect: promises[0].owner?.key ?? undefined,\n });\n }\n\n if (result.done) {\n this.state = SceneState.Finished;\n }\n }\n\n public async reset(previousScene: Scene | null = null) {\n this.counters = {};\n this.previousScene = previousScene;\n this.previousOnTop = false;\n this.runner = threads(\n () => this.runnerFactory(this.getView()),\n thread => {\n this.thread.current = thread;\n },\n );\n this.state = SceneState.AfterTransitionIn;\n this.afterReset.dispatch();\n await this.next();\n }\n\n public getSize(): Vector2 {\n return this.size;\n }\n\n public getRealSize(): Vector2 {\n return this.size.mul(this.resolutionScale);\n }\n\n public isAfterTransitionIn(): boolean {\n return this.state === SceneState.AfterTransitionIn;\n }\n\n public canTransitionOut(): boolean {\n return (\n this.state === SceneState.CanTransitionOut ||\n this.state === SceneState.Finished\n );\n }\n\n public isFinished(): boolean {\n return this.state === SceneState.Finished;\n }\n\n public enterInitial() {\n if (this.state === SceneState.AfterTransitionIn) {\n this.state = SceneState.Initial;\n } else {\n this.logger.warn(\n `Scene ${this.name} entered initial in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public enterAfterTransitionIn() {\n if (this.state === SceneState.Initial) {\n this.state = SceneState.AfterTransitionIn;\n } else {\n this.logger.warn(\n `Scene ${this.name} transitioned in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public enterCanTransitionOut() {\n if (\n this.state === SceneState.AfterTransitionIn ||\n this.state === SceneState.Initial // only on recalculate\n ) {\n this.state = SceneState.CanTransitionOut;\n } else {\n this.logger.warn(\n `Scene ${this.name} was marked as finished in an unexpected state: ${this.state}`,\n );\n }\n }\n\n public isCached() {\n return this.cached;\n }\n\n /**\n * Invoke the given callback in the context of this scene.\n *\n * @remarks\n * This method makes sure that the context of this scene is globally available\n * during the execution of the callback.\n *\n * @param callback - The callback to invoke.\n */\n protected execute<T>(callback: () => T): T {\n let result: T;\n startScene(this);\n startPlayback(this.playback);\n try {\n result = callback();\n } finally {\n endPlayback(this.playback);\n endScene(this);\n }\n\n return result;\n }\n}\n","import type {Vector2} from '../types/Vector';\n\n/**\n * Represents an element to inspect.\n *\n * @remarks\n * The type is not important because the UI does not interact with it.\n * It serves as a key that will be passed back to an Inspectable scene to\n * receive more information about said element.\n */\nexport type InspectedElement = unknown;\n\n/**\n * Represents attributes of an inspected element.\n */\nexport type InspectedAttributes = {\n stack?: string;\n [K: string]: any;\n};\n\n/**\n * Scenes can implement this interface to make their components\n * inspectable through the UI.\n */\nexport interface Inspectable {\n /**\n * Get a possible element to inspect at a given position.\n *\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n */\n inspectPosition(x: number, y: number): InspectedElement | null;\n\n /**\n * Check if the inspected element is still valid.\n *\n * @remarks\n * If a scene destroys and recreates its components upon every reset, the\n * reference may no longer be valid. Even though the component is still\n * present. This method should check that and return a new reference.\n *\n * @param element - The element to validate.\n */\n validateInspection(element: InspectedElement | null): InspectedElement | null;\n\n /**\n * Return the attributes of the inspected element.\n *\n * @remarks\n * This information will be displayed in the \"Properties\" panel.\n *\n * @param element - The element to inspect.\n */\n inspectAttributes(element: InspectedElement): InspectedAttributes | null;\n\n /**\n * Draw an overlay for the inspected element.\n *\n * @remarks\n * This method can be used to overlay additional information about an\n * element on top of the animation.\n *\n * @param element - The element for which to draw an overlay.\n * @param matrix - A local-to-screen matrix.\n * @param context - The context to draw with.\n */\n drawOverlay(\n element: InspectedElement,\n matrix: DOMMatrix,\n context: CanvasRenderingContext2D,\n ): void;\n\n /**\n * Transform the absolute mouse coordinates into the scene's coordinate system.\n *\n * @param x - The x coordinate.\n * @param y - The y coordinate.\n */\n transformMousePosition(x: number, y: number): Vector2 | null;\n}\n\nexport function isInspectable(value: any): value is Inspectable {\n return value && typeof value === 'object' && 'validateInspection' in value;\n}\n","import {map} from '../tweening';\nimport {range} from '../utils';\n\n/**\n * // TODO(refactor): maybe we can delete this\n *\n * A random number generator based on\n * {@link https://gist.github.com/tommyettinger/46a874533244883189143505d203312c | Mulberry32}.\n */\nexport class Random {\n /**\n * Previously generated Gaussian random number.\n *\n * @remarks\n * This is an optimization.\n * Since {@link gauss} generates a pair of independent Gaussian random\n * numbers, it returns one immediately and stores the other for the next call\n * to {@link gauss}.\n */\n private nextGauss: number | null = null;\n\n public constructor(private state: number) {}\n\n /**\n * @internal\n */\n public static createSeed() {\n return Math.floor(Math.random() * 4294967296);\n }\n\n /**\n * Get the next random float in the given range.\n *\n * @param from - The start of the range.\n * @param to - The end of the range.\n */\n public nextFloat(from = 0, to = 1) {\n return map(from, to, this.next());\n }\n\n /**\n * Get the next random integer in the given range.\n *\n * @param from - The start of the range.\n * @param to - The end of the range. Exclusive.\n */\n public nextInt(from = 0, to = 4294967296) {\n let value = Math.floor(map(from, to, this.next()));\n if (value === to) {\n value = from;\n }\n\n return value;\n }\n\n /**\n * Get a random float from a gaussian distribution.\n * @param mean - The mean of the distribution.\n * @param stdev - The standard deviation of the distribution.\n */\n public gauss(mean = 0, stdev = 1): number {\n let z = this.nextGauss;\n this.nextGauss = null;\n if (z === null) {\n const x2pi = this.next() * 2 * Math.PI;\n const g2rad = Math.sqrt(-2 * Math.log(1 - this.next()));\n z = Math.cos(x2pi) * g2rad;\n this.nextGauss = Math.sin(x2pi) * g2rad;\n }\n return mean + z * stdev;\n }\n\n /**\n * Get an array filled with random floats in the given range.\n *\n * @param size - The size of the array.\n * @param from - The start of the range.\n * @param to - The end of the range.\n */\n public floatArray(size: number, from = 0, to = 1): number[] {\n return range(size).map(() => this.nextFloat(from, to));\n }\n\n /**\n Get an array filled with random integers in the given range.\n *\n * @param size - The size of the array.\n * @param from - The start of the range.\n * @param to - The end of the range. Exclusive.\n */\n public intArray(size: number, from = 0, to = 4294967296): number[] {\n return range(size).map(() => this.nextInt(from, to));\n }\n\n /**\n * Create a new independent generator.\n */\n public spawn() {\n return new Random(this.nextInt());\n }\n\n private next() {\n this.state |= 0;\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = Math.imul(this.state ^ (this.state >>> 15), 1 | this.state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n}\n","import type {SubscribableValueEvent} from '../events';\nimport type {Thread} from '../threading';\n\n/**\n * Scenes can implement this interface to display their thread hierarchy in the\n * UI.\n *\n * @remarks\n * This interface is only useful when a scene uses thread generators to run.\n */\nexport interface Threadable {\n /**\n * Triggered when the main thread changes.\n *\n * @eventProperty\n */\n get onThreadChanged(): SubscribableValueEvent<Thread | null>;\n}\n\nexport function isThreadable(value: any): value is Threadable {\n return value && typeof value === 'object' && 'onThreadChanged' in value;\n}\n","import type {SignalValue} from '../signals/types';\nimport {useScene} from '../utils';\n\n/**\n * Transition to the current scene by altering the Context2D before scenes are rendered.\n *\n * @param current - The callback to use before the current scene is rendered.\n * @param previous - The callback to use before the previous scene is rendered.\n * @param previousOnTop - Whether the previous scene should be rendered on top.\n */\nexport function useTransition(\n current: (ctx: CanvasRenderingContext2D) => void,\n previous?: (ctx: CanvasRenderingContext2D) => void,\n previousOnTop?: SignalValue<boolean>,\n) {\n if (previous == null) {\n previous = () => {\n // do nothing\n };\n }\n\n const scene = useScene();\n const prior = scene.previous;\n scene.previousOnTop = previousOnTop ?? false;\n\n const unsubPrev = prior?.lifecycleEvents.onBeforeRender.subscribe(previous);\n const unsubNext = scene.lifecycleEvents.onBeforeRender.subscribe(current);\n\n scene.enterInitial();\n\n return () => {\n scene.enterAfterTransitionIn();\n unsubPrev?.();\n unsubNext();\n };\n}\n","import {createSignal} from '../signals';\nimport type {ThreadGenerator} from '../threading';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that fades between the scenes.\n *\n * @param duration - The duration of the transition.\n */\nexport function* fadeTransition(duration = 0.6): ThreadGenerator {\n const progress = createSignal(0);\n const endTransition = useTransition(ctx => {\n ctx.globalAlpha = progress();\n });\n\n yield* progress(1, duration);\n endTransition();\n}\n","import {all} from '../flow';\nimport type {ThreadGenerator} from '../threading';\nimport type {Origin} from '../types';\nimport {Direction, Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that slides the scene in the given direction.\n *\n * @param direction - The direction in which to slide.\n * @param duration - The duration of the transition.\n */\nexport function slideTransition(\n direction: Direction,\n duration?: number,\n): ThreadGenerator;\n/**\n * Perform a transition that slides the scene towards the given origin.\n *\n * @param origin - The origin towards which to slide.\n * @param duration - The duration of the transition.\n */\nexport function slideTransition(\n origin: Origin,\n duration?: number,\n): ThreadGenerator;\nexport function* slideTransition(\n direction: Direction | Origin = Direction.Top,\n duration = 0.6,\n): ThreadGenerator {\n const size = useScene().getSize();\n const position = size.getOriginOffset(direction).scale(2);\n const previousPosition = Vector2.createSignal();\n const currentPosition = Vector2.createSignal(position);\n const endTransition = useTransition(\n ctx => ctx.translate(currentPosition.x(), currentPosition.y()),\n ctx => ctx.translate(previousPosition.x(), previousPosition.y()),\n );\n\n yield* all(\n previousPosition(position.scale(-1), duration),\n currentPosition(Vector2.zero, duration),\n );\n endTransition();\n}\n","import {all} from '../flow';\nimport {createSignal} from '../signals';\nimport type {ThreadGenerator} from '../threading';\nimport {clampRemap, easeInOutCubic, linear} from '../tweening';\nimport type {BBox} from '../types';\nimport {Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that zooms in on a given area of the scene.\n *\n * @param area - The area on which to zoom in.\n * @param duration - The duration of the transition.\n */\nexport function* zoomInTransition(area: BBox, duration = 0.6): ThreadGenerator {\n const scale = useScene().getSize().div(area.size);\n\n const currentPosition = Vector2.createSignal(area.position);\n const currentScale = Vector2.createSignal(Vector2.one.div(scale));\n const previousPosition = Vector2.createSignal(0);\n const previousScale = Vector2.createSignal(1);\n const alpha = createSignal(0);\n\n const endTransition = useTransition(\n ctx => {\n ctx.globalAlpha = clampRemap(0.1, 0.5, 0, 1, alpha());\n ctx.translate(currentPosition.x(), currentPosition.y());\n ctx.scale(currentScale.x(), currentScale.y());\n },\n ctx => {\n ctx.globalAlpha = clampRemap(0.5, 0.9, 1, 0, alpha());\n ctx.translate(previousPosition.x(), previousPosition.y());\n ctx.scale(previousScale.x(), previousScale.y());\n },\n );\n\n const timing = (v: number) => easeInOutCubic(v * v);\n yield* all(\n currentPosition(Vector2.zero, duration, timing),\n previousPosition(area.position.flipped.mul(scale), duration, timing),\n currentScale(1, duration, timing),\n previousScale(scale, duration, timing),\n alpha(1, duration, linear),\n );\n\n endTransition();\n}\n","import {all} from '../flow';\nimport {createSignal} from '../signals';\nimport type {ThreadGenerator} from '../threading';\nimport {clampRemap, easeInOutCubic, linear} from '../tweening';\nimport type {BBox} from '../types';\nimport {Vector2} from '../types';\nimport {useScene} from '../utils';\nimport {useTransition} from './useTransition';\n\n/**\n * Perform a transition that zooms out from a given area of the scene.\n *\n * @param area - The area from which to zoom out.\n * @param duration - The duration of the transition.\n */\nexport function* zoomOutTransition(\n area: BBox,\n duration = 0.6,\n): ThreadGenerator {\n const scale = useScene().getSize().div(area.size);\n\n const currentPosition = Vector2.createSignal(\n area.position.flipped.mul(scale),\n );\n const currentScale = Vector2.createSignal(scale);\n const previousPosition = Vector2.createSignal(0);\n const previousScale = Vector2.createSignal(1);\n const alpha = createSignal(0);\n\n const endTransition = useTransition(\n ctx => {\n ctx.globalAlpha = clampRemap(0.1, 0.5, 0, 1, alpha());\n ctx.translate(currentPosition.x(), currentPosition.y());\n ctx.scale(currentScale.x(), currentScale.y());\n },\n ctx => {\n ctx.globalAlpha = clampRemap(0.5, 0.9, 1, 0, alpha());\n ctx.translate(previousPosition.x(), previousPosition.y());\n ctx.scale(previousScale.x(), previousScale.y());\n },\n );\n\n const timing = (v: number) => easeInOutCubic(Math.sqrt(v));\n yield* all(\n currentPosition(Vector2.zero, duration, timing),\n previousPosition(area.position, duration, timing),\n currentScale(1, duration, timing),\n previousScale(Vector2.one.div(scale), duration, timing),\n alpha(1, duration, linear),\n );\n\n endTransition();\n}\n"],"mappings":"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","names":["LogLevel","range","Handler","spring","easeOutBounce","import_meta","loadMp4Module","Direction","Center","Origin","all","threads","delay","x","y","z","PlaybackState","line","import_meta","RendererState","RendererResult","thread","threads","SceneRenderEvent","SceneState"]}