@editframe/elements 0.37.3-beta → 0.38.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 (321) hide show
  1. package/dist/EF_FRAMEGEN.js +17 -14
  2. package/dist/EF_FRAMEGEN.js.map +1 -1
  3. package/dist/EF_RENDERING.js.map +1 -1
  4. package/dist/canvas/EFCanvas.d.ts +9 -2
  5. package/dist/canvas/EFCanvas.js +14 -4
  6. package/dist/canvas/EFCanvas.js.map +1 -1
  7. package/dist/canvas/EFCanvasItem.d.ts +4 -4
  8. package/dist/canvas/overlays/SelectionOverlay.d.ts +10 -2
  9. package/dist/canvas/overlays/SelectionOverlay.js +5 -12
  10. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
  11. package/dist/canvas/overlays/overlayState.js.map +1 -1
  12. package/dist/canvas/selection/SelectionController.js.map +1 -1
  13. package/dist/elements/EFAudio.d.ts +1 -11
  14. package/dist/elements/EFAudio.js +2 -10
  15. package/dist/elements/EFAudio.js.map +1 -1
  16. package/dist/elements/EFCaptions.d.ts +5 -9
  17. package/dist/elements/EFCaptions.js +34 -11
  18. package/dist/elements/EFCaptions.js.map +1 -1
  19. package/dist/elements/EFImage.d.ts +10 -8
  20. package/dist/elements/EFImage.js +117 -32
  21. package/dist/elements/EFImage.js.map +1 -1
  22. package/dist/elements/EFMedia/AssetMediaEngine.js +2 -2
  23. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
  24. package/dist/elements/EFMedia/BaseMediaEngine.js +15 -92
  25. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
  26. package/dist/elements/EFMedia/BufferedSeekingInput.js +10 -11
  27. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
  28. package/dist/elements/EFMedia/{AssetIdMediaEngine.js → FileMediaEngine.js} +44 -24
  29. package/dist/elements/EFMedia/FileMediaEngine.js.map +1 -0
  30. package/dist/elements/EFMedia/JitMediaEngine.js +14 -13
  31. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
  32. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -3
  33. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  34. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +12 -7
  35. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  36. package/dist/elements/EFMedia/shared/timeoutUtils.js +44 -0
  37. package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -0
  38. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
  39. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  40. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +4 -4
  41. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  42. package/dist/elements/EFMedia.d.ts +14 -8
  43. package/dist/elements/EFMedia.js +52 -19
  44. package/dist/elements/EFMedia.js.map +1 -1
  45. package/dist/elements/EFPanZoom.d.ts +2 -2
  46. package/dist/elements/EFPanZoom.js +1 -1
  47. package/dist/elements/EFPanZoom.js.map +1 -1
  48. package/dist/elements/EFSourceMixin.js +16 -8
  49. package/dist/elements/EFSourceMixin.js.map +1 -1
  50. package/dist/elements/EFSurface.d.ts +7 -10
  51. package/dist/elements/EFSurface.js +4 -43
  52. package/dist/elements/EFSurface.js.map +1 -1
  53. package/dist/elements/EFTemporal.d.ts +33 -8
  54. package/dist/elements/EFTemporal.js +92 -40
  55. package/dist/elements/EFTemporal.js.map +1 -1
  56. package/dist/elements/EFText.d.ts +3 -0
  57. package/dist/elements/EFText.js +54 -21
  58. package/dist/elements/EFText.js.map +1 -1
  59. package/dist/elements/EFTextSegment.js +8 -4
  60. package/dist/elements/EFTextSegment.js.map +1 -1
  61. package/dist/elements/EFTimegroup.d.ts +26 -43
  62. package/dist/elements/EFTimegroup.js +295 -314
  63. package/dist/elements/EFTimegroup.js.map +1 -1
  64. package/dist/elements/EFVideo.d.ts +44 -42
  65. package/dist/elements/EFVideo.js +259 -172
  66. package/dist/elements/EFVideo.js.map +1 -1
  67. package/dist/elements/EFWaveform.d.ts +3 -8
  68. package/dist/elements/EFWaveform.js +18 -13
  69. package/dist/elements/EFWaveform.js.map +1 -1
  70. package/dist/elements/ElementPositionInfo.js.map +1 -1
  71. package/dist/elements/FetchMixin.js.map +1 -1
  72. package/dist/elements/TargetController.d.ts +0 -3
  73. package/dist/elements/TargetController.js +12 -35
  74. package/dist/elements/TargetController.js.map +1 -1
  75. package/dist/elements/TimegroupController.js.map +1 -1
  76. package/dist/elements/cloneFactoryRegistry.d.ts +14 -0
  77. package/dist/elements/cloneFactoryRegistry.js +15 -0
  78. package/dist/elements/cloneFactoryRegistry.js.map +1 -0
  79. package/dist/elements/renderTemporalAudio.js +8 -6
  80. package/dist/elements/renderTemporalAudio.js.map +1 -1
  81. package/dist/elements/setupTemporalHierarchy.js +62 -0
  82. package/dist/elements/setupTemporalHierarchy.js.map +1 -0
  83. package/dist/elements/updateAnimations.js +62 -87
  84. package/dist/elements/updateAnimations.js.map +1 -1
  85. package/dist/getRenderInfo.d.ts +3 -2
  86. package/dist/getRenderInfo.js +20 -4
  87. package/dist/getRenderInfo.js.map +1 -1
  88. package/dist/gui/ContextMixin.js +68 -12
  89. package/dist/gui/ContextMixin.js.map +1 -1
  90. package/dist/gui/Controllable.js +1 -1
  91. package/dist/gui/Controllable.js.map +1 -1
  92. package/dist/gui/EFActiveRootTemporal.d.ts +4 -4
  93. package/dist/gui/EFActiveRootTemporal.js.map +1 -1
  94. package/dist/gui/EFControls.d.ts +2 -2
  95. package/dist/gui/EFControls.js +2 -2
  96. package/dist/gui/EFControls.js.map +1 -1
  97. package/dist/gui/EFDial.d.ts +4 -4
  98. package/dist/gui/EFDial.js +12 -9
  99. package/dist/gui/EFDial.js.map +1 -1
  100. package/dist/gui/EFFilmstrip.d.ts +2 -0
  101. package/dist/gui/EFFilmstrip.js +18 -10
  102. package/dist/gui/EFFilmstrip.js.map +1 -1
  103. package/dist/gui/EFFitScale.d.ts +28 -4
  104. package/dist/gui/EFFitScale.js +88 -26
  105. package/dist/gui/EFFitScale.js.map +1 -1
  106. package/dist/gui/EFFocusOverlay.d.ts +4 -4
  107. package/dist/gui/EFFocusOverlay.js +3 -3
  108. package/dist/gui/EFFocusOverlay.js.map +1 -1
  109. package/dist/gui/EFOverlayItem.d.ts +4 -4
  110. package/dist/gui/EFOverlayLayer.d.ts +4 -4
  111. package/dist/gui/EFPause.d.ts +4 -4
  112. package/dist/gui/EFPause.js +1 -1
  113. package/dist/gui/EFPlay.d.ts +4 -4
  114. package/dist/gui/EFPlay.js +1 -1
  115. package/dist/gui/EFPreview.js +1 -1
  116. package/dist/gui/EFResizableBox.d.ts +4 -4
  117. package/dist/gui/EFResizableBox.js +5 -5
  118. package/dist/gui/EFResizableBox.js.map +1 -1
  119. package/dist/gui/EFScrubber.d.ts +4 -4
  120. package/dist/gui/EFScrubber.js +8 -13
  121. package/dist/gui/EFScrubber.js.map +1 -1
  122. package/dist/gui/EFTimeDisplay.d.ts +8 -4
  123. package/dist/gui/EFTimeDisplay.js +25 -7
  124. package/dist/gui/EFTimeDisplay.js.map +1 -1
  125. package/dist/gui/EFTimelineRuler.d.ts +4 -4
  126. package/dist/gui/EFTimelineRuler.js +3 -3
  127. package/dist/gui/EFTimelineRuler.js.map +1 -1
  128. package/dist/gui/EFToggleLoop.d.ts +4 -4
  129. package/dist/gui/EFToggleLoop.js +1 -1
  130. package/dist/gui/EFTogglePlay.d.ts +4 -4
  131. package/dist/gui/EFTogglePlay.js +1 -1
  132. package/dist/gui/EFTransformHandles.d.ts +4 -4
  133. package/dist/gui/EFTransformHandles.js +6 -6
  134. package/dist/gui/EFTransformHandles.js.map +1 -1
  135. package/dist/gui/EFWorkbench.d.ts +40 -36
  136. package/dist/gui/EFWorkbench.js +436 -822
  137. package/dist/gui/EFWorkbench.js.map +1 -1
  138. package/dist/gui/FitScaleHelpers.js.map +1 -1
  139. package/dist/gui/PlaybackController.d.ts +3 -8
  140. package/dist/gui/PlaybackController.js +59 -56
  141. package/dist/gui/PlaybackController.js.map +1 -1
  142. package/dist/gui/TWMixin.js +1 -1
  143. package/dist/gui/TWMixin.js.map +1 -1
  144. package/dist/gui/TargetOrContextMixin.js +43 -6
  145. package/dist/gui/TargetOrContextMixin.js.map +1 -1
  146. package/dist/gui/ef-theme.css +136 -0
  147. package/dist/gui/hierarchy/EFHierarchy.d.ts +2 -2
  148. package/dist/gui/hierarchy/EFHierarchy.js +14 -24
  149. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
  150. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +3 -3
  151. package/dist/gui/hierarchy/EFHierarchyItem.js +22 -10
  152. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
  153. package/dist/gui/icons.js.map +1 -1
  154. package/dist/gui/previewSettingsContext.d.ts +18 -0
  155. package/dist/gui/previewSettingsContext.js.map +1 -1
  156. package/dist/gui/theme.js +34 -0
  157. package/dist/gui/theme.js.map +1 -0
  158. package/dist/gui/timeline/EFTimeline.d.ts +2 -2
  159. package/dist/gui/timeline/EFTimeline.js +70 -52
  160. package/dist/gui/timeline/EFTimeline.js.map +1 -1
  161. package/dist/gui/timeline/EFTimelineRow.d.ts +3 -1
  162. package/dist/gui/timeline/EFTimelineRow.js +55 -32
  163. package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
  164. package/dist/gui/timeline/TrimHandles.d.ts +23 -9
  165. package/dist/gui/timeline/TrimHandles.js +224 -51
  166. package/dist/gui/timeline/TrimHandles.js.map +1 -1
  167. package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
  168. package/dist/gui/timeline/timelineEditingContext.d.ts +34 -0
  169. package/dist/gui/timeline/timelineEditingContext.js +24 -0
  170. package/dist/gui/timeline/timelineEditingContext.js.map +1 -0
  171. package/dist/gui/timeline/timelineStateContext.js.map +1 -1
  172. package/dist/gui/timeline/tracks/AudioTrack.js +1 -1
  173. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
  174. package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -3
  175. package/dist/gui/timeline/tracks/CaptionsTrack.js +17 -75
  176. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
  177. package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +52 -0
  178. package/dist/gui/timeline/tracks/EFThumbnailStrip.js +596 -0
  179. package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -0
  180. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
  181. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
  182. package/dist/gui/timeline/tracks/TextTrack.d.ts +3 -2
  183. package/dist/gui/timeline/tracks/TextTrack.js +17 -43
  184. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
  185. package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +3 -4
  186. package/dist/gui/timeline/tracks/TimegroupTrack.js +33 -23
  187. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
  188. package/dist/gui/timeline/tracks/TrackItem.d.ts +7 -9
  189. package/dist/gui/timeline/tracks/TrackItem.js +18 -17
  190. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
  191. package/dist/gui/timeline/tracks/VideoTrack.d.ts +3 -3
  192. package/dist/gui/timeline/tracks/VideoTrack.js +11 -14
  193. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
  194. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
  195. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
  196. package/dist/gui/timeline/tracks/waveformUtils.js +1 -1
  197. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
  198. package/dist/gui/tree/EFTree.d.ts +4 -4
  199. package/dist/gui/tree/EFTree.js +8 -14
  200. package/dist/gui/tree/EFTree.js.map +1 -1
  201. package/dist/gui/tree/EFTreeItem.d.ts +4 -4
  202. package/dist/gui/tree/EFTreeItem.js +3 -3
  203. package/dist/gui/tree/EFTreeItem.js.map +1 -1
  204. package/dist/gui/tree/treeContext.js.map +1 -1
  205. package/dist/index.d.ts +10 -8
  206. package/dist/index.js +6 -5
  207. package/dist/index.js.map +1 -1
  208. package/dist/node.d.ts +2 -2
  209. package/dist/node.js +2 -2
  210. package/dist/preview/AdaptiveResolutionTracker.js +3 -3
  211. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
  212. package/dist/preview/FrameController.d.ts +2 -17
  213. package/dist/preview/FrameController.js +40 -63
  214. package/dist/preview/FrameController.js.map +1 -1
  215. package/dist/preview/QualityUpgradeScheduler.d.ts +76 -0
  216. package/dist/preview/QualityUpgradeScheduler.js +158 -0
  217. package/dist/preview/QualityUpgradeScheduler.js.map +1 -0
  218. package/dist/preview/RenderContext.d.ts +119 -1
  219. package/dist/preview/RenderContext.js +21 -3
  220. package/dist/preview/RenderContext.js.map +1 -1
  221. package/dist/preview/RenderProfiler.js.map +1 -1
  222. package/dist/preview/RenderStats.js +85 -0
  223. package/dist/preview/RenderStats.js.map +1 -0
  224. package/dist/preview/encoding/canvasEncoder.js +2 -52
  225. package/dist/preview/encoding/canvasEncoder.js.map +1 -1
  226. package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
  227. package/dist/preview/encoding/workerEncoder.js.map +1 -1
  228. package/dist/preview/logger.js.map +1 -1
  229. package/dist/preview/previewSettings.d.ts +34 -0
  230. package/dist/preview/previewSettings.js +29 -17
  231. package/dist/preview/previewSettings.js.map +1 -1
  232. package/dist/preview/previewTypes.js +4 -4
  233. package/dist/preview/previewTypes.js.map +1 -1
  234. package/dist/preview/renderElementToCanvas.d.ts +44 -0
  235. package/dist/preview/renderElementToCanvas.js +72 -0
  236. package/dist/preview/renderElementToCanvas.js.map +1 -0
  237. package/dist/preview/renderTimegroupToCanvas.js +267 -145
  238. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  239. package/dist/preview/renderTimegroupToCanvas.types.d.ts +30 -0
  240. package/dist/preview/renderTimegroupToVideo.js +85 -105
  241. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  242. package/dist/preview/{renderTimegroupToVideo.d.ts → renderTimegroupToVideo.types.d.ts} +9 -9
  243. package/dist/preview/renderVideoToVideo.js +286 -0
  244. package/dist/preview/renderVideoToVideo.js.map +1 -0
  245. package/dist/preview/renderers.js.map +1 -1
  246. package/dist/preview/rendering/ScaleConfig.js +74 -0
  247. package/dist/preview/rendering/ScaleConfig.js.map +1 -0
  248. package/dist/preview/rendering/inlineImages.js +1 -44
  249. package/dist/preview/rendering/inlineImages.js.map +1 -1
  250. package/dist/preview/rendering/loadImage.js +22 -0
  251. package/dist/preview/rendering/loadImage.js.map +1 -0
  252. package/dist/preview/rendering/renderToImageNative.js +3 -3
  253. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  254. package/dist/preview/rendering/serializeTimelineDirect.js +224 -68
  255. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  256. package/dist/preview/statsTrackingStrategy.js +1 -101
  257. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  258. package/dist/preview/workers/WorkerPool.js +0 -1
  259. package/dist/preview/workers/WorkerPool.js.map +1 -1
  260. package/dist/preview/workers/encoderWorkerInline.js +21 -54
  261. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  262. package/dist/render/EFRenderAPI.d.ts +2 -1
  263. package/dist/render/EFRenderAPI.js +12 -36
  264. package/dist/render/EFRenderAPI.js.map +1 -1
  265. package/dist/render/getRenderData.js +4 -4
  266. package/dist/render/getRenderData.js.map +1 -1
  267. package/dist/style.css +114 -163
  268. package/dist/transcoding/cache/RequestDeduplicator.js +1 -0
  269. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  270. package/dist/transcoding/types/index.d.ts +1 -1
  271. package/dist/transcoding/utils/UrlGenerator.js +10 -3
  272. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  273. package/dist/utils/LRUCache.js +1 -0
  274. package/dist/utils/LRUCache.js.map +1 -1
  275. package/dist/utils/frameTime.js +23 -1
  276. package/dist/utils/frameTime.js.map +1 -1
  277. package/package.json +21 -8
  278. package/scripts/build-css.js +8 -1
  279. package/test/setup.ts +0 -1
  280. package/test/useAssetMSW.ts +50 -0
  281. package/test/visualRegressionUtils.ts +23 -9
  282. package/dist/_virtual/rolldown_runtime.js +0 -27
  283. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +0 -1
  284. package/dist/elements/EFThumbnailStrip.d.ts +0 -167
  285. package/dist/elements/EFThumbnailStrip.js +0 -731
  286. package/dist/elements/EFThumbnailStrip.js.map +0 -1
  287. package/dist/elements/SessionThumbnailCache.js +0 -154
  288. package/dist/elements/SessionThumbnailCache.js.map +0 -1
  289. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -688
  290. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
  291. package/dist/node_modules/react/cjs/react.development.js +0 -1521
  292. package/dist/node_modules/react/cjs/react.development.js.map +0 -1
  293. package/dist/node_modules/react/index.js +0 -13
  294. package/dist/node_modules/react/index.js.map +0 -1
  295. package/dist/node_modules/react/jsx-runtime.js +0 -13
  296. package/dist/node_modules/react/jsx-runtime.js.map +0 -1
  297. package/dist/preview/encoding/types.d.ts +0 -1
  298. package/dist/preview/renderTimegroupPreview.js +0 -686
  299. package/dist/preview/renderTimegroupPreview.js.map +0 -1
  300. package/dist/preview/renderTimegroupToCanvas.d.ts +0 -42
  301. package/dist/preview/rendering/renderToImage.d.ts +0 -2
  302. package/dist/preview/rendering/renderToImage.js +0 -95
  303. package/dist/preview/rendering/renderToImage.js.map +0 -1
  304. package/dist/preview/rendering/renderToImageForeignObject.js +0 -163
  305. package/dist/preview/rendering/renderToImageForeignObject.js.map +0 -1
  306. package/dist/preview/rendering/renderToImageNative.d.ts +0 -1
  307. package/dist/preview/rendering/svgSerializer.js +0 -43
  308. package/dist/preview/rendering/svgSerializer.js.map +0 -1
  309. package/dist/preview/rendering/types.d.ts +0 -2
  310. package/dist/preview/thumbnailCacheSettings.js +0 -52
  311. package/dist/preview/thumbnailCacheSettings.js.map +0 -1
  312. package/dist/sandbox/PlaybackControls.d.ts +0 -1
  313. package/dist/sandbox/PlaybackControls.js +0 -10
  314. package/dist/sandbox/PlaybackControls.js.map +0 -1
  315. package/dist/sandbox/ScenarioRunner.d.ts +0 -1
  316. package/dist/sandbox/ScenarioRunner.js +0 -1
  317. package/dist/sandbox/defineSandbox.d.ts +0 -1
  318. package/dist/sandbox/index.d.ts +0 -3
  319. package/dist/sandbox/index.js +0 -2
  320. package/test/EFVideo.framegen.browsertest.ts +0 -80
  321. package/test/thumbnail-performance-test.html +0 -116
@@ -1,4 +1,3 @@
1
- import { renderTimegroupToVideo } from "../preview/renderTimegroupToVideo.js";
2
1
  import { getRenderInfo } from "../getRenderInfo.js";
3
2
 
4
3
  //#region src/render/EFRenderAPI.ts
@@ -15,47 +14,23 @@ function setWorkbenchRendering(rendering) {
15
14
  if (workbench) workbench.rendering = rendering;
16
15
  }
17
16
  async function waitForTimegroupDimensions(timegroup) {
18
- console.log("[EFRenderAPI] Waiting for stylesheets to load...");
19
- console.log(`[EFRenderAPI] Found ${document.styleSheets.length} stylesheets`);
20
- const styleLinks = Array.from(document.querySelectorAll("link[rel=\"stylesheet\"]"));
21
- console.log(`[EFRenderAPI] Found ${styleLinks.length} stylesheet <link> elements`);
22
- styleLinks.forEach((link, i) => {
23
- const href = link.href;
24
- const sheet = link.sheet;
25
- console.log(`[EFRenderAPI] [${i}] ${href}`);
26
- try {
27
- const rulesCount = sheet ? sheet.cssRules.length : 0;
28
- console.log(`[EFRenderAPI] loaded: ${!!sheet}, rules: ${rulesCount}`);
29
- if (sheet && sheet.cssRules.length > 0) {
30
- const firstRules = Array.from(sheet.cssRules).slice(0, 5).map((r) => r.cssText.substring(0, 100));
31
- console.log(`[EFRenderAPI] first rules:`, firstRules);
32
- const hasWidthClass = Array.from(sheet.cssRules).some((r) => r.cssText.includes("w-\\[1080px\\]") || r.cssText.includes("width: 1080px"));
33
- console.log(`[EFRenderAPI] has w-[1080px] class: ${hasWidthClass}`);
34
- }
35
- } catch (e) {
36
- console.log(`[EFRenderAPI] Error reading stylesheet rules:`, e);
37
- }
38
- });
39
17
  await Promise.all(Array.from(document.styleSheets).map((sheet) => {
40
18
  if (sheet.href) {
41
19
  const link = Array.from(document.querySelectorAll("link[rel=\"stylesheet\"]")).find((l) => l.href === sheet.href);
42
- if (link && !link.sheet) {
43
- console.log(`[EFRenderAPI] Waiting for stylesheet: ${sheet.href}`);
44
- return new Promise((resolve) => {
45
- link.addEventListener("load", resolve);
46
- link.addEventListener("error", resolve);
47
- });
48
- }
20
+ if (link && !link.sheet) return new Promise((resolve) => {
21
+ link.addEventListener("load", resolve);
22
+ link.addEventListener("error", resolve);
23
+ });
49
24
  }
50
25
  return Promise.resolve();
51
26
  }));
52
27
  timegroup.offsetHeight;
53
- if (!timegroup.offsetWidth || !timegroup.offsetHeight) {
54
- const computedWidth = getComputedStyle(timegroup).width;
55
- const computedHeight = getComputedStyle(timegroup).height;
56
- throw new Error(`Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). Computed styles: width=${computedWidth}, height=${computedHeight}. Classes: "${timegroup.className}". \n\nTailwind CSS did not generate styles for these classes. Check that:\n1. Your Tailwind config 'content' array includes the HTML file\n2. Tailwind CSS is properly configured in your project\n3. The dev server successfully compiled CSS (check for Tailwind warnings above)`);
57
- }
58
- console.log(`[EFRenderAPI] Timegroup dimensions ready: ${timegroup.offsetWidth}x${timegroup.offsetHeight}`);
28
+ const rect = timegroup.getBoundingClientRect();
29
+ const hasOffset = timegroup.offsetWidth > 0 && timegroup.offsetHeight > 0;
30
+ const hasRect = rect.width > 0 && rect.height > 0;
31
+ const computedWidth = getComputedStyle(timegroup).width;
32
+ const computedHeight = getComputedStyle(timegroup).height;
33
+ if (!hasOffset && !hasRect && !(parseFloat(computedWidth) > 0 && parseFloat(computedHeight) > 0)) throw new Error(`Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). Computed styles: width=${computedWidth}, height=${computedHeight}. Classes: "${timegroup.className}". \n\nTailwind CSS did not generate styles for these classes. Check that:\n1. Your Tailwind config 'content' array includes the HTML file\n2. Tailwind CSS is properly configured in your project\n3. The dev server successfully compiled CSS (check for Tailwind warnings above)`);
59
34
  }
60
35
  const api = {
61
36
  async renderStreaming(options = {}) {
@@ -67,10 +42,10 @@ const api = {
67
42
  await waitForTimegroupDimensions(timegroup);
68
43
  await timegroup.waitForMediaDurations();
69
44
  const chunkWriter = new WritableStream({ write(chunk) {
70
- console.error("Writing chunk", chunk);
71
45
  if (window.onRenderChunk) window.onRenderChunk(chunk);
72
46
  } });
73
47
  const onProgress = options.onProgress || window.onRenderProgress;
48
+ const { renderTimegroupToVideo } = await import("../preview/renderTimegroupToVideo.js");
74
49
  await renderTimegroupToVideo(timegroup, {
75
50
  ...options,
76
51
  customWritableStream: chunkWriter,
@@ -89,6 +64,7 @@ const api = {
89
64
  await waitForTimegroupDimensions(timegroup);
90
65
  await timegroup.waitForMediaDurations();
91
66
  const onProgress = options.onProgress || window.onRenderProgress;
67
+ const { renderTimegroupToVideo } = await import("../preview/renderTimegroupToVideo.js");
92
68
  const buffer = await renderTimegroupToVideo(timegroup, {
93
69
  ...options,
94
70
  returnBuffer: true,
@@ -1 +1 @@
1
- {"version":3,"file":"EFRenderAPI.js","names":["api: IEFRenderAPI"],"sources":["../../src/render/EFRenderAPI.ts"],"sourcesContent":["/**\n * Window API for programmatic video rendering.\n * \n * Exposes renderTimegroupToVideo for use from Playwright/CLI.\n * Supports streaming output and custom data injection.\n */\n\nimport type { EFTimegroup } from \"../elements/EFTimegroup.js\";\nimport type { EFWorkbench } from \"../gui/EFWorkbench.js\";\nimport { getRenderInfo, type RenderInfo } from \"../getRenderInfo.js\";\nimport {\n renderTimegroupToVideo,\n type RenderToVideoOptions,\n type RenderProgress,\n} from \"../preview/renderTimegroupToVideo.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface IEFRenderAPI {\n /**\n * Render with streaming output (calls window.onRenderChunk for each chunk).\n * Use this for CLI/Playwright to avoid memory buffering.\n */\n renderStreaming(options?: RenderToVideoOptions): Promise<void>;\n\n /**\n * Render and return buffer (for shorter videos or in-browser use).\n * Returns the video as Uint8Array.\n */\n render(options?: RenderToVideoOptions): Promise<Uint8Array>;\n\n /**\n * Get render info (dimensions, duration, assets).\n * Same as the exported getRenderInfo function.\n */\n getRenderInfo(): Promise<RenderInfo>;\n\n /**\n * Check if SDK is ready for rendering.\n * Returns true if a root timegroup is found.\n */\n isReady(): boolean;\n}\n\ndeclare global {\n interface Window {\n EF_RENDER?: IEFRenderAPI;\n EF_RENDER_DATA?: Record<string, unknown>;\n onRenderChunk?: (chunk: Uint8Array) => void; // Set by Playwright\n onRenderProgress?: (progress: RenderProgress) => void; // Optional progress callback\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nfunction findRootTimegroup(): EFTimegroup | null {\n // Try to find timegroup from workbench first\n const workbench = document.querySelector(\"ef-workbench\") as EFWorkbench | null;\n if (workbench) {\n const timegroup = workbench.querySelector(\"ef-timegroup\") as EFTimegroup | null;\n if (timegroup) {\n return timegroup;\n }\n }\n\n // Fallback: find first root timegroup\n const rootTimegroup = document.querySelector(\"ef-timegroup\") as EFTimegroup | null;\n return rootTimegroup;\n}\n\nfunction setWorkbenchRendering(rendering: boolean): void {\n const workbench = document.querySelector(\"ef-workbench\") as EFWorkbench | null;\n if (workbench) {\n workbench.rendering = rendering;\n }\n}\n\nasync function waitForTimegroupDimensions(timegroup: EFTimegroup): Promise<void> {\n // Wait for all stylesheets to load first\n console.log('[EFRenderAPI] Waiting for stylesheets to load...');\n console.log(`[EFRenderAPI] Found ${document.styleSheets.length} stylesheets`);\n \n const styleLinks = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]'));\n console.log(`[EFRenderAPI] Found ${styleLinks.length} stylesheet <link> elements`);\n styleLinks.forEach((link, i) => {\n const href = (link as HTMLLinkElement).href;\n const sheet = (link as HTMLLinkElement).sheet;\n console.log(`[EFRenderAPI] [${i}] ${href}`);\n try {\n const rulesCount = sheet ? sheet.cssRules.length : 0;\n console.log(`[EFRenderAPI] loaded: ${!!sheet}, rules: ${rulesCount}`);\n if (sheet && sheet.cssRules.length > 0) {\n // Log first few rules to see what CSS is loaded\n const firstRules = Array.from(sheet.cssRules).slice(0, 5).map(r => r.cssText.substring(0, 100));\n console.log(`[EFRenderAPI] first rules:`, firstRules);\n \n // Search for the specific Tailwind classes we need\n const hasWidthClass = Array.from(sheet.cssRules).some(r => \n r.cssText.includes('w-\\\\[1080px\\\\]') || r.cssText.includes('width: 1080px')\n );\n console.log(`[EFRenderAPI] has w-[1080px] class: ${hasWidthClass}`);\n }\n } catch (e) {\n console.log(`[EFRenderAPI] Error reading stylesheet rules:`, e);\n }\n });\n \n await Promise.all(\n Array.from(document.styleSheets).map((sheet) => {\n if (sheet.href) {\n // Check if stylesheet is from a <link> tag and wait for it\n const link = Array.from(document.querySelectorAll('link[rel=\"stylesheet\"]')).find(\n (l) => (l as HTMLLinkElement).href === sheet.href\n );\n if (link && !(link as HTMLLinkElement).sheet) {\n console.log(`[EFRenderAPI] Waiting for stylesheet: ${sheet.href}`);\n return new Promise((resolve) => {\n link.addEventListener('load', resolve);\n link.addEventListener('error', resolve);\n });\n }\n }\n return Promise.resolve();\n })\n );\n \n // Force layout immediately after stylesheets load\n void timegroup.offsetHeight;\n \n if (!timegroup.offsetWidth || !timegroup.offsetHeight) {\n const computedWidth = getComputedStyle(timegroup).width;\n const computedHeight = getComputedStyle(timegroup).height;\n \n throw new Error(\n `Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). ` +\n `Computed styles: width=${computedWidth}, height=${computedHeight}. ` +\n `Classes: \"${timegroup.className}\". ` +\n `\\n\\nTailwind CSS did not generate styles for these classes. ` +\n `Check that:\\n` +\n `1. Your Tailwind config 'content' array includes the HTML file\\n` +\n `2. Tailwind CSS is properly configured in your project\\n` +\n `3. The dev server successfully compiled CSS (check for Tailwind warnings above)`\n );\n }\n \n console.log(`[EFRenderAPI] Timegroup dimensions ready: ${timegroup.offsetWidth}x${timegroup.offsetHeight}`);\n}\n\nconst api: IEFRenderAPI = {\n async renderStreaming(options: RenderToVideoOptions = {}): Promise<void> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Check if window.onRenderChunk is available\n if (typeof window === \"undefined\" || !window.onRenderChunk) {\n throw new Error(\n \"window.onRenderChunk is not set. \" +\n \"Call page.exposeFunction('onRenderChunk', callback) from Playwright first.\"\n );\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n \n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Create custom writable stream that calls window.onRenderChunk\n const chunkWriter = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array) {\n console.error(\"Writing chunk\", chunk);\n if (window.onRenderChunk) {\n window.onRenderChunk(chunk);\n }\n },\n });\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Render with custom stream\n await renderTimegroupToVideo(timegroup, {\n ...options,\n customWritableStream: chunkWriter,\n onProgress,\n returnBuffer: false,\n });\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async render(options: RenderToVideoOptions = {}): Promise<Uint8Array> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n \n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n const buffer = await renderTimegroupToVideo(timegroup, {\n ...options,\n returnBuffer: true,\n onProgress,\n });\n\n if (!buffer) {\n throw new Error(\"Render failed: no buffer returned\");\n }\n\n return buffer;\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async getRenderInfo(): Promise<RenderInfo> {\n return getRenderInfo();\n },\n\n isReady(): boolean {\n return findRootTimegroup() !== null;\n },\n};\n\n// Export and register on window\nif (typeof window !== \"undefined\") {\n window.EF_RENDER = api;\n}\n\nexport { api as EFRenderAPI };\nexport type { IEFRenderAPI as EFRenderAPIInterface };\n"],"mappings":";;;;AA2DA,SAAS,oBAAwC;CAE/C,MAAM,YAAY,SAAS,cAAc,eAAe;AACxD,KAAI,WAAW;EACb,MAAM,YAAY,UAAU,cAAc,eAAe;AACzD,MAAI,UACF,QAAO;;AAMX,QADsB,SAAS,cAAc,eAAe;;AAI9D,SAAS,sBAAsB,WAA0B;CACvD,MAAM,YAAY,SAAS,cAAc,eAAe;AACxD,KAAI,UACF,WAAU,YAAY;;AAI1B,eAAe,2BAA2B,WAAuC;AAE/E,SAAQ,IAAI,mDAAmD;AAC/D,SAAQ,IAAI,uBAAuB,SAAS,YAAY,OAAO,cAAc;CAE7E,MAAM,aAAa,MAAM,KAAK,SAAS,iBAAiB,2BAAyB,CAAC;AAClF,SAAQ,IAAI,uBAAuB,WAAW,OAAO,6BAA6B;AAClF,YAAW,SAAS,MAAM,MAAM;EAC9B,MAAM,OAAQ,KAAyB;EACvC,MAAM,QAAS,KAAyB;AACxC,UAAQ,IAAI,oBAAoB,EAAE,IAAI,OAAO;AAC7C,MAAI;GACF,MAAM,aAAa,QAAQ,MAAM,SAAS,SAAS;AACnD,WAAQ,IAAI,+BAA+B,CAAC,CAAC,MAAM,WAAW,aAAa;AAC3E,OAAI,SAAS,MAAM,SAAS,SAAS,GAAG;IAEtC,MAAM,aAAa,MAAM,KAAK,MAAM,SAAS,CAAC,MAAM,GAAG,EAAE,CAAC,KAAI,MAAK,EAAE,QAAQ,UAAU,GAAG,IAAI,CAAC;AAC/F,YAAQ,IAAI,oCAAoC,WAAW;IAG3D,MAAM,gBAAgB,MAAM,KAAK,MAAM,SAAS,CAAC,MAAK,MACpD,EAAE,QAAQ,SAAS,iBAAiB,IAAI,EAAE,QAAQ,SAAS,gBAAgB,CAC5E;AACD,YAAQ,IAAI,6CAA6C,gBAAgB;;WAEpE,GAAG;AACV,WAAQ,IAAI,uDAAuD,EAAE;;GAEvE;AAEF,OAAM,QAAQ,IACZ,MAAM,KAAK,SAAS,YAAY,CAAC,KAAK,UAAU;AAC9C,MAAI,MAAM,MAAM;GAEd,MAAM,OAAO,MAAM,KAAK,SAAS,iBAAiB,2BAAyB,CAAC,CAAC,MAC1E,MAAO,EAAsB,SAAS,MAAM,KAC9C;AACD,OAAI,QAAQ,CAAE,KAAyB,OAAO;AAC5C,YAAQ,IAAI,yCAAyC,MAAM,OAAO;AAClE,WAAO,IAAI,SAAS,YAAY;AAC9B,UAAK,iBAAiB,QAAQ,QAAQ;AACtC,UAAK,iBAAiB,SAAS,QAAQ;MACvC;;;AAGN,SAAO,QAAQ,SAAS;GACxB,CACH;AAGD,CAAK,UAAU;AAEf,KAAI,CAAC,UAAU,eAAe,CAAC,UAAU,cAAc;EACrD,MAAM,gBAAgB,iBAAiB,UAAU,CAAC;EAClD,MAAM,iBAAiB,iBAAiB,UAAU,CAAC;AAEnD,QAAM,IAAI,MACR,gCAAgC,UAAU,YAAY,GAAG,UAAU,aAAa,4BACtD,cAAc,WAAW,eAAe,cACrD,UAAU,UAAU,qRAMlC;;AAGH,SAAQ,IAAI,6CAA6C,UAAU,YAAY,GAAG,UAAU,eAAe;;AAG7G,MAAMA,MAAoB;CACxB,MAAM,gBAAgB,UAAgC,EAAE,EAAiB;EACvE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,cAC3C,OAAM,IAAI,MACR,8GAED;AAIH,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,cAAc,IAAI,eAA2B,EACjD,MAAM,OAAmB;AACvB,YAAQ,MAAM,iBAAiB,MAAM;AACrC,QAAI,OAAO,cACT,QAAO,cAAc,MAAM;MAGhC,CAAC;GAGF,MAAM,aAAa,QAAQ,cAAc,OAAO;AAGhD,SAAM,uBAAuB,WAAW;IACtC,GAAG;IACH,sBAAsB;IACtB;IACA,cAAc;IACf,CAAC;YACM;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,OAAO,UAAgC,EAAE,EAAuB;EACpE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,aAAa,QAAQ,cAAc,OAAO;GAEhD,MAAM,SAAS,MAAM,uBAAuB,WAAW;IACrD,GAAG;IACH,cAAc;IACd;IACD,CAAC;AAEF,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,UAAO;YACC;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,gBAAqC;AACzC,SAAO,eAAe;;CAGxB,UAAmB;AACjB,SAAO,mBAAmB,KAAK;;CAElC;AAGD,IAAI,OAAO,WAAW,YACpB,QAAO,YAAY"}
1
+ {"version":3,"file":"EFRenderAPI.js","names":["api: IEFRenderAPI"],"sources":["../../src/render/EFRenderAPI.ts"],"sourcesContent":["/**\n * Window API for programmatic video rendering.\n *\n * Exposes renderTimegroupToVideo for use from Playwright/CLI.\n * Supports streaming output and custom data injection.\n */\n\nimport type { EFTimegroup } from \"../elements/EFTimegroup.js\";\nimport type { EFWorkbench } from \"../gui/EFWorkbench.js\";\nimport { getRenderInfo, type RenderInfo } from \"../getRenderInfo.js\";\n// Import only types - actual function loaded dynamically\nimport type {\n RenderToVideoOptions,\n RenderProgress,\n} from \"../preview/renderTimegroupToVideo.types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface IEFRenderAPI {\n /**\n * Render with streaming output (calls window.onRenderChunk for each chunk).\n * Use this for CLI/Playwright to avoid memory buffering.\n */\n renderStreaming(options?: RenderToVideoOptions): Promise<void>;\n\n /**\n * Render and return buffer (for shorter videos or in-browser use).\n * Returns the video as Uint8Array.\n */\n render(options?: RenderToVideoOptions): Promise<Uint8Array>;\n\n /**\n * Get render info (dimensions, duration, assets).\n * Same as the exported getRenderInfo function.\n */\n getRenderInfo(): Promise<RenderInfo>;\n\n /**\n * Check if SDK is ready for rendering.\n * Returns true if a root timegroup is found.\n */\n isReady(): boolean;\n}\n\ndeclare global {\n interface Window {\n EF_RENDER?: IEFRenderAPI;\n EF_RENDER_DATA?: Record<string, unknown>;\n onRenderChunk?: (chunk: Uint8Array) => void; // Set by Playwright\n onRenderProgress?: (progress: RenderProgress) => void; // Optional progress callback\n }\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nfunction findRootTimegroup(): EFTimegroup | null {\n // Try to find timegroup from workbench first\n const workbench = document.querySelector(\n \"ef-workbench\",\n ) as EFWorkbench | null;\n if (workbench) {\n const timegroup = workbench.querySelector(\n \"ef-timegroup\",\n ) as EFTimegroup | null;\n if (timegroup) {\n return timegroup;\n }\n }\n\n // Fallback: find first root timegroup\n const rootTimegroup = document.querySelector(\n \"ef-timegroup\",\n ) as EFTimegroup | null;\n return rootTimegroup;\n}\n\nfunction setWorkbenchRendering(rendering: boolean): void {\n const workbench = document.querySelector(\n \"ef-workbench\",\n ) as EFWorkbench | null;\n if (workbench) {\n workbench.rendering = rendering;\n }\n}\n\nasync function waitForTimegroupDimensions(\n timegroup: EFTimegroup,\n): Promise<void> {\n await Promise.all(\n Array.from(document.styleSheets).map((sheet) => {\n if (sheet.href) {\n const link = Array.from(\n document.querySelectorAll('link[rel=\"stylesheet\"]'),\n ).find((l) => (l as HTMLLinkElement).href === sheet.href);\n if (link && !(link as HTMLLinkElement).sheet) {\n return new Promise((resolve) => {\n link.addEventListener(\"load\", resolve);\n link.addEventListener(\"error\", resolve);\n });\n }\n }\n return Promise.resolve();\n }),\n );\n\n // Force layout immediately after stylesheets load\n void timegroup.offsetHeight;\n\n const rect = timegroup.getBoundingClientRect();\n const hasOffset = timegroup.offsetWidth > 0 && timegroup.offsetHeight > 0;\n const hasRect = rect.width > 0 && rect.height > 0;\n const computedWidth = getComputedStyle(timegroup).width;\n const computedHeight = getComputedStyle(timegroup).height;\n const hasComputed =\n parseFloat(computedWidth) > 0 && parseFloat(computedHeight) > 0;\n\n if (!hasOffset && !hasRect && !hasComputed) {\n throw new Error(\n `Timegroup has no dimensions (${timegroup.offsetWidth}x${timegroup.offsetHeight}). ` +\n `Computed styles: width=${computedWidth}, height=${computedHeight}. ` +\n `Classes: \"${timegroup.className}\". ` +\n `\\n\\nTailwind CSS did not generate styles for these classes. ` +\n `Check that:\\n` +\n `1. Your Tailwind config 'content' array includes the HTML file\\n` +\n `2. Tailwind CSS is properly configured in your project\\n` +\n `3. The dev server successfully compiled CSS (check for Tailwind warnings above)`,\n );\n }\n\n}\n\nconst api: IEFRenderAPI = {\n async renderStreaming(options: RenderToVideoOptions = {}): Promise<void> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Check if window.onRenderChunk is available\n if (typeof window === \"undefined\" || !window.onRenderChunk) {\n throw new Error(\n \"window.onRenderChunk is not set. \" +\n \"Call page.exposeFunction('onRenderChunk', callback) from Playwright first.\",\n );\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n\n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Create custom writable stream that calls window.onRenderChunk\n const chunkWriter = new WritableStream<Uint8Array>({\n write(chunk: Uint8Array) {\n if (window.onRenderChunk) {\n window.onRenderChunk(chunk);\n }\n },\n });\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Render with custom stream\n // Dynamic import to avoid loading render utilities during module initialization\n const { renderTimegroupToVideo } =\n await import(\"../preview/renderTimegroupToVideo.js\");\n await renderTimegroupToVideo(timegroup, {\n ...options,\n customWritableStream: chunkWriter,\n onProgress,\n returnBuffer: false,\n });\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async render(options: RenderToVideoOptions = {}): Promise<Uint8Array> {\n const timegroup = findRootTimegroup();\n if (!timegroup) {\n throw new Error(\"No ef-timegroup found. Cannot render.\");\n }\n\n // Hide workbench UI during render\n setWorkbenchRendering(true);\n\n try {\n // Wait for timegroup to have dimensions\n await waitForTimegroupDimensions(timegroup);\n\n // Wait for media to be ready\n await timegroup.waitForMediaDurations();\n\n // Merge progress callback if window.onRenderProgress is set\n const onProgress = options.onProgress || window.onRenderProgress;\n\n // Dynamic import to avoid loading render utilities during module initialization\n const { renderTimegroupToVideo } =\n await import(\"../preview/renderTimegroupToVideo.js\");\n const buffer = await renderTimegroupToVideo(timegroup, {\n ...options,\n returnBuffer: true,\n onProgress,\n });\n\n if (!buffer) {\n throw new Error(\"Render failed: no buffer returned\");\n }\n\n return buffer;\n } finally {\n // Restore workbench UI\n setWorkbenchRendering(false);\n }\n },\n\n async getRenderInfo(): Promise<RenderInfo> {\n return getRenderInfo();\n },\n\n isReady(): boolean {\n return findRootTimegroup() !== null;\n },\n};\n\n// Export and register on window\nif (typeof window !== \"undefined\") {\n window.EF_RENDER = api;\n}\n\nexport { api as EFRenderAPI };\nexport type { IEFRenderAPI as EFRenderAPIInterface };\n"],"mappings":";;;AA2DA,SAAS,oBAAwC;CAE/C,MAAM,YAAY,SAAS,cACzB,eACD;AACD,KAAI,WAAW;EACb,MAAM,YAAY,UAAU,cAC1B,eACD;AACD,MAAI,UACF,QAAO;;AAQX,QAHsB,SAAS,cAC7B,eACD;;AAIH,SAAS,sBAAsB,WAA0B;CACvD,MAAM,YAAY,SAAS,cACzB,eACD;AACD,KAAI,UACF,WAAU,YAAY;;AAI1B,eAAe,2BACb,WACe;AACf,OAAM,QAAQ,IACZ,MAAM,KAAK,SAAS,YAAY,CAAC,KAAK,UAAU;AAC9C,MAAI,MAAM,MAAM;GACd,MAAM,OAAO,MAAM,KACjB,SAAS,iBAAiB,2BAAyB,CACpD,CAAC,MAAM,MAAO,EAAsB,SAAS,MAAM,KAAK;AACzD,OAAI,QAAQ,CAAE,KAAyB,MACrC,QAAO,IAAI,SAAS,YAAY;AAC9B,SAAK,iBAAiB,QAAQ,QAAQ;AACtC,SAAK,iBAAiB,SAAS,QAAQ;KACvC;;AAGN,SAAO,QAAQ,SAAS;GACxB,CACH;AAGD,CAAK,UAAU;CAEf,MAAM,OAAO,UAAU,uBAAuB;CAC9C,MAAM,YAAY,UAAU,cAAc,KAAK,UAAU,eAAe;CACxE,MAAM,UAAU,KAAK,QAAQ,KAAK,KAAK,SAAS;CAChD,MAAM,gBAAgB,iBAAiB,UAAU,CAAC;CAClD,MAAM,iBAAiB,iBAAiB,UAAU,CAAC;AAInD,KAAI,CAAC,aAAa,CAAC,WAAW,EAF5B,WAAW,cAAc,GAAG,KAAK,WAAW,eAAe,GAAG,GAG9D,OAAM,IAAI,MACR,gCAAgC,UAAU,YAAY,GAAG,UAAU,aAAa,4BACpD,cAAc,WAAW,eAAe,cACrD,UAAU,UAAU,qRAMpC;;AAKL,MAAMA,MAAoB;CACxB,MAAM,gBAAgB,UAAgC,EAAE,EAAiB;EACvE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,MAAI,OAAO,WAAW,eAAe,CAAC,OAAO,cAC3C,OAAM,IAAI,MACR,8GAED;AAIH,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,cAAc,IAAI,eAA2B,EACjD,MAAM,OAAmB;AACvB,QAAI,OAAO,cACT,QAAO,cAAc,MAAM;MAGhC,CAAC;GAGF,MAAM,aAAa,QAAQ,cAAc,OAAO;GAIhD,MAAM,EAAE,2BACN,MAAM,OAAO;AACf,SAAM,uBAAuB,WAAW;IACtC,GAAG;IACH,sBAAsB;IACtB;IACA,cAAc;IACf,CAAC;YACM;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,OAAO,UAAgC,EAAE,EAAuB;EACpE,MAAM,YAAY,mBAAmB;AACrC,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,wCAAwC;AAI1D,wBAAsB,KAAK;AAE3B,MAAI;AAEF,SAAM,2BAA2B,UAAU;AAG3C,SAAM,UAAU,uBAAuB;GAGvC,MAAM,aAAa,QAAQ,cAAc,OAAO;GAGhD,MAAM,EAAE,2BACN,MAAM,OAAO;GACf,MAAM,SAAS,MAAM,uBAAuB,WAAW;IACrD,GAAG;IACH,cAAc;IACd;IACD,CAAC;AAEF,OAAI,CAAC,OACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,UAAO;YACC;AAER,yBAAsB,MAAM;;;CAIhC,MAAM,gBAAqC;AACzC,SAAO,eAAe;;CAGxB,UAAmB;AACjB,SAAO,mBAAmB,KAAK;;CAElC;AAGD,IAAI,OAAO,WAAW,YACpB,QAAO,YAAY"}
@@ -1,18 +1,18 @@
1
1
  //#region src/render/getRenderData.ts
2
2
  /**
3
3
  * Get custom render data that was passed to the render process.
4
- *
4
+ *
5
5
  * @returns The render data object, or undefined if no data was provided
6
- *
6
+ *
7
7
  * @example
8
8
  * ```typescript
9
9
  * import { getRenderData } from "@editframe/elements";
10
- *
10
+ *
11
11
  * interface MyRenderData {
12
12
  * userName: string;
13
13
  * theme: "light" | "dark";
14
14
  * }
15
- *
15
+ *
16
16
  * const data = getRenderData<MyRenderData>();
17
17
  * if (data) {
18
18
  * console.log(data.userName); // "John"
@@ -1 +1 @@
1
- {"version":3,"file":"getRenderData.js","names":[],"sources":["../../src/render/getRenderData.ts"],"sourcesContent":["/**\n * Helper function for compositions to read custom render data.\n * \n * Supports both runtime data (set by Playwright/CLI via window.EF_RENDER_DATA)\n * and build-time data (set by Vite define as RENDER_DATA).\n */\n\n// Declare RENDER_DATA for TypeScript (set via Vite define at build time)\ndeclare const RENDER_DATA: unknown | undefined;\n\n/**\n * Get custom render data that was passed to the render process.\n * \n * @returns The render data object, or undefined if no data was provided\n * \n * @example\n * ```typescript\n * import { getRenderData } from \"@editframe/elements\";\n * \n * interface MyRenderData {\n * userName: string;\n * theme: \"light\" | \"dark\";\n * }\n * \n * const data = getRenderData<MyRenderData>();\n * if (data) {\n * console.log(data.userName); // \"John\"\n * }\n * ```\n */\nexport function getRenderData<T = unknown>(): T | undefined {\n // Runtime data (set by Playwright/CLI)\n if (typeof window !== \"undefined\" && window.EF_RENDER_DATA) {\n return window.EF_RENDER_DATA as T;\n }\n \n // Build-time data (set by Vite define)\n if (typeof RENDER_DATA !== \"undefined\") {\n return RENDER_DATA as T;\n }\n \n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,gBAA4C;AAE1D,KAAI,OAAO,WAAW,eAAe,OAAO,eAC1C,QAAO,OAAO;AAIhB,KAAI,OAAO,gBAAgB,YACzB,QAAO"}
1
+ {"version":3,"file":"getRenderData.js","names":[],"sources":["../../src/render/getRenderData.ts"],"sourcesContent":["/**\n * Helper function for compositions to read custom render data.\n *\n * Supports both runtime data (set by Playwright/CLI via window.EF_RENDER_DATA)\n * and build-time data (set by Vite define as RENDER_DATA).\n */\n\n// Declare RENDER_DATA for TypeScript (set via Vite define at build time)\ndeclare const RENDER_DATA: unknown | undefined;\n\n/**\n * Get custom render data that was passed to the render process.\n *\n * @returns The render data object, or undefined if no data was provided\n *\n * @example\n * ```typescript\n * import { getRenderData } from \"@editframe/elements\";\n *\n * interface MyRenderData {\n * userName: string;\n * theme: \"light\" | \"dark\";\n * }\n *\n * const data = getRenderData<MyRenderData>();\n * if (data) {\n * console.log(data.userName); // \"John\"\n * }\n * ```\n */\nexport function getRenderData<T = unknown>(): T | undefined {\n // Runtime data (set by Playwright/CLI)\n if (typeof window !== \"undefined\" && window.EF_RENDER_DATA) {\n return window.EF_RENDER_DATA as T;\n }\n\n // Build-time data (set by Vite define)\n if (typeof RENDER_DATA !== \"undefined\") {\n return RENDER_DATA as T;\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8BA,SAAgB,gBAA4C;AAE1D,KAAI,OAAO,WAAW,eAAe,OAAO,eAC1C,QAAO,OAAO;AAIhB,KAAI,OAAO,gBAAgB,YACzB,QAAO"}
package/dist/style.css CHANGED
@@ -1,5 +1,8 @@
1
+ /* Import theme tokens first so they're available to all components */
2
+ @import "./gui/ef-theme.css";
3
+
1
4
  /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
2
- *, ::before, ::after {
5
+ *, ::before, ::after{
3
6
  --tw-border-spacing-x: 0;
4
7
  --tw-border-spacing-y: 0;
5
8
  --tw-translate-x: 0;
@@ -52,7 +55,7 @@
52
55
  --tw-contain-paint: ;
53
56
  --tw-contain-style: ;
54
57
  }
55
- ::backdrop {
58
+ ::backdrop{
56
59
  --tw-border-spacing-x: 0;
57
60
  --tw-border-spacing-y: 0;
58
61
  --tw-translate-x: 0;
@@ -433,348 +436,296 @@ video {
433
436
  display: none;
434
437
  }
435
438
  /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
436
- .\!container {
439
+ .\!container{
437
440
  width: 100% !important;
438
441
  }
439
- .container {
442
+ .container{
440
443
  width: 100%;
441
444
  }
442
- @media (min-width: 640px) {
443
- .\!container {
445
+ @media (min-width: 640px){
446
+ .\!container{
444
447
  max-width: 640px !important;
445
448
  }
446
- .container {
449
+ .container{
447
450
  max-width: 640px;
448
451
  }
449
452
  }
450
- @media (min-width: 768px) {
451
- .\!container {
453
+ @media (min-width: 768px){
454
+ .\!container{
452
455
  max-width: 768px !important;
453
456
  }
454
- .container {
457
+ .container{
455
458
  max-width: 768px;
456
459
  }
457
460
  }
458
- @media (min-width: 1024px) {
459
- .\!container {
461
+ @media (min-width: 1024px){
462
+ .\!container{
460
463
  max-width: 1024px !important;
461
464
  }
462
- .container {
465
+ .container{
463
466
  max-width: 1024px;
464
467
  }
465
468
  }
466
- @media (min-width: 1280px) {
467
- .\!container {
469
+ @media (min-width: 1280px){
470
+ .\!container{
468
471
  max-width: 1280px !important;
469
472
  }
470
- .container {
473
+ .container{
471
474
  max-width: 1280px;
472
475
  }
473
476
  }
474
- @media (min-width: 1536px) {
475
- .\!container {
477
+ @media (min-width: 1536px){
478
+ .\!container{
476
479
  max-width: 1536px !important;
477
480
  }
478
- .container {
481
+ .container{
479
482
  max-width: 1536px;
480
483
  }
481
484
  }
482
485
  /* biome-ignore lint/suspicious/noUnknownAtRules: @tailwind is a valid Tailwind CSS directive */
483
- .\!visible {
484
- visibility: visible !important;
485
- }
486
- .visible {
486
+ .visible{
487
487
  visibility: visible;
488
488
  }
489
- .invisible {
489
+ .invisible{
490
490
  visibility: hidden;
491
491
  }
492
- .collapse {
492
+ .collapse{
493
493
  visibility: collapse;
494
494
  }
495
- .static {
495
+ .static{
496
496
  position: static;
497
497
  }
498
- .fixed {
498
+ .fixed{
499
499
  position: fixed;
500
500
  }
501
- .absolute {
501
+ .absolute{
502
502
  position: absolute;
503
503
  }
504
- .relative {
504
+ .relative{
505
505
  position: relative;
506
506
  }
507
- .sticky {
507
+ .sticky{
508
508
  position: sticky;
509
509
  }
510
- .inset-0 {
510
+ .inset-0{
511
511
  inset: 0px;
512
512
  }
513
- .left-0 {
513
+ .left-0{
514
514
  left: 0px;
515
515
  }
516
- .top-0 {
516
+ .right-0{
517
+ right: 0px;
518
+ }
519
+ .top-0{
517
520
  top: 0px;
518
521
  }
519
- .isolate {
522
+ .top-8{
523
+ top: 2rem;
524
+ }
525
+ .isolate{
520
526
  isolation: isolate;
521
527
  }
522
- .z-\[5\] {
528
+ .z-\[5\]{
523
529
  z-index: 5;
524
530
  }
525
- .mb-0 {
531
+ .mb-0{
526
532
  margin-bottom: 0px;
527
533
  }
528
- .mb-\[1px\] {
534
+ .mb-\[1px\]{
529
535
  margin-bottom: 1px;
530
536
  }
531
- .block {
537
+ .block{
532
538
  display: block;
533
539
  }
534
- .inline-block {
540
+ .inline-block{
535
541
  display: inline-block;
536
542
  }
537
- .inline {
543
+ .inline{
538
544
  display: inline;
539
545
  }
540
- .flex {
546
+ .flex{
541
547
  display: flex;
542
548
  }
543
- .inline-flex {
549
+ .inline-flex{
544
550
  display: inline-flex;
545
551
  }
546
- .table {
552
+ .table{
547
553
  display: table;
548
554
  }
549
- .grid {
555
+ .grid{
550
556
  display: grid;
551
557
  }
552
- .inline-grid {
558
+ .inline-grid{
553
559
  display: inline-grid;
554
560
  }
555
- .contents {
561
+ .contents{
556
562
  display: contents;
557
563
  }
558
- .hidden {
564
+ .hidden{
559
565
  display: none;
560
566
  }
561
- .size-full {
567
+ .size-full{
562
568
  width: 100%;
563
569
  height: 100%;
564
570
  }
565
- .h-\[1\.1rem\] {
571
+ .h-\[1\.1rem\]{
566
572
  height: 1.1rem;
567
573
  }
568
- .h-\[1080px\] {
574
+ .h-\[1080px\]{
569
575
  height: 1080px;
570
576
  }
571
- .h-\[200px\] {
572
- height: 200px;
573
- }
574
- .h-\[270px\] {
575
- height: 270px;
576
- }
577
- .h-\[300px\] {
578
- height: 300px;
579
- }
580
- .h-\[360px\] {
581
- height: 360px;
582
- }
583
- .h-\[400px\] {
584
- height: 400px;
585
- }
586
- .h-\[500px\] {
577
+ .h-\[500px\]{
587
578
  height: 500px;
588
579
  }
589
- .h-\[5px\] {
580
+ .h-\[5px\]{
590
581
  height: 5px;
591
582
  }
592
- .h-full {
583
+ .h-\[calc\(50vh-4rem\)\]{
584
+ height: calc(50vh - 4rem);
585
+ }
586
+ .h-full{
593
587
  height: 100%;
594
588
  }
595
- .w-1 {
589
+ .w-1{
596
590
  width: 0.25rem;
597
591
  }
598
- .w-\[1000px\] {
592
+ .w-\[1000px\]{
599
593
  width: 1000px;
600
594
  }
601
- .w-\[1080px\] {
602
- width: 1080px;
603
- }
604
- .w-\[1920px\] {
595
+ .w-\[1920px\]{
605
596
  width: 1920px;
606
597
  }
607
- .w-\[200px\] {
608
- width: 200px;
609
- }
610
- .w-\[420px\] {
598
+ .w-\[420px\]{
611
599
  width: 420px;
612
600
  }
613
- .w-\[480px\] {
614
- width: 480px;
615
- }
616
- .w-\[600px\] {
617
- width: 600px;
618
- }
619
- .w-\[640px\] {
620
- width: 640px;
621
- }
622
- .w-full {
601
+ .w-full{
623
602
  width: 100%;
624
603
  }
625
- .flex-shrink {
604
+ .flex-1{
605
+ flex: 1 1 0%;
606
+ }
607
+ .flex-shrink{
626
608
  flex-shrink: 1;
627
609
  }
628
- .shrink {
610
+ .shrink{
629
611
  flex-shrink: 1;
630
612
  }
631
- .\!transform {
613
+ .\!transform{
632
614
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)) !important;
633
615
  }
634
- .transform {
616
+ .transform{
635
617
  transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
636
618
  }
637
- .cursor-grabbing {
638
- cursor: grabbing;
639
- }
640
- .cursor-pointer {
641
- cursor: pointer;
642
- }
643
- .resize {
619
+ .resize{
644
620
  resize: both;
645
621
  }
646
- .flex-row {
647
- flex-direction: row;
648
- }
649
- .flex-wrap {
622
+ .flex-wrap{
650
623
  flex-wrap: wrap;
651
624
  }
652
- .items-center {
625
+ .items-center{
653
626
  align-items: center;
654
627
  }
655
- .gap-2 {
656
- gap: 0.5rem;
657
- }
658
- .overflow-hidden {
628
+ .overflow-hidden{
659
629
  overflow: hidden;
660
630
  }
661
- .overflow-visible {
631
+ .overflow-visible{
662
632
  overflow: visible;
663
633
  }
664
- .whitespace-nowrap {
634
+ .whitespace-nowrap{
665
635
  white-space: nowrap;
666
636
  }
667
- .text-nowrap {
637
+ .text-nowrap{
668
638
  text-wrap: nowrap;
669
639
  }
670
- .rounded {
640
+ .rounded{
671
641
  border-radius: 0.25rem;
672
642
  }
673
- .border {
643
+ .border{
674
644
  border-width: 1px;
675
645
  }
676
- .bg-black {
677
- --tw-bg-opacity: 1;
678
- background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1));
679
- }
680
- .bg-lime-400 {
681
- --tw-bg-opacity: 1;
682
- background-color: rgb(163 230 53 / var(--tw-bg-opacity, 1));
683
- }
684
- .bg-slate-500 {
646
+ .bg-slate-500{
685
647
  --tw-bg-opacity: 1;
686
648
  background-color: rgb(100 116 139 / var(--tw-bg-opacity, 1));
687
649
  }
688
- .bg-yellow-400 {
689
- --tw-bg-opacity: 1;
690
- background-color: rgb(250 204 21 / var(--tw-bg-opacity, 1));
691
- }
692
- .object-contain {
693
- -o-object-fit: contain;
694
- object-fit: contain;
650
+ .object-cover{
651
+ -o-object-fit: cover;
652
+ object-fit: cover;
695
653
  }
696
- .p-4 {
697
- padding: 1rem;
698
- }
699
- .px-0\.5 {
654
+ .px-0\.5{
700
655
  padding-left: 0.125rem;
701
656
  padding-right: 0.125rem;
702
657
  }
703
- .text-center {
658
+ .text-center{
704
659
  text-align: center;
705
660
  }
706
- .text-\[8px\] {
661
+ .text-3xl{
662
+ font-size: 1.875rem;
663
+ line-height: 2.25rem;
664
+ }
665
+ .text-\[8px\]{
707
666
  font-size: 8px;
708
667
  }
709
- .text-sm {
668
+ .text-sm{
710
669
  font-size: 0.875rem;
711
670
  line-height: 1.25rem;
712
671
  }
713
- .text-xs {
672
+ .text-xs{
714
673
  font-size: 0.75rem;
715
674
  line-height: 1rem;
716
675
  }
717
- .font-bold {
676
+ .font-bold{
718
677
  font-weight: 700;
719
678
  }
720
- .uppercase {
679
+ .uppercase{
721
680
  text-transform: uppercase;
722
681
  }
723
- .capitalize {
682
+ .capitalize{
724
683
  text-transform: capitalize;
725
684
  }
726
- .italic {
685
+ .italic{
727
686
  font-style: italic;
728
687
  }
729
- .text-black {
730
- --tw-text-opacity: 1;
731
- color: rgb(0 0 0 / var(--tw-text-opacity, 1));
732
- }
733
- .text-green-200 {
734
- --tw-text-opacity: 1;
735
- color: rgb(187 247 208 / var(--tw-text-opacity, 1));
736
- }
737
- .text-green-900 {
688
+ .text-white{
738
689
  --tw-text-opacity: 1;
739
- color: rgb(20 83 45 / var(--tw-text-opacity, 1));
690
+ color: rgb(255 255 255 / var(--tw-text-opacity, 1));
740
691
  }
741
- .opacity-50 {
692
+ .opacity-50{
742
693
  opacity: 0.5;
743
694
  }
744
- .shadow {
695
+ .shadow{
745
696
  --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
746
697
  --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
747
698
  box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
748
699
  }
749
- .outline {
700
+ .outline{
750
701
  outline-style: solid;
751
702
  }
752
- .blur {
703
+ .blur{
753
704
  --tw-blur: blur(8px);
754
705
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
755
706
  }
756
- .drop-shadow {
757
- --tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / 0.1)) drop-shadow(0 1px 1px rgb(0 0 0 / 0.06));
707
+ .grayscale{
708
+ --tw-grayscale: grayscale(100%);
758
709
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
759
710
  }
760
- .filter {
711
+ .filter{
761
712
  filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
762
713
  }
763
- .backdrop-filter {
714
+ .backdrop-filter{
764
715
  backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
765
716
  }
766
- .transition {
717
+ .transition{
767
718
  transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
768
719
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
769
720
  transition-duration: 150ms;
770
721
  }
771
- .ease-in {
722
+ .ease-in{
772
723
  transition-timing-function: cubic-bezier(0.4, 0, 1, 1);
773
724
  }
774
- .ease-in-out {
725
+ .ease-in-out{
775
726
  transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
776
727
  }
777
- .ease-out {
728
+ .ease-out{
778
729
  transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
779
730
  }
780
731
 
@@ -17,6 +17,7 @@ var RequestDeduplicator = class {
17
17
  if (existingRequest) return existingRequest;
18
18
  const requestPromise = requestFactory();
19
19
  this.pendingRequests.set(key, requestPromise);
20
+ requestPromise.catch(() => {});
20
21
  try {
21
22
  const result = await requestPromise;
22
23
  this.pendingRequests.delete(key);
@@ -1 +1 @@
1
- {"version":3,"file":"RequestDeduplicator.js","names":[],"sources":["../../../src/transcoding/cache/RequestDeduplicator.ts"],"sourcesContent":["/**\n * Request deduplication utility\n * Manages pending requests to prevent concurrent duplicate requests\n */\n\nexport class RequestDeduplicator {\n private pendingRequests = new Map<string, Promise<any>>();\n\n /**\n * Execute a request with deduplication\n * If a request with the same key is already pending, return the existing promise\n * Otherwise, execute the request factory and track the promise\n */\n async executeRequest<T>(\n key: string,\n requestFactory: () => Promise<T>,\n ): Promise<T> {\n // Check if there's already a pending request for this key\n const existingRequest = this.pendingRequests.get(key);\n if (existingRequest) {\n return existingRequest;\n }\n\n // Create and track the new request\n const requestPromise = requestFactory();\n this.pendingRequests.set(key, requestPromise);\n\n try {\n const result = await requestPromise;\n this.pendingRequests.delete(key);\n return result;\n } catch (error) {\n this.pendingRequests.delete(key);\n throw error;\n }\n }\n\n /**\n * Clear all pending requests (used in cache clearing)\n */\n clear(): void {\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n getPendingCount(): number {\n return this.pendingRequests.size;\n }\n\n /**\n * Check if a request is pending\n */\n isPending(key: string): boolean {\n return this.pendingRequests.has(key);\n }\n\n /**\n * Get all pending request keys\n */\n getPendingKeys(): string[] {\n return Array.from(this.pendingRequests.keys());\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,sBAAb,MAAiC;;yCACL,IAAI,KAA2B;;;;;;;CAOzD,MAAM,eACJ,KACA,gBACY;EAEZ,MAAM,kBAAkB,KAAK,gBAAgB,IAAI,IAAI;AACrD,MAAI,gBACF,QAAO;EAIT,MAAM,iBAAiB,gBAAgB;AACvC,OAAK,gBAAgB,IAAI,KAAK,eAAe;AAE7C,MAAI;GACF,MAAM,SAAS,MAAM;AACrB,QAAK,gBAAgB,OAAO,IAAI;AAChC,UAAO;WACA,OAAO;AACd,QAAK,gBAAgB,OAAO,IAAI;AAChC,SAAM;;;;;;CAOV,QAAc;AACZ,OAAK,gBAAgB,OAAO;;;;;CAM9B,kBAA0B;AACxB,SAAO,KAAK,gBAAgB;;;;;CAM9B,UAAU,KAAsB;AAC9B,SAAO,KAAK,gBAAgB,IAAI,IAAI;;;;;CAMtC,iBAA2B;AACzB,SAAO,MAAM,KAAK,KAAK,gBAAgB,MAAM,CAAC"}
1
+ {"version":3,"file":"RequestDeduplicator.js","names":[],"sources":["../../../src/transcoding/cache/RequestDeduplicator.ts"],"sourcesContent":["/**\n * Request deduplication utility\n * Manages pending requests to prevent concurrent duplicate requests\n */\n\nexport class RequestDeduplicator {\n private pendingRequests = new Map<string, Promise<any>>();\n\n /**\n * Execute a request with deduplication\n * If a request with the same key is already pending, return the existing promise\n * Otherwise, execute the request factory and track the promise\n */\n async executeRequest<T>(\n key: string,\n requestFactory: () => Promise<T>,\n ): Promise<T> {\n // Check if there's already a pending request for this key\n const existingRequest = this.pendingRequests.get(key);\n if (existingRequest) {\n return existingRequest;\n }\n\n // Create and track the new request\n const requestPromise = requestFactory();\n this.pendingRequests.set(key, requestPromise);\n\n // Prevent unhandled rejection on the raw factory promise. Chrome's V8\n // may detect a rejection as unhandled if no synchronous .catch() is\n // attached before any microtask boundary, even when the promise is\n // currently being await-ed. The error still propagates via the try/catch.\n requestPromise.catch(() => {});\n\n try {\n const result = await requestPromise;\n this.pendingRequests.delete(key);\n return result;\n } catch (error) {\n this.pendingRequests.delete(key);\n throw error;\n }\n }\n\n /**\n * Clear all pending requests (used in cache clearing)\n */\n clear(): void {\n this.pendingRequests.clear();\n }\n\n /**\n * Get number of pending requests\n */\n getPendingCount(): number {\n return this.pendingRequests.size;\n }\n\n /**\n * Check if a request is pending\n */\n isPending(key: string): boolean {\n return this.pendingRequests.has(key);\n }\n\n /**\n * Get all pending request keys\n */\n getPendingKeys(): string[] {\n return Array.from(this.pendingRequests.keys());\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,sBAAb,MAAiC;;yCACL,IAAI,KAA2B;;;;;;;CAOzD,MAAM,eACJ,KACA,gBACY;EAEZ,MAAM,kBAAkB,KAAK,gBAAgB,IAAI,IAAI;AACrD,MAAI,gBACF,QAAO;EAIT,MAAM,iBAAiB,gBAAgB;AACvC,OAAK,gBAAgB,IAAI,KAAK,eAAe;AAM7C,iBAAe,YAAY,GAAG;AAE9B,MAAI;GACF,MAAM,SAAS,MAAM;AACrB,QAAK,gBAAgB,OAAO,IAAI;AAChC,UAAO;WACA,OAAO;AACd,QAAK,gBAAgB,OAAO,IAAI;AAChC,SAAM;;;;;;CAOV,QAAc;AACZ,OAAK,gBAAgB,OAAO;;;;;CAM9B,kBAA0B;AACxB,SAAO,KAAK,gBAAgB;;;;;CAM9B,UAAU,KAAsB;AAC9B,SAAO,KAAK,gBAAgB,IAAI,IAAI;;;;;CAMtC,iBAA2B;AACzB,SAAO,MAAM,KAAK,KAAK,gBAAgB,MAAM,CAAC"}