@editframe/elements 0.23.8-beta.0 → 0.25.0-beta.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 (339) hide show
  1. package/dist/DelayedLoadingState.js +31 -0
  2. package/dist/DelayedLoadingState.js.map +1 -0
  3. package/dist/EF_FRAMEGEN.d.ts +50 -46
  4. package/dist/EF_FRAMEGEN.js +5 -1
  5. package/dist/EF_FRAMEGEN.js.map +1 -0
  6. package/dist/EF_INTERACTIVE.js +4 -0
  7. package/dist/EF_INTERACTIVE.js.map +1 -0
  8. package/dist/EF_RENDERING.js +4 -0
  9. package/dist/EF_RENDERING.js.map +1 -0
  10. package/dist/_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js +4 -1
  11. package/dist/attachContextRoot.js +6 -1
  12. package/dist/attachContextRoot.js.map +1 -0
  13. package/dist/elements/CrossUpdateController.js +4 -0
  14. package/dist/elements/CrossUpdateController.js.map +1 -0
  15. package/dist/elements/EFAudio.d.ts +24 -16
  16. package/dist/elements/EFAudio.js +10 -1
  17. package/dist/elements/EFAudio.js.map +1 -0
  18. package/dist/elements/EFCaptions.d.ts +118 -109
  19. package/dist/elements/EFCaptions.js +11 -6
  20. package/dist/elements/EFCaptions.js.map +1 -0
  21. package/dist/elements/EFImage.d.ts +31 -20
  22. package/dist/elements/EFImage.js +6 -1
  23. package/dist/elements/EFImage.js.map +1 -0
  24. package/dist/elements/EFMedia/AssetIdMediaEngine.js +5 -0
  25. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -0
  26. package/dist/elements/EFMedia/AssetMediaEngine.js +12 -0
  27. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -0
  28. package/dist/elements/EFMedia/BaseMediaEngine.js +53 -0
  29. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -0
  30. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +47 -46
  31. package/dist/elements/EFMedia/BufferedSeekingInput.js +6 -1
  32. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -0
  33. package/dist/elements/EFMedia/JitMediaEngine.js +12 -0
  34. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -0
  35. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.d.ts +9 -13
  36. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +5 -0
  37. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -0
  38. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +6 -1
  39. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -0
  40. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +5 -0
  41. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -0
  42. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +5 -0
  43. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -0
  44. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +5 -0
  45. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -0
  46. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +5 -0
  47. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -0
  48. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +5 -0
  49. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -0
  50. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +6 -1
  51. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -0
  52. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +18 -2
  53. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -0
  54. package/dist/elements/EFMedia/shared/BufferUtils.d.ts +9 -67
  55. package/dist/elements/EFMedia/shared/BufferUtils.js +15 -0
  56. package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -0
  57. package/dist/elements/EFMedia/shared/GlobalInputCache.js +29 -0
  58. package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -0
  59. package/dist/elements/EFMedia/shared/MediaTaskUtils.d.ts +11 -17
  60. package/dist/elements/EFMedia/shared/PrecisionUtils.js +25 -0
  61. package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -0
  62. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +22 -0
  63. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -0
  64. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +13 -0
  65. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -0
  66. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +21 -0
  67. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -0
  68. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +18 -0
  69. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -0
  70. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +10 -0
  71. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -0
  72. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +5 -0
  73. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -0
  74. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +5 -0
  75. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -0
  76. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +6 -1
  77. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -0
  78. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +5 -0
  79. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -0
  80. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +5 -0
  81. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -0
  82. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +16 -2
  83. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -0
  84. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.d.ts +9 -13
  85. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +5 -0
  86. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -0
  87. package/dist/elements/EFMedia.d.ts +115 -104
  88. package/dist/elements/EFMedia.js +25 -1
  89. package/dist/elements/EFMedia.js.map +1 -0
  90. package/dist/elements/EFSourceMixin.d.ts +10 -11
  91. package/dist/elements/EFSourceMixin.js +5 -0
  92. package/dist/elements/EFSourceMixin.js.map +1 -0
  93. package/dist/elements/EFSurface.d.ts +35 -27
  94. package/dist/elements/EFSurface.js +6 -1
  95. package/dist/elements/EFSurface.js.map +1 -0
  96. package/dist/elements/EFTemporal.d.ts +200 -213
  97. package/dist/elements/EFTemporal.js +24 -4
  98. package/dist/elements/EFTemporal.js.map +1 -0
  99. package/dist/elements/EFThumbnailStrip.d.ts +91 -83
  100. package/dist/elements/EFThumbnailStrip.js +49 -4
  101. package/dist/elements/EFThumbnailStrip.js.map +1 -0
  102. package/dist/elements/EFTimegroup.d.ts +107 -88
  103. package/dist/elements/EFTimegroup.js +74 -4
  104. package/dist/elements/EFTimegroup.js.map +1 -0
  105. package/dist/elements/EFVideo.d.ts +120 -108
  106. package/dist/elements/EFVideo.js +46 -2
  107. package/dist/elements/EFVideo.js.map +1 -0
  108. package/dist/elements/EFWaveform.d.ts +48 -41
  109. package/dist/elements/EFWaveform.js +6 -1
  110. package/dist/elements/EFWaveform.js.map +1 -0
  111. package/dist/elements/FetchMixin.d.ts +8 -6
  112. package/dist/elements/FetchMixin.js +4 -0
  113. package/dist/elements/FetchMixin.js.map +1 -0
  114. package/dist/elements/SampleBuffer.d.ts +18 -13
  115. package/dist/elements/SampleBuffer.js +5 -0
  116. package/dist/elements/SampleBuffer.js.map +1 -0
  117. package/dist/elements/TargetController.d.ts +23 -24
  118. package/dist/elements/TargetController.js +8 -3
  119. package/dist/elements/TargetController.js.map +1 -0
  120. package/dist/elements/TimegroupController.d.ts +17 -12
  121. package/dist/elements/TimegroupController.js +4 -0
  122. package/dist/elements/TimegroupController.js.map +1 -0
  123. package/dist/elements/durationConverter.js +9 -4
  124. package/dist/elements/durationConverter.js.map +1 -0
  125. package/dist/elements/parseTimeToMs.js +4 -0
  126. package/dist/elements/parseTimeToMs.js.map +1 -0
  127. package/dist/elements/renderTemporalAudio.js +4 -0
  128. package/dist/elements/renderTemporalAudio.js.map +1 -0
  129. package/dist/elements/updateAnimations.js +29 -8
  130. package/dist/elements/updateAnimations.js.map +1 -0
  131. package/dist/elements-ZhsB7B5N.css +9 -0
  132. package/dist/elements-ZhsB7B5N.css.map +1 -0
  133. package/dist/getRenderInfo.d.ts +53 -47
  134. package/dist/getRenderInfo.js +5 -0
  135. package/dist/getRenderInfo.js.map +1 -0
  136. package/dist/gui/ContextMixin.d.ts +19 -20
  137. package/dist/gui/ContextMixin.js +32 -1
  138. package/dist/gui/ContextMixin.js.map +1 -0
  139. package/dist/gui/Controllable.d.ts +13 -14
  140. package/dist/gui/Controllable.js +5 -0
  141. package/dist/gui/Controllable.js.map +1 -0
  142. package/dist/gui/EFConfiguration.d.ts +18 -14
  143. package/dist/gui/EFConfiguration.js +6 -1
  144. package/dist/gui/EFConfiguration.js.map +1 -0
  145. package/dist/gui/EFControls.d.ts +35 -31
  146. package/dist/gui/EFControls.js +8 -3
  147. package/dist/gui/EFControls.js.map +1 -0
  148. package/dist/gui/EFDial.d.ts +23 -16
  149. package/dist/gui/EFDial.js +6 -1
  150. package/dist/gui/EFDial.js.map +1 -0
  151. package/dist/gui/EFFilmstrip.d.ts +183 -177
  152. package/dist/gui/EFFilmstrip.js +30 -25
  153. package/dist/gui/EFFilmstrip.js.map +1 -0
  154. package/dist/gui/EFFitScale.d.ts +30 -24
  155. package/dist/gui/EFFitScale.js +6 -1
  156. package/dist/gui/EFFitScale.js.map +1 -0
  157. package/dist/gui/EFFocusOverlay.d.ts +22 -14
  158. package/dist/gui/EFFocusOverlay.js +6 -1
  159. package/dist/gui/EFFocusOverlay.js.map +1 -0
  160. package/dist/gui/EFPause.d.ts +24 -18
  161. package/dist/gui/EFPause.js +6 -1
  162. package/dist/gui/EFPause.js.map +1 -0
  163. package/dist/gui/EFPlay.d.ts +24 -18
  164. package/dist/gui/EFPlay.js +6 -1
  165. package/dist/gui/EFPlay.js.map +1 -0
  166. package/dist/gui/EFPreview.d.ts +22 -15
  167. package/dist/gui/EFPreview.js +9 -1
  168. package/dist/gui/EFPreview.js.map +1 -0
  169. package/dist/gui/EFResizableBox.d.ts +39 -32
  170. package/dist/gui/EFResizableBox.js +8 -3
  171. package/dist/gui/EFResizableBox.js.map +1 -0
  172. package/dist/gui/EFScrubber.d.ts +31 -25
  173. package/dist/gui/EFScrubber.js +6 -1
  174. package/dist/gui/EFScrubber.js.map +1 -0
  175. package/dist/gui/EFTimeDisplay.d.ts +21 -14
  176. package/dist/gui/EFTimeDisplay.js +6 -1
  177. package/dist/gui/EFTimeDisplay.js.map +1 -0
  178. package/dist/gui/EFToggleLoop.d.ts +19 -13
  179. package/dist/gui/EFToggleLoop.js +6 -1
  180. package/dist/gui/EFToggleLoop.js.map +1 -0
  181. package/dist/gui/EFTogglePlay.d.ts +23 -17
  182. package/dist/gui/EFTogglePlay.js +6 -1
  183. package/dist/gui/EFTogglePlay.js.map +1 -0
  184. package/dist/gui/EFWorkbench.d.ts +24 -16
  185. package/dist/gui/EFWorkbench.js +6 -1
  186. package/dist/gui/EFWorkbench.js.map +1 -0
  187. package/dist/gui/PlaybackController.d.ts +54 -50
  188. package/dist/gui/PlaybackController.js +23 -1
  189. package/dist/gui/PlaybackController.js.map +1 -0
  190. package/dist/gui/TWMixin.js +5 -1
  191. package/dist/gui/TWMixin.js.map +1 -0
  192. package/dist/gui/TWMixin2.js +6 -1
  193. package/dist/gui/TWMixin2.js.map +1 -0
  194. package/dist/gui/TargetOrContextMixin.js +5 -0
  195. package/dist/gui/TargetOrContextMixin.js.map +1 -0
  196. package/dist/gui/currentTimeContext.js +5 -0
  197. package/dist/gui/currentTimeContext.js.map +1 -0
  198. package/dist/gui/durationContext.js +5 -0
  199. package/dist/gui/durationContext.js.map +1 -0
  200. package/dist/gui/efContext.js +5 -0
  201. package/dist/gui/efContext.js.map +1 -0
  202. package/dist/gui/fetchContext.js +5 -0
  203. package/dist/gui/fetchContext.js.map +1 -0
  204. package/dist/gui/focusContext.d.ts +6 -5
  205. package/dist/gui/focusContext.js +5 -0
  206. package/dist/gui/focusContext.js.map +1 -0
  207. package/dist/gui/focusedElementContext.js +5 -0
  208. package/dist/gui/focusedElementContext.js.map +1 -0
  209. package/dist/gui/playingContext.js +5 -0
  210. package/dist/gui/playingContext.js.map +1 -0
  211. package/dist/index.d.ts +27 -26
  212. package/dist/index.js +6 -1
  213. package/dist/index.js.map +1 -0
  214. package/dist/msToTimeCode.js +4 -0
  215. package/dist/msToTimeCode.js.map +1 -0
  216. package/dist/otel/BridgeSpanExporter.js +5 -0
  217. package/dist/otel/BridgeSpanExporter.js.map +1 -0
  218. package/dist/otel/setupBrowserTracing.js +7 -2
  219. package/dist/otel/setupBrowserTracing.js.map +1 -0
  220. package/dist/otel/tracingHelpers.d.ts +7 -34
  221. package/dist/otel/tracingHelpers.js +34 -2
  222. package/dist/otel/tracingHelpers.js.map +1 -0
  223. package/dist/transcoding/cache/RequestDeduplicator.js +25 -0
  224. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -0
  225. package/dist/transcoding/cache/URLTokenDeduplicator.js +23 -0
  226. package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -0
  227. package/dist/transcoding/types/index.d.ts +96 -270
  228. package/dist/transcoding/utils/UrlGenerator.d.ts +30 -25
  229. package/dist/transcoding/utils/UrlGenerator.js +19 -0
  230. package/dist/transcoding/utils/UrlGenerator.js.map +1 -0
  231. package/dist/utils/LRUCache.js +44 -0
  232. package/dist/utils/LRUCache.js.map +1 -0
  233. package/package.json +11 -24
  234. package/src/elements/EFCaptions.browsertest.ts +7 -7
  235. package/src/elements/EFTimegroup.ts +43 -1
  236. package/src/gui/PlaybackController.ts +6 -1
  237. package/tsdown.config.ts +36 -0
  238. package/types.json +1 -1
  239. package/dist/DelayedLoadingState.d.ts +0 -48
  240. package/dist/DelayedLoadingState.integration.test.d.ts +0 -1
  241. package/dist/DelayedLoadingState.test.d.ts +0 -1
  242. package/dist/EF_INTERACTIVE.d.ts +0 -1
  243. package/dist/EF_RENDERING.d.ts +0 -1
  244. package/dist/LoadingDebounce.test.d.ts +0 -1
  245. package/dist/ManualScrubTest.test.d.ts +0 -1
  246. package/dist/ScrubResolvedFlashing.test.d.ts +0 -1
  247. package/dist/ScrubTrackManager.test.d.ts +0 -1
  248. package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
  249. package/dist/VideoStuckDiagnostic.test.d.ts +0 -1
  250. package/dist/attachContextRoot.d.ts +0 -1
  251. package/dist/elements/ContextProxiesController.d.ts +0 -39
  252. package/dist/elements/CrossUpdateController.d.ts +0 -8
  253. package/dist/elements/EFAudio.browsertest.d.ts +0 -0
  254. package/dist/elements/EFCaptions.browsertest.d.ts +0 -0
  255. package/dist/elements/EFImage.browsertest.d.ts +0 -0
  256. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +0 -19
  257. package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +0 -1
  258. package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
  259. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +0 -56
  260. package/dist/elements/EFMedia/BaseMediaEngine.browsertest.d.ts +0 -1
  261. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +0 -103
  262. package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +0 -1
  263. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  264. package/dist/elements/EFMedia/JitMediaEngine.d.ts +0 -46
  265. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +0 -9
  266. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +0 -3
  267. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +0 -9
  268. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +0 -4
  269. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +0 -9
  270. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +0 -3
  271. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
  272. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +0 -7
  273. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +0 -4
  274. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +0 -4
  275. package/dist/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.d.ts +0 -1
  276. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +0 -3
  277. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +0 -7
  278. package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +0 -39
  279. package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +0 -28
  280. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +0 -1
  281. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +0 -11
  282. package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +0 -27
  283. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +0 -9
  284. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +0 -17
  285. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +0 -29
  286. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -25
  287. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.d.ts +0 -8
  288. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.d.ts +0 -4
  289. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.d.ts +0 -3
  290. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.d.ts +0 -6
  291. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.d.ts +0 -4
  292. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.d.ts +0 -4
  293. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.d.ts +0 -6
  294. package/dist/elements/EFMedia.browsertest.d.ts +0 -10
  295. package/dist/elements/EFSurface.browsertest.d.ts +0 -0
  296. package/dist/elements/EFTemporal.browsertest.d.ts +0 -22
  297. package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
  298. package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
  299. package/dist/elements/EFTimegroup.browsertest.d.ts +0 -41
  300. package/dist/elements/EFVideo.browsertest.d.ts +0 -0
  301. package/dist/elements/FetchContext.browsertest.d.ts +0 -0
  302. package/dist/elements/TargetController.browsertest.d.ts +0 -19
  303. package/dist/elements/durationConverter.d.ts +0 -16
  304. package/dist/elements/parseTimeToMs.d.ts +0 -1
  305. package/dist/elements/printTaskStatus.d.ts +0 -2
  306. package/dist/elements/renderTemporalAudio.d.ts +0 -10
  307. package/dist/elements/updateAnimations.browsertest.d.ts +0 -13
  308. package/dist/elements/updateAnimations.d.ts +0 -24
  309. package/dist/elements/util.d.ts +0 -3
  310. package/dist/gui/ContextMixin.browsertest.d.ts +0 -15
  311. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  312. package/dist/gui/EFControls.browsertest.d.ts +0 -11
  313. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  314. package/dist/gui/EFFilmstrip.browsertest.d.ts +0 -11
  315. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  316. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  317. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  318. package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
  319. package/dist/gui/TWMixin.d.ts +0 -2
  320. package/dist/gui/TargetOrContextMixin.d.ts +0 -10
  321. package/dist/gui/currentTimeContext.d.ts +0 -3
  322. package/dist/gui/durationContext.d.ts +0 -3
  323. package/dist/gui/efContext.d.ts +0 -4
  324. package/dist/gui/fetchContext.d.ts +0 -3
  325. package/dist/gui/focusedElementContext.d.ts +0 -3
  326. package/dist/gui/playingContext.d.ts +0 -6
  327. package/dist/msToTimeCode.d.ts +0 -1
  328. package/dist/otel/BridgeSpanExporter.d.ts +0 -13
  329. package/dist/otel/setupBrowserTracing.d.ts +0 -12
  330. package/dist/style.css +0 -2
  331. package/dist/transcoding/cache/RequestDeduplicator.d.ts +0 -29
  332. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +0 -1
  333. package/dist/transcoding/cache/URLTokenDeduplicator.d.ts +0 -38
  334. package/dist/transcoding/cache/URLTokenDeduplicator.test.d.ts +0 -1
  335. package/dist/transcoding/utils/MediaUtils.d.ts +0 -9
  336. package/dist/transcoding/utils/constants.d.ts +0 -27
  337. package/dist/utils/LRUCache.d.ts +0 -80
  338. package/dist/utils/LRUCache.test.d.ts +0 -1
  339. /package/dist/{LoadingIndicator.browsertest.d.ts → elements.js} +0 -0
@@ -1,14 +1,19 @@
1
- import { AudioSample, VideoSample } from 'mediabunny';
2
- export type MediaSample = VideoSample | AudioSample;
3
- export declare class SampleBuffer {
4
- private buffer;
5
- private bufferSize;
6
- constructor(bufferSize?: number);
7
- push(sample: MediaSample): void;
8
- clear(): void;
9
- peek(): MediaSample | undefined;
10
- find(desiredSeekTimeMs: number): MediaSample | undefined;
11
- get length(): number;
12
- get firstTimestamp(): number;
13
- getContents(): MediaSample[];
1
+ import { AudioSample, VideoSample } from "mediabunny";
2
+
3
+ //#region src/elements/SampleBuffer.d.ts
4
+ type MediaSample = VideoSample | AudioSample;
5
+ declare class SampleBuffer {
6
+ private buffer;
7
+ private bufferSize;
8
+ constructor(bufferSize?: number);
9
+ push(sample: MediaSample): void;
10
+ clear(): void;
11
+ peek(): MediaSample | undefined;
12
+ find(desiredSeekTimeMs: number): MediaSample | undefined;
13
+ get length(): number;
14
+ get firstTimestamp(): number;
15
+ getContents(): MediaSample[];
14
16
  }
17
+ //#endregion
18
+ export { MediaSample, SampleBuffer };
19
+ //# sourceMappingURL=SampleBuffer.d.ts.map
@@ -1,4 +1,6 @@
1
1
  import { roundToMilliseconds } from "./EFMedia/shared/PrecisionUtils.js";
2
+
3
+ //#region src/elements/SampleBuffer.ts
2
4
  var SampleBuffer = class {
3
5
  constructor(bufferSize = 10) {
4
6
  this.buffer = [];
@@ -45,4 +47,7 @@ var SampleBuffer = class {
45
47
  return [...this.buffer];
46
48
  }
47
49
  };
50
+
51
+ //#endregion
48
52
  export { SampleBuffer };
53
+ //# sourceMappingURL=SampleBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SampleBuffer.js","names":[],"sources":["../../src/elements/SampleBuffer.ts"],"sourcesContent":["import type { AudioSample, VideoSample } from \"mediabunny\";\nimport { roundToMilliseconds } from \"./EFMedia/shared/PrecisionUtils\";\nexport type MediaSample = VideoSample | AudioSample;\n\n// Generic sample buffer that works with both VideoSample and AudioSample\nexport class SampleBuffer {\n private buffer: MediaSample[] = [];\n private bufferSize: number;\n\n constructor(bufferSize = 10) {\n this.bufferSize = bufferSize;\n }\n\n push(sample: MediaSample) {\n // Defensive copy to avoid concurrent modification during iteration\n const currentBuffer = [...this.buffer];\n currentBuffer.push(sample);\n\n if (currentBuffer.length > this.bufferSize) {\n const shifted = currentBuffer.shift();\n if (shifted) {\n try {\n shifted.close();\n } catch (_error) {\n // Sample already closed, continue\n }\n }\n }\n\n // Update buffer atomically\n this.buffer = currentBuffer;\n }\n\n clear() {\n // Get current buffer and clear atomically\n const toClose = this.buffer;\n this.buffer = [];\n\n // Close samples after clearing to avoid holding references\n for (const sample of toClose) {\n try {\n sample.close();\n } catch (_error) {\n // Sample already closed, continue\n }\n }\n }\n\n peek(): MediaSample | undefined {\n // Defensive read - get current buffer state\n const currentBuffer = this.buffer;\n return currentBuffer[0];\n }\n\n find(desiredSeekTimeMs: number): MediaSample | undefined {\n const currentBuffer = [...this.buffer];\n\n if (currentBuffer.length === 0) return undefined;\n\n // Use consistent precision handling across the entire pipeline\n const targetTimeMs = roundToMilliseconds(desiredSeekTimeMs);\n\n // Find the sample that contains the target time\n for (const sample of currentBuffer) {\n const sampleStartMs = roundToMilliseconds((sample.timestamp || 0) * 1000);\n const sampleDurationMs = roundToMilliseconds(\n (sample.duration || 0) * 1000,\n );\n const sampleEndMs = roundToMilliseconds(sampleStartMs + sampleDurationMs);\n\n // Check if the desired time falls within this sample's time span [start, end], inclusive of end\n if (targetTimeMs >= sampleStartMs && targetTimeMs < sampleEndMs) {\n return sample;\n }\n }\n\n return undefined; // No sample contains the target time\n }\n\n get length() {\n return this.buffer.length;\n }\n\n get firstTimestamp() {\n // Defensive read - get current buffer state\n const currentBuffer = this.buffer;\n return currentBuffer[0]?.timestamp || 0;\n }\n\n getContents(): MediaSample[] {\n // Defensive copy to avoid concurrent modification during iteration\n return [...this.buffer];\n }\n}\n"],"mappings":";;;AAKA,IAAa,eAAb,MAA0B;CAIxB,YAAY,aAAa,IAAI;gBAHG,EAAE;AAIhC,OAAK,aAAa;;CAGpB,KAAK,QAAqB;EAExB,MAAM,gBAAgB,CAAC,GAAG,KAAK,OAAO;AACtC,gBAAc,KAAK,OAAO;AAE1B,MAAI,cAAc,SAAS,KAAK,YAAY;GAC1C,MAAM,UAAU,cAAc,OAAO;AACrC,OAAI,QACF,KAAI;AACF,YAAQ,OAAO;YACR,QAAQ;;AAOrB,OAAK,SAAS;;CAGhB,QAAQ;EAEN,MAAM,UAAU,KAAK;AACrB,OAAK,SAAS,EAAE;AAGhB,OAAK,MAAM,UAAU,QACnB,KAAI;AACF,UAAO,OAAO;WACP,QAAQ;;CAMrB,OAAgC;AAG9B,SADsB,KAAK,OACN;;CAGvB,KAAK,mBAAoD;EACvD,MAAM,gBAAgB,CAAC,GAAG,KAAK,OAAO;AAEtC,MAAI,cAAc,WAAW,EAAG,QAAO;EAGvC,MAAM,eAAe,oBAAoB,kBAAkB;AAG3D,OAAK,MAAM,UAAU,eAAe;GAClC,MAAM,gBAAgB,qBAAqB,OAAO,aAAa,KAAK,IAAK;GAIzE,MAAM,cAAc,oBAAoB,gBAHf,qBACtB,OAAO,YAAY,KAAK,IAC1B,CACwE;AAGzE,OAAI,gBAAgB,iBAAiB,eAAe,YAClD,QAAO;;;CAOb,IAAI,SAAS;AACX,SAAO,KAAK,OAAO;;CAGrB,IAAI,iBAAiB;AAGnB,SADsB,KAAK,OACN,IAAI,aAAa;;CAGxC,cAA6B;AAE3B,SAAO,CAAC,GAAG,KAAK,OAAO"}
@@ -1,25 +1,24 @@
1
- import { LitElement, ReactiveController } from 'lit';
2
- type Constructor<T = {}> = new (...args: any[]) => T;
3
- export declare class TargetableMixinInterface {
4
- id: string;
1
+ import { LitElement, ReactiveController } from "lit";
2
+
3
+ //#region src/elements/TargetController.d.ts
4
+
5
+ declare class TargetController implements ReactiveController {
6
+ private host;
7
+ private targetController;
8
+ private currentTargetString;
9
+ constructor(host: LitElement & {
10
+ targetElement: Element | null;
11
+ target: string;
12
+ });
13
+ private registryCallback;
14
+ private updateTarget;
15
+ private connectToTarget;
16
+ private disconnectFromTarget;
17
+ private get registry();
18
+ hostDisconnected(): void;
19
+ hostConnected(): void;
20
+ hostUpdate(): void;
5
21
  }
6
- export declare const isEFTargetable: (obj: any) => obj is TargetableMixinInterface;
7
- export declare const EFTargetable: <T extends Constructor<LitElement>>(superClass: T) => T;
8
- export declare class TargetController implements ReactiveController {
9
- private host;
10
- private targetController;
11
- private currentTargetString;
12
- constructor(host: LitElement & {
13
- targetElement: Element | null;
14
- target: string;
15
- });
16
- private registryCallback;
17
- private updateTarget;
18
- private connectToTarget;
19
- private disconnectFromTarget;
20
- private get registry();
21
- hostDisconnected(): void;
22
- hostConnected(): void;
23
- hostUpdate(): void;
24
- }
25
- export {};
22
+ //#endregion
23
+ export { TargetController };
24
+ //# sourceMappingURL=TargetController.d.ts.map
@@ -1,5 +1,7 @@
1
1
  import { LitElement } from "lit";
2
- var EF_TARGETABLE = Symbol("EF_TARGETABLE");
2
+
3
+ //#region src/elements/TargetController.ts
4
+ const EF_TARGETABLE = Symbol("EF_TARGETABLE");
3
5
  var TargetRegistry = class {
4
6
  constructor() {
5
7
  this.idMap = /* @__PURE__ */ new Map();
@@ -28,8 +30,8 @@ var TargetRegistry = class {
28
30
  this.callbacks.delete(id);
29
31
  }
30
32
  };
31
- var documentRegistries = /* @__PURE__ */ new WeakMap();
32
- var getRegistry = (root) => {
33
+ const documentRegistries = /* @__PURE__ */ new WeakMap();
34
+ const getRegistry = (root) => {
33
35
  let registry = documentRegistries.get(root);
34
36
  if (!registry) {
35
37
  registry = new TargetRegistry();
@@ -136,4 +138,7 @@ var TargetController = class {
136
138
  }
137
139
  }
138
140
  };
141
+
142
+ //#endregion
139
143
  export { EFTargetable, TargetController };
144
+ //# sourceMappingURL=TargetController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TargetController.js","names":["#registry","host: LitElement"],"sources":["../../src/elements/TargetController.ts"],"sourcesContent":["import { LitElement, type ReactiveController } from \"lit\";\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\n\n// Symbol to identify elements that can be targeted\nconst EF_TARGETABLE = Symbol(\"EF_TARGETABLE\");\n\nclass TargetRegistry {\n private idMap = new Map<string, LitElement>();\n private callbacks = new Map<\n string,\n Set<(target: LitElement | undefined) => void>\n >();\n\n subscribe(id: string, callback: (target: LitElement | undefined) => void) {\n this.callbacks.set(id, this.callbacks.get(id) ?? new Set());\n this.callbacks.get(id)?.add(callback);\n }\n\n unsubscribe(\n id: string | null,\n callback: (target: LitElement | undefined) => void,\n ) {\n if (id === null) {\n return;\n }\n this.callbacks.get(id)?.delete(callback);\n if (this.callbacks.get(id)?.size === 0) {\n this.callbacks.delete(id);\n }\n }\n\n get(id: string) {\n return this.idMap.get(id);\n }\n\n register(id: string, target: LitElement) {\n this.idMap.set(id, target);\n for (const callback of this.callbacks.get(id) ?? []) {\n callback(target);\n }\n }\n\n unregister(id: string, target: LitElement) {\n if (this.idMap.get(id) !== target) {\n // Avoid unregistering a target that is not the current target\n return;\n }\n for (const callback of this.callbacks.get(id) ?? []) {\n callback(undefined);\n }\n this.idMap.delete(id);\n this.callbacks.delete(id);\n }\n}\n\n// Map of root nodes to their target registries\nconst documentRegistries = new WeakMap<Node, TargetRegistry>();\n\nconst getRegistry = (root: Node) => {\n let registry = documentRegistries.get(root);\n if (!registry) {\n registry = new TargetRegistry();\n documentRegistries.set(root, registry);\n }\n return registry;\n};\n\nexport declare class TargetableMixinInterface {\n id: string;\n}\n\nexport const isEFTargetable = (obj: any): obj is TargetableMixinInterface =>\n obj[EF_TARGETABLE];\n\nexport const EFTargetable = <T extends Constructor<LitElement>>(\n superClass: T,\n) => {\n class TargetableElement extends superClass {\n #registry: TargetRegistry | null = null;\n\n static get observedAttributes(): string[] {\n // Get parent's observed attributes\n const parentAttributes = (superClass as any).observedAttributes || [];\n // Add 'id' if not already present\n return [...new Set([...parentAttributes, \"id\"])];\n }\n\n private updateRegistry(oldValue: string, newValue: string) {\n if (!this.#registry) return;\n if (oldValue === newValue) return;\n\n if (oldValue) {\n this.#registry.unregister(oldValue, this);\n }\n if (newValue) {\n this.#registry.register(newValue, this);\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.#registry = getRegistry(this.getRootNode());\n const initialId = this.getAttribute(\"id\");\n if (initialId) {\n this.updateRegistry(\"\", initialId);\n }\n }\n\n attributeChangedCallback(\n name: string,\n old: string | null,\n value: string | null,\n ) {\n super.attributeChangedCallback(name, old, value);\n if (name === \"id\") {\n this.updateRegistry(old ?? \"\", value ?? \"\");\n }\n }\n\n disconnectedCallback() {\n if (this.#registry) {\n this.updateRegistry(this.id, \"\");\n this.#registry = null;\n }\n super.disconnectedCallback();\n }\n }\n\n Object.defineProperty(TargetableElement.prototype, EF_TARGETABLE, {\n value: true,\n });\n\n return TargetableElement as T;\n};\n\nclass TargetUpdateController implements ReactiveController {\n constructor(private host: LitElement) {}\n\n hostConnected() {\n this.host.requestUpdate();\n }\n\n hostDisconnected() {\n this.host.requestUpdate();\n }\n\n hostUpdate() {\n this.host.requestUpdate();\n }\n}\n\nexport class TargetController implements ReactiveController {\n private host: LitElement & { targetElement: Element | null; target: string };\n private targetController: ReactiveController | null = null;\n private currentTargetString: string | null = null;\n\n constructor(\n host: LitElement & { targetElement: Element | null; target: string },\n ) {\n this.host = host;\n this.host.addController(this);\n this.currentTargetString = this.host.target;\n if (this.currentTargetString) {\n this.registry.subscribe(this.currentTargetString, this.registryCallback);\n }\n }\n\n private registryCallback = (target: LitElement | undefined) => {\n this.host.targetElement = target ?? null;\n };\n\n private updateTarget() {\n const newTarget = this.registry.get(this.host.target);\n if (this.host.targetElement !== newTarget) {\n this.disconnectFromTarget();\n this.host.targetElement = newTarget ?? (null as Element | null);\n this.connectToTarget();\n this.host.requestUpdate(\"targetElement\");\n }\n }\n\n private connectToTarget() {\n if (this.host.targetElement instanceof LitElement) {\n this.targetController = new TargetUpdateController(this.host);\n this.host.targetElement.addController(this.targetController);\n }\n }\n\n private disconnectFromTarget() {\n if (\n this.host.targetElement instanceof LitElement &&\n this.targetController\n ) {\n this.host.targetElement.removeController(this.targetController);\n this.targetController = null;\n }\n }\n\n private get registry() {\n const root = this.host.getRootNode();\n return getRegistry(root);\n }\n\n hostDisconnected() {\n this.disconnectFromTarget();\n }\n\n hostConnected() {\n this.updateTarget();\n }\n\n hostUpdate() {\n if (this.currentTargetString !== this.host.target) {\n this.registry.unsubscribe(\n this.currentTargetString,\n this.registryCallback,\n );\n this.registry.subscribe(this.host.target, this.registryCallback);\n this.updateTarget();\n this.currentTargetString = this.host.target;\n }\n }\n}\n"],"mappings":"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"}
@@ -1,13 +1,18 @@
1
- import { LitElement, ReactiveController } from 'lit';
2
- import { EFTimegroup } from './EFTimegroup.js';
3
- export declare class TimegroupController implements ReactiveController {
4
- private host;
5
- private child;
6
- constructor(host: EFTimegroup, child: {
7
- currentTimeMs: number;
8
- startTimeMs?: number;
9
- } & LitElement);
10
- remove(): void;
11
- hostDisconnected(): void;
12
- hostUpdated(): void;
1
+ import { EFTimegroup } from "./EFTimegroup.js";
2
+ import { LitElement, ReactiveController } from "lit";
3
+
4
+ //#region src/elements/TimegroupController.d.ts
5
+ declare class TimegroupController implements ReactiveController {
6
+ private host;
7
+ private child;
8
+ constructor(host: EFTimegroup, child: {
9
+ currentTimeMs: number;
10
+ startTimeMs?: number;
11
+ } & LitElement);
12
+ remove(): void;
13
+ hostDisconnected(): void;
14
+ hostUpdated(): void;
13
15
  }
16
+ //#endregion
17
+ export { TimegroupController };
18
+ //# sourceMappingURL=TimegroupController.d.ts.map
@@ -1,3 +1,4 @@
1
+ //#region src/elements/TimegroupController.ts
1
2
  var TimegroupController = class {
2
3
  constructor(host, child) {
3
4
  this.host = host;
@@ -16,4 +17,7 @@ var TimegroupController = class {
16
17
  this.child.currentTimeMs = newChildTimeMs;
17
18
  }
18
19
  };
20
+
21
+ //#endregion
19
22
  export { TimegroupController };
23
+ //# sourceMappingURL=TimegroupController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimegroupController.js","names":["host: EFTimegroup","child: { currentTimeMs: number; startTimeMs?: number } & LitElement"],"sources":["../../src/elements/TimegroupController.ts"],"sourcesContent":["import type { LitElement, ReactiveController } from \"lit\";\nimport type { EFTimegroup } from \"./EFTimegroup.js\";\n\nexport class TimegroupController implements ReactiveController {\n constructor(\n private host: EFTimegroup,\n private child: { currentTimeMs: number; startTimeMs?: number } & LitElement,\n ) {\n this.host.addController(this);\n }\n\n remove() {\n this.host.removeController(this);\n }\n\n hostDisconnected(): void {\n this.host.removeController(this);\n }\n\n hostUpdated(): void {\n this.child.requestUpdate();\n const newChildTimeMs =\n this.host.currentTimeMs - (this.child.startTimeMs ?? 0);\n this.child.currentTimeMs = newChildTimeMs;\n }\n}\n"],"mappings":";AAGA,IAAa,sBAAb,MAA+D;CAC7D,YACE,AAAQA,MACR,AAAQC,OACR;EAFQ;EACA;AAER,OAAK,KAAK,cAAc,KAAK;;CAG/B,SAAS;AACP,OAAK,KAAK,iBAAiB,KAAK;;CAGlC,mBAAyB;AACvB,OAAK,KAAK,iBAAiB,KAAK;;CAGlC,cAAoB;AAClB,OAAK,MAAM,eAAe;EAC1B,MAAM,iBACJ,KAAK,KAAK,iBAAiB,KAAK,MAAM,eAAe;AACvD,OAAK,MAAM,gBAAgB"}
@@ -1,9 +1,11 @@
1
1
  import { parseTimeToMs } from "./parseTimeToMs.js";
2
+
3
+ //#region src/elements/durationConverter.ts
2
4
  const durationConverter = {
3
5
  fromAttribute: (value) => value === null ? null : parseTimeToMs(value),
4
6
  toAttribute: (value) => value === null ? null : `${value}s`
5
7
  };
6
- var positiveDurationConverter = (error) => {
8
+ const positiveDurationConverter = (error) => {
7
9
  return {
8
10
  fromAttribute: (value) => {
9
11
  if (value === null) return null;
@@ -13,7 +15,10 @@ var positiveDurationConverter = (error) => {
13
15
  toAttribute: (value) => value === null ? null : `${value}s`
14
16
  };
15
17
  };
16
- positiveDurationConverter("Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)");
17
- positiveDurationConverter("Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)");
18
- positiveDurationConverter("Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)");
18
+ const trimDurationConverter = positiveDurationConverter("Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)");
19
+ const imageDurationConverter = positiveDurationConverter("Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)");
20
+ const sourceDurationConverter = positiveDurationConverter("Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)");
21
+
22
+ //#endregion
19
23
  export { durationConverter };
24
+ //# sourceMappingURL=durationConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"durationConverter.js","names":[],"sources":["../../src/elements/durationConverter.ts"],"sourcesContent":["import { parseTimeToMs } from \"./parseTimeToMs.js\";\n\nexport const durationConverter = {\n fromAttribute: (value: string | null) =>\n value === null ? null : parseTimeToMs(value),\n toAttribute: (value: number | null) => (value === null ? null : `${value}s`),\n};\n\nconst positiveDurationConverter = (error: string) => {\n return {\n fromAttribute: (value: string | null): number | null => {\n if (value === null) {\n return null;\n }\n if (value.startsWith(\"-\")) {\n throw new Error(error);\n }\n return parseTimeToMs(value);\n },\n toAttribute: (value: number | null) =>\n value === null ? null : `${value}s`,\n };\n};\n\nexport const trimDurationConverter = positiveDurationConverter(\n \"Trimstart & trimend must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n\nexport const imageDurationConverter = positiveDurationConverter(\n \"Image duration must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n\nexport const sourceDurationConverter = positiveDurationConverter(\n \"Sourcein & sourceout must be a positive value in milliseconds or seconds (1s, 1000ms)\",\n);\n"],"mappings":";;;AAEA,MAAa,oBAAoB;CAC/B,gBAAgB,UACd,UAAU,OAAO,OAAO,cAAc,MAAM;CAC9C,cAAc,UAA0B,UAAU,OAAO,OAAO,GAAG,MAAM;CAC1E;AAED,MAAM,6BAA6B,UAAkB;AACnD,QAAO;EACL,gBAAgB,UAAwC;AACtD,OAAI,UAAU,KACZ,QAAO;AAET,OAAI,MAAM,WAAW,IAAI,CACvB,OAAM,IAAI,MAAM,MAAM;AAExB,UAAO,cAAc,MAAM;;EAE7B,cAAc,UACZ,UAAU,OAAO,OAAO,GAAG,MAAM;EACpC;;AAGH,MAAa,wBAAwB,0BACnC,uFACD;AAED,MAAa,yBAAyB,0BACpC,kFACD;AAED,MAAa,0BAA0B,0BACrC,wFACD"}
@@ -1,6 +1,10 @@
1
+ //#region src/elements/parseTimeToMs.ts
1
2
  const parseTimeToMs = (time) => {
2
3
  if (time.endsWith("ms")) return Number.parseFloat(time);
3
4
  if (time.endsWith("s")) return Number.parseFloat(time) * 1e3;
4
5
  throw new Error("Time must be in milliseconds or seconds (10s, 10000ms)");
5
6
  };
7
+
8
+ //#endregion
6
9
  export { parseTimeToMs };
10
+ //# sourceMappingURL=parseTimeToMs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTimeToMs.js","names":[],"sources":["../../src/elements/parseTimeToMs.ts"],"sourcesContent":["export const parseTimeToMs = (time: string) => {\n if (time.endsWith(\"ms\")) {\n return Number.parseFloat(time);\n }\n if (time.endsWith(\"s\")) {\n return Number.parseFloat(time) * 1000;\n }\n throw new Error(\"Time must be in milliseconds or seconds (10s, 10000ms)\");\n};\n"],"mappings":";AAAA,MAAa,iBAAiB,SAAiB;AAC7C,KAAI,KAAK,SAAS,KAAK,CACrB,QAAO,OAAO,WAAW,KAAK;AAEhC,KAAI,KAAK,SAAS,IAAI,CACpB,QAAO,OAAO,WAAW,KAAK,GAAG;AAEnC,OAAM,IAAI,MAAM,yDAAyD"}
@@ -1,3 +1,4 @@
1
+ //#region src/elements/renderTemporalAudio.ts
1
2
  async function renderTemporalAudio(host, fromMs, toMs) {
2
3
  const aacFrames = 48e3 * ((toMs - fromMs) / 1e3) / 1024;
3
4
  const contextSize = Math.round(aacFrames) * 1024;
@@ -32,4 +33,7 @@ async function renderTemporalAudio(host, fromMs, toMs) {
32
33
  }));
33
34
  return audioContext.startRendering();
34
35
  }
36
+
37
+ //#endregion
35
38
  export { renderTemporalAudio };
39
+ //# sourceMappingURL=renderTemporalAudio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderTemporalAudio.js","names":[],"sources":["../../src/elements/renderTemporalAudio.ts"],"sourcesContent":["import type { EFMedia } from \"./EFMedia.js\";\n\ninterface TemporalAudioHost {\n startTimeMs: number;\n endTimeMs: number;\n durationMs: number;\n getMediaElements(): EFMedia[];\n waitForMediaDurations?(): Promise<void>;\n}\n\nexport async function renderTemporalAudio(\n host: TemporalAudioHost,\n fromMs: number,\n toMs: number,\n): Promise<AudioBuffer> {\n const durationMs = toMs - fromMs;\n const duration = durationMs / 1000;\n const exactSamples = 48000 * duration;\n const aacFrames = exactSamples / 1024;\n const alignedFrames = Math.round(aacFrames);\n const contextSize = alignedFrames * 1024;\n\n if (contextSize <= 0) {\n throw new Error(\n `Duration must be greater than 0 when rendering audio. ${contextSize}ms`,\n );\n }\n\n const audioContext = new OfflineAudioContext(2, contextSize, 48000);\n\n if (host.waitForMediaDurations) {\n await host.waitForMediaDurations();\n }\n\n const abortController = new AbortController();\n\n await Promise.all(\n host.getMediaElements().map(async (mediaElement) => {\n if (mediaElement.mute) {\n return;\n }\n\n const mediaStartsBeforeEnd = mediaElement.startTimeMs <= toMs;\n const mediaEndsAfterStart = mediaElement.endTimeMs >= fromMs;\n const mediaOverlaps = mediaStartsBeforeEnd && mediaEndsAfterStart;\n if (!mediaOverlaps) {\n return;\n }\n\n const mediaLocalFromMs = Math.max(0, fromMs - mediaElement.startTimeMs);\n const mediaLocalToMs = Math.min(\n mediaElement.endTimeMs - mediaElement.startTimeMs,\n toMs - mediaElement.startTimeMs,\n );\n\n if (mediaLocalFromMs >= mediaLocalToMs) {\n return;\n }\n\n const sourceInMs =\n mediaElement.sourceInMs || mediaElement.trimStartMs || 0;\n const mediaSourceFromMs = mediaLocalFromMs + sourceInMs;\n const mediaSourceToMs = mediaLocalToMs + sourceInMs;\n\n const audio = await mediaElement.fetchAudioSpanningTime(\n mediaSourceFromMs,\n mediaSourceToMs,\n abortController.signal,\n );\n if (!audio) {\n return;\n }\n\n const bufferSource = audioContext.createBufferSource();\n bufferSource.buffer = await audioContext.decodeAudioData(\n await audio.blob.arrayBuffer(),\n );\n bufferSource.connect(audioContext.destination);\n\n const ctxStartMs = Math.max(0, mediaElement.startTimeMs - fromMs);\n\n const requestedSourceFromMs = mediaSourceFromMs;\n const actualSourceStartMs = audio.startMs;\n const offsetInBufferMs = requestedSourceFromMs - actualSourceStartMs;\n\n const safeOffsetMs = Math.max(0, offsetInBufferMs);\n\n const requestedDurationMs = mediaSourceToMs - mediaSourceFromMs;\n const availableAudioMs = audio.endMs - audio.startMs;\n const actualDurationMs = Math.min(\n requestedDurationMs,\n availableAudioMs - safeOffsetMs,\n );\n\n if (actualDurationMs <= 0) {\n return;\n }\n\n bufferSource.start(\n ctxStartMs / 1000,\n safeOffsetMs / 1000,\n actualDurationMs / 1000,\n );\n }),\n );\n\n return audioContext.startRendering();\n}\n"],"mappings":";AAUA,eAAsB,oBACpB,MACA,QACA,MACsB;CAItB,MAAM,YADe,SAFF,OAAO,UACI,OAEG;CAEjC,MAAM,cADgB,KAAK,MAAM,UAAU,GACP;AAEpC,KAAI,eAAe,EACjB,OAAM,IAAI,MACR,yDAAyD,YAAY,IACtE;CAGH,MAAM,eAAe,IAAI,oBAAoB,GAAG,aAAa,KAAM;AAEnE,KAAI,KAAK,sBACP,OAAM,KAAK,uBAAuB;CAGpC,MAAM,kBAAkB,IAAI,iBAAiB;AAE7C,OAAM,QAAQ,IACZ,KAAK,kBAAkB,CAAC,IAAI,OAAO,iBAAiB;AAClD,MAAI,aAAa,KACf;EAGF,MAAM,uBAAuB,aAAa,eAAe;EACzD,MAAM,sBAAsB,aAAa,aAAa;AAEtD,MAAI,EADkB,wBAAwB,qBAE5C;EAGF,MAAM,mBAAmB,KAAK,IAAI,GAAG,SAAS,aAAa,YAAY;EACvE,MAAM,iBAAiB,KAAK,IAC1B,aAAa,YAAY,aAAa,aACtC,OAAO,aAAa,YACrB;AAED,MAAI,oBAAoB,eACtB;EAGF,MAAM,aACJ,aAAa,cAAc,aAAa,eAAe;EACzD,MAAM,oBAAoB,mBAAmB;EAC7C,MAAM,kBAAkB,iBAAiB;EAEzC,MAAM,QAAQ,MAAM,aAAa,uBAC/B,mBACA,iBACA,gBAAgB,OACjB;AACD,MAAI,CAAC,MACH;EAGF,MAAM,eAAe,aAAa,oBAAoB;AACtD,eAAa,SAAS,MAAM,aAAa,gBACvC,MAAM,MAAM,KAAK,aAAa,CAC/B;AACD,eAAa,QAAQ,aAAa,YAAY;EAE9C,MAAM,aAAa,KAAK,IAAI,GAAG,aAAa,cAAc,OAAO;EAIjE,MAAM,mBAFwB,oBACF,MAAM;EAGlC,MAAM,eAAe,KAAK,IAAI,GAAG,iBAAiB;EAElD,MAAM,sBAAsB,kBAAkB;EAC9C,MAAM,mBAAmB,MAAM,QAAQ,MAAM;EAC7C,MAAM,mBAAmB,KAAK,IAC5B,qBACA,mBAAmB,aACpB;AAED,MAAI,oBAAoB,EACtB;AAGF,eAAa,MACX,aAAa,KACb,eAAe,KACf,mBAAmB,IACpB;GACD,CACH;AAED,QAAO,aAAa,gBAAgB"}
@@ -1,10 +1,15 @@
1
1
  import { deepGetTemporalElements } from "./EFTemporal.js";
2
- var ANIMATION_PRECISION_OFFSET = .1;
3
- var DEFAULT_ANIMATION_ITERATIONS = 1;
4
- var PROGRESS_PROPERTY = "--ef-progress";
5
- var DURATION_PROPERTY = "--ef-duration";
6
- var TRANSITION_DURATION_PROPERTY = "--ef-transition-duration";
7
- var TRANSITION_OUT_START_PROPERTY = "--ef-transition-out-start";
2
+
3
+ //#region src/elements/updateAnimations.ts
4
+ const ANIMATION_PRECISION_OFFSET = .1;
5
+ const DEFAULT_ANIMATION_ITERATIONS = 1;
6
+ const PROGRESS_PROPERTY = "--ef-progress";
7
+ const DURATION_PROPERTY = "--ef-duration";
8
+ const TRANSITION_DURATION_PROPERTY = "--ef-transition-duration";
9
+ const TRANSITION_OUT_START_PROPERTY = "--ef-transition-out-start";
10
+ /**
11
+ * Evaluates what the element's state should be based on the timeline
12
+ */
8
13
  const evaluateTemporalState = (element) => {
9
14
  const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;
10
15
  const progress = element.durationMs <= 0 ? 1 : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));
@@ -17,6 +22,10 @@ const evaluateTemporalState = (element) => {
17
22
  timelineTimeMs
18
23
  };
19
24
  };
25
+ /**
26
+ * Evaluates element visibility specifically for animation coordination
27
+ * Uses inclusive end boundaries to prevent animation jumps at exact boundaries
28
+ */
20
29
  const evaluateTemporalStateForAnimation = (element) => {
21
30
  const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;
22
31
  return {
@@ -25,7 +34,10 @@ const evaluateTemporalStateForAnimation = (element) => {
25
34
  timelineTimeMs
26
35
  };
27
36
  };
28
- var updateVisualState = (element, state) => {
37
+ /**
38
+ * Updates the visual state (CSS + display) to match temporal state
39
+ */
40
+ const updateVisualState = (element, state) => {
29
41
  element.style.setProperty(PROGRESS_PROPERTY, `${state.progress * 100}%`);
30
42
  if (!state.isVisible) {
31
43
  if (element.style.display !== "none") element.style.display = "none";
@@ -36,7 +48,10 @@ var updateVisualState = (element, state) => {
36
48
  element.style.setProperty(TRANSITION_DURATION_PROPERTY, `${element.parentTimegroup?.overlapMs ?? 0}ms`);
37
49
  element.style.setProperty(TRANSITION_OUT_START_PROPERTY, `${element.durationMs - (element.parentTimegroup?.overlapMs ?? 0)}ms`);
38
50
  };
39
- var coordinateAnimationsForSingleElement = (element) => {
51
+ /**
52
+ * Coordinates animations for a single element and its subtree, using the element as the time source
53
+ */
54
+ const coordinateAnimationsForSingleElement = (element) => {
40
55
  const animations = element.getAnimations({ subtree: true });
41
56
  for (const animation of animations) {
42
57
  if (animation.playState === "running") animation.pause();
@@ -67,6 +82,9 @@ var coordinateAnimationsForSingleElement = (element) => {
67
82
  }
68
83
  }
69
84
  };
85
+ /**
86
+ * Main function: synchronizes DOM element with timeline
87
+ */
70
88
  const updateAnimations = (element) => {
71
89
  const temporalState = evaluateTemporalState(element);
72
90
  deepGetTemporalElements(element).forEach((temporalElement) => {
@@ -78,4 +96,7 @@ const updateAnimations = (element) => {
78
96
  if (evaluateTemporalStateForAnimation(temporalElement).isVisible) coordinateAnimationsForSingleElement(temporalElement);
79
97
  });
80
98
  };
99
+
100
+ //#endregion
81
101
  export { evaluateTemporalStateForAnimation, updateAnimations };
102
+ //# sourceMappingURL=updateAnimations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateAnimations.js","names":[],"sources":["../../src/elements/updateAnimations.ts"],"sourcesContent":["import {\n deepGetTemporalElements,\n type TemporalMixinInterface,\n} from \"./EFTemporal.ts\";\n\n// All animatable elements are temporal elements with HTMLElement interface\nexport type AnimatableElement = TemporalMixinInterface & HTMLElement;\n\n// Constants\nconst ANIMATION_PRECISION_OFFSET = 0.1; // Use 0.1ms to safely avoid completion threshold\nconst DEFAULT_ANIMATION_ITERATIONS = 1;\nconst PROGRESS_PROPERTY = \"--ef-progress\";\nconst DURATION_PROPERTY = \"--ef-duration\";\nconst TRANSITION_DURATION_PROPERTY = \"--ef-transition-duration\";\nconst TRANSITION_OUT_START_PROPERTY = \"--ef-transition-out-start\";\n\n/**\n * Represents the temporal state of an element relative to the timeline\n */\ninterface TemporalState {\n progress: number;\n isVisible: boolean;\n timelineTimeMs: number;\n}\n\n/**\n * Evaluates what the element's state should be based on the timeline\n */\nexport const evaluateTemporalState = (\n element: AnimatableElement,\n): TemporalState => {\n // Get timeline time from root timegroup, or use element's own time if it IS a timegroup\n const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;\n\n const progress =\n element.durationMs <= 0\n ? 1\n : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));\n\n // Root elements and elements aligned with composition end should remain visible at exact end time\n // Other elements use exclusive end for clean transitions\n const isRootElement = !(element as any).parentTimegroup;\n const isLastElementInComposition =\n element.endTimeMs === element.rootTimegroup?.endTimeMs;\n const useInclusiveEnd = isRootElement || isLastElementInComposition;\n\n const isVisible =\n element.startTimeMs <= timelineTimeMs &&\n (useInclusiveEnd\n ? element.endTimeMs >= timelineTimeMs\n : element.endTimeMs > timelineTimeMs);\n\n return { progress, isVisible, timelineTimeMs };\n};\n\n/**\n * Evaluates element visibility specifically for animation coordination\n * Uses inclusive end boundaries to prevent animation jumps at exact boundaries\n */\nexport const evaluateTemporalStateForAnimation = (\n element: AnimatableElement,\n): TemporalState => {\n // Get timeline time from root timegroup, or use element's own time if it IS a timegroup\n const timelineTimeMs = (element.rootTimegroup ?? element).currentTimeMs;\n\n const progress =\n element.durationMs <= 0\n ? 1\n : Math.max(0, Math.min(1, element.currentTimeMs / element.durationMs));\n\n // For animation coordination, use inclusive end for ALL elements to prevent visual jumps\n const isVisible =\n element.startTimeMs <= timelineTimeMs &&\n element.endTimeMs >= timelineTimeMs;\n\n return { progress, isVisible, timelineTimeMs };\n};\n\n/**\n * Updates the visual state (CSS + display) to match temporal state\n */\nconst updateVisualState = (\n element: AnimatableElement,\n state: TemporalState,\n): void => {\n // Always set progress (needed for many use cases)\n element.style.setProperty(PROGRESS_PROPERTY, `${state.progress * 100}%`);\n\n // Handle visibility\n if (!state.isVisible) {\n if (element.style.display !== \"none\") {\n element.style.display = \"none\";\n }\n return;\n }\n\n if (element.style.display === \"none\") {\n element.style.display = \"\";\n }\n\n // Set other CSS properties for visible elements only\n element.style.setProperty(DURATION_PROPERTY, `${element.durationMs}ms`);\n element.style.setProperty(\n TRANSITION_DURATION_PROPERTY,\n `${element.parentTimegroup?.overlapMs ?? 0}ms`,\n );\n element.style.setProperty(\n TRANSITION_OUT_START_PROPERTY,\n `${element.durationMs - (element.parentTimegroup?.overlapMs ?? 0)}ms`,\n );\n};\n\n/**\n * Coordinates animations for a single element and its subtree, using the element as the time source\n */\nconst coordinateAnimationsForSingleElement = (\n element: AnimatableElement,\n): void => {\n const animations = element.getAnimations({ subtree: true });\n\n for (const animation of animations) {\n if (animation.playState === \"running\") {\n animation.pause();\n }\n\n const effect = animation.effect;\n if (!(effect && effect instanceof KeyframeEffect)) {\n continue;\n }\n\n const target = effect.target;\n if (!target) {\n continue;\n }\n\n // For animations in this element's subtree, always use this element as the time source\n // This handles both animations directly on the temporal element and on its non-temporal children\n const timing = effect.getTiming();\n const duration = Number(timing.duration) || 0;\n const delay = Number(timing.delay) || 0;\n const iterations =\n Number(timing.iterations) || DEFAULT_ANIMATION_ITERATIONS;\n\n if (duration <= 0) {\n animation.currentTime = 0;\n continue;\n }\n\n // Use the element itself as the time source (it's guaranteed to be temporal)\n const currentTime = element.ownCurrentTimeMs ?? 0;\n\n if (currentTime < delay) {\n animation.currentTime = 0;\n continue;\n }\n\n const adjustedTime = currentTime - delay;\n const currentIteration = Math.floor(adjustedTime / duration);\n const currentIterationTime = adjustedTime % duration;\n\n // Calculate the total animation timeline length (delay + duration * iterations)\n const totalAnimationLength = delay + duration * iterations;\n\n // CRITICAL: Always keep currentTime below totalAnimationLength to prevent completion\n const maxSafeCurrentTime =\n totalAnimationLength - ANIMATION_PRECISION_OFFSET;\n\n if (currentIteration >= iterations) {\n // Animation would be complete - clamp to just before completion\n animation.currentTime = maxSafeCurrentTime;\n } else {\n // Animation in progress - clamp to safe value within current iteration\n const proposedCurrentTime =\n Math.min(currentIterationTime, duration - ANIMATION_PRECISION_OFFSET) +\n delay;\n animation.currentTime = Math.min(proposedCurrentTime, maxSafeCurrentTime);\n }\n }\n};\n\n/**\n * Main function: synchronizes DOM element with timeline\n */\nexport const updateAnimations = (element: AnimatableElement): void => {\n const temporalState = evaluateTemporalState(element);\n deepGetTemporalElements(element).forEach((temporalElement) => {\n const temporalState = evaluateTemporalState(temporalElement);\n updateVisualState(temporalElement, temporalState);\n });\n updateVisualState(element, temporalState);\n\n // Coordinate animations - use animation-specific visibility to prevent jumps at exact boundaries\n const animationState = evaluateTemporalStateForAnimation(element);\n if (animationState.isVisible) {\n coordinateAnimationsForSingleElement(element);\n }\n\n // Coordinate animations for child elements using animation-specific visibility\n deepGetTemporalElements(element).forEach((temporalElement) => {\n const childAnimationState =\n evaluateTemporalStateForAnimation(temporalElement);\n if (childAnimationState.isVisible) {\n coordinateAnimationsForSingleElement(temporalElement);\n }\n });\n};\n"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
2
+ @tailwind base;
3
+ /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
4
+ @tailwind components;
5
+ /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
6
+ @tailwind utilities;
7
+
8
+
9
+ /*# sourceMappingURL=elements-ZhsB7B5N.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements-ZhsB7B5N.css","names":[],"sources":["../src/elements.css"],"sourcesContent":["/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind base;\n/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind components;\n/* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */\n@tailwind utilities;\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA"}
@@ -1,51 +1,57 @@
1
- import { z } from 'zod';
2
- export declare const RenderInfo: z.ZodObject<{
3
- width: z.ZodNumber;
4
- height: z.ZodNumber;
5
- fps: z.ZodNumber;
6
- durationMs: z.ZodNumber;
7
- assets: z.ZodObject<{
8
- efMedia: z.ZodRecord<z.ZodString, z.ZodAny>;
9
- efCaptions: z.ZodArray<z.ZodString, "many">;
10
- efImage: z.ZodArray<z.ZodString, "many">;
11
- }, "strip", z.ZodTypeAny, {
12
- efMedia: Record<string, any>;
13
- efCaptions: string[];
14
- efImage: string[];
15
- }, {
16
- efMedia: Record<string, any>;
17
- efCaptions: string[];
18
- efImage: string[];
19
- }>;
1
+ import { z } from "zod";
2
+
3
+ //#region src/getRenderInfo.d.ts
4
+
5
+ declare const RenderInfo: z.ZodObject<{
6
+ width: z.ZodNumber;
7
+ height: z.ZodNumber;
8
+ fps: z.ZodNumber;
9
+ durationMs: z.ZodNumber;
10
+ assets: z.ZodObject<{
11
+ efMedia: z.ZodRecord<z.ZodString, z.ZodAny>;
12
+ efCaptions: z.ZodArray<z.ZodString, "many">;
13
+ efImage: z.ZodArray<z.ZodString, "many">;
14
+ }, "strip", z.ZodTypeAny, {
15
+ efMedia: Record<string, any>;
16
+ efCaptions: string[];
17
+ efImage: string[];
18
+ }, {
19
+ efMedia: Record<string, any>;
20
+ efCaptions: string[];
21
+ efImage: string[];
22
+ }>;
20
23
  }, "strip", z.ZodTypeAny, {
21
- durationMs: number;
22
- width: number;
23
- height: number;
24
- fps: number;
25
- assets: {
26
- efMedia: Record<string, any>;
27
- efCaptions: string[];
28
- efImage: string[];
29
- };
24
+ durationMs: number;
25
+ width: number;
26
+ height: number;
27
+ fps: number;
28
+ assets: {
29
+ efMedia: Record<string, any>;
30
+ efCaptions: string[];
31
+ efImage: string[];
32
+ };
30
33
  }, {
31
- durationMs: number;
32
- width: number;
33
- height: number;
34
- fps: number;
35
- assets: {
36
- efMedia: Record<string, any>;
37
- efCaptions: string[];
38
- efImage: string[];
39
- };
34
+ durationMs: number;
35
+ width: number;
36
+ height: number;
37
+ fps: number;
38
+ assets: {
39
+ efMedia: Record<string, any>;
40
+ efCaptions: string[];
41
+ efImage: string[];
42
+ };
40
43
  }>;
41
- export declare const getRenderInfo: () => Promise<{
42
- width: number;
43
- height: number;
44
- fps: number;
45
- durationMs: number;
46
- assets: {
47
- efMedia: Record<string, any>;
48
- efCaptions: string[];
49
- efImage: string[];
50
- };
44
+ declare const getRenderInfo: () => Promise<{
45
+ width: number;
46
+ height: number;
47
+ fps: number;
48
+ durationMs: number;
49
+ assets: {
50
+ efMedia: Record<string, any>;
51
+ efCaptions: string[];
52
+ efImage: string[];
53
+ };
51
54
  }>;
55
+ //#endregion
56
+ export { RenderInfo, getRenderInfo };
57
+ //# sourceMappingURL=getRenderInfo.d.ts.map
@@ -1,4 +1,6 @@
1
1
  import { z } from "zod";
2
+
3
+ //#region src/getRenderInfo.ts
2
4
  const RenderInfo = z.object({
3
5
  width: z.number().positive(),
4
6
  height: z.number().positive(),
@@ -61,4 +63,7 @@ const getRenderInfo = async () => {
61
63
  console.error("Render info", renderInfo);
62
64
  return renderInfo;
63
65
  };
66
+
67
+ //#endregion
64
68
  export { RenderInfo, getRenderInfo };
69
+ //# sourceMappingURL=getRenderInfo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getRenderInfo.js","names":[],"sources":["../src/getRenderInfo.ts"],"sourcesContent":["/**\n * THIS MODULE DOESNT USE THE DEBUG LOGGER BECAUSE IT IS\n * RUN IN A WEB BROWSER. LOGS ARE CAPTURED AND RE-LOGGED.\n *\n * A similar module exists in @/render. For the time being, we are\n * allowing this divergence to allow for a more efficient implementation\n * of the render info extraction.\n */\n\nimport type {\n EFCaptions,\n EFImage,\n EFMedia,\n EFTimegroup,\n} from \"@editframe/elements\";\nimport { z } from \"zod\";\n\nexport const RenderInfo = z.object({\n width: z.number().positive(),\n height: z.number().positive(),\n fps: z.number().positive(),\n durationMs: z.number().positive(),\n assets: z.object({\n efMedia: z.record(z.any()),\n efCaptions: z.array(z.string()),\n efImage: z.array(z.string()),\n }),\n});\n\nexport const getRenderInfo = async () => {\n const rootTimeGroup = document.querySelector(\"ef-timegroup\") as\n | EFTimegroup\n | undefined;\n if (!rootTimeGroup) {\n throw new Error(\"No ef-timegroup found\");\n }\n\n console.error(\"Waiting for media durations\", rootTimeGroup);\n await rootTimeGroup.waitForMediaDurations();\n\n const width = rootTimeGroup.clientWidth;\n const height = rootTimeGroup.clientHeight;\n const fps = 30;\n const durationMs = Math.round(rootTimeGroup.durationMs);\n\n const elements = document.querySelectorAll(\n \"ef-audio, ef-video, ef-image, ef-captions\",\n );\n\n const assets = {\n efMedia: <Record<string, any>>{},\n efCaptions: new Set<string>(),\n efImage: new Set<string>(),\n };\n\n for (const element of elements) {\n switch (element.tagName) {\n case \"EF-AUDIO\":\n case \"EF-VIDEO\": {\n const src = (element as EFMedia).src;\n console.error(\"Processing element\", element.tagName, src);\n // Access fragment index data from the media engine task\n const mediaEngine = (element as EFMedia).mediaEngineTask.value;\n if (mediaEngine && \"data\" in mediaEngine) {\n assets.efMedia[src] = (mediaEngine as any).data;\n }\n break;\n }\n case \"EF-IMAGE\": {\n const src = (element as EFImage).src;\n console.error(\"Processing element\", element.tagName, src);\n assets.efImage.add(src);\n break;\n }\n case \"EF-CAPTIONS\": {\n const src = (element as EFCaptions).targetElement?.src;\n console.error(\"Processing element\", element.tagName, src);\n assets.efCaptions.add(src ?? \"undefined\");\n break;\n }\n }\n }\n\n const renderInfo = {\n width,\n height,\n fps,\n durationMs,\n assets: {\n efMedia: assets.efMedia,\n efCaptions: Array.from(assets.efCaptions),\n efImage: Array.from(assets.efImage),\n },\n };\n\n console.error(\"Render info\", renderInfo);\n\n return renderInfo;\n};\n"],"mappings":";;;AAiBA,MAAa,aAAa,EAAE,OAAO;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,QAAQ,EAAE,OAAO;EACf,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;EAC1B,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;EAC/B,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC;EAC7B,CAAC;CACH,CAAC;AAEF,MAAa,gBAAgB,YAAY;CACvC,MAAM,gBAAgB,SAAS,cAAc,eAAe;AAG5D,KAAI,CAAC,cACH,OAAM,IAAI,MAAM,wBAAwB;AAG1C,SAAQ,MAAM,+BAA+B,cAAc;AAC3D,OAAM,cAAc,uBAAuB;CAE3C,MAAM,QAAQ,cAAc;CAC5B,MAAM,SAAS,cAAc;CAC7B,MAAM,MAAM;CACZ,MAAM,aAAa,KAAK,MAAM,cAAc,WAAW;CAEvD,MAAM,WAAW,SAAS,iBACxB,4CACD;CAED,MAAM,SAAS;EACb,SAA8B,EAAE;EAChC,4BAAY,IAAI,KAAa;EAC7B,yBAAS,IAAI,KAAa;EAC3B;AAED,MAAK,MAAM,WAAW,SACpB,SAAQ,QAAQ,SAAhB;EACE,KAAK;EACL,KAAK,YAAY;GACf,MAAM,MAAO,QAAoB;AACjC,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;GAEzD,MAAM,cAAe,QAAoB,gBAAgB;AACzD,OAAI,eAAe,UAAU,YAC3B,QAAO,QAAQ,OAAQ,YAAoB;AAE7C;;EAEF,KAAK,YAAY;GACf,MAAM,MAAO,QAAoB;AACjC,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AACzD,UAAO,QAAQ,IAAI,IAAI;AACvB;;EAEF,KAAK,eAAe;GAClB,MAAM,MAAO,QAAuB,eAAe;AACnD,WAAQ,MAAM,sBAAsB,QAAQ,SAAS,IAAI;AACzD,UAAO,WAAW,IAAI,OAAO,YAAY;AACzC;;;CAKN,MAAM,aAAa;EACjB;EACA;EACA;EACA;EACA,QAAQ;GACN,SAAS,OAAO;GAChB,YAAY,MAAM,KAAK,OAAO,WAAW;GACzC,SAAS,MAAM,KAAK,OAAO,QAAQ;GACpC;EACF;AAED,SAAQ,MAAM,eAAe,WAAW;AAExC,QAAO"}
@@ -1,21 +1,20 @@
1
- import { LitElement } from 'lit';
2
- import { TemporalMixinInterface } from '../elements/EFTemporal.js';
3
- export declare const targetTemporalContext: {
4
- __context__: TemporalMixinInterface | null;
5
- };
6
- export declare class ContextMixinInterface extends LitElement {
7
- signingURL?: string;
8
- apiHost?: string;
9
- rendering: boolean;
10
- playing: boolean;
11
- loop: boolean;
12
- currentTimeMs: number;
13
- focusedElement?: HTMLElement;
14
- targetTemporal: TemporalMixinInterface | null;
15
- play(): Promise<void>;
16
- pause(): void;
1
+ import { TemporalMixinInterface } from "../elements/EFTemporal.js";
2
+ import { LitElement } from "lit";
3
+
4
+ //#region src/gui/ContextMixin.d.ts
5
+
6
+ declare class ContextMixinInterface extends LitElement {
7
+ signingURL?: string;
8
+ apiHost?: string;
9
+ rendering: boolean;
10
+ playing: boolean;
11
+ loop: boolean;
12
+ currentTimeMs: number;
13
+ focusedElement?: HTMLElement;
14
+ targetTemporal: TemporalMixinInterface | null;
15
+ play(): Promise<void>;
16
+ pause(): void;
17
17
  }
18
- export declare function isContextMixin(value: any): value is ContextMixinInterface;
19
- type Constructor<T = {}> = new (...args: any[]) => T;
20
- export declare function ContextMixin<T extends Constructor<LitElement>>(superClass: T): Constructor<ContextMixinInterface> & T;
21
- export {};
18
+ //#endregion
19
+ export { ContextMixinInterface };
20
+ //# sourceMappingURL=ContextMixin.d.ts.map