@editframe/elements 0.47.1 → 0.48.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 (406) hide show
  1. package/LICENSE.md +58 -0
  2. package/dist/DelayedLoadingState.js +1 -1
  3. package/dist/DelayedLoadingState.js.map +1 -1
  4. package/dist/EF_FRAMEGEN.js +1 -2
  5. package/dist/EF_FRAMEGEN.js.map +1 -1
  6. package/dist/EF_RENDERING.js +1 -1
  7. package/dist/EF_RENDERING.js.map +1 -1
  8. package/dist/_virtual/{_@oxc-project_runtime@0.95.0 → _@oxc-project_runtime@0.122.0}/helpers/decorate.js +2 -3
  9. package/dist/attachContextRoot.js +1 -2
  10. package/dist/attachContextRoot.js.map +1 -1
  11. package/dist/canvas/EFCanvas.d.ts +4 -7
  12. package/dist/canvas/EFCanvas.js +20 -21
  13. package/dist/canvas/EFCanvas.js.map +1 -1
  14. package/dist/canvas/EFCanvasItem.d.ts +4 -5
  15. package/dist/canvas/EFCanvasItem.js +3 -4
  16. package/dist/canvas/EFCanvasItem.js.map +1 -1
  17. package/dist/canvas/api/CanvasAPI.d.ts +0 -1
  18. package/dist/canvas/api/CanvasAPI.js +1 -1
  19. package/dist/canvas/api/CanvasAPI.js.map +1 -1
  20. package/dist/canvas/coordinateTransform.js +1 -1
  21. package/dist/canvas/coordinateTransform.js.map +1 -1
  22. package/dist/canvas/getElementBounds.js +1 -1
  23. package/dist/canvas/getElementBounds.js.map +1 -1
  24. package/dist/canvas/overlays/SelectionOverlay.d.ts +4 -4
  25. package/dist/canvas/overlays/SelectionOverlay.js +6 -7
  26. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
  27. package/dist/canvas/overlays/overlayState.js +1 -2
  28. package/dist/canvas/overlays/overlayState.js.map +1 -1
  29. package/dist/canvas/selection/SelectionController.js +1 -2
  30. package/dist/canvas/selection/SelectionController.js.map +1 -1
  31. package/dist/canvas/selection/SelectionModel.d.ts +0 -1
  32. package/dist/canvas/selection/SelectionModel.js +1 -1
  33. package/dist/canvas/selection/SelectionModel.js.map +1 -1
  34. package/dist/canvas/selection/selectionContext.d.ts +0 -1
  35. package/dist/canvas/selection/selectionContext.js +1 -2
  36. package/dist/canvas/selection/selectionContext.js.map +1 -1
  37. package/dist/elements/ContainerInfo.js +1 -1
  38. package/dist/elements/ContainerInfo.js.map +1 -1
  39. package/dist/elements/CrossUpdateController.js +1 -1
  40. package/dist/elements/CrossUpdateController.js.map +1 -1
  41. package/dist/elements/EFAudio.d.ts +4 -4
  42. package/dist/elements/EFAudio.js +4 -6
  43. package/dist/elements/EFAudio.js.map +1 -1
  44. package/dist/elements/EFCaptions.d.ts +4 -4
  45. package/dist/elements/EFCaptions.js +8 -10
  46. package/dist/elements/EFCaptions.js.map +1 -1
  47. package/dist/elements/EFImage.d.ts +7 -7
  48. package/dist/elements/EFImage.js +4 -6
  49. package/dist/elements/EFImage.js.map +1 -1
  50. package/dist/elements/EFMedia/BufferedSeekingInput.d.ts +2 -2
  51. package/dist/elements/EFMedia/BufferedSeekingInput.js +14 -11
  52. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
  53. package/dist/elements/EFMedia/CachedFetcher.js +1 -2
  54. package/dist/elements/EFMedia/CachedFetcher.js.map +1 -1
  55. package/dist/elements/EFMedia/MediaEngine.d.ts +0 -2
  56. package/dist/elements/EFMedia/MediaEngine.js +1 -2
  57. package/dist/elements/EFMedia/MediaEngine.js.map +1 -1
  58. package/dist/elements/EFMedia/SegmentIndex.d.ts +2 -3
  59. package/dist/elements/EFMedia/SegmentIndex.js +10 -3
  60. package/dist/elements/EFMedia/SegmentIndex.js.map +1 -1
  61. package/dist/elements/EFMedia/SegmentTransport.d.ts +0 -2
  62. package/dist/elements/EFMedia/SegmentTransport.js +1 -1
  63. package/dist/elements/EFMedia/SegmentTransport.js.map +1 -1
  64. package/dist/elements/EFMedia/TimingModel.d.ts +0 -2
  65. package/dist/elements/EFMedia/TimingModel.js +1 -1
  66. package/dist/elements/EFMedia/TimingModel.js.map +1 -1
  67. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +1 -1
  68. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  69. package/dist/elements/EFMedia/shared/GlobalInputCache.js +1 -2
  70. package/dist/elements/EFMedia/shared/GlobalInputCache.js.map +1 -1
  71. package/dist/elements/EFMedia/shared/PrecisionUtils.js +1 -1
  72. package/dist/elements/EFMedia/shared/PrecisionUtils.js.map +1 -1
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +1 -2
  74. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  75. package/dist/elements/EFMedia/shared/timeoutUtils.js +1 -2
  76. package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -1
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
  78. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.d.ts +0 -1
  80. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +12 -12
  81. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  82. package/dist/elements/EFMedia.d.ts +3 -3
  83. package/dist/elements/EFMedia.js +3 -4
  84. package/dist/elements/EFMedia.js.map +1 -1
  85. package/dist/elements/EFMotionBlur.d.ts +0 -1
  86. package/dist/elements/EFMotionBlur.js +8 -15
  87. package/dist/elements/EFMotionBlur.js.map +1 -1
  88. package/dist/elements/EFPanZoom.d.ts +4 -4
  89. package/dist/elements/EFPanZoom.js +3 -4
  90. package/dist/elements/EFPanZoom.js.map +1 -1
  91. package/dist/elements/EFSourceMixin.js +2 -3
  92. package/dist/elements/EFSourceMixin.js.map +1 -1
  93. package/dist/elements/EFSurface.d.ts +6 -6
  94. package/dist/elements/EFSurface.js +3 -4
  95. package/dist/elements/EFSurface.js.map +1 -1
  96. package/dist/elements/EFTemporal.d.ts +0 -1
  97. package/dist/elements/EFTemporal.js +6 -7
  98. package/dist/elements/EFTemporal.js.map +1 -1
  99. package/dist/elements/EFText.d.ts +4 -4
  100. package/dist/elements/EFText.js +6 -7
  101. package/dist/elements/EFText.js.map +1 -1
  102. package/dist/elements/EFTextSegment.d.ts +4 -4
  103. package/dist/elements/EFTextSegment.js +3 -4
  104. package/dist/elements/EFTextSegment.js.map +1 -1
  105. package/dist/elements/EFTimegroup.d.ts +4 -10
  106. package/dist/elements/EFTimegroup.js +11 -12
  107. package/dist/elements/EFTimegroup.js.map +1 -1
  108. package/dist/elements/EFVideo.d.ts +35 -8
  109. package/dist/elements/EFVideo.js +57 -12
  110. package/dist/elements/EFVideo.js.map +1 -1
  111. package/dist/elements/EFWaveform.d.ts +4 -4
  112. package/dist/elements/EFWaveform.js +4 -6
  113. package/dist/elements/EFWaveform.js.map +1 -1
  114. package/dist/elements/ElementPositionInfo.js +1 -1
  115. package/dist/elements/ElementPositionInfo.js.map +1 -1
  116. package/dist/elements/FetchMixin.js +1 -1
  117. package/dist/elements/FetchMixin.js.map +1 -1
  118. package/dist/elements/SampleBuffer.js +1 -2
  119. package/dist/elements/SampleBuffer.js.map +1 -1
  120. package/dist/elements/TargetController.d.ts +0 -1
  121. package/dist/elements/TargetController.js +1 -1
  122. package/dist/elements/TargetController.js.map +1 -1
  123. package/dist/elements/TimegroupController.js +1 -1
  124. package/dist/elements/TimegroupController.js.map +1 -1
  125. package/dist/elements/cloneFactoryRegistry.js +1 -1
  126. package/dist/elements/cloneFactoryRegistry.js.map +1 -1
  127. package/dist/elements/durationConverter.js +4 -5
  128. package/dist/elements/durationConverter.js.map +1 -1
  129. package/dist/elements/easingUtils.js +1 -1
  130. package/dist/elements/easingUtils.js.map +1 -1
  131. package/dist/elements/findRootTemporal.js +1 -2
  132. package/dist/elements/findRootTemporal.js.map +1 -1
  133. package/dist/elements/parseTimeToMs.js +1 -1
  134. package/dist/elements/parseTimeToMs.js.map +1 -1
  135. package/dist/elements/renderTemporalAudio.js +1 -2
  136. package/dist/elements/renderTemporalAudio.js.map +1 -1
  137. package/dist/elements/setupTemporalHierarchy.js +1 -1
  138. package/dist/elements/setupTemporalHierarchy.js.map +1 -1
  139. package/dist/elements/updateAnimations.js +1 -2
  140. package/dist/elements/updateAnimations.js.map +1 -1
  141. package/dist/getRenderInfo.d.ts +0 -1
  142. package/dist/getRenderInfo.js +1 -2
  143. package/dist/getRenderInfo.js.map +1 -1
  144. package/dist/gui/ContextMixin.d.ts +0 -1
  145. package/dist/gui/ContextMixin.js +2 -3
  146. package/dist/gui/ContextMixin.js.map +1 -1
  147. package/dist/gui/Controllable.d.ts +0 -2
  148. package/dist/gui/Controllable.js +1 -2
  149. package/dist/gui/Controllable.js.map +1 -1
  150. package/dist/gui/EFActiveRootTemporal.d.ts +4 -5
  151. package/dist/gui/EFActiveRootTemporal.js +3 -4
  152. package/dist/gui/EFActiveRootTemporal.js.map +1 -1
  153. package/dist/gui/EFConfiguration.d.ts +4 -4
  154. package/dist/gui/EFConfiguration.js +3 -4
  155. package/dist/gui/EFConfiguration.js.map +1 -1
  156. package/dist/gui/EFControls.d.ts +2 -3
  157. package/dist/gui/EFControls.js +4 -5
  158. package/dist/gui/EFControls.js.map +1 -1
  159. package/dist/gui/EFDial.d.ts +4 -4
  160. package/dist/gui/EFDial.js +3 -4
  161. package/dist/gui/EFDial.js.map +1 -1
  162. package/dist/gui/EFFilmstrip.d.ts +6 -7
  163. package/dist/gui/EFFilmstrip.js +3 -4
  164. package/dist/gui/EFFilmstrip.js.map +1 -1
  165. package/dist/gui/EFFitScale.d.ts +3 -3
  166. package/dist/gui/EFFitScale.js +6 -7
  167. package/dist/gui/EFFitScale.js.map +1 -1
  168. package/dist/gui/EFFocusOverlay.d.ts +6 -6
  169. package/dist/gui/EFFocusOverlay.js +3 -4
  170. package/dist/gui/EFFocusOverlay.js.map +1 -1
  171. package/dist/gui/EFOverlayItem.d.ts +4 -4
  172. package/dist/gui/EFOverlayItem.js +3 -4
  173. package/dist/gui/EFOverlayItem.js.map +1 -1
  174. package/dist/gui/EFOverlayLayer.d.ts +4 -5
  175. package/dist/gui/EFOverlayLayer.js +3 -4
  176. package/dist/gui/EFOverlayLayer.js.map +1 -1
  177. package/dist/gui/EFPause.d.ts +4 -4
  178. package/dist/gui/EFPause.js +3 -4
  179. package/dist/gui/EFPause.js.map +1 -1
  180. package/dist/gui/EFPlay.d.ts +4 -4
  181. package/dist/gui/EFPlay.js +3 -4
  182. package/dist/gui/EFPlay.js.map +1 -1
  183. package/dist/gui/EFPreview.d.ts +4 -4
  184. package/dist/gui/EFPreview.js +3 -4
  185. package/dist/gui/EFPreview.js.map +1 -1
  186. package/dist/gui/EFResizableBox.d.ts +4 -4
  187. package/dist/gui/EFResizableBox.js +3 -4
  188. package/dist/gui/EFResizableBox.js.map +1 -1
  189. package/dist/gui/EFScrubber.d.ts +4 -4
  190. package/dist/gui/EFScrubber.js +3 -4
  191. package/dist/gui/EFScrubber.js.map +1 -1
  192. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  193. package/dist/gui/EFTimeDisplay.js +3 -4
  194. package/dist/gui/EFTimeDisplay.js.map +1 -1
  195. package/dist/gui/EFTimelineRuler.d.ts +4 -4
  196. package/dist/gui/EFTimelineRuler.js +5 -6
  197. package/dist/gui/EFTimelineRuler.js.map +1 -1
  198. package/dist/gui/EFToggleLoop.d.ts +4 -4
  199. package/dist/gui/EFToggleLoop.js +3 -4
  200. package/dist/gui/EFToggleLoop.js.map +1 -1
  201. package/dist/gui/EFTogglePlay.d.ts +4 -4
  202. package/dist/gui/EFTogglePlay.js +3 -4
  203. package/dist/gui/EFTogglePlay.js.map +1 -1
  204. package/dist/gui/EFTransformHandles.d.ts +4 -4
  205. package/dist/gui/EFTransformHandles.js +3 -4
  206. package/dist/gui/EFTransformHandles.js.map +1 -1
  207. package/dist/gui/EFWorkbench.d.ts +6 -7
  208. package/dist/gui/EFWorkbench.js +13 -15
  209. package/dist/gui/EFWorkbench.js.map +1 -1
  210. package/dist/gui/EFWorkbench.spacebar.js +1 -1
  211. package/dist/gui/EFWorkbench.spacebar.js.map +1 -1
  212. package/dist/gui/FitScaleHelpers.js +1 -2
  213. package/dist/gui/FitScaleHelpers.js.map +1 -1
  214. package/dist/gui/PlaybackController.js +38 -18
  215. package/dist/gui/PlaybackController.js.map +1 -1
  216. package/dist/gui/TWMixin.js +1 -1
  217. package/dist/gui/TWMixin.js.map +1 -1
  218. package/dist/gui/TWMixin2.js +1 -2
  219. package/dist/gui/TWMixin2.js.map +1 -1
  220. package/dist/gui/TargetOrContextMixin.js +2 -3
  221. package/dist/gui/TargetOrContextMixin.js.map +1 -1
  222. package/dist/gui/currentTimeContext.js +1 -2
  223. package/dist/gui/currentTimeContext.js.map +1 -1
  224. package/dist/gui/durationContext.js +1 -2
  225. package/dist/gui/durationContext.js.map +1 -1
  226. package/dist/gui/efContext.js +1 -2
  227. package/dist/gui/efContext.js.map +1 -1
  228. package/dist/gui/fetchContext.js +1 -2
  229. package/dist/gui/fetchContext.js.map +1 -1
  230. package/dist/gui/focusContext.js +1 -2
  231. package/dist/gui/focusContext.js.map +1 -1
  232. package/dist/gui/focusedElementContext.js +1 -2
  233. package/dist/gui/focusedElementContext.js.map +1 -1
  234. package/dist/gui/hierarchy/EFHierarchy.d.ts +4 -4
  235. package/dist/gui/hierarchy/EFHierarchy.js +3 -4
  236. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
  237. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +2 -2
  238. package/dist/gui/hierarchy/EFHierarchyItem.js +13 -14
  239. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
  240. package/dist/gui/hierarchy/hierarchyContext.js +1 -2
  241. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -1
  242. package/dist/gui/icons.js +1 -2
  243. package/dist/gui/icons.js.map +1 -1
  244. package/dist/gui/panZoomTransformContext.js +1 -2
  245. package/dist/gui/panZoomTransformContext.js.map +1 -1
  246. package/dist/gui/playingContext.js +1 -2
  247. package/dist/gui/playingContext.js.map +1 -1
  248. package/dist/gui/previewSettingsContext.d.ts +0 -1
  249. package/dist/gui/previewSettingsContext.js +1 -2
  250. package/dist/gui/previewSettingsContext.js.map +1 -1
  251. package/dist/gui/shouldSignUrl.js +1 -1
  252. package/dist/gui/shouldSignUrl.js.map +1 -1
  253. package/dist/gui/theme.js +1 -1
  254. package/dist/gui/theme.js.map +1 -1
  255. package/dist/gui/timeline/EFTimeline.d.ts +2 -5
  256. package/dist/gui/timeline/EFTimeline.js +19 -20
  257. package/dist/gui/timeline/EFTimeline.js.map +1 -1
  258. package/dist/gui/timeline/EFTimelineRow.d.ts +2 -2
  259. package/dist/gui/timeline/EFTimelineRow.js +3 -4
  260. package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
  261. package/dist/gui/timeline/TrimHandles.d.ts +4 -4
  262. package/dist/gui/timeline/TrimHandles.js +3 -4
  263. package/dist/gui/timeline/TrimHandles.js.map +1 -1
  264. package/dist/gui/timeline/flattenHierarchy.js +1 -2
  265. package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
  266. package/dist/gui/timeline/timelineEditingContext.js +1 -2
  267. package/dist/gui/timeline/timelineEditingContext.js.map +1 -1
  268. package/dist/gui/timeline/timelineStateContext.js +1 -14
  269. package/dist/gui/timeline/timelineStateContext.js.map +1 -1
  270. package/dist/gui/timeline/tracks/AudioTrack.d.ts +0 -1
  271. package/dist/gui/timeline/tracks/AudioTrack.js +3 -4
  272. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
  273. package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -2
  274. package/dist/gui/timeline/tracks/CaptionsTrack.js +9 -9
  275. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
  276. package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +4 -4
  277. package/dist/gui/timeline/tracks/EFThumbnailStrip.js +3 -4
  278. package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -1
  279. package/dist/gui/timeline/tracks/HTMLTrack.d.ts +2 -2
  280. package/dist/gui/timeline/tracks/HTMLTrack.js +3 -4
  281. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
  282. package/dist/gui/timeline/tracks/ImageTrack.d.ts +2 -2
  283. package/dist/gui/timeline/tracks/ImageTrack.js +3 -4
  284. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
  285. package/dist/gui/timeline/tracks/TextTrack.d.ts +2 -2
  286. package/dist/gui/timeline/tracks/TextTrack.js +4 -5
  287. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
  288. package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +5 -6
  289. package/dist/gui/timeline/tracks/TimegroupTrack.js +3 -4
  290. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
  291. package/dist/gui/timeline/tracks/TrackItem.d.ts +2 -2
  292. package/dist/gui/timeline/tracks/TrackItem.js +3 -4
  293. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
  294. package/dist/gui/timeline/tracks/VideoTrack.d.ts +6 -7
  295. package/dist/gui/timeline/tracks/VideoTrack.js +3 -4
  296. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
  297. package/dist/gui/timeline/tracks/WaveformTrack.js +3 -4
  298. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
  299. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -1
  300. package/dist/gui/timeline/tracks/preloadTracks.d.ts +1 -9
  301. package/dist/gui/timeline/tracks/renderTrackChildren.js +1 -2
  302. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
  303. package/dist/gui/timeline/tracks/waveformUtils.js +3 -6
  304. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
  305. package/dist/gui/transformCalculations.js +1 -2
  306. package/dist/gui/transformCalculations.js.map +1 -1
  307. package/dist/gui/transformUtils.js +1 -1
  308. package/dist/gui/transformUtils.js.map +1 -1
  309. package/dist/gui/tree/EFTree.d.ts +4 -6
  310. package/dist/gui/tree/EFTree.js +3 -4
  311. package/dist/gui/tree/EFTree.js.map +1 -1
  312. package/dist/gui/tree/EFTreeItem.d.ts +4 -5
  313. package/dist/gui/tree/EFTreeItem.js +3 -4
  314. package/dist/gui/tree/EFTreeItem.js.map +1 -1
  315. package/dist/gui/tree/treeContext.d.ts +0 -1
  316. package/dist/gui/tree/treeContext.js +1 -2
  317. package/dist/gui/tree/treeContext.js.map +1 -1
  318. package/dist/index.d.ts +0 -2
  319. package/dist/index.js +1 -2
  320. package/dist/index.js.map +1 -1
  321. package/dist/node.js +1 -2
  322. package/dist/node_modules/lit-html/development/directives/ref.d.ts +14 -0
  323. package/dist/node_modules/lit-html/development/lit-html.d.ts +46 -0
  324. package/dist/otel/BridgeSpanExporter.js +1 -2
  325. package/dist/otel/BridgeSpanExporter.js.map +1 -1
  326. package/dist/otel/setupBrowserTracing.js +1 -2
  327. package/dist/otel/setupBrowserTracing.js.map +1 -1
  328. package/dist/otel/tracingHelpers.d.ts +0 -2
  329. package/dist/otel/tracingHelpers.js +1 -2
  330. package/dist/otel/tracingHelpers.js.map +1 -1
  331. package/dist/preview/AdaptiveResolutionTracker.js +11 -2
  332. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
  333. package/dist/preview/FrameController.d.ts +0 -1
  334. package/dist/preview/FrameController.js +2 -32
  335. package/dist/preview/FrameController.js.map +1 -1
  336. package/dist/preview/QualityUpgradeScheduler.js +1 -1
  337. package/dist/preview/QualityUpgradeScheduler.js.map +1 -1
  338. package/dist/preview/RenderContext.d.ts +0 -1
  339. package/dist/preview/RenderContext.js +11 -2
  340. package/dist/preview/RenderContext.js.map +1 -1
  341. package/dist/preview/RenderProfiler.js +1 -1
  342. package/dist/preview/RenderProfiler.js.map +1 -1
  343. package/dist/preview/RenderStats.js +1 -1
  344. package/dist/preview/RenderStats.js.map +1 -1
  345. package/dist/preview/encoding/canvasEncoder.js +7 -2
  346. package/dist/preview/encoding/canvasEncoder.js.map +1 -1
  347. package/dist/preview/encoding/mainThreadEncoder.js +1 -1
  348. package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
  349. package/dist/preview/encoding/workerEncoder.js +1 -1
  350. package/dist/preview/encoding/workerEncoder.js.map +1 -1
  351. package/dist/preview/logger.js +1 -1
  352. package/dist/preview/logger.js.map +1 -1
  353. package/dist/preview/previewSettings.js +1 -1
  354. package/dist/preview/previewSettings.js.map +1 -1
  355. package/dist/preview/previewTypes.js +1 -1
  356. package/dist/preview/previewTypes.js.map +1 -1
  357. package/dist/preview/renderElementToCanvas.d.ts +0 -1
  358. package/dist/preview/renderElementToCanvas.js +12 -5
  359. package/dist/preview/renderElementToCanvas.js.map +1 -1
  360. package/dist/preview/renderTimegroupToCanvas.d.ts +0 -1
  361. package/dist/preview/renderTimegroupToCanvas.js +6 -7
  362. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  363. package/dist/preview/renderTimegroupToVideo.d.ts +0 -1
  364. package/dist/preview/renderTimegroupToVideo.js +20 -8
  365. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  366. package/dist/preview/renderVideoToVideo.js +11 -2
  367. package/dist/preview/renderVideoToVideo.js.map +1 -1
  368. package/dist/preview/renderers.d.ts +0 -1
  369. package/dist/preview/renderers.js +5 -2
  370. package/dist/preview/renderers.js.map +1 -1
  371. package/dist/preview/rendering/ScaleConfig.js +2 -3
  372. package/dist/preview/rendering/ScaleConfig.js.map +1 -1
  373. package/dist/preview/rendering/inlineImages.d.ts +0 -1
  374. package/dist/preview/rendering/inlineImages.js +1 -1
  375. package/dist/preview/rendering/inlineImages.js.map +1 -1
  376. package/dist/preview/rendering/loadImage.js +1 -2
  377. package/dist/preview/rendering/loadImage.js.map +1 -1
  378. package/dist/preview/rendering/renderToImageNative.js +4 -5
  379. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  380. package/dist/preview/rendering/serializeTimelineDirect.js +18 -4
  381. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  382. package/dist/preview/statsTrackingStrategy.js +1 -1
  383. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  384. package/dist/preview/workers/WorkerPool.js +5 -2
  385. package/dist/preview/workers/WorkerPool.js.map +1 -1
  386. package/dist/preview/workers/encoderWorkerInline.js +1 -1
  387. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  388. package/dist/render/EFRenderAPI.d.ts +0 -1
  389. package/dist/render/EFRenderAPI.js +1 -2
  390. package/dist/render/EFRenderAPI.js.map +1 -1
  391. package/dist/render/getRenderData.js +1 -1
  392. package/dist/render/getRenderData.js.map +1 -1
  393. package/dist/transcoding/cache/RequestDeduplicator.js +1 -1
  394. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  395. package/dist/transcoding/cache/URLTokenDeduplicator.js +1 -1
  396. package/dist/transcoding/cache/URLTokenDeduplicator.js.map +1 -1
  397. package/dist/transcoding/types/index.d.ts +0 -1
  398. package/dist/transcoding/utils/UrlGenerator.js +1 -1
  399. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  400. package/dist/utils/LRUCache.js +1 -1
  401. package/dist/utils/LRUCache.js.map +1 -1
  402. package/dist/utils/frameTime.js +2 -9
  403. package/dist/utils/frameTime.js.map +1 -1
  404. package/dist/version.js +2 -2
  405. package/dist/version.js.map +1 -1
  406. package/package.json +5 -4
@@ -1 +1 @@
1
- {"version":3,"file":"ImageTrack.js","names":["EFImageTrack"],"sources":["../../../../src/gui/timeline/tracks/ImageTrack.ts"],"sourcesContent":["import { html, nothing } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EFImage } from \"../../../elements/EFImage.js\";\n// TrackItem must be pre-loaded before this module is imported\n// See preloadTracks.ts for the initialization sequence\nimport { TrackItem } from \"./TrackItem.js\";\n\n@customElement(\"ef-image-track\")\nexport class EFImageTrack extends TrackItem {\n contents() {\n const image = this.element as EFImage;\n if (!(image instanceof EFImage)) {\n return nothing;\n }\n\n // Try to get image src for thumbnail preview\n const src = image.getAttribute(\"src\") || (image as any).src;\n\n // Calculate track dimensions - show repeating thumbnails to fill the track\n const durationMs = image.durationMs ?? 0;\n const trackWidth = durationMs * this.pixelsPerMs;\n const thumbnailHeight = 18;\n const thumbnailWidth = Math.min(32, trackWidth);\n\n if (!src || thumbnailWidth < 8) {\n return nothing;\n }\n\n // Calculate how many thumbnails can fit\n const thumbnailCount = Math.max(1, Math.floor((trackWidth - 8) / (thumbnailWidth + 2)));\n\n return html`\n <div style=${styleMap({\n position: \"absolute\",\n left: \"4px\",\n right: \"4px\",\n top: \"2px\",\n bottom: \"2px\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"2px\",\n overflow: \"hidden\",\n })}>\n ${Array.from(\n { length: thumbnailCount },\n () => html`\n <img\n src=\"${src}\"\n alt=\"\"\n style=${styleMap({\n height: `${thumbnailHeight}px`,\n width: `${thumbnailWidth}px`,\n objectFit: \"cover\",\n borderRadius: \"2px\",\n opacity: \"0.75\",\n pointerEvents: \"none\",\n flexShrink: \"0\",\n })}\n />\n `,\n )}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-image-track\": EFImageTrack;\n }\n}\n"],"mappings":";;;;;;;;AASO,yBAAMA,uBAAqB,UAAU;CAC1C,WAAW;EACT,MAAM,QAAQ,KAAK;AACnB,MAAI,EAAE,iBAAiB,SACrB,QAAO;EAIT,MAAM,MAAM,MAAM,aAAa,MAAM,IAAK,MAAc;EAIxD,MAAM,cADa,MAAM,cAAc,KACP,KAAK;EACrC,MAAM,kBAAkB;EACxB,MAAM,iBAAiB,KAAK,IAAI,IAAI,WAAW;AAE/C,MAAI,CAAC,OAAO,iBAAiB,EAC3B,QAAO;EAIT,MAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,OAAO,aAAa,MAAM,iBAAiB,GAAG,CAAC;AAEvF,SAAO,IAAI;mBACI,SAAS;GACpB,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK;GACL,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,KAAK;GACL,UAAU;GACX,CAAC,CAAC;UACC,MAAM,KACN,EAAE,QAAQ,gBAAgB,QACpB,IAAI;;mBAED,IAAI;;oBAEH,SAAS;GACf,QAAQ,GAAG,gBAAgB;GAC3B,OAAO,GAAG,eAAe;GACzB,WAAW;GACX,cAAc;GACd,SAAS;GACT,eAAe;GACf,YAAY;GACb,CAAC,CAAC;;UAGN,CAAC;;;;;2BArDT,cAAc,iBAAiB"}
1
+ {"version":3,"file":"ImageTrack.js","names":[],"sources":["../../../../src/gui/timeline/tracks/ImageTrack.ts"],"mappings":";;;;;;;AASO,IAAA,eAAA,MAAM,qBAAqB,UAAU;CAC1C,WAAW;EACT,MAAM,QAAQ,KAAK;AACnB,MAAI,EAAE,iBAAiB,SACrB,QAAO;EAIT,MAAM,MAAM,MAAM,aAAa,MAAM,IAAK,MAAc;EAIxD,MAAM,cADa,MAAM,cAAc,KACP,KAAK;EACrC,MAAM,kBAAkB;EACxB,MAAM,iBAAiB,KAAK,IAAI,IAAI,WAAW;AAE/C,MAAI,CAAC,OAAO,iBAAiB,EAC3B,QAAO;EAIT,MAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,OAAO,aAAa,MAAM,iBAAiB,GAAG,CAAC;AAEvF,SAAO,IAAI;mBACI,SAAS;GACpB,UAAU;GACV,MAAM;GACN,OAAO;GACP,KAAK;GACL,QAAQ;GACR,SAAS;GACT,YAAY;GACZ,KAAK;GACL,UAAU;GACX,CAAC,CAAC;UACC,MAAM,KACN,EAAE,QAAQ,gBAAgB,QACpB,IAAI;;mBAED,IAAI;;oBAEH,SAAS;GACf,QAAQ,GAAG,gBAAgB;GAC3B,OAAO,GAAG,eAAe;GACzB,WAAW;GACX,cAAc;GACd,SAAS;GACT,eAAe;GACf,YAAY;GACb,CAAC,CAAC;;UAGN,CAAC;;;;;2BArDT,cAAc,iBAAiB,CAAA,EAAA,aAAA"}
@@ -1,12 +1,12 @@
1
1
  import { TrackItem } from "./TrackItem.js";
2
- import * as lit42 from "lit";
2
+ import * as _$lit from "lit";
3
3
  import { TemplateResult, nothing } from "lit";
4
4
 
5
5
  //#region src/gui/timeline/tracks/TextTrack.d.ts
6
6
  declare class EFTextTrack extends TrackItem {
7
7
  #private;
8
8
  contextCurrentTimeMs: number;
9
- static styles: lit42.CSSResult[];
9
+ static styles: _$lit.CSSResult[];
10
10
  render(): TemplateResult<1>;
11
11
  renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing;
12
12
  }
@@ -1,14 +1,13 @@
1
1
  import { currentTimeContext } from "../../currentTimeContext.js";
2
- import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
2
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
3
3
  import { TrackItem } from "./TrackItem.js";
4
4
  import { renderTrackChildren } from "./renderTrackChildren.js";
5
5
  import { consume } from "@lit/context";
6
6
  import { css, html, nothing } from "lit";
7
7
  import { customElement } from "lit/decorators.js";
8
8
  import { styleMap } from "lit/directives/style-map.js";
9
-
10
9
  //#region src/gui/timeline/tracks/TextTrack.ts
11
- let EFTextTrack = class EFTextTrack$1 extends TrackItem {
10
+ let EFTextTrack = class EFTextTrack extends TrackItem {
12
11
  constructor(..._args) {
13
12
  super(..._args);
14
13
  this.contextCurrentTimeMs = 0;
@@ -180,7 +179,7 @@ __decorate([consume({
180
179
  subscribe: true
181
180
  })], EFTextTrack.prototype, "contextCurrentTimeMs", void 0);
182
181
  EFTextTrack = __decorate([customElement("ef-text-track")], EFTextTrack);
183
- let EFTextSegmentTrack = class EFTextSegmentTrack$1 extends TrackItem {
182
+ let EFTextSegmentTrack = class EFTextSegmentTrack extends TrackItem {
184
183
  get textTrackStyles() {
185
184
  const parentText = this.element.closest("ef-text");
186
185
  return {
@@ -219,6 +218,6 @@ let EFTextSegmentTrack = class EFTextSegmentTrack$1 extends TrackItem {
219
218
  }
220
219
  };
221
220
  EFTextSegmentTrack = __decorate([customElement("ef-text-segment-track")], EFTextSegmentTrack);
222
-
223
221
  //#endregion
222
+
224
223
  //# sourceMappingURL=TextTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextTrack.js","names":["EFTextTrack","#getTextContent","#canShowSegmentsIndividually","#renderSegments","#renderCompactText","EFTextSegmentTrack"],"sources":["../../../../src/gui/timeline/tracks/TextTrack.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, nothing, type TemplateResult } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EFText } from \"../../../elements/EFText.js\";\nimport { EFTextSegment } from \"../../../elements/EFTextSegment.js\";\nimport { currentTimeContext } from \"../../currentTimeContext.js\";\n// TrackItem must be pre-loaded before this module is imported\n// See preloadTracks.ts for the initialization sequence\nimport { TrackItem } from \"./TrackItem.js\";\nimport { renderTrackChildren } from \"./renderTrackChildren.js\";\n\n@customElement(\"ef-text-track\")\nexport class EFTextTrack extends TrackItem {\n @consume({ context: currentTimeContext, subscribe: true })\n contextCurrentTimeMs = 0;\n static styles = [\n ...TrackItem.styles,\n css`\n .text-segment-block {\n position: absolute;\n height: calc(100% - 4px);\n top: 2px;\n display: flex;\n align-items: center;\n padding: 0 4px;\n border-radius: 2px;\n overflow: hidden;\n background: color-mix(in srgb, var(--ef-color-type-text) 15%, transparent);\n }\n \n .text-segment-block.active {\n background: color-mix(in srgb, var(--ef-color-type-text) 35%, transparent);\n }\n \n .text-segment-block:hover {\n z-index: 100;\n overflow: visible;\n width: max-content !important;\n min-width: max-content;\n background: var(--ef-color-bg-elevated);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);\n }\n \n .segment-text {\n font-size: 10px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--ef-color-text);\n }\n \n .text-segment-block:hover .segment-text {\n overflow: visible;\n text-overflow: clip;\n }\n \n .text-segment-block.active .segment-text {\n font-weight: 500;\n color: white;\n }\n \n /* Compact mode - single block for full text */\n .text-compact-block {\n position: absolute;\n left: 4px;\n right: 4px;\n top: 2px;\n bottom: 2px;\n display: flex;\n align-items: center;\n padding: 0 4px;\n overflow: hidden;\n border-radius: 2px;\n background: color-mix(in srgb, var(--ef-color-type-text) 10%, transparent);\n }\n \n .text-compact-block:hover {\n overflow: visible;\n z-index: 100;\n width: max-content;\n background: var(--ef-color-bg-elevated);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);\n }\n `,\n ];\n\n /**\n * Get the text content - from segments, direct text nodes, or element textContent\n */\n #getTextContent(segments: EFTextSegment[]): string {\n const text = this.element as EFText;\n\n // If there are segments, use their text\n if (segments.length > 0) {\n return segments.map((s) => s.segmentText).join(\" \");\n }\n\n // Try direct text nodes (excluding templates and other elements)\n const directText = Array.from(text.childNodes)\n .filter((node) => node.nodeType === Node.TEXT_NODE)\n .map((node) => node.textContent?.trim())\n .filter(Boolean)\n .join(\" \");\n\n if (directText) return directText;\n\n // Ultimate fallback: use the element's full text content\n // (excluding script/style content but including nested text)\n const fullText = text.textContent?.trim() || \"\";\n return fullText;\n }\n\n /**\n * Check if segments can fit individually based on track width\n */\n #canShowSegmentsIndividually(segments: EFTextSegment[], trackWidthPx: number): boolean {\n if (segments.length === 0) return false;\n // Need at least 20px per segment\n return trackWidthPx >= segments.length * 20;\n }\n\n render() {\n const text = this.element as EFText;\n const segments = Array.from(text.querySelectorAll(\"ef-text-segment\")) as EFTextSegment[];\n const textContent = this.#getTextContent(segments);\n const durationMs = text.durationMs ?? 0;\n const trackWidthPx = durationMs * this.pixelsPerMs;\n const canShowSegments = this.#canShowSegmentsIndividually(segments, trackWidthPx);\n\n return html`<div style=${styleMap(this.gutterStyles)}>\n <div\n class=\"relative\"\n style=\"background-color: var(--filmstrip-bg);\"\n ?data-focused=${this.isFocused}\n @mouseenter=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = this.element;\n }\n }}\n @mouseleave=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = null;\n }\n }}\n >\n <div\n ?data-focused=${this.isFocused}\n class=\"relative mb-[1px] block h-[1.1rem] text-nowrap border text-sm overflow-visible\"\n style=${styleMap({\n ...this.trimPortionStyles,\n backgroundColor: this.isFocused\n ? \"var(--filmstrip-item-focused)\"\n : \"var(--filmstrip-item-bg)\",\n borderColor: \"var(--filmstrip-border)\",\n borderLeftColor: this.getElementTypeColor(),\n borderLeftWidth: \"3px\",\n })}\n >\n ${\n segments.length > 0 && canShowSegments\n ? this.#renderSegments(segments, durationMs)\n : this.#renderCompactText(textContent)\n }\n </div>\n </div>\n ${this.renderChildren()}\n </div>`;\n }\n\n /**\n * Render segments as positioned blocks (like captions)\n */\n #renderSegments(segments: EFTextSegment[], durationMs: number) {\n const text = this.element as EFText;\n const currentTimeMs = this.contextCurrentTimeMs || 0;\n const textLocalTimeMs = currentTimeMs - text.startTimeMs;\n\n return segments.map((segment, index) => {\n const staggerOffset = segment.staggerOffsetMs ?? 0;\n // Segment becomes active at its stagger offset\n const isActive = textLocalTimeMs >= staggerOffset;\n\n // Calculate segment width - distribute evenly or use stagger spacing\n const nextSegment = segments[index + 1];\n const nextStagger = nextSegment?.staggerOffsetMs ?? durationMs;\n const segmentWidthMs = nextStagger - staggerOffset;\n const segmentWidthPx = Math.max(this.pixelsPerMs * segmentWidthMs, 18);\n\n return html`<div\n class=\"text-segment-block ${isActive ? \"active\" : \"\"}\"\n style=${styleMap({\n left: `${this.pixelsPerMs * staggerOffset}px`,\n width: `${segmentWidthPx}px`,\n })}\n title=\"${segment.segmentText}\"\n >\n <span class=\"segment-text\">${segment.segmentText}</span>\n </div>`;\n });\n }\n\n /**\n * Render compact text (no segments or not enough space)\n */\n #renderCompactText(textContent: string) {\n if (!textContent) return nothing;\n\n return html`\n <div class=\"text-compact-block\">\n <span class=\"segment-text\">${textContent}</span>\n </div>\n `;\n }\n\n renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing {\n const nonSegmentChildren = Array.from(this.element.children).filter(\n (child) => child.tagName?.toUpperCase() !== \"EF-TEXT-SEGMENT\",\n );\n\n if (nonSegmentChildren.length === 0) {\n return nothing;\n }\n\n return renderTrackChildren(\n nonSegmentChildren,\n this.pixelsPerMs,\n this.hideSelectors,\n this.showSelectors,\n false,\n this.enableTrim,\n );\n }\n}\n\n@customElement(\"ef-text-segment-track\")\nexport class EFTextSegmentTrack extends TrackItem {\n get textTrackStyles() {\n const parentText = this.element.closest(\"ef-text\") as EFText;\n return {\n position: \"relative\",\n left: `${this.pixelsPerMs * (parentText?.startTimeWithinParentMs || 0)}px`,\n width: `${this.pixelsPerMs * (parentText?.durationMs || 0)}px`,\n };\n }\n\n render() {\n const segment = this.element as EFTextSegment;\n const parentText = segment.closest(\"ef-text\") as EFText;\n\n if (!parentText) {\n return html`<div style=${styleMap(this.textTrackStyles)}>\n <div class=\"border h-[1.1rem] mb-[1px] text-xs\" style=\"background-color: var(--filmstrip-bg); border-color: var(--filmstrip-border);\">\n </div>\n </div>`;\n }\n\n const rootTimegroup = parentText.rootTimegroup;\n const currentTimeMs = rootTimegroup?.currentTimeMs || 0;\n const textLocalTimeMs = currentTimeMs - parentText.startTimeMs;\n\n const isCurrentlyActive =\n textLocalTimeMs >= segment.segmentStartMs && textLocalTimeMs < segment.segmentEndMs;\n\n return html`<div style=${styleMap(this.textTrackStyles)}>\n <div class=\"relative border h-[1.1rem] mb-[1px] w-full\" style=\"background-color: var(--filmstrip-bg); border-color: var(--filmstrip-border);\">\n <div\n class=\"absolute border text-xs overflow-visible flex items-center ${isCurrentlyActive ? \"font-bold z-[5]\" : \"\"}\"\n style=${styleMap({\n left: `${this.pixelsPerMs * segment.segmentStartMs}px`,\n width: `${this.pixelsPerMs * (segment.segmentEndMs - segment.segmentStartMs)}px`,\n height: \"100%\",\n top: \"0px\",\n backgroundColor: isCurrentlyActive\n ? \"var(--filmstrip-caption-bg)\"\n : \"var(--filmstrip-item-bg)\",\n borderColor: isCurrentlyActive\n ? \"var(--filmstrip-caption-border)\"\n : \"var(--filmstrip-border)\",\n })}\n title=\"Segment: '${segment.segmentText}' (${segment.segmentStartMs}ms - ${segment.segmentEndMs}ms)\"\n >\n ${isCurrentlyActive ? html`<span class=\"px-0.5 text-[8px] font-bold whitespace-nowrap\" style=\"background-color: var(--filmstrip-caption-bg);\">${segment.segmentText}</span>` : \"\"}\n </div>\n </div>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-text-track\": EFTextTrack;\n \"ef-text-segment-track\": EFTextSegmentTrack;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextTrack.js","names":["#getTextContent","#canShowSegmentsIndividually","#renderSegments","#renderCompactText"],"sources":["../../../../src/gui/timeline/tracks/TextTrack.ts"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
+ import { TemplateResult as TemplateResult$1 } from "../../../node_modules/lit-html/development/lit-html.js";
1
2
  import { TrackItem } from "./TrackItem.js";
2
- import "./EFThumbnailStrip.js";
3
- import * as lit41 from "lit";
4
- import * as lit_html38 from "lit-html";
3
+ import * as _$lit from "lit";
5
4
 
6
5
  //#region src/gui/timeline/tracks/TimegroupTrack.d.ts
7
6
  declare class EFTimegroupTrack extends TrackItem {
8
- static styles: lit41.CSSResult[];
7
+ static styles: _$lit.CSSResult[];
9
8
  /**
10
9
  * When true, children are not rendered (used in unified row architecture
11
10
  * where children get their own rows).
@@ -32,11 +31,11 @@ declare class EFTimegroupTrack extends TrackItem {
32
31
  left: string;
33
32
  };
34
33
  private get modeLabel();
35
- contents(): lit_html38.TemplateResult<1>;
34
+ contents(): TemplateResult$1<1>;
36
35
  /**
37
36
  * Override render to use taller height for filmstrip rows
38
37
  */
39
- render(): lit_html38.TemplateResult<1>;
38
+ render(): TemplateResult$1<1>;
40
39
  }
41
40
  declare global {
42
41
  interface HTMLElementTagNameMap {
@@ -1,11 +1,10 @@
1
- import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
1
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
2
2
  import { TrackItem } from "./TrackItem.js";
3
3
  import "./EFThumbnailStrip.js";
4
4
  import { renderTrackChildren } from "./renderTrackChildren.js";
5
5
  import { css, html } from "lit";
6
6
  import { customElement, property } from "lit/decorators.js";
7
7
  import { styleMap } from "lit/directives/style-map.js";
8
-
9
8
  //#region src/gui/timeline/tracks/TimegroupTrack.ts
10
9
  /**
11
10
  * Check if a timegroup is a root timegroup (has no parent timegroup)
@@ -25,7 +24,7 @@ function isRootTimegroup(element) {
25
24
  }
26
25
  /** Height for root timegroup filmstrip row */
27
26
  const FILMSTRIP_ROW_HEIGHT = 48;
28
- let EFTimegroupTrack = class EFTimegroupTrack$1 extends TrackItem {
27
+ let EFTimegroupTrack = class EFTimegroupTrack extends TrackItem {
29
28
  constructor(..._args) {
30
29
  super(..._args);
31
30
  this.skipChildren = false;
@@ -140,6 +139,6 @@ __decorate([property({
140
139
  attribute: "show-filmstrip"
141
140
  })], EFTimegroupTrack.prototype, "showFilmstrip", void 0);
142
141
  EFTimegroupTrack = __decorate([customElement("ef-timegroup-track")], EFTimegroupTrack);
143
-
144
142
  //#endregion
143
+
145
144
  //# sourceMappingURL=TimegroupTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TimegroupTrack.js","names":["EFTimegroupTrack"],"sources":["../../../../src/gui/timeline/tracks/TimegroupTrack.ts"],"sourcesContent":["import { css, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n// TrackItem must be pre-loaded before this module is imported\n// See preloadTracks.ts for the initialization sequence\nimport { TrackItem } from \"./TrackItem.js\";\nimport { renderTrackChildren } from \"./renderTrackChildren.js\";\nimport \"./EFThumbnailStrip.js\";\n\n/**\n * Check if a timegroup is a root timegroup (has no parent timegroup)\n * Uses the timegroup's own isRootTimegroup property for reliability\n */\nfunction isRootTimegroup(element: Element | null | undefined): boolean {\n // Handle null/undefined\n if (!element) {\n return false;\n }\n\n // Check if element has the isRootTimegroup property (most reliable)\n // EFTimegroup instances have this property that checks parentTimegroup\n const elem = element as any;\n if (typeof elem.isRootTimegroup === \"boolean\") {\n return elem.isRootTimegroup;\n }\n\n // Alternative: check parentTimegroup property directly (EFTimegroup has this)\n if (elem.parentTimegroup !== undefined) {\n return !elem.parentTimegroup; // Root if no parent timegroup\n }\n\n // Fallback: check DOM parent tree (less reliable after DOM moves)\n let parent = element.parentElement;\n while (parent) {\n if (parent.tagName.toLowerCase() === \"ef-timegroup\") {\n return false;\n }\n parent = parent.parentElement;\n }\n return true;\n}\n\n/** Height for root timegroup filmstrip row */\nconst FILMSTRIP_ROW_HEIGHT = 48;\n\n@customElement(\"ef-timegroup-track\")\nexport class EFTimegroupTrack extends TrackItem {\n static styles = [\n ...TrackItem.styles,\n css`\n .trim-container {\n background: linear-gradient(\n 135deg,\n color-mix(in srgb, var(--ef-color-type-timegroup) 10%, transparent) 0%,\n color-mix(in srgb, var(--ef-color-type-timegroup) 5%, transparent) 100%\n ) !important;\n }\n \n :host(:hover) .trim-container {\n background: linear-gradient(\n 135deg,\n color-mix(in srgb, var(--ef-color-type-timegroup) 15%, transparent) 0%,\n color-mix(in srgb, var(--ef-color-type-timegroup) 8%, transparent) 100%\n ) !important;\n }\n `,\n ];\n\n /**\n * When true, children are not rendered (used in unified row architecture\n * where children get their own rows).\n */\n @property({ type: Boolean, attribute: \"skip-children\" })\n skipChildren = false;\n\n /**\n * When true, show filmstrip thumbnails for root timegroups\n * TODO: Re-enable when thumbnail strip performance is improved\n */\n @property({ type: Boolean, attribute: \"show-filmstrip\" })\n showFilmstrip = false;\n\n /**\n * Check if this track should show a filmstrip\n */\n private get shouldShowFilmstrip(): boolean {\n const skipChildren = this.skipChildren;\n const showFilmstrip = this.showFilmstrip;\n const hasId = !!this.element?.id;\n const isRoot = isRootTimegroup(this.element);\n\n return skipChildren && showFilmstrip && hasId && isRoot;\n }\n\n /**\n * Override trimPortionStyles to use taller height for filmstrip rows\n */\n override get trimPortionStyles() {\n const baseStyles = super.trimPortionStyles;\n if (this.shouldShowFilmstrip) {\n return {\n ...baseStyles,\n height: `${FILMSTRIP_ROW_HEIGHT}px`,\n };\n }\n return baseStyles;\n }\n\n private get modeLabel(): string {\n const mode = (this.element as any).mode || \"fixed\";\n const labels: Record<string, string> = {\n fixed: \"Fixed\",\n sequence: \"Sequence\",\n contain: \"Container\",\n fit: \"Fit\",\n };\n return labels[mode] || mode;\n }\n\n contents() {\n // Show filmstrip only for ROOT timegroups (no parent timegroup)\n const shouldShow = this.shouldShowFilmstrip;\n\n if (shouldShow) {\n return html`<ef-thumbnail-strip\n .targetElement=${this.element}\n thumbnail-height=${FILMSTRIP_ROW_HEIGHT}\n thumbnail-spacing-px=\"96\"\n pixels-per-ms=${this.pixelsPerMs}\n ></ef-thumbnail-strip>`;\n }\n\n if (this.skipChildren) {\n return html`<span style=\"\n font-size: 9px;\n opacity: 0.5;\n padding-left: 4px;\n line-height: 14px;\n pointer-events: none;\n white-space: nowrap;\n \">${this.modeLabel}</span>`;\n }\n // Wrap children in a fragment for consistent return type\n // Note: This hierarchical rendering path is only used in tests/sandboxes.\n // Production code always uses skipChildren=true with flat row architecture.\n return html`${renderTrackChildren(\n Array.from(this.element.children || []),\n this.pixelsPerMs,\n this.hideSelectors,\n this.showSelectors,\n false,\n this.enableTrim,\n )}`;\n }\n\n /**\n * Override render to use taller height for filmstrip rows\n */\n override render() {\n const trackHeight = this.shouldShowFilmstrip\n ? `${FILMSTRIP_ROW_HEIGHT}px`\n : \"var(--timeline-track-height, 22px)\";\n\n return html`<div style=${styleMap(this.gutterStyles)}>\n <div\n style=\"background-color: var(--filmstrip-bg);\"\n ?data-focused=${this.isFocused}\n @mouseenter=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = this.element;\n }\n }}\n @mouseleave=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = null;\n }\n }}\n >\n <div\n ?data-focused=${this.isFocused}\n class=\"trim-container relative mb-0 block text-nowrap border text-sm\"\n style=${styleMap({\n ...this.trimPortionStyles,\n height: trackHeight,\n backgroundColor: this.isFocused\n ? \"var(--filmstrip-item-focused)\"\n : \"var(--filmstrip-item-bg)\",\n borderColor: this.shouldShowFilmstrip ? \"transparent\" : \"var(--filmstrip-border)\",\n })}\n >\n ${this.animations()}\n ${this.contents()}\n </div>\n </div>\n ${this.renderChildren()}\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-timegroup-track\": EFTimegroupTrack;\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,SAAS,gBAAgB,SAA8C;AAErE,KAAI,CAAC,QACH,QAAO;CAKT,MAAM,OAAO;AACb,KAAI,OAAO,KAAK,oBAAoB,UAClC,QAAO,KAAK;AAId,KAAI,KAAK,oBAAoB,OAC3B,QAAO,CAAC,KAAK;CAIf,IAAI,SAAS,QAAQ;AACrB,QAAO,QAAQ;AACb,MAAI,OAAO,QAAQ,aAAa,KAAK,eACnC,QAAO;AAET,WAAS,OAAO;;AAElB,QAAO;;;AAIT,MAAM,uBAAuB;AAGtB,6BAAMA,2BAAyB,UAAU;;;sBA2B/B;uBAOC;;;gBAjCA,CACd,GAAG,UAAU,QACb,GAAG;;;;;;;;;;;;;;;;MAiBJ;;;;;CAmBD,IAAY,sBAA+B;EACzC,MAAM,eAAe,KAAK;EAC1B,MAAM,gBAAgB,KAAK;EAC3B,MAAM,QAAQ,CAAC,CAAC,KAAK,SAAS;EAC9B,MAAM,SAAS,gBAAgB,KAAK,QAAQ;AAE5C,SAAO,gBAAgB,iBAAiB,SAAS;;;;;CAMnD,IAAa,oBAAoB;EAC/B,MAAM,aAAa,MAAM;AACzB,MAAI,KAAK,oBACP,QAAO;GACL,GAAG;GACH,QAAQ,GAAG,qBAAqB;GACjC;AAEH,SAAO;;CAGT,IAAY,YAAoB;EAC9B,MAAM,OAAQ,KAAK,QAAgB,QAAQ;AAO3C,SANuC;GACrC,OAAO;GACP,UAAU;GACV,SAAS;GACT,KAAK;GACN,CACa,SAAS;;CAGzB,WAAW;AAIT,MAFmB,KAAK,oBAGtB,QAAO,IAAI;yBACQ,KAAK,QAAQ;2BACX,qBAAqB;;wBAExB,KAAK,YAAY;;AAIrC,MAAI,KAAK,aACP,QAAO,IAAI;;;;;;;UAOP,KAAK,UAAU;AAKrB,SAAO,IAAI,GAAG,oBACZ,MAAM,KAAK,KAAK,QAAQ,YAAY,EAAE,CAAC,EACvC,KAAK,aACL,KAAK,eACL,KAAK,eACL,OACA,KAAK,WACN;;;;;CAMH,AAAS,SAAS;EAChB,MAAM,cAAc,KAAK,sBACrB,GAAG,qBAAqB,MACxB;AAEJ,SAAO,IAAI,cAAc,SAAS,KAAK,aAAa,CAAC;;;wBAGjC,KAAK,UAAU;4BACX;AAClB,OAAI,KAAK,aACP,MAAK,aAAa,iBAAiB,KAAK;IAE1C;4BACkB;AAClB,OAAI,KAAK,aACP,MAAK,aAAa,iBAAiB;IAErC;;;0BAGgB,KAAK,UAAU;;kBAEvB,SAAS;GACf,GAAG,KAAK;GACR,QAAQ;GACR,iBAAiB,KAAK,YAClB,kCACA;GACJ,aAAa,KAAK,sBAAsB,gBAAgB;GACzD,CAAC,CAAC;;YAED,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU,CAAC;;;QAGpB,KAAK,gBAAgB,CAAC;;;;YA1H3B,SAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,CAAC;YAOvD,SAAS;CAAE,MAAM;CAAS,WAAW;CAAkB,CAAC;+BAlC1D,cAAc,qBAAqB"}
1
+ {"version":3,"file":"TimegroupTrack.js","names":[],"sources":["../../../../src/gui/timeline/tracks/TimegroupTrack.ts"],"mappings":";;;;;;;;;;;;AAaA,SAAS,gBAAgB,SAA8C;AAErE,KAAI,CAAC,QACH,QAAO;CAKT,MAAM,OAAO;AACb,KAAI,OAAO,KAAK,oBAAoB,UAClC,QAAO,KAAK;AAId,KAAI,KAAK,oBAAoB,KAAA,EAC3B,QAAO,CAAC,KAAK;CAIf,IAAI,SAAS,QAAQ;AACrB,QAAO,QAAQ;AACb,MAAI,OAAO,QAAQ,aAAa,KAAK,eACnC,QAAO;AAET,WAAS,OAAO;;AAElB,QAAO;;;AAIT,MAAM,uBAAuB;AAGtB,IAAA,mBAAA,MAAM,yBAAyB,UAAU;;;sBA2B/B;uBAOC;;;gBAjCA,CACd,GAAG,UAAU,QACb,GAAG;;;;;;;;;;;;;;;;MAiBJ;;;;;CAmBD,IAAY,sBAA+B;EACzC,MAAM,eAAe,KAAK;EAC1B,MAAM,gBAAgB,KAAK;EAC3B,MAAM,QAAQ,CAAC,CAAC,KAAK,SAAS;EAC9B,MAAM,SAAS,gBAAgB,KAAK,QAAQ;AAE5C,SAAO,gBAAgB,iBAAiB,SAAS;;;;;CAMnD,IAAa,oBAAoB;EAC/B,MAAM,aAAa,MAAM;AACzB,MAAI,KAAK,oBACP,QAAO;GACL,GAAG;GACH,QAAQ,GAAG,qBAAqB;GACjC;AAEH,SAAO;;CAGT,IAAY,YAAoB;EAC9B,MAAM,OAAQ,KAAK,QAAgB,QAAQ;AAO3C,SANuC;GACrC,OAAO;GACP,UAAU;GACV,SAAS;GACT,KAAK;GACN,CACa,SAAS;;CAGzB,WAAW;AAIT,MAFmB,KAAK,oBAGtB,QAAO,IAAI;yBACQ,KAAK,QAAQ;2BACX,qBAAqB;;wBAExB,KAAK,YAAY;;AAIrC,MAAI,KAAK,aACP,QAAO,IAAI;;;;;;;UAOP,KAAK,UAAU;AAKrB,SAAO,IAAI,GAAG,oBACZ,MAAM,KAAK,KAAK,QAAQ,YAAY,EAAE,CAAC,EACvC,KAAK,aACL,KAAK,eACL,KAAK,eACL,OACA,KAAK,WACN;;;;;CAMH,SAAkB;EAChB,MAAM,cAAc,KAAK,sBACrB,GAAG,qBAAqB,MACxB;AAEJ,SAAO,IAAI,cAAc,SAAS,KAAK,aAAa,CAAC;;;wBAGjC,KAAK,UAAU;4BACX;AAClB,OAAI,KAAK,aACP,MAAK,aAAa,iBAAiB,KAAK;IAE1C;4BACkB;AAClB,OAAI,KAAK,aACP,MAAK,aAAa,iBAAiB;IAErC;;;0BAGgB,KAAK,UAAU;;kBAEvB,SAAS;GACf,GAAG,KAAK;GACR,QAAQ;GACR,iBAAiB,KAAK,YAClB,kCACA;GACJ,aAAa,KAAK,sBAAsB,gBAAgB;GACzD,CAAC,CAAC;;YAED,KAAK,YAAY,CAAC;YAClB,KAAK,UAAU,CAAC;;;QAGpB,KAAK,gBAAgB,CAAC;;;;YA1H3B,SAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,CAAC,CAAA,EAAA,iBAAA,WAAA,gBAAA,KAAA,EAAA;YAOvD,SAAS;CAAE,MAAM;CAAS,WAAW;CAAkB,CAAC,CAAA,EAAA,iBAAA,WAAA,iBAAA,KAAA,EAAA;+BAlC1D,cAAc,qBAAqB,CAAA,EAAA,iBAAA"}
@@ -1,7 +1,7 @@
1
1
  import { TemporalMixinInterface } from "../../../elements/EFTemporal.js";
2
2
  import { FocusContext } from "../../focusContext.js";
3
3
  import { TrimChangeDetail } from "../TrimHandles.js";
4
- import * as lit44 from "lit";
4
+ import * as _$lit from "lit";
5
5
  import { LitElement, PropertyValueMap, ReactiveController, TemplateResult, nothing } from "lit";
6
6
 
7
7
  //#region src/gui/timeline/tracks/TrackItem.d.ts
@@ -19,7 +19,7 @@ declare class ElementTrackController implements ReactiveController {
19
19
  }
20
20
  declare const TrackItem_base: typeof LitElement;
21
21
  declare class TrackItem extends TrackItem_base {
22
- static styles: lit44.CSSResult[];
22
+ static styles: _$lit.CSSResult[];
23
23
  focusContext?: FocusContext;
24
24
  focusedElement?: HTMLElement | null;
25
25
  get isFocused(): boolean;
@@ -1,5 +1,5 @@
1
1
  import { TWMixin } from "../../TWMixin2.js";
2
- import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
2
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
3
3
  import { focusContext } from "../../focusContext.js";
4
4
  import { focusedElementContext } from "../../focusedElementContext.js";
5
5
  import { EFAudio } from "../../../elements/EFAudio.js";
@@ -14,7 +14,6 @@ import { consume } from "@lit/context";
14
14
  import { LitElement, css, html, nothing } from "lit";
15
15
  import { customElement, property } from "lit/decorators.js";
16
16
  import { styleMap } from "lit/directives/style-map.js";
17
-
18
17
  //#region src/gui/timeline/tracks/TrackItem.ts
19
18
  var ElementTrackController = class {
20
19
  constructor(host, track) {
@@ -45,7 +44,7 @@ var ElementTrackController = class {
45
44
  }
46
45
  hostUpdated() {}
47
46
  };
48
- let TrackItem = class TrackItem$1 extends TWMixin(LitElement) {
47
+ let TrackItem = class TrackItem extends TWMixin(LitElement) {
49
48
  constructor(..._args) {
50
49
  super(..._args);
51
50
  this.element = new EFTimegroup();
@@ -264,7 +263,7 @@ __decorate([property({
264
263
  attribute: false
265
264
  })], TrackItem.prototype, "showSelectors", void 0);
266
265
  TrackItem = __decorate([customElement("ef-track-item")], TrackItem);
267
-
268
266
  //#endregion
269
267
  export { TrackItem };
268
+
270
269
  //# sourceMappingURL=TrackItem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TrackItem.js","names":["host: LitElement","track: TrackItem","TrackItem"],"sources":["../../../../src/gui/timeline/tracks/TrackItem.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport {\n css,\n html,\n LitElement,\n nothing,\n type PropertyValueMap,\n type ReactiveController,\n type TemplateResult,\n} from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport { type TemporalMixinInterface } from \"../../../elements/EFTemporal.js\";\nimport { EFTimegroup } from \"../../../elements/EFTimegroup.js\";\nimport { EFVideo } from \"../../../elements/EFVideo.js\";\nimport { EFAudio } from \"../../../elements/EFAudio.js\";\nimport { EFImage } from \"../../../elements/EFImage.js\";\nimport { EFText } from \"../../../elements/EFText.js\";\nimport { type FocusContext, focusContext } from \"../../focusContext.js\";\nimport { focusedElementContext } from \"../../focusedElementContext.js\";\nimport { TWMixin } from \"../../TWMixin.js\";\nimport { phosphorIcon, ICONS } from \"../../icons.js\";\nimport \"../TrimHandles.js\";\nimport type { TrimChangeDetail } from \"../TrimHandles.js\";\nimport { getElementTypeColor } from \"../../theme.js\";\n\nclass ElementTrackController implements ReactiveController {\n private lastDuration = 0;\n private durationCheckFrame?: number;\n\n constructor(\n private host: LitElement,\n private track: TrackItem,\n ) {\n this.host.addController(this);\n }\n\n remove() {\n this.host.removeController(this);\n if (this.durationCheckFrame) {\n cancelAnimationFrame(this.durationCheckFrame);\n }\n }\n\n hostDisconnected() {\n this.host.removeController(this);\n if (this.durationCheckFrame) {\n cancelAnimationFrame(this.durationCheckFrame);\n }\n }\n\n hostConnected(): void {\n // Start watching for duration changes\n this.lastDuration = (this.host as any).durationMs ?? 0;\n this.checkDuration();\n }\n\n private checkDuration = () => {\n const currentDuration = (this.host as any).durationMs ?? 0;\n if (currentDuration !== this.lastDuration) {\n this.lastDuration = currentDuration;\n // Duration changed - trigger re-render of the track\n this.track.requestUpdate();\n }\n // Keep checking if duration is still 0 (waiting for media to load)\n if (currentDuration === 0) {\n this.durationCheckFrame = requestAnimationFrame(this.checkDuration);\n }\n };\n\n hostUpdated(): void {\n // TEMPORARILY DISABLED: This causes every TrackItem to re-render on every frame\n // during playback, even though TrackItem doesn't display currentTimeMs.\n // Duration changes are now handled separately via checkDuration()\n }\n}\n\n@customElement(\"ef-track-item\")\nexport class TrackItem extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: block;\n }\n .trim-container {\n position: relative;\n border-radius: 3px;\n transition: background-color 0.15s ease, box-shadow 0.15s ease;\n }\n \n :host(:hover) .trim-container {\n box-shadow: inset 0 0 0 1px var(--ef-color-hover);\n }\n \n :host([data-focused]) .trim-container {\n box-shadow: inset 0 0 0 1px var(--ef-color-primary);\n }\n `,\n ];\n\n @consume({ context: focusContext, subscribe: true })\n focusContext?: FocusContext;\n\n @consume({ context: focusedElementContext, subscribe: true })\n focusedElement?: HTMLElement | null;\n\n get isFocused() {\n return this.element && this.focusContext?.focusedElement === this.element;\n }\n\n /**\n * Get element type for styling and icons\n */\n protected getElementType():\n | \"video\"\n | \"audio\"\n | \"image\"\n | \"text\"\n | \"timegroup\"\n | \"captions\"\n | \"unknown\" {\n // Check for captions element\n if (\n (this.element as any).tagName === \"EF-CAPTIONS\" ||\n (this.element as any).tagName?.toLowerCase() === \"ef-captions\"\n ) {\n return \"captions\";\n }\n if (this.element instanceof EFVideo) return \"video\";\n if (this.element instanceof EFAudio) return \"audio\";\n if (this.element instanceof EFImage) return \"image\";\n if (this.element instanceof EFText) return \"text\";\n if (this.element instanceof EFTimegroup) return \"timegroup\";\n return \"unknown\";\n }\n\n /**\n * Get color for element type using shared theme utility\n */\n protected getElementTypeColor(): string {\n const type = this.getElementType();\n return getElementTypeColor(type, this);\n }\n\n /**\n * @deprecated Use getElementTypeColor() instead\n */\n protected getElementTypeColorOld(): string {\n const type = this.getElementType();\n switch (type) {\n case \"video\":\n return \"rgb(59, 130, 246)\"; // Blue\n case \"audio\":\n return \"rgb(34, 197, 94)\"; // Green\n case \"image\":\n return \"rgb(168, 85, 247)\"; // Purple\n case \"text\":\n return \"rgb(249, 115, 22)\"; // Orange\n case \"captions\":\n return \"rgb(34, 197, 94)\"; // Green (same as audio, but distinct usage)\n case \"timegroup\":\n return \"rgb(148, 163, 184)\"; // Gray\n default:\n return \"rgb(148, 163, 184)\"; // Gray\n }\n }\n\n /**\n * Get icon for element type\n */\n protected getElementIcon(): TemplateResult | typeof nothing {\n const type = this.getElementType();\n switch (type) {\n case \"video\":\n return phosphorIcon(ICONS.filmStrip, 14);\n case \"audio\":\n return phosphorIcon(ICONS.speakerHigh, 14);\n case \"image\":\n return phosphorIcon(ICONS.image, 14);\n case \"text\":\n return phosphorIcon(ICONS.textT, 14);\n case \"captions\":\n return phosphorIcon(ICONS.subtitles, 14);\n case \"timegroup\":\n return phosphorIcon(ICONS.filmSlate, 14);\n default:\n return nothing;\n }\n }\n\n /**\n * Format duration for display\n */\n protected formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${Math.round(ms)}ms`;\n }\n const seconds = (ms / 1000).toFixed(1);\n return `${seconds}s`;\n }\n\n /**\n * Get tooltip text with element info\n */\n protected getTooltipText(): string {\n const elementId = (this.element as HTMLElement)?.id || \"\";\n const type = this.getElementType();\n const duration = this.formatDuration(this.element.durationMs ?? 0);\n const startTime = this.formatDuration(this.element.startTimeMs ?? 0);\n const endTime = this.formatDuration(\n (this.element.startTimeMs ?? 0) + (this.element.durationMs ?? 0),\n );\n\n const parts = [];\n if (elementId) parts.push(elementId);\n parts.push(`${type} • ${duration}`);\n if (this.element.startTimeMs > 0) {\n parts.push(`${startTime} → ${endTime}`);\n }\n\n // Add composition mode for timegroups\n if (type === \"timegroup\") {\n const mode = (this.element as any).mode || \"fixed\";\n parts.push(`mode: ${mode}`);\n }\n\n return parts.join(\" • \");\n }\n\n @property({ type: Object, attribute: false })\n element: TemporalMixinInterface & LitElement = new EFTimegroup();\n\n @property({ type: Number, attribute: \"pixels-per-ms\" })\n pixelsPerMs = 0.04;\n\n @property({ type: Boolean, attribute: \"enable-trim\" })\n enableTrim = false;\n\n @property({ type: Array, attribute: false })\n hideSelectors?: string[];\n\n @property({ type: Array, attribute: false })\n showSelectors?: string[];\n\n get gutterStyles() {\n // Always use absolute positioning (startTimeMs) for flat row architecture.\n // startTimeMs already includes the cumulative position from all parent timegroups.\n const startMs = this.element.startTimeMs;\n const leftOffset = startMs;\n\n return {\n position: \"relative\",\n left: `${this.pixelsPerMs * leftOffset}px`,\n width: `${this.pixelsPerMs * (this.element.intrinsicDurationMs ?? this.element.durationMs)}px`,\n };\n }\n\n get trimPortionStyles() {\n // The trim container starts at 0 relative to the gutter,\n // which is already positioned at the element's absolute startTimeMs.\n return {\n width: `${this.pixelsPerMs * this.element.durationMs}px`,\n left: \"0px\",\n };\n }\n\n protected handleTrimChange(e: CustomEvent<TrimChangeDetail>): void {\n const { type, value } = e.detail;\n\n this.element.trimStartMs = value.startMs;\n this.element.trimEndMs = value.endMs;\n\n this.dispatchEvent(\n new CustomEvent(\"track-trim-change\", {\n detail: {\n elementId: this.element.id || \"\",\n type,\n value,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n contents(): TemplateResult | typeof nothing {\n return nothing;\n }\n\n animations() {\n // TEMPORARILY DISABLED: getAnimations() is expensive and called on every render\n // TODO: Cache animations or only compute when element structure changes\n return [];\n\n // const animations = this.element.getAnimations();\n // return animations.map((animation) => {\n // const effect = animation.effect;\n // if (!(effect instanceof KeyframeEffect)) {\n // return nothing;\n // }\n // const start = effect.getTiming().delay ?? 0;\n // const duration = effect.getTiming().duration;\n // if (duration === null) {\n // return nothing;\n // }\n // const keyframes = effect.getKeyframes();\n // const firstKeyframe = keyframes[0];\n // if (!firstKeyframe) {\n // return nothing;\n // }\n // const properties = new Set(Object.keys(firstKeyframe));\n // for (const key of CommonEffectKeys) {\n // properties.delete(key);\n // }\n\n // return html`<div\n // class=\"relative h-[5px] opacity-50\"\n // label=\"animation\"\n // style=${styleMap({\n // left: `${this.pixelsPerMs * start}px`,\n // width: `${this.pixelsPerMs * Number(duration)}px`,\n // backgroundColor: \"var(--filmstrip-animation-bg)\",\n // })}\n // >\n // ${effect.getKeyframes().map((keyframe) => {\n // return html`<div\n // class=\"absolute top-0 h-full w-1\"\n // style=${styleMap({\n // left: `${\n // this.pixelsPerMs * keyframe.computedOffset * Number(duration)\n // }px`,\n // backgroundColor: \"var(--filmstrip-keyframe-bg)\",\n // })}\n // ></div>`;\n // })}\n // </div>`;\n // });\n }\n\n renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing {\n return nothing;\n }\n\n render() {\n const elementId = (this.element as HTMLElement).id || \"\";\n const trimStartMs = this.element.trimStartMs ?? 0;\n const trimEndMs = this.element.trimEndMs ?? 0;\n const intrinsicDurationMs = this.element.intrinsicDurationMs ?? this.element.durationMs;\n\n const typeColor = this.getElementTypeColor();\n\n return html`<div style=${styleMap(this.gutterStyles)}>\n <div\n ?data-focused=${this.isFocused}\n @mouseenter=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = this.element;\n }\n }}\n @mouseleave=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = null;\n }\n }}\n >\n <div\n ?data-focused=${this.isFocused}\n class=\"trim-container\"\n style=${styleMap({\n ...this.trimPortionStyles,\n height: \"var(--timeline-track-height, 22px)\",\n backgroundColor: this.isFocused ? \"rgba(59, 130, 246, 0.25)\" : \"rgba(30, 41, 59, 0.8)\",\n borderLeft: `3px solid ${typeColor}`,\n })}\n title=\"${this.getTooltipText()}\"\n >\n ${this.animations()}\n ${this.contents()}\n ${\n this.enableTrim\n ? html`<ef-trim-handles\n mode=\"track\"\n element-id=${elementId}\n pixels-per-ms=${this.pixelsPerMs}\n trim-start-ms=${trimStartMs}\n trim-end-ms=${trimEndMs}\n intrinsic-duration-ms=${intrinsicDurationMs}\n @trim-change=${this.handleTrimChange}\n ></ef-trim-handles>`\n : nothing\n }\n </div>\n </div>\n ${this.renderChildren()}\n </div>`;\n }\n\n protected trackController?: ElementTrackController;\n\n update(changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>) {\n if (changedProperties.has(\"element\") && this.element instanceof LitElement) {\n this.trackController?.remove();\n this.trackController = new ElementTrackController(this.element, this);\n }\n super.update(changedProperties);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-track-item\": TrackItem;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TrackItem.js","names":[],"sources":["../../../../src/gui/timeline/tracks/TrackItem.ts"],"mappings":"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"}
@@ -1,21 +1,20 @@
1
+ import { TemplateResult as TemplateResult$1 } from "../../../node_modules/lit-html/development/lit-html.js";
2
+ import { Ref } from "../../../node_modules/lit-html/development/directives/ref.js";
1
3
  import { TrackItem } from "./TrackItem.js";
2
- import "./EFThumbnailStrip.js";
3
- import * as lit40 from "lit";
4
- import * as lit_html36 from "lit-html";
5
- import * as lit_html_directives_ref_js5 from "lit-html/directives/ref.js";
4
+ import * as _$lit from "lit";
6
5
 
7
6
  //#region src/gui/timeline/tracks/VideoTrack.d.ts
8
7
  declare class EFVideoTrack extends TrackItem {
9
8
  #private;
10
- static styles: lit40.CSSResult[];
11
- audioCanvasRef: lit_html_directives_ref_js5.Ref<HTMLCanvasElement>;
9
+ static styles: _$lit.CSSResult[];
10
+ audioCanvasRef: Ref<HTMLCanvasElement>;
12
11
  private _timelineState?;
13
12
  private _waveformData;
14
13
  private _hasAudio;
15
14
  connectedCallback(): void;
16
15
  disconnectedCallback(): void;
17
16
  updated(changedProperties: Map<string | number | symbol, unknown>): void;
18
- render(): lit_html36.TemplateResult<1>;
17
+ render(): TemplateResult$1<1>;
19
18
  }
20
19
  declare global {
21
20
  interface HTMLElementTagNameMap {
@@ -1,4 +1,4 @@
1
- import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
1
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
2
2
  import { EFVideo } from "../../../elements/EFVideo.js";
3
3
  import { TrackItem } from "./TrackItem.js";
4
4
  import { extractWaveformData } from "./waveformUtils.js";
@@ -9,7 +9,6 @@ import { css, html, nothing } from "lit";
9
9
  import { customElement, state } from "lit/decorators.js";
10
10
  import { styleMap } from "lit/directives/style-map.js";
11
11
  import { createRef, ref } from "lit/directives/ref.js";
12
-
13
12
  //#region src/gui/timeline/tracks/VideoTrack.ts
14
13
  /** Padding for virtual rendering */
15
14
  const VIRTUAL_RENDER_PADDING_PX = 100;
@@ -17,7 +16,7 @@ const VIRTUAL_RENDER_PADDING_PX = 100;
17
16
  const THUMBNAIL_HEIGHT = 24;
18
17
  /** Height of audio section when present */
19
18
  const AUDIO_SECTION_HEIGHT = 14;
20
- let EFVideoTrack = class EFVideoTrack$1 extends TrackItem {
19
+ let EFVideoTrack = class EFVideoTrack extends TrackItem {
21
20
  constructor(..._args) {
22
21
  super(..._args);
23
22
  this.audioCanvasRef = createRef();
@@ -257,6 +256,6 @@ __decorate([consume({
257
256
  __decorate([state()], EFVideoTrack.prototype, "_waveformData", void 0);
258
257
  __decorate([state()], EFVideoTrack.prototype, "_hasAudio", void 0);
259
258
  EFVideoTrack = __decorate([customElement("ef-video-track")], EFVideoTrack);
260
-
261
259
  //#endregion
260
+
262
261
  //# sourceMappingURL=VideoTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VideoTrack.js","names":["EFVideoTrack","#checkAndLoadAudioWaveform","#lastSrc","#abortController","#scheduleRender","#renderRequested","#renderAudioOverlay","#drawAudioWaveform","#getTrackHeight"],"sources":["../../../../src/gui/timeline/tracks/VideoTrack.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { EFVideo } from \"../../../elements/EFVideo.js\";\n\n// TrackItem must be pre-loaded before this module is imported\n// See preloadTracks.ts for the initialization sequence\nimport { TrackItem } from \"./TrackItem.js\";\nimport { extractWaveformData, type WaveformData } from \"./waveformUtils.js\";\nimport { timelineStateContext, type TimelineState } from \"../timelineStateContext.js\";\nimport \"./EFThumbnailStrip.js\";\n\n/** Padding for virtual rendering */\nconst VIRTUAL_RENDER_PADDING_PX = 100;\n\n/** Height of thumbnail section */\nconst THUMBNAIL_HEIGHT = 24;\n/** Height of audio section when present */\nconst AUDIO_SECTION_HEIGHT = 14;\n\n@customElement(\"ef-video-track\")\nexport class EFVideoTrack extends TrackItem {\n static override styles = [\n ...TrackItem.styles,\n css`\n .video-content {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .thumbnail-section {\n position: relative;\n flex: 0 0 ${THUMBNAIL_HEIGHT}px;\n height: ${THUMBNAIL_HEIGHT}px;\n background: var(--ef-color-bg-inset);\n }\n .audio-section {\n position: relative;\n flex: 0 0 ${AUDIO_SECTION_HEIGHT}px;\n height: ${AUDIO_SECTION_HEIGHT}px;\n background: var(--ef-color-bg-elevated);\n border-top: 1px solid var(--ef-color-border-subtle);\n overflow: hidden;\n }\n .audio-section-canvas {\n position: absolute;\n top: 0;\n height: 100%;\n }\n `,\n ];\n\n audioCanvasRef = createRef<HTMLCanvasElement>();\n\n @consume({ context: timelineStateContext, subscribe: true })\n @state()\n private _timelineState?: TimelineState;\n\n @state()\n private _waveformData: WaveformData | null = null;\n\n @state()\n private _hasAudio = false;\n\n #lastSrc: string | null = null;\n #abortController: AbortController | null = null;\n #renderRequested = false;\n\n /**\n * Check if video has audio and load waveform data\n */\n async #checkAndLoadAudioWaveform(): Promise<void> {\n const video = this.element as EFVideo;\n const src = video?.src;\n\n if (!src || src === this.#lastSrc) {\n return;\n }\n\n this.#lastSrc = src;\n this._hasAudio = false;\n this._waveformData = null;\n\n // Cancel any in-progress load\n this.#abortController?.abort();\n this.#abortController = new AbortController();\n\n try {\n // Wait for media engine to determine if video has audio\n if (video.mediaEngineTask) {\n const mediaEngine = await video.mediaEngineTask.taskComplete;\n if (mediaEngine?.tracks.audio) {\n this._hasAudio = true;\n\n const waveformData = await extractWaveformData(video, this.#abortController.signal);\n\n if (waveformData) {\n this._waveformData = waveformData;\n this.#scheduleRender();\n }\n }\n }\n } catch (error) {\n if (!(error instanceof DOMException && error.name === \"AbortError\")) {\n // Silently fail - audio overlay is optional\n }\n }\n }\n\n #scheduleRender(): void {\n if (this.#renderRequested) return;\n this.#renderRequested = true;\n\n requestAnimationFrame(() => {\n this.#renderRequested = false;\n this.#renderAudioOverlay();\n });\n }\n\n #renderAudioOverlay(): void {\n const canvas = this.audioCanvasRef.value;\n const waveformData = this._waveformData;\n\n if (!canvas || !waveformData || !this._hasAudio) return;\n\n const video = this.element as EFVideo;\n const durationMs = video.durationMs ?? 0;\n if (durationMs === 0) return;\n\n const pixelsPerMs = this._timelineState?.pixelsPerMs ?? this.pixelsPerMs;\n const trackWidthPx = durationMs * pixelsPerMs;\n const trackStartMs = video.startTimeMs ?? 0;\n const trackStartPx = trackStartMs * pixelsPerMs;\n\n // Get scroll/viewport info\n const scrollLeft = this._timelineState?.viewportScrollLeft ?? 0;\n const viewportWidth = this._timelineState?.viewportWidth ?? 800;\n\n // Calculate visible region\n const visibleLeftPx = scrollLeft - VIRTUAL_RENDER_PADDING_PX;\n const visibleRightPx = scrollLeft + viewportWidth + VIRTUAL_RENDER_PADDING_PX;\n const trackEndPx = trackStartPx + trackWidthPx;\n\n // Check visibility\n if (trackEndPx < visibleLeftPx || trackStartPx > visibleRightPx) {\n canvas.style.display = \"none\";\n return;\n }\n canvas.style.display = \"block\";\n\n // Calculate visible portion within track\n const visibleStartInTrack = Math.max(0, visibleLeftPx - trackStartPx);\n const visibleEndInTrack = Math.min(trackWidthPx, visibleRightPx - trackStartPx);\n const visibleWidthPx = visibleEndInTrack - visibleStartInTrack;\n\n if (visibleWidthPx <= 0) return;\n\n const height = AUDIO_SECTION_HEIGHT;\n const dpr = window.devicePixelRatio || 1;\n\n // Set canvas size\n const targetWidth = Math.ceil(visibleWidthPx * dpr);\n const targetHeight = Math.ceil(height * dpr);\n\n if (canvas.width !== targetWidth || canvas.height !== targetHeight) {\n canvas.width = targetWidth;\n canvas.height = targetHeight;\n }\n\n canvas.style.left = `${visibleStartInTrack}px`;\n canvas.style.width = `${visibleWidthPx}px`;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, visibleWidthPx, height);\n\n // Calculate time range to render\n const sourceInMs = video.sourceStartMs ?? 0;\n const timeStartMs = sourceInMs + visibleStartInTrack / pixelsPerMs;\n const timeEndMs = sourceInMs + visibleEndInTrack / pixelsPerMs;\n\n // Draw waveform in dedicated section\n this.#drawAudioWaveform(ctx, waveformData, visibleWidthPx, height, timeStartMs, timeEndMs);\n }\n\n #drawAudioWaveform(\n ctx: CanvasRenderingContext2D,\n waveformData: WaveformData,\n width: number,\n height: number,\n startMs: number,\n endMs: number,\n ): void {\n const { peaks, samplesPerSecond } = waveformData;\n\n const startSample = Math.floor((startMs / 1000) * samplesPerSecond);\n const endSample = Math.ceil((endMs / 1000) * samplesPerSecond);\n const sampleCount = endSample - startSample;\n\n if (sampleCount <= 0 || width <= 0) return;\n\n const centerY = height / 2;\n const halfHeight = height / 2 - 1;\n const pixelsPerSample = width / sampleCount;\n\n // Draw filled waveform\n ctx.fillStyle =\n getComputedStyle(this).getPropertyValue(\"--ef-color-success\").trim() || \"rgb(74, 222, 128)\";\n ctx.globalAlpha = 0.9;\n ctx.beginPath();\n\n // Draw top half (max values) left to right\n for (let i = 0; i <= sampleCount; i++) {\n const sampleIndex = startSample + i;\n const peakIndex = sampleIndex * 2;\n if (peakIndex + 1 >= peaks.length) break;\n\n const maxValue = peaks[peakIndex + 1] ?? 0;\n const px = i * pixelsPerSample;\n const py = centerY - maxValue * halfHeight;\n\n if (i === 0) {\n ctx.moveTo(px, py);\n } else {\n ctx.lineTo(px, py);\n }\n }\n\n // Draw bottom half (min values) right to left\n for (let i = sampleCount; i >= 0; i--) {\n const sampleIndex = startSample + i;\n const peakIndex = sampleIndex * 2;\n if (peakIndex >= peaks.length) continue;\n\n const minValue = peaks[peakIndex] ?? 0;\n const px = i * pixelsPerSample;\n const py = centerY - minValue * halfHeight;\n\n ctx.lineTo(px, py);\n }\n\n ctx.closePath();\n ctx.fill();\n\n // Draw center line\n ctx.globalAlpha = 0.3;\n ctx.strokeStyle =\n getComputedStyle(this).getPropertyValue(\"--ef-color-success\").trim() || \"rgb(74, 222, 128)\";\n ctx.lineWidth = 1;\n ctx.beginPath();\n ctx.moveTo(0, centerY);\n ctx.lineTo(width, centerY);\n ctx.stroke();\n\n ctx.globalAlpha = 1;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.#checkAndLoadAudioWaveform();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.#abortController?.abort();\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>): void {\n super.updated(changedProperties);\n\n const video = this.element as EFVideo;\n if (video?.src !== this.#lastSrc) {\n this.#checkAndLoadAudioWaveform();\n }\n\n if (changedProperties.has(\"_timelineState\") || changedProperties.has(\"_waveformData\")) {\n this.#scheduleRender();\n }\n\n // Always schedule render after update\n if (this._waveformData) {\n this.#scheduleRender();\n }\n }\n\n /**\n * Get the total track height based on whether audio is present\n */\n #getTrackHeight(): number {\n if (this._hasAudio && this._waveformData) {\n return THUMBNAIL_HEIGHT + AUDIO_SECTION_HEIGHT;\n }\n return THUMBNAIL_HEIGHT;\n }\n\n override render() {\n const video = this.element as EFVideo;\n const elementId = (this.element as HTMLElement).id || \"\";\n\n // Don't render thumbnail strip until we have a valid EFVideo element\n if (!(video instanceof EFVideo)) {\n return html``;\n }\n const trimStartMs = this.element.trimStartMs ?? 0;\n const trimEndMs = this.element.trimEndMs ?? 0;\n const intrinsicDurationMs = this.element.intrinsicDurationMs ?? this.element.durationMs;\n\n const trackHeight = this.#getTrackHeight();\n const hasAudioSection = this._hasAudio && this._waveformData;\n\n const typeColor = this.getElementTypeColor();\n\n return html`<div style=${styleMap(this.gutterStyles)}>\n <div\n ?data-focused=${this.isFocused}\n @mouseenter=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = this.element;\n }\n }}\n @mouseleave=${() => {\n if (this.focusContext) {\n this.focusContext.focusedElement = null;\n }\n }}\n >\n <div\n ?data-focused=${this.isFocused}\n class=\"trim-container\"\n style=${styleMap({\n ...this.trimPortionStyles,\n height: `${trackHeight}px`,\n backgroundColor: this.isFocused\n ? \"color-mix(in srgb, var(--ef-color-primary) 25%, transparent)\"\n : \"var(--ef-color-bg-inset)\",\n borderLeft: `3px solid ${typeColor}`,\n borderRadius: \"3px\",\n })}\n >\n <div class=\"video-content\">\n <div class=\"thumbnail-section\">\n <ef-thumbnail-strip\n .targetElement=${this.element}\n thumbnail-height=${THUMBNAIL_HEIGHT}\n thumbnail-spacing-px=\"48\"\n pixels-per-ms=${this.pixelsPerMs}\n ></ef-thumbnail-strip>\n </div>\n ${\n hasAudioSection\n ? html`<div class=\"audio-section\">\n <canvas ${ref(this.audioCanvasRef)} class=\"audio-section-canvas\"></canvas>\n </div>`\n : nothing\n }\n </div>\n ${\n this.enableTrim\n ? html`<ef-trim-handles\n element-id=${elementId}\n pixels-per-ms=${this.pixelsPerMs}\n trim-start-ms=${trimStartMs}\n trim-end-ms=${trimEndMs}\n intrinsic-duration-ms=${intrinsicDurationMs}\n @trim-change=${this.handleTrimChange}\n ></ef-trim-handles>`\n : nothing\n }\n </div>\n </div>\n ${this.renderChildren()}\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-video-track\": EFVideoTrack;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"VideoTrack.js","names":["#checkAndLoadAudioWaveform","#lastSrc","#abortController","#scheduleRender","#renderRequested","#renderAudioOverlay","#drawAudioWaveform","#getTrackHeight"],"sources":["../../../../src/gui/timeline/tracks/VideoTrack.ts"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
- import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
1
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js";
2
2
  import { ICONS, phosphorIcon } from "../../icons.js";
3
3
  import { TrackItem } from "./TrackItem.js";
4
4
  import { nothing } from "lit";
5
5
  import { customElement } from "lit/decorators.js";
6
-
7
6
  //#region src/gui/timeline/tracks/WaveformTrack.ts
8
- let EFWaveformTrack = class EFWaveformTrack$1 extends TrackItem {
7
+ let EFWaveformTrack = class EFWaveformTrack extends TrackItem {
9
8
  contents() {
10
9
  return phosphorIcon(ICONS.waveform);
11
10
  }
@@ -14,6 +13,6 @@ let EFWaveformTrack = class EFWaveformTrack$1 extends TrackItem {
14
13
  }
15
14
  };
16
15
  EFWaveformTrack = __decorate([customElement("ef-waveform-track")], EFWaveformTrack);
17
-
18
16
  //#endregion
17
+
19
18
  //# sourceMappingURL=WaveformTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WaveformTrack.js","names":["EFWaveformTrack"],"sources":["../../../../src/gui/timeline/tracks/WaveformTrack.ts"],"sourcesContent":["import { nothing, type TemplateResult } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { phosphorIcon, ICONS } from \"../../icons.js\";\n// TrackItem must be pre-loaded before this module is imported\n// See preloadTracks.ts for the initialization sequence\nimport { TrackItem } from \"./TrackItem.js\";\n\n@customElement(\"ef-waveform-track\")\nexport class EFWaveformTrack extends TrackItem {\n contents() {\n return phosphorIcon(ICONS.waveform);\n }\n\n renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing {\n return nothing;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-waveform-track\": EFWaveformTrack;\n }\n}\n"],"mappings":";;;;;;;AAQO,4BAAMA,0BAAwB,UAAU;CAC7C,WAAW;AACT,SAAO,aAAa,MAAM,SAAS;;CAGrC,iBAA6E;AAC3E,SAAO;;;8BAPV,cAAc,oBAAoB"}
1
+ {"version":3,"file":"WaveformTrack.js","names":[],"sources":["../../../../src/gui/timeline/tracks/WaveformTrack.ts"],"mappings":";;;;;;AAQO,IAAA,kBAAA,MAAM,wBAAwB,UAAU;CAC7C,WAAW;AACT,SAAO,aAAa,MAAM,SAAS;;CAGrC,iBAA6E;AAC3E,SAAO;;;8BAPV,cAAc,oBAAoB,CAAA,EAAA,gBAAA"}
@@ -1 +1 @@
1
- import { TrackItem } from "./TrackItem.js";
1
+ import "./TrackItem.js";
@@ -1,9 +1 @@
1
- import "./ensureTrackItemInit.js";
2
- import "./AudioTrack.js";
3
- import "./VideoTrack.js";
4
- import "./ImageTrack.js";
5
- import "./TimegroupTrack.js";
6
- import "./TextTrack.js";
7
- import "./HTMLTrack.js";
8
- import "./CaptionsTrack.js";
9
- import "./WaveformTrack.js";
1
+ export { };
@@ -8,7 +8,6 @@ import { EFWaveform } from "../../../elements/EFWaveform.js";
8
8
  import { shouldRenderElement } from "../../hierarchy/EFHierarchyItem.js";
9
9
  import { EFTimegroup } from "../../../elements/EFTimegroup.js";
10
10
  import { html, nothing } from "lit";
11
-
12
11
  //#region src/gui/timeline/tracks/renderTrackChildren.ts
13
12
  function renderTrackChildren(children, pixelsPerMs, hideSelectors, showSelectors, skipRootFiltering = false, enableTrim = false, useAbsolutePosition = false) {
14
13
  return children.map((child) => {
@@ -113,7 +112,7 @@ function renderTrackChildren(children, pixelsPerMs, hideSelectors, showSelectors
113
112
  return nothing;
114
113
  });
115
114
  }
116
-
117
115
  //#endregion
118
116
  export { renderTrackChildren };
117
+
119
118
  //# sourceMappingURL=renderTrackChildren.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderTrackChildren.js","names":[],"sources":["../../../../src/gui/timeline/tracks/renderTrackChildren.ts"],"sourcesContent":["import { html, nothing, type TemplateResult } from \"lit\";\nimport { EFAudio } from \"../../../elements/EFAudio.js\";\nimport { EFCaptions, EFCaptionsActiveWord } from \"../../../elements/EFCaptions.js\";\nimport { EFImage } from \"../../../elements/EFImage.js\";\nimport { EFText } from \"../../../elements/EFText.js\";\nimport { EFTextSegment } from \"../../../elements/EFTextSegment.js\";\nimport { EFTimegroup } from \"../../../elements/EFTimegroup.js\";\nimport { EFVideo } from \"../../../elements/EFVideo.js\";\nimport { EFWaveform } from \"../../../elements/EFWaveform.js\";\nimport { shouldRenderElement } from \"../../hierarchy/EFHierarchyItem.js\";\n\n// NOTE: Track components are NOT imported here to avoid circular dependencies.\n// They must be pre-loaded elsewhere before this module is used.\n// The custom elements (ef-audio-track, ef-video-track, etc.) are rendered\n// via Lit templates which will work as long as the elements are registered.\n// See preloadTracks.ts for the track component initialization.\n\nexport function renderTrackChildren(\n children: Element[],\n pixelsPerMs: number,\n hideSelectors?: string[],\n showSelectors?: string[],\n skipRootFiltering = false,\n enableTrim = false,\n useAbsolutePosition = false,\n): Array<TemplateResult<1> | typeof nothing> {\n return children.map((child) => {\n if (!skipRootFiltering && !shouldRenderElement(child, hideSelectors, showSelectors)) {\n return nothing;\n }\n\n if (child instanceof EFTimegroup) {\n return html`<ef-timegroup-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n >\n </ef-timegroup-track>`;\n }\n if (child instanceof EFImage) {\n return html`<ef-image-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-image-track>`;\n }\n if (child instanceof EFAudio) {\n return html`<ef-audio-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-audio-track>`;\n }\n if (child instanceof EFVideo) {\n return html`<ef-video-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-video-track>`;\n }\n if (child instanceof EFCaptions) {\n return html`<ef-captions-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-captions-track>`;\n }\n if (child instanceof EFCaptionsActiveWord) {\n return html`<ef-captions-active-word-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-captions-active-word-track>`;\n }\n if (child instanceof EFText) {\n return html`<ef-text-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-text-track>`;\n }\n if (child instanceof EFTextSegment) {\n return html`<ef-text-segment-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-text-segment-track>`;\n }\n if (child.tagName === \"EF-CAPTIONS-SEGMENT\") {\n return html`<ef-captions-segment-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-captions-segment-track>`;\n }\n if (child.tagName === \"EF-CAPTIONS-BEFORE-ACTIVE-WORD\") {\n return html`<ef-captions-before-word-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-captions-before-word-track>`;\n }\n if (child.tagName === \"EF-CAPTIONS-AFTER-ACTIVE-WORD\") {\n return html`<ef-captions-after-word-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-captions-after-word-track>`;\n }\n if (child instanceof EFWaveform) {\n return html`<ef-waveform-track\n .element=${child}\n pixels-per-ms=${pixelsPerMs}\n ?enable-trim=${enableTrim}\n ?use-absolute-position=${useAbsolutePosition}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-waveform-track>`;\n }\n return nothing;\n });\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,SAAgB,oBACd,UACA,aACA,eACA,eACA,oBAAoB,OACpB,aAAa,OACb,sBAAsB,OACqB;AAC3C,QAAO,SAAS,KAAK,UAAU;AAC7B,MAAI,CAAC,qBAAqB,CAAC,oBAAoB,OAAO,eAAe,cAAc,CACjF,QAAO;AAGT,MAAI,iBAAiB,YACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;;AAInC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,WACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,qBACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,OACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,cACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,sBACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,iCACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,gCACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,WACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,SAAO;GACP"}
1
+ {"version":3,"file":"renderTrackChildren.js","names":[],"sources":["../../../../src/gui/timeline/tracks/renderTrackChildren.ts"],"mappings":";;;;;;;;;;;AAiBA,SAAgB,oBACd,UACA,aACA,eACA,eACA,oBAAoB,OACpB,aAAa,OACb,sBAAsB,OACqB;AAC3C,QAAO,SAAS,KAAK,UAAU;AAC7B,MAAI,CAAC,qBAAqB,CAAC,oBAAoB,OAAO,eAAe,cAAc,CACjF,QAAO;AAGT,MAAI,iBAAiB,YACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;;AAInC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,QACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,WACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,qBACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,OACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,cACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,sBACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,iCACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,MAAM,YAAY,gCACpB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,MAAI,iBAAiB,WACnB,QAAO,IAAI;mBACE,MAAM;wBACD,YAAY;uBACb,WAAW;iCACD,oBAAoB;yBAC5B,cAAc;yBACd,cAAc;;AAGnC,SAAO;GACP"}
@@ -1,6 +1,3 @@
1
- //#region src/gui/timeline/tracks/waveformUtils.ts
2
- /** Samples per second for waveform data - balances resolution vs. data size */
3
- const WAVEFORM_SAMPLES_PER_SECOND = 100;
4
1
  /** Simple cache for waveform data keyed by audio URL */
5
2
  const waveformCache = /* @__PURE__ */ new Map();
6
3
  /**
@@ -36,9 +33,9 @@ async function extractWaveformData(element, signal) {
36
33
  }
37
34
  signal?.throwIfAborted();
38
35
  const waveformData = {
39
- peaks: extractPeaksFromBuffer(audioBuffer, WAVEFORM_SAMPLES_PER_SECOND),
36
+ peaks: extractPeaksFromBuffer(audioBuffer, 100),
40
37
  durationMs: audioBuffer.duration * 1e3,
41
- samplesPerSecond: WAVEFORM_SAMPLES_PER_SECOND
38
+ samplesPerSecond: 100
42
39
  };
43
40
  waveformCache.set(src, waveformData);
44
41
  return waveformData;
@@ -74,7 +71,7 @@ function extractPeaksFromBuffer(buffer, samplesPerSecond) {
74
71
  }
75
72
  return peaks;
76
73
  }
77
-
78
74
  //#endregion
79
75
  export { extractWaveformData };
76
+
80
77
  //# sourceMappingURL=waveformUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"waveformUtils.js","names":["audioBuffer: AudioBuffer","waveformData: WaveformData"],"sources":["../../../../src/gui/timeline/tracks/waveformUtils.ts"],"sourcesContent":["/**\n * Waveform extraction utilities for DAW-style audio visualization.\n *\n * Extracts min/max peak pairs from audio data at a given resolution.\n * Designed for timeline visualization where we need to see amplitude\n * overview across the entire audio duration.\n */\n\nimport type { EFMedia } from \"../../../elements/EFMedia.js\";\n\n/** Samples per second for waveform data - balances resolution vs. data size */\nexport const WAVEFORM_SAMPLES_PER_SECOND = 100;\n\n/** Waveform peak data: alternating min/max values normalized to [-1, 1] */\nexport interface WaveformData {\n /** Peak data: [min0, max0, min1, max1, ...] normalized to [-1, 1] */\n peaks: Float32Array;\n /** Duration of the audio in milliseconds */\n durationMs: number;\n /** Samples per second (for interpreting peaks array) */\n samplesPerSecond: number;\n}\n\n/** Simple cache for waveform data keyed by audio URL */\nconst waveformCache = new Map<string, WaveformData>();\n\n/**\n * Extract waveform peak data from a media element.\n * Fetches audio through the media engine's transcoding pipeline,\n * then decodes with Web Audio API.\n * Results are cached by src URL.\n */\nexport async function extractWaveformData(\n element: EFMedia,\n signal?: AbortSignal,\n): Promise<WaveformData | null> {\n const src = element.src;\n if (!src) return null;\n\n const cached = waveformCache.get(src);\n if (cached) {\n return cached;\n }\n\n try {\n const mediaEngine = await element.getMediaEngine(signal);\n signal?.throwIfAborted();\n\n if (!mediaEngine?.tracks.audio) {\n return null;\n }\n\n const durationMs = mediaEngine.durationMs;\n if (!durationMs || durationMs <= 0) {\n return null;\n }\n\n const abortSignal = signal ?? new AbortController().signal;\n const audioSpan = await element.fetchAudioSpanningTime(0, durationMs, abortSignal);\n signal?.throwIfAborted();\n\n if (!audioSpan) {\n return null;\n }\n\n const arrayBuffer = await audioSpan.blob.arrayBuffer();\n signal?.throwIfAborted();\n\n // Decode audio data\n const audioContext = new OfflineAudioContext(1, 1, 44100);\n let audioBuffer: AudioBuffer;\n\n try {\n audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n } catch (decodeError) {\n console.warn(\"Failed to decode audio for waveform:\", decodeError);\n return null;\n }\n\n signal?.throwIfAborted();\n\n // Extract peaks from the decoded audio\n const peaks = extractPeaksFromBuffer(audioBuffer, WAVEFORM_SAMPLES_PER_SECOND);\n const decodedDurationMs = audioBuffer.duration * 1000;\n\n const waveformData: WaveformData = {\n peaks,\n durationMs: decodedDurationMs,\n samplesPerSecond: WAVEFORM_SAMPLES_PER_SECOND,\n };\n\n waveformCache.set(src, waveformData);\n\n return waveformData;\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n throw error;\n }\n console.warn(\"Error extracting waveform data:\", error);\n return null;\n }\n}\n\n/**\n * Extract min/max peaks from an AudioBuffer.\n * Returns Float32Array with alternating [min, max, min, max, ...] values.\n */\nfunction extractPeaksFromBuffer(buffer: AudioBuffer, samplesPerSecond: number): Float32Array {\n const channelData = buffer.getChannelData(0); // Use first channel\n const sampleRate = buffer.sampleRate;\n const duration = buffer.duration;\n\n // Calculate how many samples to output\n const outputSamples = Math.ceil(duration * samplesPerSecond);\n\n // Each output sample has min and max\n const peaks = new Float32Array(outputSamples * 2);\n\n // Samples per output window\n const samplesPerWindow = Math.floor(sampleRate / samplesPerSecond);\n\n for (let i = 0; i < outputSamples; i++) {\n const startSample = i * samplesPerWindow;\n const endSample = Math.min(startSample + samplesPerWindow, channelData.length);\n\n let min = 0;\n let max = 0;\n\n for (let j = startSample; j < endSample; j++) {\n const sample = channelData[j] ?? 0;\n if (sample < min) min = sample;\n if (sample > max) max = sample;\n }\n\n // Store as alternating min/max pairs\n peaks[i * 2] = min;\n peaks[i * 2 + 1] = max;\n }\n\n return peaks;\n}\n\n/**\n * Render waveform data to a canvas context.\n * Draws a filled waveform path centered vertically.\n */\nexport function renderWaveformToCanvas(\n ctx: CanvasRenderingContext2D,\n waveformData: WaveformData,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n startMs: number = 0,\n endMs?: number,\n): void {\n const { peaks, durationMs, samplesPerSecond } = waveformData;\n const actualEndMs = endMs ?? durationMs;\n\n // Calculate which samples to render\n const startSample = Math.floor((startMs / 1000) * samplesPerSecond);\n const endSample = Math.ceil((actualEndMs / 1000) * samplesPerSecond);\n const sampleCount = endSample - startSample;\n\n if (sampleCount <= 0) return;\n\n const centerY = y + height / 2;\n const halfHeight = height / 2;\n const pixelsPerSample = width / sampleCount;\n\n ctx.fillStyle = color;\n ctx.beginPath();\n\n // Draw top half (max values) left to right\n for (let i = 0; i < sampleCount; i++) {\n const sampleIndex = startSample + i;\n const peakIndex = sampleIndex * 2;\n const maxValue = peaks[peakIndex + 1] ?? 0;\n\n const px = x + i * pixelsPerSample;\n const py = centerY - maxValue * halfHeight;\n\n if (i === 0) {\n ctx.moveTo(px, py);\n } else {\n ctx.lineTo(px, py);\n }\n }\n\n // Draw bottom half (min values) right to left\n for (let i = sampleCount - 1; i >= 0; i--) {\n const sampleIndex = startSample + i;\n const peakIndex = sampleIndex * 2;\n const minValue = peaks[peakIndex] ?? 0;\n\n const px = x + i * pixelsPerSample;\n const py = centerY - minValue * halfHeight;\n\n ctx.lineTo(px, py);\n }\n\n ctx.closePath();\n ctx.fill();\n}\n\n/**\n * Clear waveform cache (useful for testing or memory management)\n */\nexport function clearWaveformCache(): void {\n waveformCache.clear();\n}\n"],"mappings":";;AAWA,MAAa,8BAA8B;;AAa3C,MAAM,gCAAgB,IAAI,KAA2B;;;;;;;AAQrD,eAAsB,oBACpB,SACA,QAC8B;CAC9B,MAAM,MAAM,QAAQ;AACpB,KAAI,CAAC,IAAK,QAAO;CAEjB,MAAM,SAAS,cAAc,IAAI,IAAI;AACrC,KAAI,OACF,QAAO;AAGT,KAAI;EACF,MAAM,cAAc,MAAM,QAAQ,eAAe,OAAO;AACxD,UAAQ,gBAAgB;AAExB,MAAI,CAAC,aAAa,OAAO,MACvB,QAAO;EAGT,MAAM,aAAa,YAAY;AAC/B,MAAI,CAAC,cAAc,cAAc,EAC/B,QAAO;EAGT,MAAM,cAAc,UAAU,IAAI,iBAAiB,CAAC;EACpD,MAAM,YAAY,MAAM,QAAQ,uBAAuB,GAAG,YAAY,YAAY;AAClF,UAAQ,gBAAgB;AAExB,MAAI,CAAC,UACH,QAAO;EAGT,MAAM,cAAc,MAAM,UAAU,KAAK,aAAa;AACtD,UAAQ,gBAAgB;EAGxB,MAAM,eAAe,IAAI,oBAAoB,GAAG,GAAG,MAAM;EACzD,IAAIA;AAEJ,MAAI;AACF,iBAAc,MAAM,aAAa,gBAAgB,YAAY;WACtD,aAAa;AACpB,WAAQ,KAAK,wCAAwC,YAAY;AACjE,UAAO;;AAGT,UAAQ,gBAAgB;EAMxB,MAAMC,eAA6B;GACjC,OAJY,uBAAuB,aAAa,4BAA4B;GAK5E,YAJwB,YAAY,WAAW;GAK/C,kBAAkB;GACnB;AAED,gBAAc,IAAI,KAAK,aAAa;AAEpC,SAAO;UACA,OAAO;AACd,MAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAClD,OAAM;AAER,UAAQ,KAAK,mCAAmC,MAAM;AACtD,SAAO;;;;;;;AAQX,SAAS,uBAAuB,QAAqB,kBAAwC;CAC3F,MAAM,cAAc,OAAO,eAAe,EAAE;CAC5C,MAAM,aAAa,OAAO;CAC1B,MAAM,WAAW,OAAO;CAGxB,MAAM,gBAAgB,KAAK,KAAK,WAAW,iBAAiB;CAG5D,MAAM,QAAQ,IAAI,aAAa,gBAAgB,EAAE;CAGjD,MAAM,mBAAmB,KAAK,MAAM,aAAa,iBAAiB;AAElE,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK;EACtC,MAAM,cAAc,IAAI;EACxB,MAAM,YAAY,KAAK,IAAI,cAAc,kBAAkB,YAAY,OAAO;EAE9E,IAAI,MAAM;EACV,IAAI,MAAM;AAEV,OAAK,IAAI,IAAI,aAAa,IAAI,WAAW,KAAK;GAC5C,MAAM,SAAS,YAAY,MAAM;AACjC,OAAI,SAAS,IAAK,OAAM;AACxB,OAAI,SAAS,IAAK,OAAM;;AAI1B,QAAM,IAAI,KAAK;AACf,QAAM,IAAI,IAAI,KAAK;;AAGrB,QAAO"}
1
+ {"version":3,"file":"waveformUtils.js","names":[],"sources":["../../../../src/gui/timeline/tracks/waveformUtils.ts"],"mappings":";AAwBA,MAAM,gCAAgB,IAAI,KAA2B;;;;;;;AAQrD,eAAsB,oBACpB,SACA,QAC8B;CAC9B,MAAM,MAAM,QAAQ;AACpB,KAAI,CAAC,IAAK,QAAO;CAEjB,MAAM,SAAS,cAAc,IAAI,IAAI;AACrC,KAAI,OACF,QAAO;AAGT,KAAI;EACF,MAAM,cAAc,MAAM,QAAQ,eAAe,OAAO;AACxD,UAAQ,gBAAgB;AAExB,MAAI,CAAC,aAAa,OAAO,MACvB,QAAO;EAGT,MAAM,aAAa,YAAY;AAC/B,MAAI,CAAC,cAAc,cAAc,EAC/B,QAAO;EAGT,MAAM,cAAc,UAAU,IAAI,iBAAiB,CAAC;EACpD,MAAM,YAAY,MAAM,QAAQ,uBAAuB,GAAG,YAAY,YAAY;AAClF,UAAQ,gBAAgB;AAExB,MAAI,CAAC,UACH,QAAO;EAGT,MAAM,cAAc,MAAM,UAAU,KAAK,aAAa;AACtD,UAAQ,gBAAgB;EAGxB,MAAM,eAAe,IAAI,oBAAoB,GAAG,GAAG,MAAM;EACzD,IAAI;AAEJ,MAAI;AACF,iBAAc,MAAM,aAAa,gBAAgB,YAAY;WACtD,aAAa;AACpB,WAAQ,KAAK,wCAAwC,YAAY;AACjE,UAAO;;AAGT,UAAQ,gBAAgB;EAMxB,MAAM,eAA6B;GACjC,OAJY,uBAAuB,aAAA,IAAyC;GAK5E,YAJwB,YAAY,WAAW;GAK/C,kBAAA;GACD;AAED,gBAAc,IAAI,KAAK,aAAa;AAEpC,SAAO;UACA,OAAO;AACd,MAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAClD,OAAM;AAER,UAAQ,KAAK,mCAAmC,MAAM;AACtD,SAAO;;;;;;;AAQX,SAAS,uBAAuB,QAAqB,kBAAwC;CAC3F,MAAM,cAAc,OAAO,eAAe,EAAE;CAC5C,MAAM,aAAa,OAAO;CAC1B,MAAM,WAAW,OAAO;CAGxB,MAAM,gBAAgB,KAAK,KAAK,WAAW,iBAAiB;CAG5D,MAAM,QAAQ,IAAI,aAAa,gBAAgB,EAAE;CAGjD,MAAM,mBAAmB,KAAK,MAAM,aAAa,iBAAiB;AAElE,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK;EACtC,MAAM,cAAc,IAAI;EACxB,MAAM,YAAY,KAAK,IAAI,cAAc,kBAAkB,YAAY,OAAO;EAE9E,IAAI,MAAM;EACV,IAAI,MAAM;AAEV,OAAK,IAAI,IAAI,aAAa,IAAI,WAAW,KAAK;GAC5C,MAAM,SAAS,YAAY,MAAM;AACjC,OAAI,SAAS,IAAK,OAAM;AACxB,OAAI,SAAS,IAAK,OAAM;;AAI1B,QAAM,IAAI,KAAK;AACf,QAAM,IAAI,IAAI,KAAK;;AAGrB,QAAO"}
@@ -1,5 +1,4 @@
1
1
  import { getCornerPoint, getOppositeCorner } from "./transformUtils.js";
2
-
3
2
  //#region src/gui/transformCalculations.ts
4
3
  /**
5
4
  * Calculate the axis-aligned bounding box of a rotated rectangle.
@@ -211,7 +210,7 @@ function parseRotationFromTransform(transform) {
211
210
  if (a === void 0 || b === void 0 || isNaN(a) || isNaN(b)) return 0;
212
211
  return Math.atan2(b, a) * (180 / Math.PI);
213
212
  }
214
-
215
213
  //#endregion
216
214
  export { calculateDragBounds, calculateResizeBounds, getResizeHandleCursor, getRotatedBoundingBox, parseRotationFromTransform };
215
+
217
216
  //# sourceMappingURL=transformCalculations.js.map