@editframe/elements 0.30.2-beta.0 → 0.31.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +5 -0
  2. package/dist/EF_FRAMEGEN.js +20 -4
  3. package/dist/EF_FRAMEGEN.js.map +1 -1
  4. package/dist/EF_INTERACTIVE.js.map +1 -1
  5. package/dist/_virtual/rolldown_runtime.js +27 -0
  6. package/dist/canvas/EFCanvas.d.ts +311 -0
  7. package/dist/canvas/EFCanvas.js +1089 -0
  8. package/dist/canvas/EFCanvas.js.map +1 -0
  9. package/dist/canvas/EFCanvasItem.d.ts +55 -0
  10. package/dist/canvas/EFCanvasItem.js +72 -0
  11. package/dist/canvas/EFCanvasItem.js.map +1 -0
  12. package/dist/canvas/api/CanvasAPI.d.ts +115 -0
  13. package/dist/canvas/api/CanvasAPI.js +182 -0
  14. package/dist/canvas/api/CanvasAPI.js.map +1 -0
  15. package/dist/canvas/api/types.d.ts +42 -0
  16. package/dist/canvas/coordinateTransform.js +90 -0
  17. package/dist/canvas/coordinateTransform.js.map +1 -0
  18. package/dist/canvas/getElementBounds.js +40 -0
  19. package/dist/canvas/getElementBounds.js.map +1 -0
  20. package/dist/canvas/overlays/SelectionOverlay.js +265 -0
  21. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -0
  22. package/dist/canvas/overlays/overlayState.js +153 -0
  23. package/dist/canvas/overlays/overlayState.js.map +1 -0
  24. package/dist/canvas/selection/SelectionController.js +105 -0
  25. package/dist/canvas/selection/SelectionController.js.map +1 -0
  26. package/dist/canvas/selection/SelectionModel.d.ts +98 -0
  27. package/dist/canvas/selection/SelectionModel.js +229 -0
  28. package/dist/canvas/selection/SelectionModel.js.map +1 -0
  29. package/dist/canvas/selection/selectionContext.d.ts +31 -0
  30. package/dist/canvas/selection/selectionContext.js +12 -0
  31. package/dist/canvas/selection/selectionContext.js.map +1 -0
  32. package/dist/elements/ContainerInfo.d.ts +29 -0
  33. package/dist/elements/ContainerInfo.js +30 -0
  34. package/dist/elements/ContainerInfo.js.map +1 -0
  35. package/dist/elements/EFAudio.d.ts +13 -3
  36. package/dist/elements/EFAudio.js +64 -10
  37. package/dist/elements/EFAudio.js.map +1 -1
  38. package/dist/elements/EFCaptions.d.ts +18 -16
  39. package/dist/elements/EFCaptions.js +110 -19
  40. package/dist/elements/EFCaptions.js.map +1 -1
  41. package/dist/elements/EFImage.d.ts +12 -2
  42. package/dist/elements/EFImage.js +79 -9
  43. package/dist/elements/EFImage.js.map +1 -1
  44. package/dist/elements/EFMedia/AssetIdMediaEngine.js +51 -4
  45. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -1
  46. package/dist/elements/EFMedia/AssetMediaEngine.js +125 -52
  47. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
  48. package/dist/elements/EFMedia/BaseMediaEngine.js +24 -6
  49. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
  50. package/dist/elements/EFMedia/JitMediaEngine.js +12 -8
  51. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
  52. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +46 -7
  53. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -1
  54. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +98 -73
  55. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -1
  56. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +28 -5
  57. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -1
  58. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +18 -6
  59. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -1
  60. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +8 -2
  61. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -1
  62. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +31 -6
  63. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -1
  64. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +28 -5
  65. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -1
  66. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +97 -72
  67. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -1
  68. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -1
  69. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  70. package/dist/elements/EFMedia/shared/BufferUtils.js +1 -1
  71. package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -1
  72. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +25 -14
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  74. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +47 -16
  75. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -1
  76. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +37 -19
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  78. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +65 -21
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  80. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +8 -3
  81. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -1
  82. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +32 -9
  83. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -1
  84. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +33 -10
  85. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -1
  86. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +23 -8
  87. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -1
  88. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +34 -10
  89. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -1
  90. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +31 -8
  91. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -1
  92. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +31 -114
  93. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -1
  94. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +44 -8
  95. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -1
  96. package/dist/elements/EFMedia.d.ts +18 -7
  97. package/dist/elements/EFMedia.js +23 -3
  98. package/dist/elements/EFMedia.js.map +1 -1
  99. package/dist/elements/EFPanZoom.d.ts +96 -0
  100. package/dist/elements/EFPanZoom.js +290 -0
  101. package/dist/elements/EFPanZoom.js.map +1 -0
  102. package/dist/elements/EFSourceMixin.js +7 -6
  103. package/dist/elements/EFSourceMixin.js.map +1 -1
  104. package/dist/elements/EFSurface.d.ts +6 -6
  105. package/dist/elements/EFSurface.js +7 -2
  106. package/dist/elements/EFSurface.js.map +1 -1
  107. package/dist/elements/EFTemporal.d.ts +2 -1
  108. package/dist/elements/EFTemporal.js +192 -71
  109. package/dist/elements/EFTemporal.js.map +1 -1
  110. package/dist/elements/EFText.d.ts +5 -4
  111. package/dist/elements/EFText.js +102 -13
  112. package/dist/elements/EFText.js.map +1 -1
  113. package/dist/elements/EFTextSegment.d.ts +32 -6
  114. package/dist/elements/EFTextSegment.js +53 -15
  115. package/dist/elements/EFTextSegment.js.map +1 -1
  116. package/dist/elements/EFThumbnailStrip.d.ts +118 -56
  117. package/dist/elements/EFThumbnailStrip.js +522 -358
  118. package/dist/elements/EFThumbnailStrip.js.map +1 -1
  119. package/dist/elements/EFTimegroup.d.ts +223 -27
  120. package/dist/elements/EFTimegroup.js +850 -147
  121. package/dist/elements/EFTimegroup.js.map +1 -1
  122. package/dist/elements/EFVideo.d.ts +42 -5
  123. package/dist/elements/EFVideo.js +165 -11
  124. package/dist/elements/EFVideo.js.map +1 -1
  125. package/dist/elements/EFWaveform.d.ts +6 -6
  126. package/dist/elements/EFWaveform.js +2 -1
  127. package/dist/elements/EFWaveform.js.map +1 -1
  128. package/dist/elements/ElementPositionInfo.d.ts +35 -0
  129. package/dist/elements/ElementPositionInfo.js +49 -0
  130. package/dist/elements/ElementPositionInfo.js.map +1 -0
  131. package/dist/elements/FetchMixin.js +16 -1
  132. package/dist/elements/FetchMixin.js.map +1 -1
  133. package/dist/elements/SessionThumbnailCache.js +152 -0
  134. package/dist/elements/SessionThumbnailCache.js.map +1 -0
  135. package/dist/elements/TargetController.js +3 -1
  136. package/dist/elements/TargetController.js.map +1 -1
  137. package/dist/elements/TimegroupController.js +9 -3
  138. package/dist/elements/TimegroupController.js.map +1 -1
  139. package/dist/elements/findRootTemporal.js +30 -0
  140. package/dist/elements/findRootTemporal.js.map +1 -0
  141. package/dist/elements/renderTemporalAudio.js +18 -5
  142. package/dist/elements/renderTemporalAudio.js.map +1 -1
  143. package/dist/elements/updateAnimations.js +171 -28
  144. package/dist/elements/updateAnimations.js.map +1 -1
  145. package/dist/getRenderInfo.d.ts +2 -2
  146. package/dist/gui/ContextMixin.js +4 -2
  147. package/dist/gui/ContextMixin.js.map +1 -1
  148. package/dist/gui/Controllable.js +74 -1
  149. package/dist/gui/Controllable.js.map +1 -1
  150. package/dist/gui/EFActiveRootTemporal.d.ts +50 -0
  151. package/dist/gui/EFActiveRootTemporal.js +94 -0
  152. package/dist/gui/EFActiveRootTemporal.js.map +1 -0
  153. package/dist/gui/EFConfiguration.d.ts +11 -5
  154. package/dist/gui/EFConfiguration.js.map +1 -1
  155. package/dist/gui/EFControls.d.ts +2 -2
  156. package/dist/gui/EFControls.js +109 -13
  157. package/dist/gui/EFControls.js.map +1 -1
  158. package/dist/gui/EFDial.d.ts +4 -4
  159. package/dist/gui/EFFilmstrip.d.ts +11 -214
  160. package/dist/gui/EFFilmstrip.js +53 -1152
  161. package/dist/gui/EFFilmstrip.js.map +1 -1
  162. package/dist/gui/EFFitScale.d.ts +3 -3
  163. package/dist/gui/EFFitScale.js +39 -12
  164. package/dist/gui/EFFitScale.js.map +1 -1
  165. package/dist/gui/EFFocusOverlay.d.ts +4 -4
  166. package/dist/gui/EFOverlayItem.d.ts +48 -0
  167. package/dist/gui/EFOverlayItem.js +97 -0
  168. package/dist/gui/EFOverlayItem.js.map +1 -0
  169. package/dist/gui/EFOverlayLayer.d.ts +70 -0
  170. package/dist/gui/EFOverlayLayer.js +104 -0
  171. package/dist/gui/EFOverlayLayer.js.map +1 -0
  172. package/dist/gui/EFPause.d.ts +4 -4
  173. package/dist/gui/EFPlay.d.ts +4 -4
  174. package/dist/gui/EFResizableBox.d.ts +12 -16
  175. package/dist/gui/EFResizableBox.js +109 -451
  176. package/dist/gui/EFResizableBox.js.map +1 -1
  177. package/dist/gui/EFScrubber.d.ts +30 -5
  178. package/dist/gui/EFScrubber.js +224 -31
  179. package/dist/gui/EFScrubber.js.map +1 -1
  180. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  181. package/dist/gui/EFTimeDisplay.js +4 -1
  182. package/dist/gui/EFTimeDisplay.js.map +1 -1
  183. package/dist/gui/EFTimelineRuler.d.ts +71 -0
  184. package/dist/gui/EFTimelineRuler.js +320 -0
  185. package/dist/gui/EFTimelineRuler.js.map +1 -0
  186. package/dist/gui/EFToggleLoop.d.ts +4 -4
  187. package/dist/gui/EFTogglePlay.d.ts +4 -4
  188. package/dist/gui/EFTransformHandles.d.ts +91 -0
  189. package/dist/gui/EFTransformHandles.js +393 -0
  190. package/dist/gui/EFTransformHandles.js.map +1 -0
  191. package/dist/gui/EFWorkbench.d.ts +182 -4
  192. package/dist/gui/EFWorkbench.js +2067 -22
  193. package/dist/gui/EFWorkbench.js.map +1 -1
  194. package/dist/gui/FitScaleHelpers.d.ts +31 -0
  195. package/dist/gui/FitScaleHelpers.js +41 -0
  196. package/dist/gui/FitScaleHelpers.js.map +1 -0
  197. package/dist/gui/PlaybackController.d.ts +2 -1
  198. package/dist/gui/PlaybackController.js +46 -15
  199. package/dist/gui/PlaybackController.js.map +1 -1
  200. package/dist/gui/TWMixin.js +1 -1
  201. package/dist/gui/TWMixin.js.map +1 -1
  202. package/dist/gui/hierarchy/EFHierarchy.d.ts +65 -0
  203. package/dist/gui/hierarchy/EFHierarchy.js +338 -0
  204. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -0
  205. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +118 -0
  206. package/dist/gui/hierarchy/EFHierarchyItem.js +551 -0
  207. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -0
  208. package/dist/gui/hierarchy/hierarchyContext.d.ts +38 -0
  209. package/dist/gui/hierarchy/hierarchyContext.js +8 -0
  210. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -0
  211. package/dist/gui/icons.js +34 -0
  212. package/dist/gui/icons.js.map +1 -0
  213. package/dist/gui/panZoomTransformContext.js +12 -0
  214. package/dist/gui/panZoomTransformContext.js.map +1 -0
  215. package/dist/gui/previewSettingsContext.js +12 -0
  216. package/dist/gui/previewSettingsContext.js.map +1 -0
  217. package/dist/gui/timeline/EFTimeline.d.ts +270 -0
  218. package/dist/gui/timeline/EFTimeline.js +1369 -0
  219. package/dist/gui/timeline/EFTimeline.js.map +1 -0
  220. package/dist/gui/timeline/EFTimelineRow.js +374 -0
  221. package/dist/gui/timeline/EFTimelineRow.js.map +1 -0
  222. package/dist/gui/timeline/TrimHandles.d.ts +36 -0
  223. package/dist/gui/timeline/TrimHandles.js +204 -0
  224. package/dist/gui/timeline/TrimHandles.js.map +1 -0
  225. package/dist/gui/timeline/flattenHierarchy.js +31 -0
  226. package/dist/gui/timeline/flattenHierarchy.js.map +1 -0
  227. package/dist/gui/timeline/timelineStateContext.d.ts +26 -0
  228. package/dist/gui/timeline/timelineStateContext.js +42 -0
  229. package/dist/gui/timeline/timelineStateContext.js.map +1 -0
  230. package/dist/gui/timeline/tracks/AudioTrack.js +264 -0
  231. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -0
  232. package/dist/gui/timeline/tracks/CaptionsTrack.js +595 -0
  233. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -0
  234. package/dist/gui/timeline/tracks/HTMLTrack.js +19 -0
  235. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -0
  236. package/dist/gui/timeline/tracks/ImageTrack.js +53 -0
  237. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -0
  238. package/dist/gui/timeline/tracks/TextTrack.js +250 -0
  239. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -0
  240. package/dist/gui/timeline/tracks/TimegroupTrack.js +143 -0
  241. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -0
  242. package/dist/gui/timeline/tracks/TrackItem.js +269 -0
  243. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -0
  244. package/dist/gui/timeline/tracks/VideoTrack.js +265 -0
  245. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -0
  246. package/dist/gui/timeline/tracks/WaveformTrack.js +19 -0
  247. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -0
  248. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -0
  249. package/dist/gui/timeline/tracks/preloadTracks.js +9 -0
  250. package/dist/gui/timeline/tracks/renderTrackChildren.js +119 -0
  251. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -0
  252. package/dist/gui/timeline/tracks/waveformUtils.js +80 -0
  253. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -0
  254. package/dist/gui/transformCalculations.js +217 -0
  255. package/dist/gui/transformCalculations.js.map +1 -0
  256. package/dist/gui/transformUtils.d.ts +37 -0
  257. package/dist/gui/transformUtils.js +77 -0
  258. package/dist/gui/transformUtils.js.map +1 -0
  259. package/dist/gui/tree/EFTree.d.ts +59 -0
  260. package/dist/gui/tree/EFTree.js +174 -0
  261. package/dist/gui/tree/EFTree.js.map +1 -0
  262. package/dist/gui/tree/EFTreeItem.d.ts +38 -0
  263. package/dist/gui/tree/EFTreeItem.js +146 -0
  264. package/dist/gui/tree/EFTreeItem.js.map +1 -0
  265. package/dist/gui/tree/treeContext.d.ts +60 -0
  266. package/dist/gui/tree/treeContext.js +23 -0
  267. package/dist/gui/tree/treeContext.js.map +1 -0
  268. package/dist/index.d.ts +32 -8
  269. package/dist/index.js +30 -6
  270. package/dist/index.js.map +1 -1
  271. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +688 -0
  272. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
  273. package/dist/node_modules/react/cjs/react.development.js +1521 -0
  274. package/dist/node_modules/react/cjs/react.development.js.map +1 -0
  275. package/dist/node_modules/react/index.js +13 -0
  276. package/dist/node_modules/react/index.js.map +1 -0
  277. package/dist/node_modules/react/jsx-runtime.js +13 -0
  278. package/dist/node_modules/react/jsx-runtime.js.map +1 -0
  279. package/dist/preview/AdaptiveResolutionTracker.js +228 -0
  280. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -0
  281. package/dist/preview/RenderProfiler.js +135 -0
  282. package/dist/preview/RenderProfiler.js.map +1 -0
  283. package/dist/preview/previewSettings.js +131 -0
  284. package/dist/preview/previewSettings.js.map +1 -0
  285. package/dist/preview/previewTypes.js +64 -0
  286. package/dist/preview/previewTypes.js.map +1 -0
  287. package/dist/preview/renderTimegroupPreview.js +656 -0
  288. package/dist/preview/renderTimegroupPreview.js.map +1 -0
  289. package/dist/preview/renderTimegroupToCanvas.d.ts +37 -0
  290. package/dist/preview/renderTimegroupToCanvas.js +840 -0
  291. package/dist/preview/renderTimegroupToCanvas.js.map +1 -0
  292. package/dist/preview/renderTimegroupToVideo.d.ts +39 -0
  293. package/dist/preview/renderTimegroupToVideo.js +274 -0
  294. package/dist/preview/renderTimegroupToVideo.js.map +1 -0
  295. package/dist/preview/renderers.js +16 -0
  296. package/dist/preview/renderers.js.map +1 -0
  297. package/dist/preview/statsTrackingStrategy.js +201 -0
  298. package/dist/preview/statsTrackingStrategy.js.map +1 -0
  299. package/dist/preview/thumbnailCacheSettings.js +52 -0
  300. package/dist/preview/thumbnailCacheSettings.js.map +1 -0
  301. package/dist/preview/workers/WorkerPool.js +178 -0
  302. package/dist/preview/workers/WorkerPool.js.map +1 -0
  303. package/dist/sandbox/PlaybackControls.js +10 -0
  304. package/dist/sandbox/PlaybackControls.js.map +1 -0
  305. package/dist/sandbox/ScenarioRunner.js +1 -0
  306. package/dist/sandbox/index.js +2 -0
  307. package/dist/style.css +68 -67
  308. package/dist/transcoding/types/index.d.ts +2 -1
  309. package/dist/transcoding/utils/UrlGenerator.d.ts +6 -1
  310. package/dist/transcoding/utils/UrlGenerator.js +12 -3
  311. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  312. package/dist/utils/LRUCache.js +1 -375
  313. package/dist/utils/LRUCache.js.map +1 -1
  314. package/dist/utils/frameTime.js +14 -0
  315. package/dist/utils/frameTime.js.map +1 -0
  316. package/package.json +3 -3
  317. package/test/profilingPlugin.ts +223 -0
  318. package/test/recordReplayProxyPlugin.js +22 -27
  319. package/test/thumbnail-performance-test.html +116 -0
  320. package/test/visualRegressionUtils.ts +286 -0
  321. package/types.json +1 -1
  322. package/dist/elements/TimegroupController.d.ts +0 -18
  323. package/dist/msToTimeCode.js +0 -17
  324. package/dist/msToTimeCode.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import * as lit39 from "lit";
2
+ import { LitElement } from "lit";
3
+ import * as lit_html37 from "lit-html";
4
+
5
+ //#region src/gui/timeline/TrimHandles.d.ts
6
+ interface TrimChangeDetail {
7
+ elementId: string;
8
+ type: "start" | "end";
9
+ deltaMs: number;
10
+ newValueMs: number;
11
+ }
12
+ declare const EFTrimHandles_base: typeof LitElement;
13
+ declare class EFTrimHandles extends EFTrimHandles_base {
14
+ static styles: lit39.CSSResult[];
15
+ elementId: string;
16
+ pixelsPerMs: number;
17
+ trimStartMs: number;
18
+ trimEndMs: number;
19
+ intrinsicDurationMs: number;
20
+ showOverlays: boolean;
21
+ private draggingHandle;
22
+ private dragStartX;
23
+ private dragStartValue;
24
+ private handlePointerDown;
25
+ private handlePointerMove;
26
+ private handlePointerUp;
27
+ render(): lit_html37.TemplateResult<1>;
28
+ }
29
+ declare global {
30
+ interface HTMLElementTagNameMap {
31
+ "ef-trim-handles": EFTrimHandles;
32
+ }
33
+ }
34
+ //#endregion
35
+ export { EFTrimHandles, TrimChangeDetail };
36
+ //# sourceMappingURL=TrimHandles.d.ts.map
@@ -0,0 +1,204 @@
1
+ import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
2
+ import { TWMixin } from "../TWMixin2.js";
3
+ import { LitElement, css, html, nothing } from "lit";
4
+ import { customElement, property, state } from "lit/decorators.js";
5
+ import { styleMap } from "lit/directives/style-map.js";
6
+
7
+ //#region src/gui/timeline/TrimHandles.ts
8
+ let EFTrimHandles = class EFTrimHandles$1 extends TWMixin(LitElement) {
9
+ constructor(..._args) {
10
+ super(..._args);
11
+ this.elementId = "";
12
+ this.pixelsPerMs = .04;
13
+ this.trimStartMs = 0;
14
+ this.trimEndMs = 0;
15
+ this.intrinsicDurationMs = 0;
16
+ this.showOverlays = true;
17
+ this.draggingHandle = null;
18
+ this.dragStartX = 0;
19
+ this.dragStartValue = 0;
20
+ this.handlePointerMove = (e) => {
21
+ if (!this.draggingHandle) return;
22
+ const deltaMs = (e.clientX - this.dragStartX) / this.pixelsPerMs;
23
+ let newValueMs;
24
+ if (this.draggingHandle === "start") {
25
+ newValueMs = Math.max(0, this.dragStartValue + deltaMs);
26
+ newValueMs = Math.min(newValueMs, this.intrinsicDurationMs - (this.trimEndMs || 0));
27
+ } else {
28
+ newValueMs = Math.max(0, this.dragStartValue - deltaMs);
29
+ newValueMs = Math.min(newValueMs, this.intrinsicDurationMs - this.trimStartMs);
30
+ }
31
+ this.dispatchEvent(new CustomEvent("trim-change", {
32
+ detail: {
33
+ elementId: this.elementId,
34
+ type: this.draggingHandle,
35
+ deltaMs,
36
+ newValueMs
37
+ },
38
+ bubbles: true,
39
+ composed: true
40
+ }));
41
+ };
42
+ this.handlePointerUp = (e) => {
43
+ const target = e.currentTarget;
44
+ target.releasePointerCapture(e.pointerId);
45
+ target.removeEventListener("pointermove", this.handlePointerMove);
46
+ target.removeEventListener("pointerup", this.handlePointerUp);
47
+ target.removeEventListener("pointercancel", this.handlePointerUp);
48
+ if (this.draggingHandle) this.dispatchEvent(new CustomEvent("trim-change-end", {
49
+ detail: {
50
+ elementId: this.elementId,
51
+ type: this.draggingHandle
52
+ },
53
+ bubbles: true,
54
+ composed: true
55
+ }));
56
+ this.draggingHandle = null;
57
+ };
58
+ }
59
+ static {
60
+ this.styles = [css`
61
+ :host {
62
+ display: block;
63
+ position: absolute;
64
+ top: 0;
65
+ left: 0;
66
+ right: 0;
67
+ bottom: 0;
68
+ pointer-events: none;
69
+ }
70
+
71
+ .handle {
72
+ position: absolute;
73
+ top: 0;
74
+ bottom: 0;
75
+ width: 8px;
76
+ cursor: ew-resize;
77
+ pointer-events: auto;
78
+ z-index: 10;
79
+ }
80
+
81
+ .handle::before {
82
+ content: "";
83
+ position: absolute;
84
+ top: 50%;
85
+ transform: translateY(-50%);
86
+ width: 4px;
87
+ height: 60%;
88
+ min-height: 12px;
89
+ max-height: 24px;
90
+ background: var(--trim-handle-color, rgba(255, 255, 255, 0.7));
91
+ border-radius: 2px;
92
+ transition: background 0.15s ease;
93
+ }
94
+
95
+ .handle:hover::before,
96
+ .handle.dragging::before {
97
+ background: var(--trim-handle-active-color, #3b82f6);
98
+ }
99
+
100
+ .handle-start {
101
+ left: -4px;
102
+ }
103
+
104
+ .handle-start::before {
105
+ left: 2px;
106
+ }
107
+
108
+ .handle-end {
109
+ right: -4px;
110
+ }
111
+
112
+ .handle-end::before {
113
+ right: 2px;
114
+ }
115
+
116
+ .handle.dragging {
117
+ cursor: grabbing;
118
+ }
119
+
120
+ .trim-overlay {
121
+ position: absolute;
122
+ top: 0;
123
+ bottom: 0;
124
+ background: var(--trim-overlay-color, rgba(0, 0, 0, 0.4));
125
+ pointer-events: none;
126
+ }
127
+
128
+ .trim-overlay-start {
129
+ left: 0;
130
+ }
131
+
132
+ .trim-overlay-end {
133
+ right: 0;
134
+ }
135
+ `];
136
+ }
137
+ handlePointerDown(e, type) {
138
+ e.preventDefault();
139
+ e.stopPropagation();
140
+ this.draggingHandle = type;
141
+ this.dragStartX = e.clientX;
142
+ this.dragStartValue = type === "start" ? this.trimStartMs : this.trimEndMs;
143
+ const target = e.currentTarget;
144
+ target.setPointerCapture(e.pointerId);
145
+ target.addEventListener("pointermove", this.handlePointerMove);
146
+ target.addEventListener("pointerup", this.handlePointerUp);
147
+ target.addEventListener("pointercancel", this.handlePointerUp);
148
+ }
149
+ render() {
150
+ const trimStartWidth = this.trimStartMs * this.pixelsPerMs;
151
+ const trimEndWidth = (this.trimEndMs || 0) * this.pixelsPerMs;
152
+ return html`
153
+ ${this.showOverlays && this.trimStartMs > 0 ? html`<div
154
+ class="trim-overlay trim-overlay-start"
155
+ style=${styleMap({ width: `${trimStartWidth}px` })}
156
+ ></div>` : nothing}
157
+ ${this.showOverlays && this.trimEndMs > 0 ? html`<div
158
+ class="trim-overlay trim-overlay-end"
159
+ style=${styleMap({ width: `${trimEndWidth}px` })}
160
+ ></div>` : nothing}
161
+
162
+ <div
163
+ class="handle handle-start ${this.draggingHandle === "start" ? "dragging" : ""}"
164
+ @pointerdown=${(e) => this.handlePointerDown(e, "start")}
165
+ ></div>
166
+ <div
167
+ class="handle handle-end ${this.draggingHandle === "end" ? "dragging" : ""}"
168
+ @pointerdown=${(e) => this.handlePointerDown(e, "end")}
169
+ ></div>
170
+ `;
171
+ }
172
+ };
173
+ __decorate([property({
174
+ type: String,
175
+ attribute: "element-id"
176
+ })], EFTrimHandles.prototype, "elementId", void 0);
177
+ __decorate([property({
178
+ type: Number,
179
+ attribute: "pixels-per-ms"
180
+ })], EFTrimHandles.prototype, "pixelsPerMs", void 0);
181
+ __decorate([property({
182
+ type: Number,
183
+ attribute: "trim-start-ms"
184
+ })], EFTrimHandles.prototype, "trimStartMs", void 0);
185
+ __decorate([property({
186
+ type: Number,
187
+ attribute: "trim-end-ms"
188
+ })], EFTrimHandles.prototype, "trimEndMs", void 0);
189
+ __decorate([property({
190
+ type: Number,
191
+ attribute: "intrinsic-duration-ms"
192
+ })], EFTrimHandles.prototype, "intrinsicDurationMs", void 0);
193
+ __decorate([property({
194
+ type: Boolean,
195
+ attribute: "show-overlays"
196
+ })], EFTrimHandles.prototype, "showOverlays", void 0);
197
+ __decorate([state()], EFTrimHandles.prototype, "draggingHandle", void 0);
198
+ __decorate([state()], EFTrimHandles.prototype, "dragStartX", void 0);
199
+ __decorate([state()], EFTrimHandles.prototype, "dragStartValue", void 0);
200
+ EFTrimHandles = __decorate([customElement("ef-trim-handles")], EFTrimHandles);
201
+
202
+ //#endregion
203
+ export { EFTrimHandles };
204
+ //# sourceMappingURL=TrimHandles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrimHandles.js","names":["EFTrimHandles","newValueMs: number"],"sources":["../../../src/gui/timeline/TrimHandles.ts"],"sourcesContent":["import { css, html, LitElement, nothing } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { TWMixin } from \"../TWMixin.js\";\n\nexport interface TrimChangeDetail {\n elementId: string;\n type: \"start\" | \"end\";\n deltaMs: number;\n newValueMs: number;\n}\n\n@customElement(\"ef-trim-handles\")\nexport class EFTrimHandles extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n pointer-events: none;\n }\n\n .handle {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 8px;\n cursor: ew-resize;\n pointer-events: auto;\n z-index: 10;\n }\n\n .handle::before {\n content: \"\";\n position: absolute;\n top: 50%;\n transform: translateY(-50%);\n width: 4px;\n height: 60%;\n min-height: 12px;\n max-height: 24px;\n background: var(--trim-handle-color, rgba(255, 255, 255, 0.7));\n border-radius: 2px;\n transition: background 0.15s ease;\n }\n\n .handle:hover::before,\n .handle.dragging::before {\n background: var(--trim-handle-active-color, #3b82f6);\n }\n\n .handle-start {\n left: -4px;\n }\n\n .handle-start::before {\n left: 2px;\n }\n\n .handle-end {\n right: -4px;\n }\n\n .handle-end::before {\n right: 2px;\n }\n\n .handle.dragging {\n cursor: grabbing;\n }\n\n .trim-overlay {\n position: absolute;\n top: 0;\n bottom: 0;\n background: var(--trim-overlay-color, rgba(0, 0, 0, 0.4));\n pointer-events: none;\n }\n\n .trim-overlay-start {\n left: 0;\n }\n\n .trim-overlay-end {\n right: 0;\n }\n `,\n ];\n\n @property({ type: String, attribute: \"element-id\" })\n elementId = \"\";\n\n @property({ type: Number, attribute: \"pixels-per-ms\" })\n pixelsPerMs = 0.04;\n\n @property({ type: Number, attribute: \"trim-start-ms\" })\n trimStartMs = 0;\n\n @property({ type: Number, attribute: \"trim-end-ms\" })\n trimEndMs = 0;\n\n @property({ type: Number, attribute: \"intrinsic-duration-ms\" })\n intrinsicDurationMs = 0;\n\n @property({ type: Boolean, attribute: \"show-overlays\" })\n showOverlays = true;\n\n @state()\n private draggingHandle: \"start\" | \"end\" | null = null;\n\n @state()\n private dragStartX = 0;\n\n @state()\n private dragStartValue = 0;\n\n private handlePointerDown(e: PointerEvent, type: \"start\" | \"end\"): void {\n e.preventDefault();\n e.stopPropagation();\n\n this.draggingHandle = type;\n this.dragStartX = e.clientX;\n this.dragStartValue = type === \"start\" ? this.trimStartMs : this.trimEndMs;\n\n const target = e.currentTarget as HTMLElement;\n target.setPointerCapture(e.pointerId);\n\n target.addEventListener(\"pointermove\", this.handlePointerMove);\n target.addEventListener(\"pointerup\", this.handlePointerUp);\n target.addEventListener(\"pointercancel\", this.handlePointerUp);\n }\n\n private handlePointerMove = (e: PointerEvent): void => {\n if (!this.draggingHandle) return;\n\n const deltaX = e.clientX - this.dragStartX;\n const deltaMs = deltaX / this.pixelsPerMs;\n\n let newValueMs: number;\n\n if (this.draggingHandle === \"start\") {\n newValueMs = Math.max(0, this.dragStartValue + deltaMs);\n newValueMs = Math.min(\n newValueMs,\n this.intrinsicDurationMs - (this.trimEndMs || 0),\n );\n } else {\n newValueMs = Math.max(0, this.dragStartValue - deltaMs);\n newValueMs = Math.min(\n newValueMs,\n this.intrinsicDurationMs - this.trimStartMs,\n );\n }\n\n this.dispatchEvent(\n new CustomEvent<TrimChangeDetail>(\"trim-change\", {\n detail: {\n elementId: this.elementId,\n type: this.draggingHandle,\n deltaMs,\n newValueMs,\n },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n private handlePointerUp = (e: PointerEvent): void => {\n const target = e.currentTarget as HTMLElement;\n target.releasePointerCapture(e.pointerId);\n target.removeEventListener(\"pointermove\", this.handlePointerMove);\n target.removeEventListener(\"pointerup\", this.handlePointerUp);\n target.removeEventListener(\"pointercancel\", this.handlePointerUp);\n\n if (this.draggingHandle) {\n this.dispatchEvent(\n new CustomEvent(\"trim-change-end\", {\n detail: {\n elementId: this.elementId,\n type: this.draggingHandle,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n this.draggingHandle = null;\n };\n\n render() {\n const trimStartWidth = this.trimStartMs * this.pixelsPerMs;\n const trimEndWidth = (this.trimEndMs || 0) * this.pixelsPerMs;\n\n return html`\n ${\n this.showOverlays && this.trimStartMs > 0\n ? html`<div\n class=\"trim-overlay trim-overlay-start\"\n style=${styleMap({ width: `${trimStartWidth}px` })}\n ></div>`\n : nothing\n }\n ${\n this.showOverlays && this.trimEndMs > 0\n ? html`<div\n class=\"trim-overlay trim-overlay-end\"\n style=${styleMap({ width: `${trimEndWidth}px` })}\n ></div>`\n : nothing\n }\n\n <div\n class=\"handle handle-start ${this.draggingHandle === \"start\" ? \"dragging\" : \"\"}\"\n @pointerdown=${(e: PointerEvent) => this.handlePointerDown(e, \"start\")}\n ></div>\n <div\n class=\"handle handle-end ${this.draggingHandle === \"end\" ? \"dragging\" : \"\"}\"\n @pointerdown=${(e: PointerEvent) => this.handlePointerDown(e, \"end\")}\n ></div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-trim-handles\": EFTrimHandles;\n }\n}\n"],"mappings":";;;;;;;AAaO,0BAAMA,wBAAsB,QAAQ,WAAW,CAAC;;;mBAiFzC;qBAGE;qBAGA;mBAGF;6BAGU;sBAGP;wBAGkC;oBAG5B;wBAGI;4BAkBI,MAA0B;AACrD,OAAI,CAAC,KAAK,eAAgB;GAG1B,MAAM,WADS,EAAE,UAAU,KAAK,cACP,KAAK;GAE9B,IAAIC;AAEJ,OAAI,KAAK,mBAAmB,SAAS;AACnC,iBAAa,KAAK,IAAI,GAAG,KAAK,iBAAiB,QAAQ;AACvD,iBAAa,KAAK,IAChB,YACA,KAAK,uBAAuB,KAAK,aAAa,GAC/C;UACI;AACL,iBAAa,KAAK,IAAI,GAAG,KAAK,iBAAiB,QAAQ;AACvD,iBAAa,KAAK,IAChB,YACA,KAAK,sBAAsB,KAAK,YACjC;;AAGH,QAAK,cACH,IAAI,YAA8B,eAAe;IAC/C,QAAQ;KACN,WAAW,KAAK;KAChB,MAAM,KAAK;KACX;KACA;KACD;IACD,SAAS;IACT,UAAU;IACX,CAAC,CACH;;0BAGwB,MAA0B;GACnD,MAAM,SAAS,EAAE;AACjB,UAAO,sBAAsB,EAAE,UAAU;AACzC,UAAO,oBAAoB,eAAe,KAAK,kBAAkB;AACjE,UAAO,oBAAoB,aAAa,KAAK,gBAAgB;AAC7D,UAAO,oBAAoB,iBAAiB,KAAK,gBAAgB;AAEjE,OAAI,KAAK,eACP,MAAK,cACH,IAAI,YAAY,mBAAmB;IACjC,QAAQ;KACN,WAAW,KAAK;KAChB,MAAM,KAAK;KACZ;IACD,SAAS;IACT,UAAU;IACX,CAAC,CACH;AAGH,QAAK,iBAAiB;;;;gBAlLR,CACd,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA4EJ;;CA6BD,AAAQ,kBAAkB,GAAiB,MAA6B;AACtE,IAAE,gBAAgB;AAClB,IAAE,iBAAiB;AAEnB,OAAK,iBAAiB;AACtB,OAAK,aAAa,EAAE;AACpB,OAAK,iBAAiB,SAAS,UAAU,KAAK,cAAc,KAAK;EAEjE,MAAM,SAAS,EAAE;AACjB,SAAO,kBAAkB,EAAE,UAAU;AAErC,SAAO,iBAAiB,eAAe,KAAK,kBAAkB;AAC9D,SAAO,iBAAiB,aAAa,KAAK,gBAAgB;AAC1D,SAAO,iBAAiB,iBAAiB,KAAK,gBAAgB;;CA8DhE,SAAS;EACP,MAAM,iBAAiB,KAAK,cAAc,KAAK;EAC/C,MAAM,gBAAgB,KAAK,aAAa,KAAK,KAAK;AAElD,SAAO,IAAI;QAEP,KAAK,gBAAgB,KAAK,cAAc,IACpC,IAAI;;oBAEI,SAAS,EAAE,OAAO,GAAG,eAAe,KAAK,CAAC,CAAC;qBAEnD,QACL;QAEC,KAAK,gBAAgB,KAAK,YAAY,IAClC,IAAI;;oBAEI,SAAS,EAAE,OAAO,GAAG,aAAa,KAAK,CAAC,CAAC;qBAEjD,QACL;;;qCAG8B,KAAK,mBAAmB,UAAU,aAAa,GAAG;wBAC/D,MAAoB,KAAK,kBAAkB,GAAG,QAAQ,CAAC;;;mCAG5C,KAAK,mBAAmB,QAAQ,aAAa,GAAG;wBAC3D,MAAoB,KAAK,kBAAkB,GAAG,MAAM,CAAC;;;;;YAlI1E,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAc,CAAC;YAGnD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAiB,CAAC;YAGtD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAiB,CAAC;YAGtD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAe,CAAC;YAGpD,SAAS;CAAE,MAAM;CAAQ,WAAW;CAAyB,CAAC;YAG9D,SAAS;CAAE,MAAM;CAAS,WAAW;CAAiB,CAAC;YAGvD,OAAO;YAGP,OAAO;YAGP,OAAO;4BAzGT,cAAc,kBAAkB"}
@@ -0,0 +1,31 @@
1
+ import { isEFTemporal } from "../../elements/EFTemporal.js";
2
+ import { EFTimegroup } from "../../elements/EFTimegroup.js";
3
+
4
+ //#region src/gui/timeline/flattenHierarchy.ts
5
+ /**
6
+ * Flattens a hierarchical temporal element tree into a flat array of rows.
7
+ * Each row contains the element and its depth in the hierarchy.
8
+ *
9
+ * @param root - The root temporal element to flatten
10
+ * @param startDepth - Starting depth (default 0)
11
+ * @returns Array of {element, depth} in depth-first order
12
+ */
13
+ function flattenHierarchy(root, startDepth = 0) {
14
+ const rows = [{
15
+ element: root,
16
+ depth: startDepth
17
+ }];
18
+ if (root instanceof EFTimegroup) {
19
+ for (const child of root.children) if (isEFTemporal(child)) {
20
+ const tagName = child.tagName?.toUpperCase();
21
+ if (tagName === "EF-CAPTIONS-ACTIVE-WORD" || tagName === "EF-CAPTIONS-SEGMENT" || tagName === "EF-CAPTIONS-BEFORE-ACTIVE-WORD" || tagName === "EF-CAPTIONS-AFTER-ACTIVE-WORD") continue;
22
+ if (tagName === "EF-TEXT-SEGMENT") continue;
23
+ rows.push(...flattenHierarchy(child, startDepth + 1));
24
+ }
25
+ }
26
+ return rows;
27
+ }
28
+
29
+ //#endregion
30
+ export { flattenHierarchy };
31
+ //# sourceMappingURL=flattenHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flattenHierarchy.js","names":["rows: TimelineRowModel[]"],"sources":["../../../src/gui/timeline/flattenHierarchy.ts"],"sourcesContent":["import {\n isEFTemporal,\n type TemporalMixinInterface,\n} from \"../../elements/EFTemporal.js\";\nimport { EFTimegroup } from \"../../elements/EFTimegroup.js\";\n\nexport interface TimelineRowModel {\n element: TemporalMixinInterface & Element;\n depth: number;\n}\n\n/**\n * Flattens a hierarchical temporal element tree into a flat array of rows.\n * Each row contains the element and its depth in the hierarchy.\n *\n * @param root - The root temporal element to flatten\n * @param startDepth - Starting depth (default 0)\n * @returns Array of {element, depth} in depth-first order\n */\nexport function flattenHierarchy(\n root: TemporalMixinInterface & Element,\n startDepth = 0,\n): TimelineRowModel[] {\n const rows: TimelineRowModel[] = [{ element: root, depth: startDepth }];\n\n if (root instanceof EFTimegroup) {\n for (const child of root.children) {\n if (isEFTemporal(child)) {\n // Skip child elements that are consolidated into their parent track\n const tagName = (child as Element).tagName?.toUpperCase();\n \n // Skip captions child elements - they're shown inline in the captions track\n if (\n tagName === \"EF-CAPTIONS-ACTIVE-WORD\" ||\n tagName === \"EF-CAPTIONS-SEGMENT\" ||\n tagName === \"EF-CAPTIONS-BEFORE-ACTIVE-WORD\" ||\n tagName === \"EF-CAPTIONS-AFTER-ACTIVE-WORD\"\n ) {\n continue;\n }\n \n // Skip text segments - they're shown inline in the text track\n if (tagName === \"EF-TEXT-SEGMENT\") {\n continue;\n }\n \n rows.push(\n ...flattenHierarchy(\n child as TemporalMixinInterface & Element,\n startDepth + 1,\n ),\n );\n }\n }\n }\n\n return rows;\n}\n\n"],"mappings":";;;;;;;;;;;;AAmBA,SAAgB,iBACd,MACA,aAAa,GACO;CACpB,MAAMA,OAA2B,CAAC;EAAE,SAAS;EAAM,OAAO;EAAY,CAAC;AAEvE,KAAI,gBAAgB,aAClB;OAAK,MAAM,SAAS,KAAK,SACvB,KAAI,aAAa,MAAM,EAAE;GAEvB,MAAM,UAAW,MAAkB,SAAS,aAAa;AAGzD,OACE,YAAY,6BACZ,YAAY,yBACZ,YAAY,oCACZ,YAAY,gCAEZ;AAIF,OAAI,YAAY,kBACd;AAGF,QAAK,KACH,GAAG,iBACD,OACA,aAAa,EACd,CACF;;;AAKP,QAAO"}
@@ -0,0 +1,26 @@
1
+ //#region src/gui/timeline/timelineStateContext.d.ts
2
+ /**
3
+ * The core invariant of the timeline system.
4
+ * Everything else (ruler positions, track positions, playhead position) derives from this.
5
+ */
6
+ interface TimelineState {
7
+ /** Pixels per millisecond - the single zoom value */
8
+ pixelsPerMs: number;
9
+ /** Current playhead position in milliseconds */
10
+ currentTimeMs: number;
11
+ /** Total duration in milliseconds */
12
+ durationMs: number;
13
+ /** Viewport scroll position in pixels - single source of truth for visible time range */
14
+ viewportScrollLeft: number;
15
+ /** Viewport width in pixels - for calculating visible time range */
16
+ viewportWidth: number;
17
+ /** Seek to a specific time */
18
+ seek: (timeMs: number) => void;
19
+ /** Zoom in */
20
+ zoomIn: () => void;
21
+ /** Zoom out */
22
+ zoomOut: () => void;
23
+ }
24
+ //#endregion
25
+ export { TimelineState };
26
+ //# sourceMappingURL=timelineStateContext.d.ts.map
@@ -0,0 +1,42 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ //#region src/gui/timeline/timelineStateContext.ts
4
+ const timelineStateContext = createContext("timeline-state");
5
+ /**
6
+ * Convert time to pixel position
7
+ */
8
+ function timeToPx(timeMs, pixelsPerMs) {
9
+ return timeMs * pixelsPerMs;
10
+ }
11
+ /**
12
+ * Convert pixel position to time
13
+ */
14
+ function pxToTime(px, pixelsPerMs) {
15
+ return px / pixelsPerMs;
16
+ }
17
+ /**
18
+ * Default pixels per ms at 100% zoom (100 pixels per second)
19
+ */
20
+ const DEFAULT_PIXELS_PER_MS = .1;
21
+ /**
22
+ * Timeline row height in pixels - must match --timeline-row-height CSS variable
23
+ */
24
+ const TIMELINE_ROW_HEIGHT = 28;
25
+ /**
26
+ * Timeline track content height in pixels - must match --timeline-track-height CSS variable
27
+ */
28
+ const TIMELINE_TRACK_HEIGHT = 22;
29
+ /**
30
+ * Vertical padding within a row (row height - track height) / 2
31
+ */
32
+ const TIMELINE_ROW_PADDING = (TIMELINE_ROW_HEIGHT - TIMELINE_TRACK_HEIGHT) / 2;
33
+ /**
34
+ * Calculate zoom scale from pixels per ms
35
+ */
36
+ function pixelsPerMsToZoom(pixelsPerMs) {
37
+ return pixelsPerMs / DEFAULT_PIXELS_PER_MS;
38
+ }
39
+
40
+ //#endregion
41
+ export { DEFAULT_PIXELS_PER_MS, pixelsPerMsToZoom, pxToTime, timeToPx, timelineStateContext };
42
+ //# sourceMappingURL=timelineStateContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineStateContext.js","names":[],"sources":["../../../src/gui/timeline/timelineStateContext.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\n\n/**\n * The core invariant of the timeline system.\n * Everything else (ruler positions, track positions, playhead position) derives from this.\n */\nexport interface TimelineState {\n /** Pixels per millisecond - the single zoom value */\n pixelsPerMs: number;\n /** Current playhead position in milliseconds */\n currentTimeMs: number;\n /** Total duration in milliseconds */\n durationMs: number;\n /** Viewport scroll position in pixels - single source of truth for visible time range */\n viewportScrollLeft: number;\n /** Viewport width in pixels - for calculating visible time range */\n viewportWidth: number;\n /** Seek to a specific time */\n seek: (timeMs: number) => void;\n /** Zoom in */\n zoomIn: () => void;\n /** Zoom out */\n zoomOut: () => void;\n}\n\nexport const timelineStateContext =\n createContext<TimelineState>(\"timeline-state\");\n\n/**\n * Convert time to pixel position\n */\nexport function timeToPx(timeMs: number, pixelsPerMs: number): number {\n return timeMs * pixelsPerMs;\n}\n\n/**\n * Convert pixel position to time\n */\nexport function pxToTime(px: number, pixelsPerMs: number): number {\n return px / pixelsPerMs;\n}\n\n/**\n * Default pixels per ms at 100% zoom (100 pixels per second)\n */\nexport const DEFAULT_PIXELS_PER_MS = 0.1;\n\n/**\n * Timeline row height in pixels - must match --timeline-row-height CSS variable\n */\nexport const TIMELINE_ROW_HEIGHT = 28;\n\n/**\n * Timeline track content height in pixels - must match --timeline-track-height CSS variable\n */\nexport const TIMELINE_TRACK_HEIGHT = 22;\n\n/**\n * Vertical padding within a row (row height - track height) / 2\n */\nexport const TIMELINE_ROW_PADDING = (TIMELINE_ROW_HEIGHT - TIMELINE_TRACK_HEIGHT) / 2;\n\n/**\n * Calculate pixels per ms from a zoom scale\n */\nexport function zoomToPixelsPerMs(zoomScale: number): number {\n return DEFAULT_PIXELS_PER_MS * zoomScale;\n}\n\n/**\n * Calculate zoom scale from pixels per ms\n */\nexport function pixelsPerMsToZoom(pixelsPerMs: number): number {\n return pixelsPerMs / DEFAULT_PIXELS_PER_MS;\n}\n"],"mappings":";;;AAyBA,MAAa,uBACX,cAA6B,iBAAiB;;;;AAKhD,SAAgB,SAAS,QAAgB,aAA6B;AACpE,QAAO,SAAS;;;;;AAMlB,SAAgB,SAAS,IAAY,aAA6B;AAChE,QAAO,KAAK;;;;;AAMd,MAAa,wBAAwB;;;;AAKrC,MAAa,sBAAsB;;;;AAKnC,MAAa,wBAAwB;;;;AAKrC,MAAa,wBAAwB,sBAAsB,yBAAyB;;;;AAYpF,SAAgB,kBAAkB,aAA6B;AAC7D,QAAO,cAAc"}
@@ -0,0 +1,264 @@
1
+ import { __decorate } from "../../../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
2
+ import { EFAudio } from "../../../elements/EFAudio.js";
3
+ import { TrackItem } from "./TrackItem.js";
4
+ import { extractWaveformData } from "./waveformUtils.js";
5
+ import { timelineStateContext } from "../timelineStateContext.js";
6
+ import { consume } from "@lit/context";
7
+ import { css, html, nothing } from "lit";
8
+ import { customElement, state } from "lit/decorators.js";
9
+ import { createRef, ref } from "lit/directives/ref.js";
10
+
11
+ //#region src/gui/timeline/tracks/AudioTrack.ts
12
+ /** Padding in pixels to render beyond visible area (for smooth scrolling) */
13
+ const VIRTUAL_RENDER_PADDING_PX = 100;
14
+ let EFAudioTrack = class EFAudioTrack$1 extends TrackItem {
15
+ constructor(..._args) {
16
+ super(..._args);
17
+ this.canvasRef = createRef();
18
+ this._waveformData = null;
19
+ this._isLoading = false;
20
+ }
21
+ static {
22
+ this.styles = [...TrackItem.styles, css`
23
+ .waveform-host {
24
+ position: absolute;
25
+ left: 0;
26
+ top: 2px;
27
+ right: 0;
28
+ bottom: 2px;
29
+ overflow: hidden;
30
+ }
31
+ .waveform-canvas {
32
+ display: block;
33
+ position: absolute;
34
+ top: 0;
35
+ height: 100%;
36
+ pointer-events: none;
37
+ }
38
+ `];
39
+ }
40
+ #lastSrc = null;
41
+ #abortController = null;
42
+ #resizeObserver;
43
+ #renderRequested = false;
44
+ #hostHeight = 0;
45
+ /**
46
+ * Load waveform data when the audio source changes
47
+ */
48
+ async #loadWaveformData() {
49
+ const src = this.element?.src;
50
+ if (!src || src === this.#lastSrc) return;
51
+ this.#lastSrc = src;
52
+ this.#abortController?.abort();
53
+ this.#abortController = new AbortController();
54
+ this._isLoading = true;
55
+ try {
56
+ const waveformData = await extractWaveformData(src, this.#abortController.signal);
57
+ if (waveformData) {
58
+ this._waveformData = waveformData;
59
+ this.#scheduleRender();
60
+ }
61
+ } catch (error) {
62
+ if (!(error instanceof DOMException && error.name === "AbortError")) console.warn("Failed to load waveform data:", error);
63
+ } finally {
64
+ this._isLoading = false;
65
+ }
66
+ }
67
+ /**
68
+ * Schedule a canvas render on the next animation frame
69
+ */
70
+ #scheduleRender() {
71
+ if (this.#renderRequested) return;
72
+ this.#renderRequested = true;
73
+ requestAnimationFrame(() => {
74
+ this.#renderRequested = false;
75
+ this.#renderWaveform();
76
+ });
77
+ }
78
+ /**
79
+ * Get the track's position info relative to timeline scroll
80
+ */
81
+ #getTrackPositionInfo() {
82
+ const audio = this.element;
83
+ const durationMs = audio.durationMs ?? 0;
84
+ if (durationMs === 0) return null;
85
+ const pixelsPerMs = this._timelineState?.pixelsPerMs ?? this.pixelsPerMs;
86
+ const trackWidthPx = durationMs * pixelsPerMs;
87
+ return {
88
+ trackStartPx: (audio.startTimeMs ?? 0) * pixelsPerMs,
89
+ trackWidthPx,
90
+ viewportScrollLeft: this._timelineState?.viewportScrollLeft ?? 0,
91
+ viewportWidth: this._timelineState?.viewportWidth ?? 800,
92
+ pixelsPerMs
93
+ };
94
+ }
95
+ /**
96
+ * Render the waveform to canvas with virtual rendering.
97
+ *
98
+ * The approach:
99
+ * 1. Calculate the visible portion of the track (intersection of track and viewport)
100
+ * 2. Position the canvas at that visible portion within the track
101
+ * 3. Draw only the waveform data for that visible time range
102
+ * 4. Update position and content as scroll/zoom changes
103
+ */
104
+ #renderWaveform() {
105
+ const canvas = this.canvasRef.value;
106
+ const waveformData = this._waveformData;
107
+ if (!canvas || !waveformData) return;
108
+ const positionInfo = this.#getTrackPositionInfo();
109
+ if (!positionInfo) return;
110
+ const { trackStartPx, trackWidthPx, viewportScrollLeft, viewportWidth, pixelsPerMs } = positionInfo;
111
+ const visibleLeftPx = viewportScrollLeft - VIRTUAL_RENDER_PADDING_PX;
112
+ const visibleRightPx = viewportScrollLeft + viewportWidth + VIRTUAL_RENDER_PADDING_PX;
113
+ if (trackStartPx + trackWidthPx < visibleLeftPx || trackStartPx > visibleRightPx) {
114
+ canvas.style.display = "none";
115
+ return;
116
+ }
117
+ canvas.style.display = "block";
118
+ const visibleStartInTrack = Math.max(0, visibleLeftPx - trackStartPx);
119
+ const visibleEndInTrack = Math.min(trackWidthPx, visibleRightPx - trackStartPx);
120
+ const visibleWidthPx = visibleEndInTrack - visibleStartInTrack;
121
+ if (visibleWidthPx <= 0) return;
122
+ const height = this.#hostHeight || 18;
123
+ const dpr = window.devicePixelRatio || 1;
124
+ const targetWidth = Math.ceil(visibleWidthPx * dpr);
125
+ const targetHeight = Math.ceil(height * dpr);
126
+ if (canvas.width !== targetWidth || canvas.height !== targetHeight) {
127
+ canvas.width = targetWidth;
128
+ canvas.height = targetHeight;
129
+ }
130
+ canvas.style.left = `${visibleStartInTrack}px`;
131
+ canvas.style.width = `${visibleWidthPx}px`;
132
+ canvas.style.height = `${height}px`;
133
+ const ctx = canvas.getContext("2d");
134
+ if (!ctx) return;
135
+ ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
136
+ ctx.clearRect(0, 0, visibleWidthPx, height);
137
+ const sourceInMs = this.element.sourceStartMs ?? 0;
138
+ const timeStartMs = sourceInMs + visibleStartInTrack / pixelsPerMs;
139
+ const timeEndMs = sourceInMs + visibleEndInTrack / pixelsPerMs;
140
+ this.#drawWaveformRegion(ctx, waveformData, 0, visibleWidthPx, height, timeStartMs, timeEndMs);
141
+ }
142
+ /**
143
+ * Draw a region of the waveform to canvas
144
+ */
145
+ #drawWaveformRegion(ctx, waveformData, x, width, height, startMs, endMs) {
146
+ const { peaks, samplesPerSecond } = waveformData;
147
+ const startSample = Math.floor(startMs / 1e3 * samplesPerSecond);
148
+ const sampleCount = Math.ceil(endMs / 1e3 * samplesPerSecond) - startSample;
149
+ if (sampleCount <= 0 || width <= 0) return;
150
+ const centerY = height / 2;
151
+ const halfHeight = height / 2 - 2;
152
+ const color = this.getElementTypeColor();
153
+ ctx.fillStyle = color;
154
+ ctx.globalAlpha = .8;
155
+ ctx.beginPath();
156
+ const pixelsPerSample = width / sampleCount;
157
+ for (let i = 0; i <= sampleCount; i++) {
158
+ const peakIndex = (startSample + i) * 2;
159
+ if (peakIndex + 1 >= peaks.length) break;
160
+ const maxValue = peaks[peakIndex + 1] ?? 0;
161
+ const px = x + i * pixelsPerSample;
162
+ const py = centerY - maxValue * halfHeight;
163
+ if (i === 0) ctx.moveTo(px, py);
164
+ else ctx.lineTo(px, py);
165
+ }
166
+ for (let i = sampleCount; i >= 0; i--) {
167
+ const peakIndex = (startSample + i) * 2;
168
+ if (peakIndex >= peaks.length) continue;
169
+ const minValue = peaks[peakIndex] ?? 0;
170
+ const px = x + i * pixelsPerSample;
171
+ const py = centerY - minValue * halfHeight;
172
+ ctx.lineTo(px, py);
173
+ }
174
+ ctx.closePath();
175
+ ctx.fill();
176
+ ctx.globalAlpha = .3;
177
+ ctx.strokeStyle = color;
178
+ ctx.lineWidth = 1;
179
+ ctx.beginPath();
180
+ ctx.moveTo(x, centerY);
181
+ ctx.lineTo(x + width, centerY);
182
+ ctx.stroke();
183
+ ctx.globalAlpha = 1;
184
+ }
185
+ connectedCallback() {
186
+ super.connectedCallback();
187
+ this.#loadWaveformData();
188
+ this.#resizeObserver = new ResizeObserver((entries) => {
189
+ for (const entry of entries) {
190
+ this.#hostHeight = entry.borderBoxSize?.[0]?.blockSize ?? entry.contentRect.height;
191
+ this.#scheduleRender();
192
+ }
193
+ });
194
+ }
195
+ disconnectedCallback() {
196
+ super.disconnectedCallback();
197
+ this.#abortController?.abort();
198
+ this.#resizeObserver?.disconnect();
199
+ }
200
+ updated(changedProperties) {
201
+ super.updated(changedProperties);
202
+ if (this.element?.src !== this.#lastSrc) this.#loadWaveformData();
203
+ if (changedProperties.has("_timelineState")) this.#scheduleRender();
204
+ if (this.canvasRef.value && this.#resizeObserver) {
205
+ const container = this.canvasRef.value.parentElement;
206
+ if (container) {
207
+ this.#resizeObserver.disconnect();
208
+ this.#resizeObserver.observe(container);
209
+ }
210
+ }
211
+ this.#scheduleRender();
212
+ }
213
+ contents() {
214
+ const audio = this.element;
215
+ if (!(audio instanceof EFAudio)) return nothing;
216
+ if ((audio.durationMs ?? 0) === 0) return nothing;
217
+ if (!this._waveformData) return this.#renderPlaceholder();
218
+ return html`
219
+ <div class="waveform-host">
220
+ <canvas ${ref(this.canvasRef)} class="waveform-canvas"></canvas>
221
+ </div>
222
+ `;
223
+ }
224
+ /**
225
+ * Render placeholder while loading
226
+ */
227
+ #renderPlaceholder() {
228
+ return html`
229
+ <div
230
+ style="
231
+ position: absolute;
232
+ left: 0;
233
+ top: 2px;
234
+ bottom: 2px;
235
+ right: 0;
236
+ background: linear-gradient(90deg,
237
+ ${this.getElementTypeColor()}22 0%,
238
+ ${this.getElementTypeColor()}44 50%,
239
+ ${this.getElementTypeColor()}22 100%
240
+ );
241
+ background-size: 200% 100%;
242
+ animation: ${this._isLoading ? "shimmer 1.5s infinite" : "none"};
243
+ border-radius: 2px;
244
+ "
245
+ ></div>
246
+ <style>
247
+ @keyframes shimmer {
248
+ 0% { background-position: 200% 0; }
249
+ 100% { background-position: -200% 0; }
250
+ }
251
+ </style>
252
+ `;
253
+ }
254
+ };
255
+ __decorate([consume({
256
+ context: timelineStateContext,
257
+ subscribe: true
258
+ }), state()], EFAudioTrack.prototype, "_timelineState", void 0);
259
+ __decorate([state()], EFAudioTrack.prototype, "_waveformData", void 0);
260
+ __decorate([state()], EFAudioTrack.prototype, "_isLoading", void 0);
261
+ EFAudioTrack = __decorate([customElement("ef-audio-track")], EFAudioTrack);
262
+
263
+ //#endregion
264
+ //# sourceMappingURL=AudioTrack.js.map