@editframe/elements 0.30.1-beta.0 → 0.31.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 (325) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +5 -0
  2. package/dist/EF_FRAMEGEN.js +20 -4
  3. package/dist/EF_FRAMEGEN.js.map +1 -1
  4. package/dist/EF_INTERACTIVE.js.map +1 -1
  5. package/dist/_virtual/rolldown_runtime.js +27 -0
  6. package/dist/canvas/EFCanvas.d.ts +311 -0
  7. package/dist/canvas/EFCanvas.js +1089 -0
  8. package/dist/canvas/EFCanvas.js.map +1 -0
  9. package/dist/canvas/EFCanvasItem.d.ts +55 -0
  10. package/dist/canvas/EFCanvasItem.js +72 -0
  11. package/dist/canvas/EFCanvasItem.js.map +1 -0
  12. package/dist/canvas/api/CanvasAPI.d.ts +115 -0
  13. package/dist/canvas/api/CanvasAPI.js +182 -0
  14. package/dist/canvas/api/CanvasAPI.js.map +1 -0
  15. package/dist/canvas/api/types.d.ts +42 -0
  16. package/dist/canvas/coordinateTransform.js +90 -0
  17. package/dist/canvas/coordinateTransform.js.map +1 -0
  18. package/dist/canvas/getElementBounds.js +40 -0
  19. package/dist/canvas/getElementBounds.js.map +1 -0
  20. package/dist/canvas/overlays/SelectionOverlay.js +265 -0
  21. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -0
  22. package/dist/canvas/overlays/overlayState.js +153 -0
  23. package/dist/canvas/overlays/overlayState.js.map +1 -0
  24. package/dist/canvas/selection/SelectionController.js +105 -0
  25. package/dist/canvas/selection/SelectionController.js.map +1 -0
  26. package/dist/canvas/selection/SelectionModel.d.ts +98 -0
  27. package/dist/canvas/selection/SelectionModel.js +229 -0
  28. package/dist/canvas/selection/SelectionModel.js.map +1 -0
  29. package/dist/canvas/selection/selectionContext.d.ts +31 -0
  30. package/dist/canvas/selection/selectionContext.js +12 -0
  31. package/dist/canvas/selection/selectionContext.js.map +1 -0
  32. package/dist/elements/ContainerInfo.d.ts +29 -0
  33. package/dist/elements/ContainerInfo.js +30 -0
  34. package/dist/elements/ContainerInfo.js.map +1 -0
  35. package/dist/elements/EFAudio.d.ts +13 -3
  36. package/dist/elements/EFAudio.js +64 -10
  37. package/dist/elements/EFAudio.js.map +1 -1
  38. package/dist/elements/EFCaptions.d.ts +18 -16
  39. package/dist/elements/EFCaptions.js +110 -19
  40. package/dist/elements/EFCaptions.js.map +1 -1
  41. package/dist/elements/EFImage.d.ts +16 -6
  42. package/dist/elements/EFImage.js +79 -9
  43. package/dist/elements/EFImage.js.map +1 -1
  44. package/dist/elements/EFMedia/AssetIdMediaEngine.js +51 -4
  45. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -1
  46. package/dist/elements/EFMedia/AssetMediaEngine.js +125 -52
  47. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
  48. package/dist/elements/EFMedia/BaseMediaEngine.js +24 -6
  49. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
  50. package/dist/elements/EFMedia/JitMediaEngine.js +12 -8
  51. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
  52. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +46 -7
  53. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -1
  54. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +98 -73
  55. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -1
  56. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +28 -5
  57. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -1
  58. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +18 -6
  59. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -1
  60. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +8 -2
  61. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -1
  62. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +31 -6
  63. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -1
  64. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +28 -5
  65. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -1
  66. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +97 -72
  67. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -1
  68. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -1
  69. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  70. package/dist/elements/EFMedia/shared/BufferUtils.js +1 -1
  71. package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -1
  72. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +25 -14
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  74. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +47 -16
  75. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -1
  76. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +37 -19
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  78. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +65 -21
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  80. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +8 -3
  81. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -1
  82. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +32 -9
  83. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -1
  84. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +33 -10
  85. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -1
  86. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +23 -8
  87. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -1
  88. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +34 -10
  89. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -1
  90. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +31 -8
  91. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -1
  92. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +31 -114
  93. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -1
  94. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +44 -8
  95. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -1
  96. package/dist/elements/EFMedia.d.ts +18 -7
  97. package/dist/elements/EFMedia.js +23 -3
  98. package/dist/elements/EFMedia.js.map +1 -1
  99. package/dist/elements/EFPanZoom.d.ts +96 -0
  100. package/dist/elements/EFPanZoom.js +290 -0
  101. package/dist/elements/EFPanZoom.js.map +1 -0
  102. package/dist/elements/EFSourceMixin.js +7 -6
  103. package/dist/elements/EFSourceMixin.js.map +1 -1
  104. package/dist/elements/EFSurface.d.ts +6 -6
  105. package/dist/elements/EFSurface.js +7 -2
  106. package/dist/elements/EFSurface.js.map +1 -1
  107. package/dist/elements/EFTemporal.d.ts +2 -1
  108. package/dist/elements/EFTemporal.js +192 -71
  109. package/dist/elements/EFTemporal.js.map +1 -1
  110. package/dist/elements/EFText.d.ts +5 -4
  111. package/dist/elements/EFText.js +102 -13
  112. package/dist/elements/EFText.js.map +1 -1
  113. package/dist/elements/EFTextSegment.d.ts +32 -6
  114. package/dist/elements/EFTextSegment.js +53 -15
  115. package/dist/elements/EFTextSegment.js.map +1 -1
  116. package/dist/elements/EFThumbnailStrip.d.ts +118 -56
  117. package/dist/elements/EFThumbnailStrip.js +522 -358
  118. package/dist/elements/EFThumbnailStrip.js.map +1 -1
  119. package/dist/elements/EFTimegroup.d.ts +223 -27
  120. package/dist/elements/EFTimegroup.js +851 -148
  121. package/dist/elements/EFTimegroup.js.map +1 -1
  122. package/dist/elements/EFVideo.d.ts +42 -5
  123. package/dist/elements/EFVideo.js +165 -11
  124. package/dist/elements/EFVideo.js.map +1 -1
  125. package/dist/elements/EFWaveform.d.ts +6 -6
  126. package/dist/elements/EFWaveform.js +2 -1
  127. package/dist/elements/EFWaveform.js.map +1 -1
  128. package/dist/elements/ElementPositionInfo.d.ts +35 -0
  129. package/dist/elements/ElementPositionInfo.js +49 -0
  130. package/dist/elements/ElementPositionInfo.js.map +1 -0
  131. package/dist/elements/FetchMixin.js +16 -1
  132. package/dist/elements/FetchMixin.js.map +1 -1
  133. package/dist/elements/SessionThumbnailCache.js +152 -0
  134. package/dist/elements/SessionThumbnailCache.js.map +1 -0
  135. package/dist/elements/TargetController.js +3 -1
  136. package/dist/elements/TargetController.js.map +1 -1
  137. package/dist/elements/TimegroupController.js +9 -3
  138. package/dist/elements/TimegroupController.js.map +1 -1
  139. package/dist/elements/findRootTemporal.js +30 -0
  140. package/dist/elements/findRootTemporal.js.map +1 -0
  141. package/dist/elements/renderTemporalAudio.js +18 -5
  142. package/dist/elements/renderTemporalAudio.js.map +1 -1
  143. package/dist/elements/updateAnimations.js +492 -109
  144. package/dist/elements/updateAnimations.js.map +1 -1
  145. package/dist/getRenderInfo.d.ts +2 -2
  146. package/dist/gui/ContextMixin.js +4 -2
  147. package/dist/gui/ContextMixin.js.map +1 -1
  148. package/dist/gui/Controllable.js +74 -1
  149. package/dist/gui/Controllable.js.map +1 -1
  150. package/dist/gui/EFActiveRootTemporal.d.ts +50 -0
  151. package/dist/gui/EFActiveRootTemporal.js +94 -0
  152. package/dist/gui/EFActiveRootTemporal.js.map +1 -0
  153. package/dist/gui/EFConfiguration.d.ts +11 -5
  154. package/dist/gui/EFConfiguration.js.map +1 -1
  155. package/dist/gui/EFControls.d.ts +2 -2
  156. package/dist/gui/EFControls.js +109 -13
  157. package/dist/gui/EFControls.js.map +1 -1
  158. package/dist/gui/EFDial.d.ts +4 -4
  159. package/dist/gui/EFFilmstrip.d.ts +11 -214
  160. package/dist/gui/EFFilmstrip.js +53 -1152
  161. package/dist/gui/EFFilmstrip.js.map +1 -1
  162. package/dist/gui/EFFitScale.d.ts +3 -3
  163. package/dist/gui/EFFitScale.js +39 -12
  164. package/dist/gui/EFFitScale.js.map +1 -1
  165. package/dist/gui/EFFocusOverlay.d.ts +4 -4
  166. package/dist/gui/EFOverlayItem.d.ts +48 -0
  167. package/dist/gui/EFOverlayItem.js +97 -0
  168. package/dist/gui/EFOverlayItem.js.map +1 -0
  169. package/dist/gui/EFOverlayLayer.d.ts +70 -0
  170. package/dist/gui/EFOverlayLayer.js +104 -0
  171. package/dist/gui/EFOverlayLayer.js.map +1 -0
  172. package/dist/gui/EFPause.d.ts +4 -4
  173. package/dist/gui/EFPlay.d.ts +4 -4
  174. package/dist/gui/EFPreview.d.ts +4 -4
  175. package/dist/gui/EFResizableBox.d.ts +12 -16
  176. package/dist/gui/EFResizableBox.js +109 -451
  177. package/dist/gui/EFResizableBox.js.map +1 -1
  178. package/dist/gui/EFScrubber.d.ts +30 -5
  179. package/dist/gui/EFScrubber.js +224 -31
  180. package/dist/gui/EFScrubber.js.map +1 -1
  181. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  182. package/dist/gui/EFTimeDisplay.js +4 -1
  183. package/dist/gui/EFTimeDisplay.js.map +1 -1
  184. package/dist/gui/EFTimelineRuler.d.ts +71 -0
  185. package/dist/gui/EFTimelineRuler.js +320 -0
  186. package/dist/gui/EFTimelineRuler.js.map +1 -0
  187. package/dist/gui/EFToggleLoop.d.ts +4 -4
  188. package/dist/gui/EFTogglePlay.d.ts +4 -4
  189. package/dist/gui/EFTransformHandles.d.ts +91 -0
  190. package/dist/gui/EFTransformHandles.js +393 -0
  191. package/dist/gui/EFTransformHandles.js.map +1 -0
  192. package/dist/gui/EFWorkbench.d.ts +182 -4
  193. package/dist/gui/EFWorkbench.js +2067 -22
  194. package/dist/gui/EFWorkbench.js.map +1 -1
  195. package/dist/gui/FitScaleHelpers.d.ts +31 -0
  196. package/dist/gui/FitScaleHelpers.js +41 -0
  197. package/dist/gui/FitScaleHelpers.js.map +1 -0
  198. package/dist/gui/PlaybackController.d.ts +2 -1
  199. package/dist/gui/PlaybackController.js +46 -15
  200. package/dist/gui/PlaybackController.js.map +1 -1
  201. package/dist/gui/TWMixin.js +1 -1
  202. package/dist/gui/TWMixin.js.map +1 -1
  203. package/dist/gui/hierarchy/EFHierarchy.d.ts +65 -0
  204. package/dist/gui/hierarchy/EFHierarchy.js +338 -0
  205. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -0
  206. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +118 -0
  207. package/dist/gui/hierarchy/EFHierarchyItem.js +551 -0
  208. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -0
  209. package/dist/gui/hierarchy/hierarchyContext.d.ts +38 -0
  210. package/dist/gui/hierarchy/hierarchyContext.js +8 -0
  211. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -0
  212. package/dist/gui/icons.js +34 -0
  213. package/dist/gui/icons.js.map +1 -0
  214. package/dist/gui/panZoomTransformContext.js +12 -0
  215. package/dist/gui/panZoomTransformContext.js.map +1 -0
  216. package/dist/gui/previewSettingsContext.js +12 -0
  217. package/dist/gui/previewSettingsContext.js.map +1 -0
  218. package/dist/gui/timeline/EFTimeline.d.ts +270 -0
  219. package/dist/gui/timeline/EFTimeline.js +1369 -0
  220. package/dist/gui/timeline/EFTimeline.js.map +1 -0
  221. package/dist/gui/timeline/EFTimelineRow.js +374 -0
  222. package/dist/gui/timeline/EFTimelineRow.js.map +1 -0
  223. package/dist/gui/timeline/TrimHandles.d.ts +36 -0
  224. package/dist/gui/timeline/TrimHandles.js +204 -0
  225. package/dist/gui/timeline/TrimHandles.js.map +1 -0
  226. package/dist/gui/timeline/flattenHierarchy.js +31 -0
  227. package/dist/gui/timeline/flattenHierarchy.js.map +1 -0
  228. package/dist/gui/timeline/timelineStateContext.d.ts +26 -0
  229. package/dist/gui/timeline/timelineStateContext.js +42 -0
  230. package/dist/gui/timeline/timelineStateContext.js.map +1 -0
  231. package/dist/gui/timeline/tracks/AudioTrack.js +264 -0
  232. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -0
  233. package/dist/gui/timeline/tracks/CaptionsTrack.js +595 -0
  234. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -0
  235. package/dist/gui/timeline/tracks/HTMLTrack.js +19 -0
  236. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -0
  237. package/dist/gui/timeline/tracks/ImageTrack.js +53 -0
  238. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -0
  239. package/dist/gui/timeline/tracks/TextTrack.js +250 -0
  240. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -0
  241. package/dist/gui/timeline/tracks/TimegroupTrack.js +143 -0
  242. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -0
  243. package/dist/gui/timeline/tracks/TrackItem.js +269 -0
  244. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -0
  245. package/dist/gui/timeline/tracks/VideoTrack.js +265 -0
  246. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -0
  247. package/dist/gui/timeline/tracks/WaveformTrack.js +19 -0
  248. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -0
  249. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -0
  250. package/dist/gui/timeline/tracks/preloadTracks.js +9 -0
  251. package/dist/gui/timeline/tracks/renderTrackChildren.js +119 -0
  252. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -0
  253. package/dist/gui/timeline/tracks/waveformUtils.js +80 -0
  254. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -0
  255. package/dist/gui/transformCalculations.js +217 -0
  256. package/dist/gui/transformCalculations.js.map +1 -0
  257. package/dist/gui/transformUtils.d.ts +37 -0
  258. package/dist/gui/transformUtils.js +77 -0
  259. package/dist/gui/transformUtils.js.map +1 -0
  260. package/dist/gui/tree/EFTree.d.ts +59 -0
  261. package/dist/gui/tree/EFTree.js +174 -0
  262. package/dist/gui/tree/EFTree.js.map +1 -0
  263. package/dist/gui/tree/EFTreeItem.d.ts +38 -0
  264. package/dist/gui/tree/EFTreeItem.js +146 -0
  265. package/dist/gui/tree/EFTreeItem.js.map +1 -0
  266. package/dist/gui/tree/treeContext.d.ts +60 -0
  267. package/dist/gui/tree/treeContext.js +23 -0
  268. package/dist/gui/tree/treeContext.js.map +1 -0
  269. package/dist/index.d.ts +32 -8
  270. package/dist/index.js +30 -6
  271. package/dist/index.js.map +1 -1
  272. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +688 -0
  273. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
  274. package/dist/node_modules/react/cjs/react.development.js +1521 -0
  275. package/dist/node_modules/react/cjs/react.development.js.map +1 -0
  276. package/dist/node_modules/react/index.js +13 -0
  277. package/dist/node_modules/react/index.js.map +1 -0
  278. package/dist/node_modules/react/jsx-runtime.js +13 -0
  279. package/dist/node_modules/react/jsx-runtime.js.map +1 -0
  280. package/dist/preview/AdaptiveResolutionTracker.js +228 -0
  281. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -0
  282. package/dist/preview/RenderProfiler.js +135 -0
  283. package/dist/preview/RenderProfiler.js.map +1 -0
  284. package/dist/preview/previewSettings.js +131 -0
  285. package/dist/preview/previewSettings.js.map +1 -0
  286. package/dist/preview/previewTypes.js +64 -0
  287. package/dist/preview/previewTypes.js.map +1 -0
  288. package/dist/preview/renderTimegroupPreview.js +656 -0
  289. package/dist/preview/renderTimegroupPreview.js.map +1 -0
  290. package/dist/preview/renderTimegroupToCanvas.d.ts +37 -0
  291. package/dist/preview/renderTimegroupToCanvas.js +840 -0
  292. package/dist/preview/renderTimegroupToCanvas.js.map +1 -0
  293. package/dist/preview/renderTimegroupToVideo.d.ts +39 -0
  294. package/dist/preview/renderTimegroupToVideo.js +274 -0
  295. package/dist/preview/renderTimegroupToVideo.js.map +1 -0
  296. package/dist/preview/renderers.js +16 -0
  297. package/dist/preview/renderers.js.map +1 -0
  298. package/dist/preview/statsTrackingStrategy.js +201 -0
  299. package/dist/preview/statsTrackingStrategy.js.map +1 -0
  300. package/dist/preview/thumbnailCacheSettings.js +52 -0
  301. package/dist/preview/thumbnailCacheSettings.js.map +1 -0
  302. package/dist/preview/workers/WorkerPool.js +178 -0
  303. package/dist/preview/workers/WorkerPool.js.map +1 -0
  304. package/dist/sandbox/PlaybackControls.js +10 -0
  305. package/dist/sandbox/PlaybackControls.js.map +1 -0
  306. package/dist/sandbox/ScenarioRunner.js +1 -0
  307. package/dist/sandbox/index.js +2 -0
  308. package/dist/style.css +66 -69
  309. package/dist/transcoding/types/index.d.ts +2 -1
  310. package/dist/transcoding/utils/UrlGenerator.d.ts +6 -1
  311. package/dist/transcoding/utils/UrlGenerator.js +12 -3
  312. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  313. package/dist/utils/LRUCache.js +1 -375
  314. package/dist/utils/LRUCache.js.map +1 -1
  315. package/dist/utils/frameTime.js +14 -0
  316. package/dist/utils/frameTime.js.map +1 -0
  317. package/package.json +3 -3
  318. package/test/profilingPlugin.ts +223 -0
  319. package/test/recordReplayProxyPlugin.js +22 -27
  320. package/test/thumbnail-performance-test.html +116 -0
  321. package/test/visualRegressionUtils.ts +286 -0
  322. package/types.json +1 -1
  323. package/dist/elements/TimegroupController.d.ts +0 -18
  324. package/dist/msToTimeCode.js +0 -17
  325. package/dist/msToTimeCode.js.map +0 -1
@@ -0,0 +1,656 @@
1
+ import { getTemporalBounds, isTemporal, isVisibleAtTime } from "./previewTypes.js";
2
+
3
+ //#region src/preview/renderTimegroupPreview.ts
4
+ /**
5
+ * Elements to skip entirely when building the preview.
6
+ */
7
+ const SKIP_TAGS = new Set([
8
+ "EF-AUDIO",
9
+ "EF-THUMBNAIL-STRIP",
10
+ "EF-FILMSTRIP",
11
+ "EF-TIMELINE",
12
+ "EF-WORKBENCH",
13
+ "SCRIPT",
14
+ "STYLE"
15
+ ]);
16
+ /**
17
+ * All CSS properties to sync (camelCase for style[] access).
18
+ */
19
+ const SYNC_PROPERTIES = [
20
+ "display",
21
+ "visibility",
22
+ "opacity",
23
+ "position",
24
+ "top",
25
+ "right",
26
+ "bottom",
27
+ "left",
28
+ "zIndex",
29
+ "width",
30
+ "height",
31
+ "minWidth",
32
+ "minHeight",
33
+ "maxWidth",
34
+ "maxHeight",
35
+ "flex",
36
+ "flexFlow",
37
+ "justifyContent",
38
+ "alignItems",
39
+ "alignContent",
40
+ "alignSelf",
41
+ "gap",
42
+ "gridTemplate",
43
+ "gridColumn",
44
+ "gridRow",
45
+ "gridArea",
46
+ "margin",
47
+ "padding",
48
+ "boxSizing",
49
+ "border",
50
+ "borderTop",
51
+ "borderRight",
52
+ "borderBottom",
53
+ "borderLeft",
54
+ "borderRadius",
55
+ "background",
56
+ "color",
57
+ "boxShadow",
58
+ "filter",
59
+ "backdropFilter",
60
+ "clipPath",
61
+ "font",
62
+ "textAlign",
63
+ "textDecoration",
64
+ "textTransform",
65
+ "letterSpacing",
66
+ "whiteSpace",
67
+ "textOverflow",
68
+ "lineHeight",
69
+ "transform",
70
+ "transformOrigin",
71
+ "transformStyle",
72
+ "perspective",
73
+ "perspectiveOrigin",
74
+ "backfaceVisibility",
75
+ "cursor",
76
+ "pointerEvents",
77
+ "userSelect",
78
+ "overflow"
79
+ ];
80
+ /** Set version of SYNC_PROPERTIES for O(1) validation lookups */
81
+ const SYNC_PROPERTIES_SET = new Set(SYNC_PROPERTIES);
82
+ /**
83
+ * Validation state for property change detection.
84
+ * Reset via resetPropertyValidation() at start of export.
85
+ */
86
+ let _propertyValidationEnabled = false;
87
+ let _validationFrameCount = 0;
88
+ let _baselineSnapshot = null;
89
+ /**
90
+ * Kebab-case versions for computedStyleMap.get() - pre-computed for speed.
91
+ */
92
+ const SYNC_PROPERTIES_KEBAB = SYNC_PROPERTIES.map((prop) => prop.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`));
93
+ /**
94
+ * Feature detection: computedStyleMap is ~15% faster for style syncing.
95
+ */
96
+ const HAS_COMPUTED_STYLE_MAP = typeof Element !== "undefined" && typeof Element.prototype.computedStyleMap === "function";
97
+ /**
98
+ * CSS initial/default values for SAFE-TO-SKIP properties.
99
+ * Only includes NON-INHERITED properties where skipping the default
100
+ * won't affect visual output.
101
+ *
102
+ * EXCLUDED (must always serialize):
103
+ * - Inherited properties (color, font, text-*, visibility, cursor)
104
+ * - Display (affects layout significantly)
105
+ * - Properties where "auto" computes to a specific value
106
+ *
107
+ * INCLUDED (safe to skip):
108
+ * - Transform/filter effects (none = no effect)
109
+ * - Box shadows (none = no shadow)
110
+ * - Borders when none/0 (no visual impact)
111
+ * - backdrop-filter (none = no effect)
112
+ */
113
+ const CSS_SAFE_DEFAULT_VALUES = {
114
+ transform: "none",
115
+ filter: "none",
116
+ backdropFilter: "none",
117
+ boxShadow: "none",
118
+ border: [
119
+ "none",
120
+ "0px none",
121
+ "0px",
122
+ "0px none rgb(0, 0, 0)"
123
+ ],
124
+ borderTop: [
125
+ "none",
126
+ "0px none",
127
+ "0px",
128
+ "0px none rgb(0, 0, 0)"
129
+ ],
130
+ borderRight: [
131
+ "none",
132
+ "0px none",
133
+ "0px",
134
+ "0px none rgb(0, 0, 0)"
135
+ ],
136
+ borderBottom: [
137
+ "none",
138
+ "0px none",
139
+ "0px",
140
+ "0px none rgb(0, 0, 0)"
141
+ ],
142
+ borderLeft: [
143
+ "none",
144
+ "0px none",
145
+ "0px",
146
+ "0px none rgb(0, 0, 0)"
147
+ ],
148
+ borderRadius: ["0px", "0"],
149
+ position: "static",
150
+ zIndex: "auto",
151
+ transformStyle: "flat",
152
+ perspective: "none",
153
+ backfaceVisibility: "visible"
154
+ };
155
+ /**
156
+ * Check if a value matches a safe-to-skip default.
157
+ */
158
+ function isDefaultValue(prop, value) {
159
+ const defaults = CSS_SAFE_DEFAULT_VALUES[prop];
160
+ if (!defaults) return false;
161
+ if (Array.isArray(defaults)) return defaults.includes(value);
162
+ return defaults === value;
163
+ }
164
+ /**
165
+ * Build clone tree structure with minimal overhead.
166
+ * Optionally syncs styles in the same pass if timeMs is provided.
167
+ */
168
+ function buildCloneStructure(source, timeMs) {
169
+ const container = document.createElement("div");
170
+ container.style.cssText = "position:absolute;top:0;left:0;width:100%;height:100%";
171
+ const legacyPairs = [];
172
+ function cloneElement(srcEl) {
173
+ if (SKIP_TAGS.has(srcEl.tagName)) return null;
174
+ if (srcEl instanceof SVGElement) {
175
+ const node$1 = {
176
+ source: srcEl,
177
+ clone: srcEl.cloneNode(true),
178
+ children: [],
179
+ isCanvasClone: false,
180
+ styleCache: /* @__PURE__ */ new Map()
181
+ };
182
+ legacyPairs.push([srcEl, node$1.clone]);
183
+ return node$1;
184
+ }
185
+ if (srcEl instanceof HTMLCanvasElement) {
186
+ const canvas = document.createElement("canvas");
187
+ canvas.width = srcEl.width;
188
+ canvas.height = srcEl.height;
189
+ const ctx = canvas.getContext("2d");
190
+ if (ctx) try {
191
+ ctx.drawImage(srcEl, 0, 0);
192
+ } catch {}
193
+ }
194
+ const isCustom = srcEl.tagName.includes("-");
195
+ if (isCustom && srcEl.shadowRoot) {
196
+ const shadowCanvas = srcEl.shadowRoot.querySelector("canvas");
197
+ if (shadowCanvas) {
198
+ const clone$1 = document.createElement("canvas");
199
+ clone$1.width = shadowCanvas.width || srcEl.clientWidth;
200
+ clone$1.height = shadowCanvas.height || srcEl.clientHeight;
201
+ if (srcEl.tagName === "EF-IMAGE" || srcEl.tagName === "EF-WAVEFORM") clone$1.dataset.preserveAlpha = "true";
202
+ const ctx = clone$1.getContext("2d");
203
+ if (ctx) try {
204
+ ctx.drawImage(shadowCanvas, 0, 0);
205
+ } catch {}
206
+ try {
207
+ const canvasCs = getComputedStyle(shadowCanvas);
208
+ const hostCs = getComputedStyle(srcEl);
209
+ clone$1.style.position = hostCs.position;
210
+ clone$1.style.top = hostCs.top;
211
+ clone$1.style.right = hostCs.right;
212
+ clone$1.style.bottom = hostCs.bottom;
213
+ clone$1.style.left = hostCs.left;
214
+ clone$1.style.margin = hostCs.margin;
215
+ clone$1.style.zIndex = hostCs.zIndex;
216
+ clone$1.style.transform = hostCs.transform;
217
+ clone$1.style.transformOrigin = hostCs.transformOrigin;
218
+ clone$1.style.opacity = hostCs.opacity;
219
+ clone$1.style.visibility = hostCs.visibility;
220
+ clone$1.style.width = canvasCs.width;
221
+ clone$1.style.height = canvasCs.height;
222
+ clone$1.style.display = "block";
223
+ clone$1.style.animation = "none";
224
+ clone$1.style.transition = "none";
225
+ } catch {}
226
+ const node$1 = {
227
+ source: srcEl,
228
+ clone: clone$1,
229
+ children: [],
230
+ isCanvasClone: true,
231
+ styleCache: /* @__PURE__ */ new Map()
232
+ };
233
+ legacyPairs.push([srcEl, clone$1]);
234
+ return node$1;
235
+ }
236
+ const shadowImg = srcEl.shadowRoot.querySelector("img");
237
+ if (shadowImg?.complete && shadowImg.naturalWidth > 0) {
238
+ const clone$1 = document.createElement("canvas");
239
+ clone$1.width = shadowImg.naturalWidth;
240
+ clone$1.height = shadowImg.naturalHeight;
241
+ clone$1.dataset.preserveAlpha = "true";
242
+ const ctx = clone$1.getContext("2d");
243
+ if (ctx) try {
244
+ ctx.drawImage(shadowImg, 0, 0);
245
+ } catch {}
246
+ try {
247
+ const imgCs = getComputedStyle(shadowImg);
248
+ const hostCs = getComputedStyle(srcEl);
249
+ clone$1.style.position = hostCs.position;
250
+ clone$1.style.top = hostCs.top;
251
+ clone$1.style.right = hostCs.right;
252
+ clone$1.style.bottom = hostCs.bottom;
253
+ clone$1.style.left = hostCs.left;
254
+ clone$1.style.margin = hostCs.margin;
255
+ clone$1.style.zIndex = hostCs.zIndex;
256
+ clone$1.style.transform = hostCs.transform;
257
+ clone$1.style.transformOrigin = hostCs.transformOrigin;
258
+ clone$1.style.opacity = hostCs.opacity;
259
+ clone$1.style.visibility = hostCs.visibility;
260
+ clone$1.style.width = imgCs.width;
261
+ clone$1.style.height = imgCs.height;
262
+ clone$1.style.display = "block";
263
+ clone$1.style.animation = "none";
264
+ clone$1.style.transition = "none";
265
+ } catch {}
266
+ const node$1 = {
267
+ source: srcEl,
268
+ clone: clone$1,
269
+ children: [],
270
+ isCanvasClone: true,
271
+ styleCache: /* @__PURE__ */ new Map()
272
+ };
273
+ legacyPairs.push([srcEl, clone$1]);
274
+ return node$1;
275
+ }
276
+ }
277
+ const clone = document.createElement(isCustom ? "div" : srcEl.tagName.toLowerCase());
278
+ for (const attr of srcEl.attributes) {
279
+ const name = attr.name.toLowerCase();
280
+ if (name === "id" || name.startsWith("on")) continue;
281
+ if (isCustom && name !== "class" && !name.startsWith("data-")) continue;
282
+ try {
283
+ clone.setAttribute(attr.name, attr.value);
284
+ } catch {}
285
+ }
286
+ if (srcEl instanceof HTMLImageElement && srcEl.src) clone.src = srcEl.src;
287
+ if (srcEl instanceof HTMLInputElement) clone.value = srcEl.value;
288
+ const node = {
289
+ source: srcEl,
290
+ clone,
291
+ children: [],
292
+ isCanvasClone: false,
293
+ styleCache: /* @__PURE__ */ new Map()
294
+ };
295
+ legacyPairs.push([srcEl, clone]);
296
+ if (srcEl.shadowRoot) {
297
+ const isCaptionElement = srcEl.tagName === "EF-CAPTIONS-ACTIVE-WORD" || srcEl.tagName === "EF-CAPTIONS-BEFORE-ACTIVE-WORD" || srcEl.tagName === "EF-CAPTIONS-AFTER-ACTIVE-WORD" || srcEl.tagName === "EF-CAPTIONS-SEGMENT";
298
+ const isTextSegment = srcEl.tagName === "EF-TEXT-SEGMENT";
299
+ let hasTextNode = false;
300
+ for (const child of srcEl.shadowRoot.childNodes) if (child.nodeType === Node.TEXT_NODE) {
301
+ if (child.textContent?.trim() || isCaptionElement || isTextSegment) {
302
+ clone.appendChild(document.createTextNode(child.textContent || ""));
303
+ hasTextNode = true;
304
+ }
305
+ } else if (child.nodeType === Node.ELEMENT_NODE) {
306
+ const el = child;
307
+ if (el.tagName === "STYLE" || el.tagName === "SLOT") continue;
308
+ const childNode = cloneElement(el);
309
+ if (childNode) {
310
+ node.children.push(childNode);
311
+ clone.appendChild(childNode.clone);
312
+ }
313
+ }
314
+ if (isCaptionElement && !hasTextNode) clone.appendChild(document.createTextNode(""));
315
+ }
316
+ for (const child of srcEl.childNodes) if (child.nodeType === Node.TEXT_NODE) {
317
+ const text = child.textContent?.trim();
318
+ if (text) clone.appendChild(document.createTextNode(text));
319
+ } else if (child.nodeType === Node.ELEMENT_NODE) {
320
+ const childNode = cloneElement(child);
321
+ if (childNode) {
322
+ node.children.push(childNode);
323
+ clone.appendChild(childNode.clone);
324
+ }
325
+ }
326
+ return node;
327
+ }
328
+ const root = cloneElement(source);
329
+ if (root) container.appendChild(root.clone);
330
+ const syncState = {
331
+ tree: { root },
332
+ nodeCount: legacyPairs.length
333
+ };
334
+ if (timeMs !== void 0 && root) syncNodeRecursive(root, timeMs);
335
+ return {
336
+ container,
337
+ pairs: legacyPairs,
338
+ syncState
339
+ };
340
+ }
341
+ /**
342
+ * Sync a single node's styles (extracted for reuse).
343
+ */
344
+ function syncNodeStyles(node) {
345
+ const { source, clone, isCanvasClone } = node;
346
+ if (isCanvasClone) {
347
+ const canvas = clone;
348
+ const shadowCanvas = source.shadowRoot?.querySelector("canvas");
349
+ const shadowImg = source.shadowRoot?.querySelector("img");
350
+ if (shadowCanvas) {
351
+ if (canvas.width !== shadowCanvas.width) canvas.width = shadowCanvas.width;
352
+ if (canvas.height !== shadowCanvas.height) canvas.height = shadowCanvas.height;
353
+ const ctx = canvas.getContext("2d");
354
+ if (ctx && shadowCanvas.width > 0 && shadowCanvas.height > 0) try {
355
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
356
+ ctx.drawImage(shadowCanvas, 0, 0);
357
+ } catch (e) {
358
+ console.warn("[syncNodeStyles] Canvas draw failed:", e);
359
+ }
360
+ try {
361
+ const canvasCs = getComputedStyle(shadowCanvas);
362
+ const hostCs = getComputedStyle(source);
363
+ const s = canvas.style;
364
+ const srcWidth = canvasCs.width;
365
+ const srcHeight = canvasCs.height;
366
+ const srcPosition = hostCs.position;
367
+ const srcTop = hostCs.top;
368
+ const srcLeft = hostCs.left;
369
+ const srcRight = hostCs.right;
370
+ const srcBottom = hostCs.bottom;
371
+ const srcMargin = hostCs.margin;
372
+ const srcTransform = hostCs.transform;
373
+ const srcTransformOrigin = hostCs.transformOrigin;
374
+ const srcOpacity = hostCs.opacity;
375
+ const srcVisibility = hostCs.visibility;
376
+ const srcZIndex = hostCs.zIndex;
377
+ const srcBackfaceVisibility = hostCs.backfaceVisibility;
378
+ const srcTransformStyle = hostCs.transformStyle;
379
+ if (s.position !== srcPosition) s.position = srcPosition;
380
+ if (s.top !== srcTop) s.top = srcTop;
381
+ if (s.left !== srcLeft) s.left = srcLeft;
382
+ if (s.right !== srcRight) s.right = srcRight;
383
+ if (s.bottom !== srcBottom) s.bottom = srcBottom;
384
+ if (s.margin !== srcMargin) s.margin = srcMargin;
385
+ if (s.transform !== srcTransform) s.transform = srcTransform;
386
+ if (s.transformOrigin !== srcTransformOrigin) s.transformOrigin = srcTransformOrigin;
387
+ if (s.opacity !== srcOpacity) s.opacity = srcOpacity;
388
+ if (s.visibility !== srcVisibility) s.visibility = srcVisibility;
389
+ if (s.zIndex !== srcZIndex) s.zIndex = srcZIndex;
390
+ if (s.width !== srcWidth) s.width = srcWidth;
391
+ if (s.height !== srcHeight) s.height = srcHeight;
392
+ if (s.backfaceVisibility !== srcBackfaceVisibility) s.backfaceVisibility = srcBackfaceVisibility;
393
+ if (s.transformStyle !== srcTransformStyle) s.transformStyle = srcTransformStyle;
394
+ } catch {}
395
+ } else if (shadowImg?.complete && shadowImg.naturalWidth > 0) {
396
+ if (canvas.width !== shadowImg.naturalWidth) canvas.width = shadowImg.naturalWidth;
397
+ if (canvas.height !== shadowImg.naturalHeight) canvas.height = shadowImg.naturalHeight;
398
+ const ctx = canvas.getContext("2d");
399
+ if (ctx) {
400
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
401
+ try {
402
+ ctx.drawImage(shadowImg, 0, 0);
403
+ } catch {}
404
+ }
405
+ try {
406
+ const imgCs = getComputedStyle(shadowImg);
407
+ const hostCs = getComputedStyle(source);
408
+ const s = canvas.style;
409
+ const srcWidth = imgCs.width;
410
+ const srcHeight = imgCs.height;
411
+ const srcPosition = hostCs.position;
412
+ const srcTop = hostCs.top;
413
+ const srcLeft = hostCs.left;
414
+ const srcRight = hostCs.right;
415
+ const srcBottom = hostCs.bottom;
416
+ const srcMargin = hostCs.margin;
417
+ const srcTransform = hostCs.transform;
418
+ const srcTransformOrigin = hostCs.transformOrigin;
419
+ const srcOpacity = hostCs.opacity;
420
+ const srcVisibility = hostCs.visibility;
421
+ const srcZIndex = hostCs.zIndex;
422
+ const srcBackfaceVisibility = hostCs.backfaceVisibility;
423
+ const srcTransformStyle = hostCs.transformStyle;
424
+ if (s.position !== srcPosition) s.position = srcPosition;
425
+ if (s.top !== srcTop) s.top = srcTop;
426
+ if (s.left !== srcLeft) s.left = srcLeft;
427
+ if (s.right !== srcRight) s.right = srcRight;
428
+ if (s.bottom !== srcBottom) s.bottom = srcBottom;
429
+ if (s.margin !== srcMargin) s.margin = srcMargin;
430
+ if (s.transform !== srcTransform) s.transform = srcTransform;
431
+ if (s.transformOrigin !== srcTransformOrigin) s.transformOrigin = srcTransformOrigin;
432
+ if (s.opacity !== srcOpacity) s.opacity = srcOpacity;
433
+ if (s.visibility !== srcVisibility) s.visibility = srcVisibility;
434
+ if (s.zIndex !== srcZIndex) s.zIndex = srcZIndex;
435
+ if (s.width !== srcWidth) s.width = srcWidth;
436
+ if (s.height !== srcHeight) s.height = srcHeight;
437
+ if (s.backfaceVisibility !== srcBackfaceVisibility) s.backfaceVisibility = srcBackfaceVisibility;
438
+ if (s.transformStyle !== srcTransformStyle) s.transformStyle = srcTransformStyle;
439
+ } catch {}
440
+ }
441
+ }
442
+ const cloneStyle = clone.style;
443
+ const { styleCache } = node;
444
+ const propLen = SYNC_PROPERTIES.length;
445
+ if (HAS_COMPUTED_STYLE_MAP) {
446
+ let srcMap;
447
+ try {
448
+ srcMap = source.computedStyleMap();
449
+ } catch {
450
+ return;
451
+ }
452
+ for (let j = 0; j < propLen; j++) {
453
+ const kebab = SYNC_PROPERTIES_KEBAB[j];
454
+ const camel = SYNC_PROPERTIES[j];
455
+ const srcVal = srcMap.get(kebab);
456
+ if (!srcVal) continue;
457
+ const strVal = srcVal.toString();
458
+ if (styleCache.get(camel) === strVal) continue;
459
+ styleCache.set(camel, strVal);
460
+ if (camel === "display") {
461
+ cloneStyle.display = strVal === "none" ? "block" : strVal;
462
+ continue;
463
+ }
464
+ if (camel === "clipPath") continue;
465
+ if (isDefaultValue(camel, strVal)) {
466
+ if (cloneStyle[camel]) cloneStyle[camel] = "";
467
+ continue;
468
+ }
469
+ cloneStyle[camel] = strVal;
470
+ }
471
+ } else {
472
+ let cs;
473
+ try {
474
+ cs = getComputedStyle(source);
475
+ } catch {
476
+ return;
477
+ }
478
+ const srcStyle = cs;
479
+ for (const prop of SYNC_PROPERTIES) {
480
+ const srcVal = srcStyle[prop];
481
+ if (styleCache.get(prop) === srcVal) continue;
482
+ styleCache.set(prop, srcVal);
483
+ if (prop === "display") {
484
+ cloneStyle.display = srcVal === "none" ? "block" : srcVal;
485
+ continue;
486
+ }
487
+ if (prop === "clipPath") continue;
488
+ if (isDefaultValue(prop, srcVal)) {
489
+ if (cloneStyle[prop]) cloneStyle[prop] = "";
490
+ continue;
491
+ }
492
+ cloneStyle[prop] = srcVal;
493
+ }
494
+ }
495
+ if (cloneStyle.animation !== "none") cloneStyle.animation = "none";
496
+ if (cloneStyle.transition !== "none") cloneStyle.transition = "none";
497
+ const srcTextNode = source.childNodes[0];
498
+ const cloneTextNode = clone.childNodes[0];
499
+ if (srcTextNode?.nodeType === Node.TEXT_NODE && cloneTextNode?.nodeType === Node.TEXT_NODE) {
500
+ const srcText = srcTextNode.textContent || "";
501
+ if (cloneTextNode.textContent !== srcText) cloneTextNode.textContent = srcText;
502
+ }
503
+ const tagName = source.tagName;
504
+ if (tagName && (tagName === "EF-CAPTIONS-ACTIVE-WORD" || tagName === "EF-CAPTIONS-BEFORE-ACTIVE-WORD" || tagName === "EF-CAPTIONS-AFTER-ACTIVE-WORD" || tagName === "EF-CAPTIONS-SEGMENT")) {
505
+ const srcShadowRoot = source.shadowRoot;
506
+ if (srcShadowRoot && !srcTextNode) {
507
+ let srcShadowText = "";
508
+ for (const srcChild of srcShadowRoot.childNodes) if (srcChild.nodeType === Node.TEXT_NODE) srcShadowText += srcChild.textContent || "";
509
+ let cloneTextNode$1 = null;
510
+ for (const cloneChild of clone.childNodes) if (cloneChild.nodeType === Node.TEXT_NODE) {
511
+ cloneTextNode$1 = cloneChild;
512
+ break;
513
+ }
514
+ if (!cloneTextNode$1) {
515
+ cloneTextNode$1 = document.createTextNode(srcShadowText);
516
+ clone.appendChild(cloneTextNode$1);
517
+ } else if (cloneTextNode$1.textContent !== srcShadowText) cloneTextNode$1.textContent = srcShadowText;
518
+ }
519
+ }
520
+ if (source instanceof HTMLInputElement) {
521
+ const srcVal = source.value;
522
+ const cloneInput = clone;
523
+ if (cloneInput.value !== srcVal) {
524
+ cloneInput.value = srcVal;
525
+ cloneInput.setAttribute("value", srcVal);
526
+ }
527
+ }
528
+ }
529
+ /**
530
+ * Recursively sync a node and its children.
531
+ * Returns early if the node is temporally culled, skipping ALL descendants.
532
+ */
533
+ function syncNodeRecursive(node, timeMs) {
534
+ const { source, clone, children, isCanvasClone, styleCache } = node;
535
+ if (!isCanvasClone) {
536
+ const { startMs, endMs } = getTemporalBounds(source);
537
+ if (timeMs < startMs || timeMs > endMs) {
538
+ clone.style.display = "none";
539
+ styleCache.delete("display");
540
+ return;
541
+ }
542
+ }
543
+ syncNodeStyles(node);
544
+ for (const child of children) syncNodeRecursive(child, timeMs);
545
+ }
546
+ /**
547
+ * Sync all CSS properties from source elements to their clones.
548
+ * Uses recursive tree traversal with early bailout for temporal culling.
549
+ */
550
+ function syncStyles(state, timeMs) {
551
+ if (state.tree.root) syncNodeRecursive(state.tree.root, timeMs);
552
+ if (_propertyValidationEnabled) validatePropertyChanges(state);
553
+ }
554
+ /**
555
+ * Captures a snapshot of all CSS properties for all source elements.
556
+ */
557
+ function capturePropertySnapshot(state) {
558
+ const snapshot = /* @__PURE__ */ new Map();
559
+ function captureNode(node) {
560
+ const props = /* @__PURE__ */ new Map();
561
+ try {
562
+ const cs = getComputedStyle(node.source);
563
+ for (const prop of SYNC_PROPERTIES) props.set(prop, cs[prop] ?? "");
564
+ } catch {}
565
+ snapshot.set(node.source, props);
566
+ for (const child of node.children) captureNode(child);
567
+ }
568
+ if (state.tree.root) captureNode(state.tree.root);
569
+ return snapshot;
570
+ }
571
+ /**
572
+ * Validates that only expected properties have changed since baseline.
573
+ * Throws if any unexpected property changed.
574
+ */
575
+ function validatePropertyChanges(state) {
576
+ _validationFrameCount++;
577
+ if (_baselineSnapshot === null) {
578
+ _baselineSnapshot = capturePropertySnapshot(state);
579
+ return;
580
+ }
581
+ if (_validationFrameCount % 30 !== 0) return;
582
+ const currentSnapshot = capturePropertySnapshot(state);
583
+ const violations = [];
584
+ for (const [element, baselineProps] of _baselineSnapshot) {
585
+ const currentProps = currentSnapshot.get(element);
586
+ if (!currentProps) continue;
587
+ for (const [prop, baselineValue] of baselineProps) {
588
+ const currentValue = currentProps.get(prop) ?? "";
589
+ if (baselineValue === currentValue) continue;
590
+ if (!SYNC_PROPERTIES_SET.has(prop)) {
591
+ const elementId = element.id || element.tagName;
592
+ violations.push(`[${elementId}] ${prop}: "${baselineValue}" → "${currentValue}"`);
593
+ }
594
+ }
595
+ }
596
+ if (violations.length > 0) {
597
+ const message = [
598
+ `\n⚠️ UNEXPECTED PROPERTY CHANGES at frame ${_validationFrameCount}:`,
599
+ `Properties not in SYNC_PROPERTIES changed during export.`,
600
+ ``,
601
+ `Violations (${violations.length}):`,
602
+ ...violations.slice(0, 20).map((v) => ` ${v}`),
603
+ violations.length > 20 ? ` ... and ${violations.length - 20} more` : ""
604
+ ].join("\n");
605
+ throw new Error(message);
606
+ }
607
+ }
608
+ /**
609
+ * Collect document styles for shadow DOM injection.
610
+ */
611
+ function collectDocumentStyles() {
612
+ const rules = [];
613
+ try {
614
+ for (const sheet of document.styleSheets) try {
615
+ if (sheet.cssRules) for (const rule of sheet.cssRules) rules.push(rule.cssText);
616
+ } catch {}
617
+ } catch {}
618
+ return rules.join("\n");
619
+ }
620
+ /**
621
+ * Override clip-path, opacity, and optionally transform on the root clone element.
622
+ * The source may have these properties set for proxy mode or workbench scaling.
623
+ *
624
+ * @param syncState - The sync state containing the clone tree
625
+ * @param fullReset - If true, also resets opacity and transform (for capture operations)
626
+ */
627
+ function overrideRootCloneStyles(syncState, fullReset = false) {
628
+ const rootClone = syncState.tree.root?.clone;
629
+ if (!rootClone) return;
630
+ rootClone.style.clipPath = "none";
631
+ if (fullReset) {
632
+ rootClone.style.opacity = "1";
633
+ rootClone.style.transform = "none";
634
+ }
635
+ }
636
+ /**
637
+ * Create a live preview of a timegroup with a refresh function.
638
+ * Used by EFWorkbench for the "computed" preview mode.
639
+ *
640
+ * @param source - The source timegroup to preview
641
+ * @returns Object with preview container and refresh function
642
+ */
643
+ function renderTimegroupPreview(source) {
644
+ const { container, syncState } = buildCloneStructure(source);
645
+ syncStyles(syncState, 0);
646
+ return {
647
+ container,
648
+ refresh: (timeMs) => {
649
+ syncStyles(syncState, timeMs ?? 0);
650
+ }
651
+ };
652
+ }
653
+
654
+ //#endregion
655
+ export { buildCloneStructure, collectDocumentStyles, overrideRootCloneStyles, renderTimegroupPreview, syncStyles };
656
+ //# sourceMappingURL=renderTimegroupPreview.js.map