@editframe/elements 0.37.3-beta → 0.38.1

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 (327) 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 +2 -2
  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 +5 -8
  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 +2 -2
  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 +2 -2
  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 +2 -2
  107. package/dist/gui/EFFocusOverlay.js +3 -3
  108. package/dist/gui/EFFocusOverlay.js.map +1 -1
  109. package/dist/gui/EFOverlayItem.d.ts +2 -2
  110. package/dist/gui/EFOverlayLayer.d.ts +2 -2
  111. package/dist/gui/EFPause.d.ts +2 -2
  112. package/dist/gui/EFPause.js +1 -1
  113. package/dist/gui/EFPlay.d.ts +2 -2
  114. package/dist/gui/EFPlay.js +1 -1
  115. package/dist/gui/EFPreview.js +1 -1
  116. package/dist/gui/EFResizableBox.d.ts +2 -2
  117. package/dist/gui/EFResizableBox.js +5 -5
  118. package/dist/gui/EFResizableBox.js.map +1 -1
  119. package/dist/gui/EFScrubber.d.ts +2 -2
  120. package/dist/gui/EFScrubber.js +8 -13
  121. package/dist/gui/EFScrubber.js.map +1 -1
  122. package/dist/gui/EFTimeDisplay.d.ts +6 -2
  123. package/dist/gui/EFTimeDisplay.js +25 -7
  124. package/dist/gui/EFTimeDisplay.js.map +1 -1
  125. package/dist/gui/EFTimelineRuler.d.ts +2 -2
  126. package/dist/gui/EFTimelineRuler.js +3 -3
  127. package/dist/gui/EFTimelineRuler.js.map +1 -1
  128. package/dist/gui/EFToggleLoop.d.ts +2 -2
  129. package/dist/gui/EFToggleLoop.js +1 -1
  130. package/dist/gui/EFTogglePlay.d.ts +2 -2
  131. package/dist/gui/EFTogglePlay.js +1 -1
  132. package/dist/gui/EFTransformHandles.d.ts +2 -2
  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 +5 -3
  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 +2 -2
  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 +2 -2
  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.d.ts +134 -32
  238. package/dist/preview/renderTimegroupToCanvas.js +321 -146
  239. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  240. package/dist/preview/renderTimegroupToCanvas.types.d.ts +51 -0
  241. package/dist/preview/renderTimegroupToVideo.d.ts +20 -35
  242. package/dist/preview/renderTimegroupToVideo.js +94 -106
  243. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  244. package/dist/preview/renderTimegroupToVideo.types.d.ts +42 -0
  245. package/dist/preview/renderVideoToVideo.js +286 -0
  246. package/dist/preview/renderVideoToVideo.js.map +1 -0
  247. package/dist/preview/renderers.d.ts +56 -0
  248. package/dist/preview/renderers.js +13 -1
  249. package/dist/preview/renderers.js.map +1 -1
  250. package/dist/preview/rendering/ScaleConfig.js +74 -0
  251. package/dist/preview/rendering/ScaleConfig.js.map +1 -0
  252. package/dist/preview/rendering/inlineImages.d.ts +13 -0
  253. package/dist/preview/rendering/inlineImages.js +7 -44
  254. package/dist/preview/rendering/inlineImages.js.map +1 -1
  255. package/dist/preview/rendering/loadImage.d.ts +8 -0
  256. package/dist/preview/rendering/loadImage.js +22 -0
  257. package/dist/preview/rendering/loadImage.js.map +1 -0
  258. package/dist/preview/rendering/renderToImageNative.js +3 -3
  259. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  260. package/dist/preview/rendering/serializeTimelineDirect.js +224 -68
  261. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  262. package/dist/preview/statsTrackingStrategy.js +1 -101
  263. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  264. package/dist/preview/workers/WorkerPool.js +0 -1
  265. package/dist/preview/workers/WorkerPool.js.map +1 -1
  266. package/dist/preview/workers/encoderWorkerInline.js +21 -54
  267. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  268. package/dist/render/EFRenderAPI.d.ts +2 -1
  269. package/dist/render/EFRenderAPI.js +12 -36
  270. package/dist/render/EFRenderAPI.js.map +1 -1
  271. package/dist/render/getRenderData.js +4 -4
  272. package/dist/render/getRenderData.js.map +1 -1
  273. package/dist/style.css +114 -163
  274. package/dist/transcoding/cache/RequestDeduplicator.js +1 -0
  275. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  276. package/dist/transcoding/types/index.d.ts +1 -1
  277. package/dist/transcoding/utils/UrlGenerator.js +10 -3
  278. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  279. package/dist/utils/LRUCache.js +1 -0
  280. package/dist/utils/LRUCache.js.map +1 -1
  281. package/dist/utils/frameTime.js +23 -1
  282. package/dist/utils/frameTime.js.map +1 -1
  283. package/package.json +45 -8
  284. package/scripts/build-css.js +8 -1
  285. package/test/setup.ts +0 -1
  286. package/test/useAssetMSW.ts +50 -0
  287. package/test/visualRegressionUtils.ts +23 -9
  288. package/tsdown.config.ts +6 -1
  289. package/dist/_virtual/rolldown_runtime.js +0 -27
  290. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +0 -1
  291. package/dist/elements/EFThumbnailStrip.d.ts +0 -167
  292. package/dist/elements/EFThumbnailStrip.js +0 -731
  293. package/dist/elements/EFThumbnailStrip.js.map +0 -1
  294. package/dist/elements/SessionThumbnailCache.js +0 -154
  295. package/dist/elements/SessionThumbnailCache.js.map +0 -1
  296. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -688
  297. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
  298. package/dist/node_modules/react/cjs/react.development.js +0 -1521
  299. package/dist/node_modules/react/cjs/react.development.js.map +0 -1
  300. package/dist/node_modules/react/index.js +0 -13
  301. package/dist/node_modules/react/index.js.map +0 -1
  302. package/dist/node_modules/react/jsx-runtime.js +0 -13
  303. package/dist/node_modules/react/jsx-runtime.js.map +0 -1
  304. package/dist/preview/encoding/types.d.ts +0 -1
  305. package/dist/preview/renderTimegroupPreview.js +0 -686
  306. package/dist/preview/renderTimegroupPreview.js.map +0 -1
  307. package/dist/preview/rendering/renderToImage.d.ts +0 -2
  308. package/dist/preview/rendering/renderToImage.js +0 -95
  309. package/dist/preview/rendering/renderToImage.js.map +0 -1
  310. package/dist/preview/rendering/renderToImageForeignObject.js +0 -163
  311. package/dist/preview/rendering/renderToImageForeignObject.js.map +0 -1
  312. package/dist/preview/rendering/renderToImageNative.d.ts +0 -1
  313. package/dist/preview/rendering/svgSerializer.js +0 -43
  314. package/dist/preview/rendering/svgSerializer.js.map +0 -1
  315. package/dist/preview/rendering/types.d.ts +0 -2
  316. package/dist/preview/thumbnailCacheSettings.js +0 -52
  317. package/dist/preview/thumbnailCacheSettings.js.map +0 -1
  318. package/dist/sandbox/PlaybackControls.d.ts +0 -1
  319. package/dist/sandbox/PlaybackControls.js +0 -10
  320. package/dist/sandbox/PlaybackControls.js.map +0 -1
  321. package/dist/sandbox/ScenarioRunner.d.ts +0 -1
  322. package/dist/sandbox/ScenarioRunner.js +0 -1
  323. package/dist/sandbox/defineSandbox.d.ts +0 -1
  324. package/dist/sandbox/index.d.ts +0 -3
  325. package/dist/sandbox/index.js +0 -2
  326. package/test/EFVideo.framegen.browsertest.ts +0 -80
  327. package/test/thumbnail-performance-test.html +0 -116
@@ -0,0 +1,596 @@
1
+ import { quantizeToFrameTimeMs } from "../../../utils/frameTime.js";
2
+ import { TWMixin } from "../../TWMixin2.js";
3
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
4
+ import { TargetController } from "../../../elements/TargetController.js";
5
+ import { EFVideo } from "../../../elements/EFVideo.js";
6
+ import { timelineStateContext } from "../timelineStateContext.js";
7
+ import { ThumbnailExtractor } from "../../../elements/EFMedia/shared/ThumbnailExtractor.js";
8
+ import { generateThumbnailsFromClone } from "../../../preview/renderTimegroupToCanvas.js";
9
+ import { previewSettingsContext } from "../../previewSettingsContext.js";
10
+ import { EFTimegroup } from "../../../elements/EFTimegroup.js";
11
+ import { consume } from "@lit/context";
12
+ import { LitElement, css, html } from "lit";
13
+ import { customElement, property, state } from "lit/decorators.js";
14
+ import { createRef, ref } from "lit/directives/ref.js";
15
+
16
+ //#region src/gui/timeline/tracks/EFThumbnailStrip.ts
17
+ /** Padding for virtual rendering */
18
+ const VIRTUAL_RENDER_PADDING_PX = 100;
19
+ /**
20
+ * Mutable queue for timestamp generation.
21
+ * Allows updating timestamps while generator is consuming them.
22
+ */
23
+ var MutableTimestampQueue = class {
24
+ #timestamps = [];
25
+ /** Replace entire queue with new timestamps (sorted) */
26
+ reset(timestamps) {
27
+ this.#timestamps = [...timestamps].sort((a, b) => a - b);
28
+ }
29
+ /** Keep only these specific timestamps (maintains order) */
30
+ retainOnly(timestamps) {
31
+ const keep = new Set(timestamps);
32
+ this.#timestamps = this.#timestamps.filter((t) => keep.has(t));
33
+ }
34
+ /** Append timestamps to end (sorted) */
35
+ append(timestamps) {
36
+ this.#timestamps.push(...[...timestamps].sort((a, b) => a - b));
37
+ }
38
+ /** Get next timestamp (removes from front) */
39
+ shift() {
40
+ return this.#timestamps.shift();
41
+ }
42
+ /** Get remaining timestamps without modifying queue */
43
+ remaining() {
44
+ return [...this.#timestamps];
45
+ }
46
+ /** Check if queue is empty */
47
+ isEmpty() {
48
+ return this.#timestamps.length === 0;
49
+ }
50
+ };
51
+ let EFThumbnailStrip = class EFThumbnailStrip$1 extends TWMixin(LitElement) {
52
+ constructor(..._args) {
53
+ super(..._args);
54
+ this.target = "";
55
+ this.targetElement = null;
56
+ this.thumbnailHeight = 24;
57
+ this.thumbnailSpacingPx = 48;
58
+ this.pixelsPerMs = null;
59
+ this.useIntrinsicDuration = false;
60
+ this.thumbnailDimensions = {
61
+ width: 0,
62
+ height: 0
63
+ };
64
+ }
65
+ static {
66
+ this.styles = [css`
67
+ :host {
68
+ display: block;
69
+ position: relative;
70
+ width: 100%;
71
+ height: 100%;
72
+ overflow: hidden;
73
+ }
74
+
75
+ .thumbnail-container {
76
+ position: relative;
77
+ width: 100%;
78
+ height: 100%;
79
+ overflow: hidden;
80
+ }
81
+
82
+ .error-message {
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ width: 100%;
87
+ height: 100%;
88
+ padding: 8px;
89
+ color: var(--ef-color-error);
90
+ font-size: 12px;
91
+ background: color-mix(in srgb, var(--ef-color-error) 10%, transparent);
92
+ }
93
+
94
+ canvas {
95
+ position: absolute;
96
+ image-rendering: pixelated;
97
+ image-rendering: crisp-edges;
98
+ }
99
+ `];
100
+ }
101
+ #targetController;
102
+ #abortController = null;
103
+ #renderRequested = false;
104
+ #canvasContainer = createRef();
105
+ #lastRequiredTimestamps = "";
106
+ #thumbnailCache = /* @__PURE__ */ new Map();
107
+ #timegroupQueue = new MutableTimestampQueue();
108
+ #timegroupClone = null;
109
+ #timegroupGenerator = null;
110
+ #timegroupGeneratorAbort = null;
111
+ #previewContainer = null;
112
+ #updateInProgress = false;
113
+ #consumerRunning = false;
114
+ #pendingTimestamps = /* @__PURE__ */ new Set();
115
+ #retryScheduled = false;
116
+ #thumbnailPhase = 0;
117
+ #previousPixelsPerMs = null;
118
+ #targetReadyStateHandler = null;
119
+ #targetContentChangeHandler = null;
120
+ #resizeObserver = null;
121
+ #hostWidth = 0;
122
+ /**
123
+ * Check if target is valid (EFVideo or root EFTimegroup)
124
+ */
125
+ get isValidTarget() {
126
+ const el = this.targetElement;
127
+ if (!el) return false;
128
+ if (el instanceof EFVideo) return true;
129
+ if (el instanceof EFTimegroup) return el.isRootTimegroup === true;
130
+ return false;
131
+ }
132
+ get #timelineState() {
133
+ return this.timelineState;
134
+ }
135
+ get #thumbnailDimensions() {
136
+ return this.thumbnailDimensions;
137
+ }
138
+ get #effectiveDurationMs() {
139
+ const element = this.targetElement;
140
+ if (!element) return 0;
141
+ if (this.useIntrinsicDuration) return element.intrinsicDurationMs ?? element.durationMs ?? 0;
142
+ return element.durationMs ?? 0;
143
+ }
144
+ get #effectivePixelsPerMs() {
145
+ if (this.#timelineState?.pixelsPerMs != null) return this.#timelineState.pixelsPerMs;
146
+ if (this.pixelsPerMs != null) return this.pixelsPerMs;
147
+ const durationMs = this.#effectiveDurationMs;
148
+ if (this.#hostWidth > 0 && durationMs > 0) return this.#hostWidth / durationMs;
149
+ return .04;
150
+ }
151
+ connectedCallback() {
152
+ super.connectedCallback();
153
+ if (this.target && !this.targetElement) this.#targetController = new TargetController(this);
154
+ this.#resizeObserver = new ResizeObserver((entries) => {
155
+ const entry = entries[0];
156
+ if (!entry) return;
157
+ const width = entry.contentRect.width;
158
+ if (width !== this.#hostWidth) {
159
+ this.#hostWidth = width;
160
+ this.requestUpdate();
161
+ this.#scheduleRender();
162
+ }
163
+ });
164
+ this.#resizeObserver.observe(this);
165
+ }
166
+ disconnectedCallback() {
167
+ super.disconnectedCallback();
168
+ this.#abortController?.abort();
169
+ this.#cleanupTimegroupGenerator();
170
+ this.#detachTargetListeners(this.targetElement);
171
+ this.#resizeObserver?.disconnect();
172
+ this.#resizeObserver = null;
173
+ }
174
+ willUpdate(changedProperties) {
175
+ super.willUpdate(changedProperties);
176
+ if (changedProperties.has("target")) {
177
+ if (this.target && !this.targetElement && !this.#targetController) this.#targetController = new TargetController(this);
178
+ }
179
+ if (changedProperties.has("targetElement") || changedProperties.has("thumbnailHeight")) this.thumbnailDimensions = this.#calculateThumbnailDimensions();
180
+ if (changedProperties.has("targetElement")) {
181
+ const oldTarget = changedProperties.get("targetElement");
182
+ this.#detachTargetListeners(oldTarget);
183
+ this.#attachTargetListeners(this.targetElement);
184
+ }
185
+ }
186
+ #attachTargetListeners(target) {
187
+ if (!target) return;
188
+ this.#targetReadyStateHandler = () => {
189
+ this.requestUpdate();
190
+ this.#scheduleRender();
191
+ };
192
+ this.#targetContentChangeHandler = () => {
193
+ this.requestUpdate();
194
+ this.#scheduleRender();
195
+ };
196
+ target.addEventListener("readystatechange", this.#targetReadyStateHandler);
197
+ target.addEventListener("contentchange", this.#targetContentChangeHandler);
198
+ if (target.contentReadyState === "ready") {
199
+ this.requestUpdate();
200
+ this.#scheduleRender();
201
+ }
202
+ }
203
+ #detachTargetListeners(target) {
204
+ if (!target) return;
205
+ if (this.#targetReadyStateHandler) {
206
+ target.removeEventListener("readystatechange", this.#targetReadyStateHandler);
207
+ this.#targetReadyStateHandler = null;
208
+ }
209
+ if (this.#targetContentChangeHandler) {
210
+ target.removeEventListener("contentchange", this.#targetContentChangeHandler);
211
+ this.#targetContentChangeHandler = null;
212
+ }
213
+ }
214
+ updated(changedProperties) {
215
+ super.updated(changedProperties);
216
+ if (changedProperties.has("targetElement") || changedProperties.has("thumbnailSpacingPx") || changedProperties.has("pixelsPerMs") || changedProperties.has("thumbnailHeight") || changedProperties.has("timelineState")) this.#scheduleRender();
217
+ }
218
+ /**
219
+ * Calculate thumbnail dimensions from target element's actual bounds
220
+ */
221
+ #calculateThumbnailDimensions() {
222
+ const el = this.targetElement;
223
+ if (!el) return {
224
+ width: 0,
225
+ height: 0
226
+ };
227
+ const bounds = el.getBoundingClientRect();
228
+ if (bounds.width === 0 || bounds.height === 0) return {
229
+ width: this.thumbnailHeight * (16 / 9),
230
+ height: this.thumbnailHeight
231
+ };
232
+ const aspectRatio = bounds.width / bounds.height;
233
+ return {
234
+ width: Math.round(this.thumbnailHeight * aspectRatio),
235
+ height: this.thumbnailHeight
236
+ };
237
+ }
238
+ /**
239
+ * Calculate visible thumbnails based on viewport
240
+ */
241
+ #calculateVisibleThumbnails() {
242
+ if (!this.isValidTarget) return [];
243
+ const element = this.targetElement;
244
+ if (!element) return [];
245
+ const scrollLeft = this.#timelineState?.viewportScrollLeft ?? 0;
246
+ const viewportWidth = this.#timelineState?.viewportWidth ?? (this.#hostWidth || 800);
247
+ const pixelsPerMs = this.#effectivePixelsPerMs;
248
+ const durationMs = this.#effectiveDurationMs;
249
+ if (durationMs === 0) return [];
250
+ const trackWidthPx = durationMs * pixelsPerMs;
251
+ const fps = element.fps ?? 30;
252
+ const visibleStartPx = scrollLeft - VIRTUAL_RENDER_PADDING_PX;
253
+ const visibleEndPx = scrollLeft + viewportWidth + VIRTUAL_RENDER_PADDING_PX;
254
+ const thumbnails = [];
255
+ const { width, height } = this.#thumbnailDimensions;
256
+ const gapPx = parseFloat(getComputedStyle(this).getPropertyValue("--ef-thumbnail-gap")) || 2;
257
+ const thumbnailStride = Math.max(this.thumbnailSpacingPx, width + gapPx);
258
+ const isZoom = this.#previousPixelsPerMs !== null && this.#previousPixelsPerMs !== pixelsPerMs;
259
+ if (this.#previousPixelsPerMs === null) this.#thumbnailPhase = 0;
260
+ else if (isZoom) this.#thumbnailPhase = scrollLeft % thumbnailStride;
261
+ else if (scrollLeft < thumbnailStride) this.#thumbnailPhase = 0;
262
+ this.#previousPixelsPerMs = pixelsPerMs;
263
+ const startIndex = Math.max(0, Math.floor((visibleStartPx - this.#thumbnailPhase) / thumbnailStride));
264
+ const endIndex = Math.ceil((visibleEndPx - this.#thumbnailPhase) / thumbnailStride);
265
+ for (let i = startIndex; i <= endIndex; i++) {
266
+ const thumbX = this.#thumbnailPhase + i * thumbnailStride;
267
+ if (thumbX >= 0 && thumbX < trackWidthPx) {
268
+ const timeMs = quantizeToFrameTimeMs(thumbX / pixelsPerMs, fps);
269
+ if (timeMs >= 0 && timeMs < durationMs) thumbnails.push({
270
+ timeMs,
271
+ x: thumbX,
272
+ width,
273
+ height
274
+ });
275
+ }
276
+ }
277
+ return thumbnails;
278
+ }
279
+ /**
280
+ * Schedule thumbnail render on next frame
281
+ */
282
+ #scheduleRender() {
283
+ if (this.#renderRequested) return;
284
+ this.#renderRequested = true;
285
+ requestAnimationFrame(() => {
286
+ this.#renderRequested = false;
287
+ this.#renderThumbnails();
288
+ });
289
+ }
290
+ /**
291
+ * Render thumbnails with cancellation support
292
+ */
293
+ async #renderThumbnails() {
294
+ this.#abortController?.abort();
295
+ this.#abortController = new AbortController();
296
+ const signal = this.#abortController.signal;
297
+ const visibleThumbnails = this.#calculateVisibleThumbnails();
298
+ if (visibleThumbnails.length === 0) {
299
+ this.#clearCanvas();
300
+ return;
301
+ }
302
+ const requiredTimestamps = visibleThumbnails.map((t) => t.timeMs);
303
+ const timestampsString = requiredTimestamps.join(", ");
304
+ if (timestampsString !== this.#lastRequiredTimestamps) {
305
+ this.#lastRequiredTimestamps = timestampsString;
306
+ if (this.targetElement instanceof EFVideo) this.#updateVideoCapture(requiredTimestamps, signal).catch((error) => {
307
+ if (error instanceof DOMException && error.name === "AbortError") return;
308
+ console.error("Thumbnail capture error:", error);
309
+ });
310
+ else if (this.targetElement instanceof EFTimegroup) this.#updateTimegroupCapture(requiredTimestamps);
311
+ }
312
+ if (signal.aborted) return;
313
+ const maxNeighborDistanceMs = 3e3;
314
+ const results = visibleThumbnails.map((t) => {
315
+ let canvas = this.#thumbnailCache.get(t.timeMs);
316
+ if (!canvas) {
317
+ let nearestTimeMs = null;
318
+ let minDistance = Infinity;
319
+ for (const cachedTimeMs of this.#thumbnailCache.keys()) {
320
+ const distance = Math.abs(cachedTimeMs - t.timeMs);
321
+ if (distance < minDistance && distance <= maxNeighborDistanceMs) {
322
+ minDistance = distance;
323
+ nearestTimeMs = cachedTimeMs;
324
+ }
325
+ }
326
+ if (nearestTimeMs !== null) canvas = this.#thumbnailCache.get(nearestTimeMs);
327
+ }
328
+ return { canvas: canvas ?? null };
329
+ });
330
+ this.#drawThumbnails(visibleThumbnails, results);
331
+ }
332
+ /**
333
+ * Update video thumbnail capture
334
+ */
335
+ async #updateVideoCapture(timestamps, signal) {
336
+ const video = this.targetElement;
337
+ if (!video) return;
338
+ const uncached = timestamps.filter((t) => !this.#thumbnailCache.has(t));
339
+ if (uncached.length === 0) return;
340
+ const mediaEngineTask = video.mediaEngineTask;
341
+ if (!mediaEngineTask) return;
342
+ const mediaEngine = await mediaEngineTask.taskComplete;
343
+ if (!mediaEngine) return;
344
+ const sourceTimestamps = uncached.map((t) => this.#getSourceTimeMs(t));
345
+ const extractor = new ThumbnailExtractor(mediaEngine);
346
+ const scrubRendition = mediaEngine.videoRendition;
347
+ if (!scrubRendition) return;
348
+ const results = await extractor.extractThumbnails(sourceTimestamps, scrubRendition, video.durationMs ?? 0, signal);
349
+ for (let i = 0; i < uncached.length; i++) {
350
+ const thumbnail = results[i]?.thumbnail;
351
+ const timestamp = uncached[i];
352
+ if (thumbnail && timestamp !== void 0) this.#thumbnailCache.set(timestamp, thumbnail);
353
+ }
354
+ this.#scheduleRender();
355
+ }
356
+ /**
357
+ * Update timegroup thumbnail capture using mutable queue
358
+ */
359
+ async #updateTimegroupCapture(timestamps) {
360
+ const timegroup = this.targetElement;
361
+ if (!timegroup) return;
362
+ const uncached = timestamps.filter((t) => !this.#thumbnailCache.has(t)).sort((a, b) => a - b);
363
+ if (uncached.length === 0) return;
364
+ if (this.#updateInProgress) {
365
+ this.#pendingTimestamps.clear();
366
+ uncached.forEach((t) => this.#pendingTimestamps.add(t));
367
+ if (!this.#retryScheduled) {
368
+ this.#retryScheduled = true;
369
+ requestAnimationFrame(() => {
370
+ this.#retryScheduled = false;
371
+ if (this.#pendingTimestamps.size > 0) {
372
+ const pending = Array.from(this.#pendingTimestamps);
373
+ this.#pendingTimestamps.clear();
374
+ this.#updateTimegroupCapture(pending);
375
+ }
376
+ });
377
+ }
378
+ return;
379
+ }
380
+ this.#updateInProgress = true;
381
+ try {
382
+ if (this.#timegroupGenerator) {
383
+ this.#timegroupGeneratorAbort?.abort();
384
+ this.#timegroupGeneratorAbort = new AbortController();
385
+ this.#timegroupQueue.reset(uncached);
386
+ } else if (this.#timegroupClone) {
387
+ this.#timegroupQueue.reset(uncached);
388
+ this.#timegroupGeneratorAbort = new AbortController();
389
+ this.#timegroupGenerator = generateThumbnailsFromClone(this.#timegroupClone.clone, this.#previewContainer, this.#timegroupQueue, {
390
+ scale: .25,
391
+ contentReadyMode: "blocking",
392
+ blockingTimeoutMs: 1e3,
393
+ signal: this.#timegroupGeneratorAbort.signal
394
+ });
395
+ await this.#consumeTimegroupGenerator();
396
+ } else await this.#startTimegroupGenerator(timegroup, uncached);
397
+ } finally {
398
+ this.#updateInProgress = false;
399
+ if (this.#pendingTimestamps.size > 0 && !this.#retryScheduled) {
400
+ this.#retryScheduled = true;
401
+ requestAnimationFrame(() => {
402
+ this.#retryScheduled = false;
403
+ if (this.#pendingTimestamps.size > 0) {
404
+ const pending = Array.from(this.#pendingTimestamps);
405
+ this.#pendingTimestamps.clear();
406
+ this.#updateTimegroupCapture(pending);
407
+ }
408
+ });
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * Start timegroup thumbnail generator
414
+ */
415
+ async #startTimegroupGenerator(timegroup, timestamps) {
416
+ this.#timegroupClone = await timegroup.createRenderClone();
417
+ this.#previewContainer = this.#timegroupClone.container;
418
+ await this.#timegroupClone.clone.updateComplete;
419
+ const litElements = this.#previewContainer.querySelectorAll("*");
420
+ const updatePromises = [];
421
+ for (const el of litElements) if ("updateComplete" in el) updatePromises.push(el.updateComplete);
422
+ await Promise.all(updatePromises);
423
+ const textSegments = this.#previewContainer.querySelectorAll("ef-text-segment");
424
+ const textUpdatePromises = [];
425
+ for (const seg of textSegments) if ("updateComplete" in seg) textUpdatePromises.push(seg.updateComplete);
426
+ await Promise.all(textUpdatePromises);
427
+ await new Promise((resolve) => requestAnimationFrame(resolve));
428
+ if (!this.#timegroupClone) return;
429
+ if (timestamps.length > 0) await this.#timegroupClone.clone.seekForRender(timestamps[0]);
430
+ await document.fonts.ready;
431
+ const images = this.#previewContainer.querySelectorAll("img");
432
+ const imagePromises = [];
433
+ for (const img of images) if (!img.complete) imagePromises.push(new Promise((resolve, _reject) => {
434
+ img.onload = () => resolve();
435
+ img.onerror = () => resolve();
436
+ setTimeout(() => resolve(), 5e3);
437
+ }));
438
+ await Promise.all(imagePromises);
439
+ if (!this.#timegroupClone) return;
440
+ this.#timegroupQueue.reset(timestamps);
441
+ this.#timegroupGeneratorAbort = new AbortController();
442
+ this.#timegroupGenerator = generateThumbnailsFromClone(this.#timegroupClone.clone, this.#previewContainer, this.#timegroupQueue, {
443
+ scale: .25,
444
+ contentReadyMode: "blocking",
445
+ blockingTimeoutMs: 1e3,
446
+ signal: this.#timegroupGeneratorAbort.signal
447
+ });
448
+ await this.#consumeTimegroupGenerator();
449
+ }
450
+ /**
451
+ * Consume generator and handle cleanup
452
+ */
453
+ async #consumeTimegroupGenerator() {
454
+ if (this.#consumerRunning) return;
455
+ this.#consumerRunning = true;
456
+ if (!this.#timegroupGenerator) {
457
+ this.#consumerRunning = false;
458
+ return;
459
+ }
460
+ try {
461
+ for await (const { timeMs, canvas } of this.#timegroupGenerator) {
462
+ this.#thumbnailCache.set(timeMs, canvas);
463
+ this.#scheduleRender();
464
+ }
465
+ } catch (err) {
466
+ console.warn("Timegroup thumbnail generation error:", err);
467
+ } finally {
468
+ this.#timegroupGenerator = null;
469
+ this.#consumerRunning = false;
470
+ }
471
+ }
472
+ /**
473
+ * Cleanup timegroup generator and clone
474
+ */
475
+ #cleanupTimegroupGenerator() {
476
+ this.#timegroupGeneratorAbort?.abort();
477
+ this.#timegroupGeneratorAbort = null;
478
+ this.#timegroupGenerator = null;
479
+ if (this.#previewContainer) {
480
+ this.#previewContainer.remove();
481
+ this.#previewContainer = null;
482
+ }
483
+ if (this.#timegroupClone) {
484
+ this.#timegroupClone.cleanup();
485
+ this.#timegroupClone = null;
486
+ }
487
+ }
488
+ /**
489
+ * Clear all canvas elements
490
+ */
491
+ #clearCanvas() {
492
+ const container = this.#canvasContainer.value;
493
+ if (container) container.innerHTML = "";
494
+ }
495
+ /**
496
+ * Translate composition time to source time for videos (handles trim)
497
+ */
498
+ #getSourceTimeMs(compositionTimeMs) {
499
+ if (this.useIntrinsicDuration) return compositionTimeMs;
500
+ const el = this.targetElement;
501
+ if (el instanceof EFVideo) return compositionTimeMs + (el.sourceStartMs ?? 0);
502
+ return compositionTimeMs;
503
+ }
504
+ /**
505
+ * Draw thumbnails to canvas elements
506
+ */
507
+ #drawThumbnails(thumbnails, results) {
508
+ const container = this.#canvasContainer.value;
509
+ if (!container) return;
510
+ container.innerHTML = "";
511
+ for (let i = 0; i < thumbnails.length; i++) {
512
+ const thumbnail = thumbnails[i];
513
+ const result = results[i];
514
+ if (!thumbnail) continue;
515
+ const canvas = document.createElement("canvas");
516
+ canvas.width = thumbnail.width;
517
+ canvas.height = thumbnail.height;
518
+ canvas.style.left = `${thumbnail.x}px`;
519
+ canvas.style.top = "0";
520
+ canvas.style.width = `${thumbnail.width}px`;
521
+ canvas.style.height = `${thumbnail.height}px`;
522
+ const ctx = canvas.getContext("2d");
523
+ if (!ctx) continue;
524
+ if (result?.canvas) {
525
+ ctx.drawImage(result.canvas, 0, 0, thumbnail.width, thumbnail.height);
526
+ if (this.previewSettings?.showThumbnailTimestamps) {
527
+ ctx.fillStyle = "rgba(0, 0, 0, 0.8)";
528
+ ctx.fillRect(2, 2, 95, 16);
529
+ ctx.fillStyle = "yellow";
530
+ ctx.font = "11px monospace";
531
+ ctx.textAlign = "left";
532
+ ctx.textBaseline = "top";
533
+ ctx.fillText(`${Math.round(thumbnail.timeMs)}ms`, 5, 4);
534
+ }
535
+ } else {
536
+ ctx.fillStyle = getComputedStyle(this).getPropertyValue("--ef-color-bg-inset").trim() || "rgba(100, 100, 100, 0.3)";
537
+ ctx.fillRect(0, 0, thumbnail.width, thumbnail.height);
538
+ ctx.strokeStyle = getComputedStyle(this).getPropertyValue("--ef-color-border-subtle").trim() || "rgba(150, 150, 150, 0.5)";
539
+ ctx.lineWidth = 1;
540
+ ctx.strokeRect(0, 0, thumbnail.width, thumbnail.height);
541
+ ctx.fillStyle = "white";
542
+ ctx.font = "10px monospace";
543
+ ctx.textAlign = "center";
544
+ ctx.textBaseline = "middle";
545
+ ctx.fillText(`${Math.round(thumbnail.timeMs)}ms`, thumbnail.width / 2, thumbnail.height / 2);
546
+ }
547
+ container.appendChild(canvas);
548
+ }
549
+ }
550
+ render() {
551
+ if (!this.target && !this.targetElement) return html`<div class="error-message">No target specified</div>`;
552
+ if (this.target && !this.targetElement) return html`<div class="error-message">
553
+ Target element "${this.target}" not found
554
+ </div>`;
555
+ if (!this.isValidTarget) return html`<div class="error-message">
556
+ Invalid target: "${this.targetElement.tagName?.toLowerCase() || "unknown"}" must be ef-video or root ef-timegroup
557
+ </div>`;
558
+ return html`<div
559
+ class="thumbnail-container"
560
+ style="max-width: ${this.#effectiveDurationMs * this.#effectivePixelsPerMs}px;"
561
+ ${ref(this.#canvasContainer)}
562
+ ></div>`;
563
+ }
564
+ };
565
+ __decorate([property({ type: String })], EFThumbnailStrip.prototype, "target", void 0);
566
+ __decorate([property({ attribute: false })], EFThumbnailStrip.prototype, "targetElement", void 0);
567
+ __decorate([property({
568
+ type: Number,
569
+ attribute: "thumbnail-height"
570
+ })], EFThumbnailStrip.prototype, "thumbnailHeight", void 0);
571
+ __decorate([property({
572
+ type: Number,
573
+ attribute: "thumbnail-spacing-px"
574
+ })], EFThumbnailStrip.prototype, "thumbnailSpacingPx", void 0);
575
+ __decorate([property({
576
+ type: Number,
577
+ attribute: "pixels-per-ms"
578
+ })], EFThumbnailStrip.prototype, "pixelsPerMs", void 0);
579
+ __decorate([property({
580
+ type: Boolean,
581
+ attribute: "use-intrinsic-duration"
582
+ })], EFThumbnailStrip.prototype, "useIntrinsicDuration", void 0);
583
+ __decorate([consume({
584
+ context: timelineStateContext,
585
+ subscribe: true
586
+ }), state()], EFThumbnailStrip.prototype, "timelineState", void 0);
587
+ __decorate([consume({
588
+ context: previewSettingsContext,
589
+ subscribe: true
590
+ }), state()], EFThumbnailStrip.prototype, "previewSettings", void 0);
591
+ __decorate([state()], EFThumbnailStrip.prototype, "thumbnailDimensions", void 0);
592
+ EFThumbnailStrip = __decorate([customElement("ef-thumbnail-strip")], EFThumbnailStrip);
593
+
594
+ //#endregion
595
+ export { EFThumbnailStrip };
596
+ //# sourceMappingURL=EFThumbnailStrip.js.map