@editframe/elements 0.24.1-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 (335) 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 -101
  103. package/dist/elements/EFTimegroup.js +58 -3
  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 +18 -0
  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/tsdown.config.ts +36 -0
  235. package/dist/DelayedLoadingState.d.ts +0 -48
  236. package/dist/DelayedLoadingState.integration.test.d.ts +0 -1
  237. package/dist/DelayedLoadingState.test.d.ts +0 -1
  238. package/dist/EF_INTERACTIVE.d.ts +0 -1
  239. package/dist/EF_RENDERING.d.ts +0 -1
  240. package/dist/LoadingDebounce.test.d.ts +0 -1
  241. package/dist/ManualScrubTest.test.d.ts +0 -1
  242. package/dist/ScrubResolvedFlashing.test.d.ts +0 -1
  243. package/dist/ScrubTrackManager.test.d.ts +0 -1
  244. package/dist/VideoSeekFlashing.browsertest.d.ts +0 -0
  245. package/dist/VideoStuckDiagnostic.test.d.ts +0 -1
  246. package/dist/attachContextRoot.d.ts +0 -1
  247. package/dist/elements/ContextProxiesController.d.ts +0 -39
  248. package/dist/elements/CrossUpdateController.d.ts +0 -8
  249. package/dist/elements/EFAudio.browsertest.d.ts +0 -0
  250. package/dist/elements/EFCaptions.browsertest.d.ts +0 -0
  251. package/dist/elements/EFImage.browsertest.d.ts +0 -0
  252. package/dist/elements/EFMedia/AssetIdMediaEngine.d.ts +0 -19
  253. package/dist/elements/EFMedia/AssetIdMediaEngine.test.d.ts +0 -1
  254. package/dist/elements/EFMedia/AssetMediaEngine.browsertest.d.ts +0 -0
  255. package/dist/elements/EFMedia/AssetMediaEngine.d.ts +0 -56
  256. package/dist/elements/EFMedia/BaseMediaEngine.browsertest.d.ts +0 -1
  257. package/dist/elements/EFMedia/BaseMediaEngine.d.ts +0 -103
  258. package/dist/elements/EFMedia/BufferedSeekingInput.browsertest.d.ts +0 -1
  259. package/dist/elements/EFMedia/JitMediaEngine.browsertest.d.ts +0 -0
  260. package/dist/elements/EFMedia/JitMediaEngine.d.ts +0 -46
  261. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.browsertest.d.ts +0 -9
  262. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.d.ts +0 -3
  263. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.browsertest.d.ts +0 -9
  264. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.d.ts +0 -4
  265. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.browsertest.d.ts +0 -9
  266. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.d.ts +0 -3
  267. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.chunkboundary.regression.browsertest.d.ts +0 -0
  268. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.d.ts +0 -7
  269. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.d.ts +0 -4
  270. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.d.ts +0 -4
  271. package/dist/elements/EFMedia/audioTasks/makeAudioTasksVideoOnly.browsertest.d.ts +0 -1
  272. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.d.ts +0 -3
  273. package/dist/elements/EFMedia/shared/AudioSpanUtils.d.ts +0 -7
  274. package/dist/elements/EFMedia/shared/GlobalInputCache.d.ts +0 -39
  275. package/dist/elements/EFMedia/shared/PrecisionUtils.d.ts +0 -28
  276. package/dist/elements/EFMedia/shared/RenditionHelpers.browsertest.d.ts +0 -1
  277. package/dist/elements/EFMedia/shared/RenditionHelpers.d.ts +0 -11
  278. package/dist/elements/EFMedia/shared/ThumbnailExtractor.d.ts +0 -27
  279. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.browsertest.d.ts +0 -9
  280. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.d.ts +0 -17
  281. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.d.ts +0 -29
  282. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -25
  283. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.d.ts +0 -8
  284. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.d.ts +0 -4
  285. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.d.ts +0 -3
  286. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.d.ts +0 -6
  287. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.d.ts +0 -4
  288. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.d.ts +0 -4
  289. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.d.ts +0 -6
  290. package/dist/elements/EFMedia.browsertest.d.ts +0 -10
  291. package/dist/elements/EFSurface.browsertest.d.ts +0 -0
  292. package/dist/elements/EFTemporal.browsertest.d.ts +0 -22
  293. package/dist/elements/EFThumbnailStrip.browsertest.d.ts +0 -0
  294. package/dist/elements/EFThumbnailStrip.media-engine.browsertest.d.ts +0 -0
  295. package/dist/elements/EFTimegroup.browsertest.d.ts +0 -41
  296. package/dist/elements/EFVideo.browsertest.d.ts +0 -0
  297. package/dist/elements/FetchContext.browsertest.d.ts +0 -0
  298. package/dist/elements/TargetController.browsertest.d.ts +0 -19
  299. package/dist/elements/durationConverter.d.ts +0 -16
  300. package/dist/elements/parseTimeToMs.d.ts +0 -1
  301. package/dist/elements/printTaskStatus.d.ts +0 -2
  302. package/dist/elements/renderTemporalAudio.d.ts +0 -10
  303. package/dist/elements/updateAnimations.browsertest.d.ts +0 -13
  304. package/dist/elements/updateAnimations.d.ts +0 -24
  305. package/dist/elements/util.d.ts +0 -3
  306. package/dist/gui/ContextMixin.browsertest.d.ts +0 -15
  307. package/dist/gui/Controllable.browsertest.d.ts +0 -0
  308. package/dist/gui/EFControls.browsertest.d.ts +0 -11
  309. package/dist/gui/EFDial.browsertest.d.ts +0 -0
  310. package/dist/gui/EFFilmstrip.browsertest.d.ts +0 -11
  311. package/dist/gui/EFPause.browsertest.d.ts +0 -0
  312. package/dist/gui/EFPlay.browsertest.d.ts +0 -0
  313. package/dist/gui/EFResizableBox.browsertest.d.ts +0 -0
  314. package/dist/gui/EFTimeDisplay.browsertest.d.ts +0 -0
  315. package/dist/gui/TWMixin.d.ts +0 -2
  316. package/dist/gui/TargetOrContextMixin.d.ts +0 -10
  317. package/dist/gui/currentTimeContext.d.ts +0 -3
  318. package/dist/gui/durationContext.d.ts +0 -3
  319. package/dist/gui/efContext.d.ts +0 -4
  320. package/dist/gui/fetchContext.d.ts +0 -3
  321. package/dist/gui/focusedElementContext.d.ts +0 -3
  322. package/dist/gui/playingContext.d.ts +0 -6
  323. package/dist/msToTimeCode.d.ts +0 -1
  324. package/dist/otel/BridgeSpanExporter.d.ts +0 -13
  325. package/dist/otel/setupBrowserTracing.d.ts +0 -12
  326. package/dist/style.css +0 -2
  327. package/dist/transcoding/cache/RequestDeduplicator.d.ts +0 -29
  328. package/dist/transcoding/cache/RequestDeduplicator.test.d.ts +0 -1
  329. package/dist/transcoding/cache/URLTokenDeduplicator.d.ts +0 -38
  330. package/dist/transcoding/cache/URLTokenDeduplicator.test.d.ts +0 -1
  331. package/dist/transcoding/utils/MediaUtils.d.ts +0 -9
  332. package/dist/transcoding/utils/constants.d.ts +0 -27
  333. package/dist/utils/LRUCache.d.ts +0 -80
  334. package/dist/utils/LRUCache.test.d.ts +0 -1
  335. /package/dist/{LoadingIndicator.browsertest.d.ts → elements.js} +0 -0
@@ -1,116 +1,128 @@
1
- import { Task } from '@lit/task';
2
- import { PropertyValueMap } from 'lit';
3
- import { EFMedia } from './EFMedia.js';
1
+ import { EFFramegen } from "../EF_FRAMEGEN.js";
2
+ import { InputTask } from "./EFMedia/shared/MediaTaskUtils.js";
3
+ import { MediaEngine } from "../transcoding/types/index.js";
4
+ import { EFMedia } from "./EFMedia.js";
5
+ import { VideoBufferState } from "./EFMedia/videoTasks/makeVideoBufferTask.js";
6
+ import { Task } from "@lit/task";
7
+ import * as lit2 from "lit";
8
+ import { PropertyValueMap } from "lit";
9
+ import * as mediabunny0 from "mediabunny";
10
+ import * as lit_html2 from "lit-html";
11
+ import * as lit_html_directives_ref0 from "lit-html/directives/ref";
12
+
13
+ //#region src/elements/EFVideo.d.ts
4
14
  declare global {
5
- var EF_FRAMEGEN: import("../EF_FRAMEGEN.js").EFFramegen;
15
+ var EF_FRAMEGEN: EFFramegen;
6
16
  }
7
17
  interface LoadingState {
8
- isLoading: boolean;
9
- operation: "scrub-segment" | "video-segment" | "seeking" | "decoding" | null;
10
- message: string;
18
+ isLoading: boolean;
19
+ operation: "scrub-segment" | "video-segment" | "seeking" | "decoding" | null;
20
+ message: string;
11
21
  }
12
22
  declare const EFVideo_base: typeof EFMedia;
13
- export declare class EFVideo extends EFVideo_base {
14
- static styles: import('lit').CSSResult[];
15
- canvasRef: import('lit-html/directives/ref').Ref<HTMLCanvasElement>;
16
- /**
17
- * Duration in milliseconds for video buffering ahead of current time
18
- * @domAttribute "video-buffer-duration"
19
- */
20
- videoBufferDurationMs: number;
21
- /**
22
- * Maximum number of concurrent video segment fetches for buffering
23
- * @domAttribute "max-video-buffer-fetches"
24
- */
25
- maxVideoBufferFetches: number;
26
- /**
27
- * Enable/disable video buffering system
28
- * @domAttribute "enable-video-buffering"
29
- */
30
- enableVideoBuffering: boolean;
31
- unifiedVideoSeekTask: Task<readonly [number], import('mediabunny').VideoSample | undefined>;
32
- videoBufferTask: Task<readonly [number], import('./EFMedia/videoTasks/makeVideoBufferTask.ts').VideoBufferState>;
33
- scrubVideoBufferTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], unknown>;
34
- scrubVideoInputTask: import('./EFMedia/shared/MediaTaskUtils.ts').InputTask;
35
- scrubVideoSeekTask: Task<readonly [number], import('mediabunny').VideoSample | undefined>;
36
- scrubVideoSegmentIdTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number], number | undefined>;
37
- scrubVideoSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined, number | undefined], ArrayBuffer>;
38
- scrubVideoInitSegmentFetchTask: Task<readonly [import('../transcoding/types/index.ts').MediaEngine | undefined], ArrayBuffer>;
39
- /**
40
- * Delayed loading state manager for user feedback
41
- */
42
- private delayedLoadingState;
43
- /**
44
- * Loading state for user feedback
45
- */
46
- loadingState: {
47
- isLoading: boolean;
48
- operation: LoadingState["operation"];
49
- message: string;
50
- };
51
- constructor();
52
- protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
53
- render(): import('lit-html').TemplateResult<1>;
54
- get canvasElement(): HTMLCanvasElement | undefined;
55
- frameTask: Task<readonly [number], void>;
56
- /**
57
- * Start a delayed loading operation for testing
58
- */
59
- startDelayedLoading(operationId: string, message: string, options?: {
60
- background?: boolean;
61
- }): void;
62
- /**
63
- * Clear a delayed loading operation for testing
64
- */
65
- clearDelayedLoading(operationId: string): void;
66
- /**
67
- * Set loading state for user feedback
68
- */
69
- private setLoadingState;
70
- /**
71
- * Paint the current video frame to canvas
72
- * Called by frameTask after seek is complete
73
- */
74
- paint(seekToMs: number, parentSpan?: any): void;
75
- /**
76
- * Clear the canvas when element becomes inactive
77
- */
78
- clearCanvas(): void;
79
- /**
80
- * Display a video frame on the canvas
81
- */
82
- displayFrame(frame: VideoFrame, seekToMs: number, parentSpan?: any): void;
83
- /**
84
- * Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode
85
- */
86
- private isInProductionRenderingMode;
87
- /**
88
- * Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)
89
- */
90
- private isFrameRenderingActive;
91
- /**
92
- * Legacy getter for fragment index task
93
- * Still used by EFCaptions - maps to unified video seek task
94
- */
95
- get fragmentIndexTask(): Task<readonly [number], import('mediabunny').VideoSample | undefined>;
96
- /**
97
- * Helper method for tests: wait for the current frame to be ready
98
- * This encapsulates the complexity of ensuring the video has updated
99
- * and its frameTask has completed.
100
- *
101
- * @returns Promise that resolves when the frame is ready
102
- */
103
- waitForFrameReady(): Promise<void>;
104
- /**
105
- * Clean up resources when component is disconnected
106
- */
107
- disconnectedCallback(): void;
108
- didBecomeRoot(): void;
109
- didBecomeChild(): void;
23
+ declare class EFVideo extends EFVideo_base {
24
+ static styles: lit2.CSSResult[];
25
+ canvasRef: lit_html_directives_ref0.Ref<HTMLCanvasElement>;
26
+ /**
27
+ * Duration in milliseconds for video buffering ahead of current time
28
+ * @domAttribute "video-buffer-duration"
29
+ */
30
+ videoBufferDurationMs: number;
31
+ /**
32
+ * Maximum number of concurrent video segment fetches for buffering
33
+ * @domAttribute "max-video-buffer-fetches"
34
+ */
35
+ maxVideoBufferFetches: number;
36
+ /**
37
+ * Enable/disable video buffering system
38
+ * @domAttribute "enable-video-buffering"
39
+ */
40
+ enableVideoBuffering: boolean;
41
+ unifiedVideoSeekTask: Task<readonly [number], mediabunny0.VideoSample | undefined>;
42
+ videoBufferTask: Task<readonly [number], VideoBufferState>;
43
+ scrubVideoBufferTask: Task<readonly [MediaEngine | undefined], unknown>;
44
+ scrubVideoInputTask: InputTask;
45
+ scrubVideoSeekTask: Task<readonly [number], mediabunny0.VideoSample | undefined>;
46
+ scrubVideoSegmentIdTask: Task<readonly [MediaEngine | undefined, number], number | undefined>;
47
+ scrubVideoSegmentFetchTask: Task<readonly [MediaEngine | undefined, number | undefined], ArrayBuffer>;
48
+ scrubVideoInitSegmentFetchTask: Task<readonly [MediaEngine | undefined], ArrayBuffer>;
49
+ /**
50
+ * Delayed loading state manager for user feedback
51
+ */
52
+ private delayedLoadingState;
53
+ /**
54
+ * Loading state for user feedback
55
+ */
56
+ loadingState: {
57
+ isLoading: boolean;
58
+ operation: LoadingState["operation"];
59
+ message: string;
60
+ };
61
+ constructor();
62
+ protected updated(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void;
63
+ render(): lit_html2.TemplateResult<1>;
64
+ get canvasElement(): HTMLCanvasElement | undefined;
65
+ frameTask: Task<readonly [number], void>;
66
+ /**
67
+ * Start a delayed loading operation for testing
68
+ */
69
+ startDelayedLoading(operationId: string, message: string, options?: {
70
+ background?: boolean;
71
+ }): void;
72
+ /**
73
+ * Clear a delayed loading operation for testing
74
+ */
75
+ clearDelayedLoading(operationId: string): void;
76
+ /**
77
+ * Set loading state for user feedback
78
+ */
79
+ private setLoadingState;
80
+ /**
81
+ * Paint the current video frame to canvas
82
+ * Called by frameTask after seek is complete
83
+ */
84
+ paint(seekToMs: number, parentSpan?: any): void;
85
+ /**
86
+ * Clear the canvas when element becomes inactive
87
+ */
88
+ clearCanvas(): void;
89
+ /**
90
+ * Display a video frame on the canvas
91
+ */
92
+ displayFrame(frame: VideoFrame, seekToMs: number, parentSpan?: any): void;
93
+ /**
94
+ * Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode
95
+ */
96
+ private isInProductionRenderingMode;
97
+ /**
98
+ * Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)
99
+ */
100
+ private isFrameRenderingActive;
101
+ /**
102
+ * Legacy getter for fragment index task
103
+ * Still used by EFCaptions - maps to unified video seek task
104
+ */
105
+ get fragmentIndexTask(): Task<readonly [number], mediabunny0.VideoSample | undefined>;
106
+ /**
107
+ * Helper method for tests: wait for the current frame to be ready
108
+ * This encapsulates the complexity of ensuring the video has updated
109
+ * and its frameTask has completed.
110
+ *
111
+ * @returns Promise that resolves when the frame is ready
112
+ */
113
+ waitForFrameReady(): Promise<void>;
114
+ /**
115
+ * Clean up resources when component is disconnected
116
+ */
117
+ disconnectedCallback(): void;
118
+ didBecomeRoot(): void;
119
+ didBecomeChild(): void;
110
120
  }
111
121
  declare global {
112
- interface HTMLElementTagNameMap {
113
- "ef-video": EFVideo;
114
- }
122
+ interface HTMLElementTagNameMap {
123
+ "ef-video": EFVideo;
124
+ }
115
125
  }
116
- export {};
126
+ //#endregion
127
+ export { EFVideo };
128
+ //# sourceMappingURL=EFVideo.d.ts.map
@@ -18,8 +18,10 @@ import { css, html } from "lit";
18
18
  import { customElement, property, state } from "lit/decorators.js";
19
19
  import { context, trace } from "@opentelemetry/api";
20
20
  import { createRef, ref } from "lit/directives/ref.js";
21
- var log = debug("ef:elements:EFVideo");
22
- var EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
21
+
22
+ //#region src/elements/EFVideo.ts
23
+ const log = debug("ef:elements:EFVideo");
24
+ let EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
23
25
  static {
24
26
  this.styles = [css`
25
27
  :host {
@@ -164,12 +166,21 @@ var EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
164
166
  const shadowCanvas = this.shadowRoot?.querySelector("canvas");
165
167
  if (shadowCanvas) return shadowCanvas;
166
168
  }
169
+ /**
170
+ * Start a delayed loading operation for testing
171
+ */
167
172
  startDelayedLoading(operationId, message, options = {}) {
168
173
  this.delayedLoadingState.startLoading(operationId, message, options);
169
174
  }
175
+ /**
176
+ * Clear a delayed loading operation for testing
177
+ */
170
178
  clearDelayedLoading(operationId) {
171
179
  this.delayedLoadingState.clearLoading(operationId);
172
180
  }
181
+ /**
182
+ * Set loading state for user feedback
183
+ */
173
184
  setLoadingState(isLoading, operation = null, message = "") {
174
185
  this.loadingState = {
175
186
  isLoading,
@@ -177,6 +188,10 @@ var EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
177
188
  message
178
189
  };
179
190
  }
191
+ /**
192
+ * Paint the current video frame to canvas
193
+ * Called by frameTask after seek is complete
194
+ */
180
195
  paint(seekToMs, parentSpan) {
181
196
  const parentContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : void 0;
182
197
  withSpanSync("video.paint", {
@@ -230,11 +245,17 @@ var EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
230
245
  span.setAttribute("totalPaintMs", tEnd - t0);
231
246
  });
232
247
  }
248
+ /**
249
+ * Clear the canvas when element becomes inactive
250
+ */
233
251
  clearCanvas() {
234
252
  if (!this.canvasElement) return;
235
253
  const ctx = this.canvasElement.getContext("2d");
236
254
  if (ctx) ctx.clearRect(0, 0, this.canvasElement.width, this.canvasElement.height);
237
255
  }
256
+ /**
257
+ * Display a video frame on the canvas
258
+ */
238
259
  displayFrame(frame, seekToMs, parentSpan) {
239
260
  const parentContext = parentSpan ? trace.setSpan(context.active(), parentSpan) : void 0;
240
261
  withSpanSync("video.displayFrame", {
@@ -291,24 +312,44 @@ var EFVideo = class EFVideo$1 extends TWMixin(EFMedia) {
291
312
  log("trace: frame drawn to canvas", { seekToMs });
292
313
  });
293
314
  }
315
+ /**
316
+ * Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode
317
+ */
294
318
  isInProductionRenderingMode() {
295
319
  if (typeof window.EF_RENDERING === "function") return window.EF_RENDERING();
296
320
  if (document.querySelector("ef-workbench")?.rendering) return true;
297
321
  if (window.EF_FRAMEGEN?.renderOptions) return true;
298
322
  return false;
299
323
  }
324
+ /**
325
+ * Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)
326
+ */
300
327
  isFrameRenderingActive() {
301
328
  if (!window.EF_FRAMEGEN?.renderOptions) return false;
302
329
  const renderStartTime = window.EF_FRAMEGEN.renderOptions.encoderOptions.fromMs;
303
330
  return (this.rootTimegroup?.currentTimeMs || 0) >= renderStartTime;
304
331
  }
332
+ /**
333
+ * Legacy getter for fragment index task
334
+ * Still used by EFCaptions - maps to unified video seek task
335
+ */
305
336
  get fragmentIndexTask() {
306
337
  return this.unifiedVideoSeekTask;
307
338
  }
339
+ /**
340
+ * Helper method for tests: wait for the current frame to be ready
341
+ * This encapsulates the complexity of ensuring the video has updated
342
+ * and its frameTask has completed.
343
+ *
344
+ * @returns Promise that resolves when the frame is ready
345
+ */
308
346
  async waitForFrameReady() {
309
347
  await this.updateComplete;
310
348
  await this.frameTask.run();
311
349
  }
350
+ /**
351
+ * Clean up resources when component is disconnected
352
+ */
312
353
  disconnectedCallback() {
313
354
  super.disconnectedCallback();
314
355
  this.delayedLoadingState.clearAllLoading();
@@ -334,4 +375,7 @@ __decorate([property({
334
375
  })], EFVideo.prototype, "enableVideoBuffering", void 0);
335
376
  __decorate([state()], EFVideo.prototype, "loadingState", void 0);
336
377
  EFVideo = __decorate([customElement("ef-video")], EFVideo);
378
+
379
+ //#endregion
337
380
  export { EFVideo };
381
+ //# sourceMappingURL=EFVideo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFVideo.js","names":["EFVideo"],"sources":["../../src/elements/EFVideo.ts"],"sourcesContent":["import { Task } from \"@lit/task\";\nimport { context, trace } from \"@opentelemetry/api\";\nimport debug from \"debug\";\nimport { css, html, type PropertyValueMap } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { DelayedLoadingState } from \"../DelayedLoadingState.js\";\nimport { TWMixin } from \"../gui/TWMixin.js\";\nimport { withSpan, withSpanSync } from \"../otel/tracingHelpers.js\";\nimport { makeScrubVideoBufferTask } from \"./EFMedia/videoTasks/makeScrubVideoBufferTask.ts\";\nimport { makeScrubVideoInitSegmentFetchTask } from \"./EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.ts\";\nimport { makeScrubVideoInputTask } from \"./EFMedia/videoTasks/makeScrubVideoInputTask.ts\";\nimport { makeScrubVideoSeekTask } from \"./EFMedia/videoTasks/makeScrubVideoSeekTask.ts\";\nimport { makeScrubVideoSegmentFetchTask } from \"./EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.ts\";\nimport { makeScrubVideoSegmentIdTask } from \"./EFMedia/videoTasks/makeScrubVideoSegmentIdTask.ts\";\nimport { makeUnifiedVideoSeekTask } from \"./EFMedia/videoTasks/makeUnifiedVideoSeekTask.ts\";\nimport { makeVideoBufferTask } from \"./EFMedia/videoTasks/makeVideoBufferTask.ts\";\nimport { EFMedia } from \"./EFMedia.js\";\nimport { updateAnimations } from \"./updateAnimations.js\";\n\n// EF_FRAMEGEN is a global instance created in EF_FRAMEGEN.ts\ndeclare global {\n var EF_FRAMEGEN: import(\"../EF_FRAMEGEN.js\").EFFramegen;\n}\n\nconst log = debug(\"ef:elements:EFVideo\");\n\ninterface LoadingState {\n isLoading: boolean;\n operation: \"scrub-segment\" | \"video-segment\" | \"seeking\" | \"decoding\" | null;\n message: string;\n}\n\n@customElement(\"ef-video\")\nexport class EFVideo extends TWMixin(EFMedia) {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n }\n canvas {\n overflow: hidden;\n position: static;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: hidden;\n border: none;\n outline: none;\n box-shadow: none;\n }\n .loading-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10;\n backdrop-filter: blur(2px);\n }\n .loading-content {\n background: rgba(0, 0, 0, 0.8);\n border-radius: 8px;\n padding: 16px 24px;\n display: flex;\n align-items: center;\n gap: 12px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n }\n .loading-spinner {\n width: 20px;\n height: 20px;\n border: 2px solid rgba(255, 255, 255, 0.2);\n border-left: 2px solid #fff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n .loading-message {\n font-size: 12px;\n opacity: 0.8;\n }\n `,\n ];\n canvasRef = createRef<HTMLCanvasElement>();\n\n /**\n * Duration in milliseconds for video buffering ahead of current time\n * @domAttribute \"video-buffer-duration\"\n */\n @property({ type: Number, attribute: \"video-buffer-duration\" })\n videoBufferDurationMs = 10000; // 10 seconds - reasonable for JIT encoding\n\n /**\n * Maximum number of concurrent video segment fetches for buffering\n * @domAttribute \"max-video-buffer-fetches\"\n */\n @property({ type: Number, attribute: \"max-video-buffer-fetches\" })\n maxVideoBufferFetches = 2;\n\n /**\n * Enable/disable video buffering system\n * @domAttribute \"enable-video-buffering\"\n */\n @property({ type: Boolean, attribute: \"enable-video-buffering\" })\n enableVideoBuffering = true;\n\n // Unified video system - single smart seek task that routes to scrub or main\n unifiedVideoSeekTask = makeUnifiedVideoSeekTask(this);\n videoBufferTask = makeVideoBufferTask(this); // Keep for main video buffering\n\n // Scrub video preloading system\n scrubVideoBufferTask = makeScrubVideoBufferTask(this);\n scrubVideoInputTask = makeScrubVideoInputTask(this);\n scrubVideoSeekTask = makeScrubVideoSeekTask(this);\n scrubVideoSegmentIdTask = makeScrubVideoSegmentIdTask(this);\n scrubVideoSegmentFetchTask = makeScrubVideoSegmentFetchTask(this);\n scrubVideoInitSegmentFetchTask = makeScrubVideoInitSegmentFetchTask(this);\n\n /**\n * Delayed loading state manager for user feedback\n */\n private delayedLoadingState: DelayedLoadingState;\n\n /**\n * Loading state for user feedback\n */\n @state()\n loadingState = {\n isLoading: false,\n operation: null as LoadingState[\"operation\"],\n message: \"\",\n };\n\n constructor() {\n super();\n\n // Initialize delayed loading state with callback to update UI\n this.delayedLoadingState = new DelayedLoadingState(\n 250,\n (isLoading, message) => {\n this.setLoadingState(isLoading, null, message);\n },\n );\n }\n\n protected updated(\n changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>,\n ): void {\n super.updated(changedProperties);\n\n // No need to clear canvas - displayFrame() overwrites it completely\n // and clearing creates blank frame gaps during transitions\n }\n\n render() {\n return html`\n <canvas ${ref(this.canvasRef)}></canvas>\n ${\n this.loadingState.isLoading\n ? html`\n <div class=\"loading-overlay\">\n <div class=\"loading-content\">\n <div class=\"loading-spinner\"></div>\n <div>\n <div>Loading Video...</div>\n <div class=\"loading-message\">${this.loadingState.message}</div>\n </div>\n </div>\n </div>\n `\n : \"\"\n }\n `;\n }\n\n get canvasElement() {\n const referencedCanvas = this.canvasRef.value;\n if (referencedCanvas) {\n return referencedCanvas;\n }\n const shadowCanvas = this.shadowRoot?.querySelector(\"canvas\");\n if (shadowCanvas) {\n return shadowCanvas;\n }\n return undefined;\n }\n\n frameTask = new Task(this, {\n autoRun: false,\n args: () => [this.desiredSeekTimeMs] as const,\n onError: (error) => {\n console.error(\"frameTask error\", error);\n },\n onComplete: () => {},\n task: async ([_desiredSeekTimeMs], { signal }) => {\n const t0 = performance.now();\n\n await withSpan(\n \"video.frameTask\",\n {\n elementId: this.id || \"unknown\",\n desiredSeekTimeMs: _desiredSeekTimeMs,\n src: this.src || \"none\",\n },\n undefined,\n async (span) => {\n const t1 = performance.now();\n span.setAttribute(\"preworkMs\", t1 - t0);\n\n this.unifiedVideoSeekTask.run();\n const t2 = performance.now();\n span.setAttribute(\"seekRunMs\", t2 - t1);\n\n await this.unifiedVideoSeekTask.taskComplete;\n const t3 = performance.now();\n span.setAttribute(\"seekAwaitMs\", t3 - t2);\n if (signal.aborted) {\n span.setAttribute(\"aborted\", true);\n return;\n }\n\n this.paint(this.desiredSeekTimeMs, span);\n\n if (!this.parentTimegroup) {\n updateAnimations(this);\n }\n\n const t4 = performance.now();\n this.paint(_desiredSeekTimeMs, span);\n const t5 = performance.now();\n span.setAttribute(\"paintMs\", t5 - t4);\n span.setAttribute(\"totalFrameMs\", t5 - t0);\n },\n );\n },\n });\n\n /**\n * Start a delayed loading operation for testing\n */\n startDelayedLoading(\n operationId: string,\n message: string,\n options: { background?: boolean } = {},\n ): void {\n this.delayedLoadingState.startLoading(operationId, message, options);\n }\n\n /**\n * Clear a delayed loading operation for testing\n */\n clearDelayedLoading(operationId: string): void {\n this.delayedLoadingState.clearLoading(operationId);\n }\n\n /**\n * Set loading state for user feedback\n */\n private setLoadingState(\n isLoading: boolean,\n operation: LoadingState[\"operation\"] = null,\n message = \"\",\n ): void {\n this.loadingState = {\n isLoading,\n operation,\n message,\n };\n }\n\n /**\n * Paint the current video frame to canvas\n * Called by frameTask after seek is complete\n */\n paint(seekToMs: number, parentSpan?: any): void {\n const parentContext = parentSpan\n ? trace.setSpan(context.active(), parentSpan)\n : undefined;\n\n withSpanSync(\n \"video.paint\",\n {\n elementId: this.id || \"unknown\",\n seekToMs,\n src: this.src || \"none\",\n },\n parentContext,\n (span) => {\n const t0 = performance.now();\n\n // Check if we're in production rendering mode vs preview mode\n const isProductionRendering = this.isInProductionRenderingMode();\n const t1 = performance.now();\n span.setAttribute(\"isProductionRendering\", isProductionRendering);\n span.setAttribute(\"modeCheckMs\", t1 - t0);\n\n // Unified video system: smart routing to scrub or main, with background upgrades\n // Note: frameTask guarantees unifiedVideoSeekTask is complete before calling paint\n try {\n const t2 = performance.now();\n const videoSample = this.unifiedVideoSeekTask.value;\n span.setAttribute(\"hasVideoSample\", !!videoSample);\n span.setAttribute(\"valueAccessMs\", t2 - t1);\n\n if (videoSample) {\n const t3 = performance.now();\n const videoFrame = videoSample.toVideoFrame();\n const t4 = performance.now();\n span.setAttribute(\"toVideoFrameMs\", t4 - t3);\n\n try {\n const t5 = performance.now();\n this.displayFrame(videoFrame, seekToMs, span);\n const t6 = performance.now();\n span.setAttribute(\"displayFrameMs\", t6 - t5);\n } finally {\n videoFrame.close();\n }\n }\n } catch (error) {\n console.warn(\"Unified video pipeline error:\", error);\n }\n\n // EF_FRAMEGEN-aware rendering mode detection\n if (!isProductionRendering) {\n // Preview mode: skip rendering during initialization to prevent artifacts\n if (\n !this.rootTimegroup ||\n (this.rootTimegroup.currentTimeMs === 0 &&\n this.desiredSeekTimeMs === 0)\n ) {\n span.setAttribute(\"skipped\", \"preview-initialization\");\n return; // Skip initialization frame in preview mode\n }\n // Preview mode: proceed with rendering\n } else {\n // Production rendering mode: only render when EF_FRAMEGEN has explicitly started frame rendering\n // This prevents initialization frames before the actual render sequence begins\n if (!this.rootTimegroup) {\n span.setAttribute(\"skipped\", \"no-root-timegroup\");\n return;\n }\n\n if (!this.isFrameRenderingActive()) {\n span.setAttribute(\"skipped\", \"frame-rendering-not-active\");\n return; // Wait for EF_FRAMEGEN to start frame sequence\n }\n\n // Production mode: EF_FRAMEGEN has started frame sequence, proceed with rendering\n }\n\n const tEnd = performance.now();\n span.setAttribute(\"totalPaintMs\", tEnd - t0);\n },\n );\n }\n\n /**\n * Clear the canvas when element becomes inactive\n */\n clearCanvas(): void {\n if (!this.canvasElement) return;\n\n const ctx = this.canvasElement.getContext(\"2d\");\n if (ctx) {\n ctx.clearRect(0, 0, this.canvasElement.width, this.canvasElement.height);\n }\n }\n\n /**\n * Display a video frame on the canvas\n */\n displayFrame(frame: VideoFrame, seekToMs: number, parentSpan?: any): void {\n const parentContext = parentSpan\n ? trace.setSpan(context.active(), parentSpan)\n : undefined;\n\n withSpanSync(\n \"video.displayFrame\",\n {\n elementId: this.id || \"unknown\",\n seekToMs,\n format: frame.format || \"unknown\",\n width: frame.codedWidth,\n height: frame.codedHeight,\n },\n parentContext,\n (span) => {\n const t0 = performance.now();\n\n log(\"trace: displayFrame start\", {\n seekToMs,\n frameFormat: frame.format,\n });\n\n if (!this.canvasElement) {\n log(\"trace: displayFrame aborted - no canvas element\");\n throw new Error(\n `Frame display failed: Canvas element is not available at time ${seekToMs}ms. The video component may not be properly initialized.`,\n );\n }\n const t1 = performance.now();\n span.setAttribute(\"getCanvasMs\", Math.round((t1 - t0) * 100) / 100);\n\n const ctx = this.canvasElement.getContext(\"2d\");\n const t2 = performance.now();\n span.setAttribute(\"getCtxMs\", Math.round((t2 - t1) * 100) / 100);\n\n if (!ctx) {\n log(\"trace: displayFrame aborted - no canvas context\");\n throw new Error(\n `Frame display failed: Unable to get 2D canvas context at time ${seekToMs}ms. This may indicate a browser compatibility issue or canvas corruption.`,\n );\n }\n\n let resized = false;\n if (frame?.codedWidth && frame?.codedHeight) {\n if (\n this.canvasElement.width !== frame.codedWidth ||\n this.canvasElement.height !== frame.codedHeight\n ) {\n log(\"trace: updating canvas dimensions\", {\n width: frame.codedWidth,\n height: frame.codedHeight,\n });\n this.canvasElement.width = frame.codedWidth;\n this.canvasElement.height = frame.codedHeight;\n resized = true;\n const t3 = performance.now();\n span.setAttribute(\"resizeMs\", Math.round((t3 - t2) * 100) / 100);\n }\n }\n span.setAttribute(\"canvasResized\", resized);\n\n if (frame.format === null) {\n log(\"trace: displayFrame aborted - null frame format\");\n throw new Error(\n `Frame display failed: Video frame has null format at time ${seekToMs}ms. This indicates corrupted or incompatible video data.`,\n );\n }\n\n const tDrawStart = performance.now();\n ctx.drawImage(\n frame,\n 0,\n 0,\n this.canvasElement.width,\n this.canvasElement.height,\n );\n const tDrawEnd = performance.now();\n span.setAttribute(\n \"drawImageMs\",\n Math.round((tDrawEnd - tDrawStart) * 100) / 100,\n );\n span.setAttribute(\n \"totalDisplayMs\",\n Math.round((tDrawEnd - t0) * 100) / 100,\n );\n span.setAttribute(\"canvasWidth\", this.canvasElement.width);\n span.setAttribute(\"canvasHeight\", this.canvasElement.height);\n\n log(\"trace: frame drawn to canvas\", { seekToMs });\n },\n );\n }\n\n /**\n * Check if we're in production rendering mode (EF_FRAMEGEN active) vs preview mode\n */\n private isInProductionRenderingMode(): boolean {\n // Check if EF_RENDERING function exists and returns true (production rendering)\n if (typeof window.EF_RENDERING === \"function\") {\n return window.EF_RENDERING();\n }\n\n // Check if workbench is in rendering mode\n const workbench = document.querySelector(\"ef-workbench\") as any;\n if (workbench?.rendering) {\n return true;\n }\n\n // Check if EF_FRAMEGEN exists and has render options (indicates active rendering)\n if (window.EF_FRAMEGEN?.renderOptions) {\n return true;\n }\n\n // Default to preview mode\n return false;\n }\n\n /**\n * Check if EF_FRAMEGEN has explicitly started frame rendering (not just initialization)\n */\n private isFrameRenderingActive(): boolean {\n if (!window.EF_FRAMEGEN?.renderOptions) {\n return false;\n }\n\n // In production mode, only render when EF_FRAMEGEN has actually begun frame sequence\n // Check if we're past the initialization phase by looking for explicit frame control\n const renderOptions = window.EF_FRAMEGEN.renderOptions;\n const renderStartTime = renderOptions.encoderOptions.fromMs;\n const currentTime = this.rootTimegroup?.currentTimeMs || 0;\n\n // We're in active frame rendering if:\n // 1. currentTime >= renderStartTime (includes the starting frame)\n return currentTime >= renderStartTime;\n }\n\n /**\n * Legacy getter for fragment index task\n * Still used by EFCaptions - maps to unified video seek task\n */\n get fragmentIndexTask() {\n return this.unifiedVideoSeekTask;\n }\n\n /**\n * Helper method for tests: wait for the current frame to be ready\n * This encapsulates the complexity of ensuring the video has updated\n * and its frameTask has completed.\n *\n * @returns Promise that resolves when the frame is ready\n */\n async waitForFrameReady(): Promise<void> {\n await this.updateComplete;\n await this.frameTask.run();\n }\n\n /**\n * Clean up resources when component is disconnected\n */\n disconnectedCallback(): void {\n super.disconnectedCallback();\n\n // Clean up delayed loading state\n this.delayedLoadingState.clearAllLoading();\n }\n\n didBecomeRoot() {\n super.didBecomeRoot();\n }\n didBecomeChild() {\n super.didBecomeChild();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-video\": EFVideo;\n }\n}\n"],"mappings":"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"}
@@ -1,44 +1,51 @@
1
- import { Task } from '@lit/task';
2
- import { LitElement, PropertyValueMap } from 'lit';
3
- import { Ref } from 'lit/directives/ref.js';
4
- import { EFAudio } from './EFAudio.js';
5
- import { EFVideo } from './EFVideo.js';
6
- import { TargetController } from './TargetController.ts';
7
- declare const EFWaveform_base: (new (...args: any[]) => import('./EFTemporal.js').TemporalMixinInterface) & typeof LitElement;
8
- export declare class EFWaveform extends EFWaveform_base {
9
- static styles: import('lit').CSSResult;
10
- canvasRef: Ref<HTMLCanvasElement>;
11
- private ctx;
12
- private styleObserver;
13
- private resizeObserver?;
14
- private mutationObserver?;
15
- render(): import('lit-html').TemplateResult<1>;
16
- mode: "roundBars" | "bars" | "bricks" | "line" | "curve" | "pixel" | "wave" | "spikes";
17
- color: string;
18
- target: string;
19
- barSpacing: number;
20
- targetElement: EFAudio | EFVideo | null;
21
- lineWidth: number;
22
- targetController: TargetController;
23
- connectedCallback(): void;
24
- disconnectedCallback(): void;
25
- private resizeCanvas;
26
- protected initCanvas(): CanvasRenderingContext2D | null;
27
- protected drawBars(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
28
- protected drawBricks(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
29
- protected drawRoundBars(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
30
- protected drawLine(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
31
- protected drawCurve(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
32
- protected drawPixel(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
33
- protected drawWave(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
34
- protected drawSpikes(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
35
- frameTask: Task<readonly [EFAudio | EFVideo | null, Uint8Array | null | undefined], void>;
36
- get durationMs(): number;
37
- protected updated(changedProperties: PropertyValueMap<this>): void;
1
+ import { TemporalMixinInterface } from "./EFTemporal.js";
2
+ import { EFAudio } from "./EFAudio.js";
3
+ import { EFVideo } from "./EFVideo.js";
4
+ import { TargetController } from "./TargetController.js";
5
+ import { Task } from "@lit/task";
6
+ import * as lit8 from "lit";
7
+ import { LitElement, PropertyValueMap } from "lit";
8
+ import { Ref } from "lit/directives/ref.js";
9
+ import * as lit_html8 from "lit-html";
10
+
11
+ //#region src/elements/EFWaveform.d.ts
12
+ declare const EFWaveform_base: (new (...args: any[]) => TemporalMixinInterface) & typeof LitElement;
13
+ declare class EFWaveform extends EFWaveform_base {
14
+ static styles: lit8.CSSResult;
15
+ canvasRef: Ref<HTMLCanvasElement>;
16
+ private ctx;
17
+ private styleObserver;
18
+ private resizeObserver?;
19
+ private mutationObserver?;
20
+ render(): lit_html8.TemplateResult<1>;
21
+ mode: "roundBars" | "bars" | "bricks" | "line" | "curve" | "pixel" | "wave" | "spikes";
22
+ color: string;
23
+ target: string;
24
+ barSpacing: number;
25
+ targetElement: EFAudio | EFVideo | null;
26
+ lineWidth: number;
27
+ targetController: TargetController;
28
+ connectedCallback(): void;
29
+ disconnectedCallback(): void;
30
+ private resizeCanvas;
31
+ protected initCanvas(): CanvasRenderingContext2D | null;
32
+ protected drawBars(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
33
+ protected drawBricks(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
34
+ protected drawRoundBars(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
35
+ protected drawLine(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
36
+ protected drawCurve(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
37
+ protected drawPixel(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
38
+ protected drawWave(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
39
+ protected drawSpikes(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array): void;
40
+ frameTask: Task<readonly [EFAudio | EFVideo | null, Uint8Array | null | undefined], void>;
41
+ get durationMs(): number;
42
+ protected updated(changedProperties: PropertyValueMap<this>): void;
38
43
  }
39
44
  declare global {
40
- interface HTMLElementTagNameMap {
41
- "ef-waveform": EFWaveform & Element;
42
- }
45
+ interface HTMLElementTagNameMap {
46
+ "ef-waveform": EFWaveform & Element;
47
+ }
43
48
  }
44
- export {};
49
+ //#endregion
50
+ export { EFWaveform };
51
+ //# sourceMappingURL=EFWaveform.d.ts.map
@@ -9,7 +9,9 @@ import { LitElement, css, html } from "lit";
9
9
  import { customElement, property, state } from "lit/decorators.js";
10
10
  import { createRef, ref } from "lit/directives/ref.js";
11
11
  import { CSSStyleObserver } from "@bramus/style-observer";
12
- var EFWaveform = class EFWaveform$1 extends EFTemporal(TWMixin(LitElement)) {
12
+
13
+ //#region src/elements/EFWaveform.ts
14
+ let EFWaveform = class EFWaveform$1 extends EFTemporal(TWMixin(LitElement)) {
13
15
  constructor(..._args) {
14
16
  super(..._args);
15
17
  this.canvasRef = createRef();
@@ -372,4 +374,7 @@ __decorate([property({
372
374
  attribute: "line-width"
373
375
  })], EFWaveform.prototype, "lineWidth", void 0);
374
376
  EFWaveform = __decorate([customElement("ef-waveform")], EFWaveform);
377
+
378
+ //#endregion
375
379
  export { EFWaveform };
380
+ //# sourceMappingURL=EFWaveform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EFWaveform.js","names":["EFWaveform"],"sources":["../../src/elements/EFWaveform.ts"],"sourcesContent":["import { CSSStyleObserver } from \"@bramus/style-observer\";\nimport { Task } from \"@lit/task\";\nimport { css, html, LitElement, type PropertyValueMap } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { createRef, type Ref, ref } from \"lit/directives/ref.js\";\nimport { EF_RENDERING } from \"../EF_RENDERING.js\";\nimport { TWMixin } from \"../gui/TWMixin.js\";\nimport { CrossUpdateController } from \"./CrossUpdateController.js\";\nimport type { EFAudio } from \"./EFAudio.js\";\nimport { EFTemporal } from \"./EFTemporal.js\";\nimport type { EFVideo } from \"./EFVideo.js\";\nimport { TargetController } from \"./TargetController.ts\";\n\n@customElement(\"ef-waveform\")\nexport class EFWaveform extends EFTemporal(TWMixin(LitElement)) {\n static styles = css`\n :host {\n all: inherit;\n display: block;\n position: relative;\n }\n\n canvas {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n }\n `;\n\n canvasRef: Ref<HTMLCanvasElement> = createRef();\n private ctx: CanvasRenderingContext2D | null = null;\n private styleObserver: CSSStyleObserver | null = null;\n\n private resizeObserver?: ResizeObserver;\n private mutationObserver?: MutationObserver;\n\n render() {\n return html`<canvas ${ref(this.canvasRef)}></canvas>`;\n }\n\n @property({\n type: String,\n attribute: \"mode\",\n })\n mode:\n | \"roundBars\"\n | \"bars\"\n | \"bricks\"\n | \"line\"\n | \"curve\"\n | \"pixel\"\n | \"wave\"\n | \"spikes\" = \"bars\";\n\n @property({ type: String })\n color = \"currentColor\";\n\n @property({ type: String, reflect: true })\n target = \"\";\n\n @property({ type: Number, attribute: \"bar-spacing\" })\n barSpacing = 0.5;\n\n @state()\n targetElement: EFAudio | EFVideo | null = null;\n\n @property({ type: Number, attribute: \"line-width\" })\n lineWidth = 4;\n\n targetController: TargetController = new TargetController(this);\n\n connectedCallback() {\n super.connectedCallback();\n try {\n if (this.targetElement) {\n new CrossUpdateController(this.targetElement, this);\n }\n } catch (_error) {\n // TODO: determine if this is a critical error, or if we should just ignore it\n // currenty evidence suggests everything still works\n // no target element, no cross update controller\n }\n\n // Initialize ResizeObserver\n this.resizeObserver = new ResizeObserver(() => {\n this.resizeCanvas();\n });\n\n // Observe the host element\n this.resizeObserver.observe(this);\n\n // Initialize MutationObserver\n this.mutationObserver = new MutationObserver((mutationsList) => {\n for (const mutation of mutationsList) {\n if (mutation.type === \"attributes\") {\n this.frameTask.run();\n }\n }\n });\n\n // Observe attribute changes on the element\n this.mutationObserver.observe(this, { attributes: true });\n\n if (!EF_RENDERING()) {\n this.styleObserver = new CSSStyleObserver([\"color\"], () => {\n this.frameTask.run();\n });\n this.styleObserver.attach(this);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // Disconnect the observers when the element is removed from the DOM\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.styleObserver?.detach();\n }\n\n private resizeCanvas() {\n this.ctx = this.initCanvas();\n if (this.ctx) {\n this.frameTask.run(); // Redraw the canvas\n }\n }\n\n protected initCanvas() {\n const canvas = this.canvasRef.value;\n if (!canvas) return null;\n\n const rect = {\n width: this.offsetWidth,\n height: this.offsetHeight,\n };\n const dpr = window.devicePixelRatio;\n\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n ctx.reset();\n\n // Scale all drawing operations by dpr\n return ctx;\n }\n\n protected drawBars(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n\n const totalBars = frequencyData.length;\n const paddingInner = this.barSpacing;\n const paddingOuter = 0.01;\n const availableWidth = waveWidth;\n const barWidth =\n availableWidth / (totalBars + (totalBars - 1) * paddingInner);\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n frequencyData.forEach((value, i) => {\n const normalizedValue = value / 255;\n const barHeight = normalizedValue * waveHeight;\n const y = (waveHeight - barHeight) / 2;\n const x = waveWidth * paddingOuter + i * (barWidth * (1 + paddingInner));\n path.rect(x, y, barWidth, barHeight);\n });\n\n ctx.fill(path);\n }\n\n protected drawBricks(\n ctx: CanvasRenderingContext2D,\n frequencyData: Uint8Array,\n ) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n const columnWidth = waveWidth / frequencyData.length;\n const boxSize = columnWidth * 0.9;\n const verticalGap = boxSize * 0.2; // Add spacing between bricks\n const maxBricks = Math.floor(waveHeight / (boxSize + verticalGap)); // Account for gaps in height calculation\n\n frequencyData.forEach((value, i) => {\n const normalizedValue = value / 255;\n const brickCount = Math.floor(normalizedValue * maxBricks);\n\n for (let j = 0; j < brickCount; j++) {\n const x = columnWidth * i;\n const y = waveHeight - (j + 1) * (boxSize + verticalGap); // Include gap in position calculation\n path.rect(x, y, boxSize, boxSize);\n }\n });\n\n ctx.fill(path);\n }\n\n protected drawRoundBars(\n ctx: CanvasRenderingContext2D,\n frequencyData: Uint8Array,\n ) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n\n // Similar padding calculation as drawBars\n const totalBars = frequencyData.length;\n const paddingInner = this.barSpacing;\n const paddingOuter = 0.01;\n const availableWidth = waveWidth;\n const barWidth =\n availableWidth / (totalBars + (totalBars - 1) * paddingInner);\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n\n // Create a single Path2D object for all rounded bars\n const path = new Path2D();\n\n frequencyData.forEach((value, i) => {\n const normalizedValue = value / 255;\n const height = normalizedValue * waveHeight; // Use full wave height like in drawBars\n const x = waveWidth * paddingOuter + i * (barWidth * (1 + paddingInner));\n const y = (waveHeight - height) / 2; // Center vertically\n\n // Add rounded rectangle to path\n path.roundRect(x, y, barWidth, height, barWidth / 2);\n });\n\n // Single fill operation for all bars\n ctx.fill(path);\n }\n\n protected drawLine(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n // Sample fewer points to make sharp angles more visible\n const sampleRate = 1; // Only use every 4th point\n\n for (let i = 0; i < frequencyData.length; i += sampleRate) {\n const x = (i / frequencyData.length) * waveWidth;\n const y = (1 - (frequencyData[i] ?? 0) / 255) * waveHeight;\n\n if (i === 0) {\n path.moveTo(x, y);\n } else {\n path.lineTo(x, y);\n }\n }\n // Ensure we draw to the end\n const lastX = waveWidth;\n const lastY =\n (1 - (frequencyData[frequencyData.length - 1] ?? 0) / 255) * waveHeight;\n path.lineTo(lastX, lastY);\n\n ctx.lineWidth = this.lineWidth;\n ctx.stroke(path);\n }\n\n protected drawCurve(\n ctx: CanvasRenderingContext2D,\n frequencyData: Uint8Array,\n ) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n // Draw smooth curves between points using quadratic curves\n frequencyData.forEach((value, i) => {\n const x = (i / frequencyData.length) * waveWidth;\n const y = (1 - value / 255) * waveHeight;\n\n if (i === 0) {\n path.moveTo(x, y);\n } else {\n const prevX = ((i - 1) / frequencyData.length) * waveWidth;\n const prevY = (1 - (frequencyData[i - 1] ?? 0) / 255) * waveHeight;\n const xc = (prevX + x) / 2;\n const yc = (prevY + y) / 2;\n path.quadraticCurveTo(prevX, prevY, xc, yc);\n }\n });\n\n ctx.lineWidth = this.lineWidth;\n ctx.stroke(path);\n }\n\n protected drawPixel(\n ctx: CanvasRenderingContext2D,\n frequencyData: Uint8Array,\n ) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n const baseline = waveHeight / 2;\n const barWidth = waveWidth / frequencyData.length;\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n frequencyData.forEach((value, i) => {\n const normalizedValue = value / 255;\n const x = i * (waveWidth / frequencyData.length);\n const barHeight = normalizedValue * (waveHeight / 2); // Half height since we extend both ways\n const y = baseline - barHeight;\n path.rect(x, y, barWidth, barHeight * 2); // Double height to extend both ways\n });\n\n ctx.fill(path);\n }\n\n protected drawWave(ctx: CanvasRenderingContext2D, frequencyData: Uint8Array) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n const paddingOuter = 0.01;\n const availableWidth = waveWidth * (1 - 2 * paddingOuter);\n const startX = waveWidth * paddingOuter;\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n // Draw top curve\n const firstValue = Math.min(((frequencyData[0] ?? 0) / 255) * 2, 1);\n const firstY = (waveHeight - firstValue * waveHeight) / 2;\n path.moveTo(startX, firstY);\n\n // Draw top half\n frequencyData.forEach((value, i) => {\n const normalizedValue = Math.min((value / 255) * 2, 1);\n const x = startX + (i / (frequencyData.length - 1)) * availableWidth;\n const barHeight = normalizedValue * waveHeight;\n const y = (waveHeight - barHeight) / 2;\n\n if (i === 0) {\n path.moveTo(x, y);\n } else {\n const prevX =\n startX + ((i - 1) / (frequencyData.length - 1)) * availableWidth;\n const prevValue = Math.min(((frequencyData[i - 1] ?? 0) / 255) * 2, 1);\n const prevBarHeight = prevValue * waveHeight;\n const prevY = (waveHeight - prevBarHeight) / 2;\n const xc = (prevX + x) / 2;\n const yc = (prevY + y) / 2;\n path.quadraticCurveTo(prevX, prevY, xc, yc);\n }\n });\n\n // Draw bottom half\n for (let i = frequencyData.length - 1; i >= 0; i--) {\n const normalizedValue = Math.min(((frequencyData[i] ?? 0) / 255) * 2, 1);\n const x = startX + (i / (frequencyData.length - 1)) * availableWidth;\n const barHeight = normalizedValue * waveHeight;\n const y = (waveHeight + barHeight) / 2;\n\n if (i === frequencyData.length - 1) {\n path.lineTo(x, y);\n } else {\n const nextX =\n startX + ((i + 1) / (frequencyData.length - 1)) * availableWidth;\n const nextValue = Math.min(((frequencyData[i + 1] ?? 0) / 255) * 2, 1);\n const nextBarHeight = nextValue * waveHeight;\n const nextY = (waveHeight + nextBarHeight) / 2;\n const xc = (nextX + x) / 2;\n const yc = (nextY + y) / 2;\n path.quadraticCurveTo(nextX, nextY, xc, yc);\n }\n }\n\n // Close the path with a smooth curve back to start\n const lastY = (waveHeight + firstValue * waveHeight) / 2;\n const controlX = startX;\n const controlY = (lastY + firstY) / 2;\n path.quadraticCurveTo(controlX, controlY, startX, firstY);\n\n ctx.fill(path);\n }\n\n protected drawSpikes(\n ctx: CanvasRenderingContext2D,\n frequencyData: Uint8Array,\n ) {\n const canvas = ctx.canvas;\n const waveWidth = canvas.width;\n const waveHeight = canvas.height;\n const paddingOuter = 0.01;\n const availableWidth = waveWidth * (1 - 2 * paddingOuter);\n const startX = waveWidth * paddingOuter;\n\n ctx.clearRect(0, 0, waveWidth, waveHeight);\n const path = new Path2D();\n\n // Draw top curve\n const firstValue = (frequencyData[0] ?? 0) / 255;\n const firstY = (waveHeight - firstValue * waveHeight) / 2;\n path.moveTo(startX, firstY);\n\n // Draw top half\n frequencyData.forEach((value, i) => {\n const normalizedValue = Math.min((value / 255) * 2, 1);\n const x = startX + (i / (frequencyData.length - 1)) * availableWidth;\n const barHeight = normalizedValue * (waveHeight / 2);\n const y = (waveHeight - barHeight * 2) / 2;\n\n if (i === 0) {\n path.moveTo(x, y);\n } else {\n const prevX =\n startX + ((i - 1) / (frequencyData.length - 1)) * availableWidth;\n const prevValue = (frequencyData[i - 1] ?? 0) / 255;\n const prevBarHeight = prevValue * (waveHeight / 2);\n const prevY = (waveHeight - prevBarHeight * 2) / 2;\n const xc = (prevX + x) / 2;\n const yc = (prevY + y) / 2;\n path.quadraticCurveTo(prevX, prevY, xc, yc);\n }\n });\n\n // Draw bottom half\n for (let i = frequencyData.length - 1; i >= 0; i--) {\n const normalizedValue = Math.min(((frequencyData[i] ?? 0) / 255) * 2, 1);\n const x = startX + (i / (frequencyData.length - 1)) * availableWidth;\n const barHeight = normalizedValue * (waveHeight / 2);\n const y = (waveHeight + barHeight * 2) / 2;\n\n if (i === frequencyData.length - 1) {\n path.lineTo(x, y);\n } else {\n const nextX =\n startX + ((i + 1) / (frequencyData.length - 1)) * availableWidth;\n const nextValue = (frequencyData[i + 1] ?? 0) / 255;\n const nextBarHeight = nextValue * (waveHeight / 2);\n const nextY = (waveHeight + nextBarHeight * 2) / 2;\n const xc = (nextX + x) / 2;\n const yc = (nextY + y) / 2;\n path.quadraticCurveTo(nextX, nextY, xc, yc);\n }\n }\n\n // Close the path with a smooth curve\n const lastY = (waveHeight + firstValue * waveHeight) / 2;\n const controlX = startX;\n const controlY = (lastY + firstY) / 2;\n path.quadraticCurveTo(controlX, controlY, startX, firstY);\n\n ctx.fill(path);\n }\n\n frameTask = new Task(this, {\n autoRun: false,\n args: () => {\n return [\n this.targetElement,\n this.targetElement?.frequencyDataTask.value,\n ] as const;\n },\n task: async () => {\n if (!this.targetElement) return;\n await this.targetElement.frequencyDataTask.taskComplete;\n this.ctx ||= this.initCanvas();\n const ctx = this.ctx;\n if (!ctx) return;\n\n const frequencyData = this.targetElement.frequencyDataTask.value;\n const byteTimeData = this.targetElement.byteTimeDomainTask.value;\n if (!frequencyData || !byteTimeData) return;\n\n ctx.save();\n if (this.color === \"currentColor\") {\n const computedStyle = getComputedStyle(this);\n const currentColor = computedStyle.color;\n ctx.strokeStyle = currentColor;\n ctx.fillStyle = currentColor;\n } else {\n ctx.strokeStyle = this.color;\n ctx.fillStyle = this.color;\n }\n\n switch (this.mode) {\n case \"bars\":\n this.drawBars(ctx, frequencyData);\n break;\n case \"bricks\":\n this.drawBricks(ctx, frequencyData);\n break;\n case \"line\":\n this.drawLine(ctx, byteTimeData);\n break;\n case \"curve\":\n this.drawCurve(ctx, byteTimeData);\n break;\n case \"pixel\":\n this.drawPixel(ctx, frequencyData);\n break;\n case \"wave\":\n this.drawWave(ctx, frequencyData);\n break;\n case \"spikes\":\n this.drawSpikes(ctx, frequencyData);\n break;\n case \"roundBars\":\n this.drawRoundBars(ctx, frequencyData);\n break;\n }\n\n ctx.restore();\n },\n });\n\n get durationMs() {\n if (!this.targetElement) return 0;\n return this.targetElement.durationMs;\n }\n\n protected updated(changedProperties: PropertyValueMap<this>): void {\n super.updated(changedProperties);\n\n // Trigger a redraw if any property changes\n if (changedProperties.size > 0) {\n // Request a new frame\n this.frameTask.run();\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-waveform\": EFWaveform & Element;\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- import { LitElement } from 'lit';
2
- export declare class FetchMixinInterface {
3
- fetch: typeof fetch;
1
+ import { LitElement } from "lit";
2
+
3
+ //#region src/elements/FetchMixin.d.ts
4
+ declare class FetchMixinInterface {
5
+ fetch: typeof fetch;
4
6
  }
5
- type Constructor<T = {}> = new (...args: any[]) => T;
6
- export declare function FetchMixin<T extends Constructor<LitElement>>(superClass: T): Constructor<FetchMixinInterface> & T;
7
- export {};
7
+ //#endregion
8
+ export { FetchMixinInterface };
9
+ //# sourceMappingURL=FetchMixin.d.ts.map
@@ -1,3 +1,4 @@
1
+ //#region src/elements/FetchMixin.ts
1
2
  function FetchMixin(superClass) {
2
3
  class FetchElement extends superClass {
3
4
  constructor(..._args) {
@@ -20,4 +21,7 @@ function FetchMixin(superClass) {
20
21
  }
21
22
  return FetchElement;
22
23
  }
24
+
25
+ //#endregion
23
26
  export { FetchMixin };
27
+ //# sourceMappingURL=FetchMixin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetchMixin.js","names":[],"sources":["../../src/elements/FetchMixin.ts"],"sourcesContent":["import type { LitElement } from \"lit\";\n\nexport declare class FetchMixinInterface {\n fetch: typeof fetch;\n}\n\ntype Constructor<T = {}> = new (...args: any[]) => T;\nexport function FetchMixin<T extends Constructor<LitElement>>(superClass: T) {\n class FetchElement extends superClass {\n fetch = (url: string, init?: RequestInit): Promise<Response> => {\n try {\n // Look for context providers up the DOM tree\n const workbench = this.closest(\"ef-workbench\") as any;\n if (workbench?.fetch) {\n return workbench.fetch(url, init);\n }\n\n const preview = this.closest(\"ef-preview\") as any;\n if (preview?.fetch) {\n return preview.fetch(url, init);\n }\n\n const configuration = this.closest(\"ef-configuration\") as any;\n if (configuration?.fetch) {\n return configuration.fetch(url, init);\n }\n\n // Fallback to window.fetch\n return window.fetch(url, init);\n } catch (error) {\n console.error(\"FetchMixin error\", url, error);\n throw error;\n }\n };\n }\n\n return FetchElement as Constructor<FetchMixinInterface> & T;\n}\n"],"mappings":";AAOA,SAAgB,WAA8C,YAAe;CAC3E,MAAM,qBAAqB,WAAW;;;iBAC3B,KAAa,SAA0C;AAC9D,QAAI;KAEF,MAAM,YAAY,KAAK,QAAQ,eAAe;AAC9C,SAAI,WAAW,MACb,QAAO,UAAU,MAAM,KAAK,KAAK;KAGnC,MAAM,UAAU,KAAK,QAAQ,aAAa;AAC1C,SAAI,SAAS,MACX,QAAO,QAAQ,MAAM,KAAK,KAAK;KAGjC,MAAM,gBAAgB,KAAK,QAAQ,mBAAmB;AACtD,SAAI,eAAe,MACjB,QAAO,cAAc,MAAM,KAAK,KAAK;AAIvC,YAAO,OAAO,MAAM,KAAK,KAAK;aACvB,OAAO;AACd,aAAQ,MAAM,oBAAoB,KAAK,MAAM;AAC7C,WAAM;;;;;AAKZ,QAAO"}