@editframe/elements 0.37.3-beta → 0.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/dist/EF_FRAMEGEN.js +17 -14
  2. package/dist/EF_FRAMEGEN.js.map +1 -1
  3. package/dist/EF_RENDERING.js.map +1 -1
  4. package/dist/canvas/EFCanvas.d.ts +9 -2
  5. package/dist/canvas/EFCanvas.js +14 -4
  6. package/dist/canvas/EFCanvas.js.map +1 -1
  7. package/dist/canvas/EFCanvasItem.d.ts +2 -2
  8. package/dist/canvas/overlays/SelectionOverlay.d.ts +10 -2
  9. package/dist/canvas/overlays/SelectionOverlay.js +5 -12
  10. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -1
  11. package/dist/canvas/overlays/overlayState.js.map +1 -1
  12. package/dist/canvas/selection/SelectionController.js.map +1 -1
  13. package/dist/elements/EFAudio.d.ts +1 -11
  14. package/dist/elements/EFAudio.js +2 -10
  15. package/dist/elements/EFAudio.js.map +1 -1
  16. package/dist/elements/EFCaptions.d.ts +5 -9
  17. package/dist/elements/EFCaptions.js +34 -11
  18. package/dist/elements/EFCaptions.js.map +1 -1
  19. package/dist/elements/EFImage.d.ts +10 -8
  20. package/dist/elements/EFImage.js +117 -32
  21. package/dist/elements/EFImage.js.map +1 -1
  22. package/dist/elements/EFMedia/AssetMediaEngine.js +2 -2
  23. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
  24. package/dist/elements/EFMedia/BaseMediaEngine.js +15 -92
  25. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
  26. package/dist/elements/EFMedia/BufferedSeekingInput.js +10 -11
  27. package/dist/elements/EFMedia/BufferedSeekingInput.js.map +1 -1
  28. package/dist/elements/EFMedia/{AssetIdMediaEngine.js → FileMediaEngine.js} +44 -24
  29. package/dist/elements/EFMedia/FileMediaEngine.js.map +1 -0
  30. package/dist/elements/EFMedia/JitMediaEngine.js +14 -13
  31. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
  32. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -3
  33. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  34. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +12 -7
  35. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  36. package/dist/elements/EFMedia/shared/timeoutUtils.js +44 -0
  37. package/dist/elements/EFMedia/shared/timeoutUtils.js.map +1 -0
  38. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +1 -1
  39. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  40. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +4 -4
  41. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  42. package/dist/elements/EFMedia.d.ts +14 -8
  43. package/dist/elements/EFMedia.js +52 -19
  44. package/dist/elements/EFMedia.js.map +1 -1
  45. package/dist/elements/EFPanZoom.d.ts +2 -2
  46. package/dist/elements/EFPanZoom.js +1 -1
  47. package/dist/elements/EFPanZoom.js.map +1 -1
  48. package/dist/elements/EFSourceMixin.js +16 -8
  49. package/dist/elements/EFSourceMixin.js.map +1 -1
  50. package/dist/elements/EFSurface.d.ts +5 -8
  51. package/dist/elements/EFSurface.js +4 -43
  52. package/dist/elements/EFSurface.js.map +1 -1
  53. package/dist/elements/EFTemporal.d.ts +33 -8
  54. package/dist/elements/EFTemporal.js +92 -40
  55. package/dist/elements/EFTemporal.js.map +1 -1
  56. package/dist/elements/EFText.d.ts +3 -0
  57. package/dist/elements/EFText.js +54 -21
  58. package/dist/elements/EFText.js.map +1 -1
  59. package/dist/elements/EFTextSegment.js +8 -4
  60. package/dist/elements/EFTextSegment.js.map +1 -1
  61. package/dist/elements/EFTimegroup.d.ts +26 -43
  62. package/dist/elements/EFTimegroup.js +295 -314
  63. package/dist/elements/EFTimegroup.js.map +1 -1
  64. package/dist/elements/EFVideo.d.ts +44 -42
  65. package/dist/elements/EFVideo.js +259 -172
  66. package/dist/elements/EFVideo.js.map +1 -1
  67. package/dist/elements/EFWaveform.d.ts +3 -8
  68. package/dist/elements/EFWaveform.js +18 -13
  69. package/dist/elements/EFWaveform.js.map +1 -1
  70. package/dist/elements/ElementPositionInfo.js.map +1 -1
  71. package/dist/elements/FetchMixin.js.map +1 -1
  72. package/dist/elements/TargetController.d.ts +0 -3
  73. package/dist/elements/TargetController.js +12 -35
  74. package/dist/elements/TargetController.js.map +1 -1
  75. package/dist/elements/TimegroupController.js.map +1 -1
  76. package/dist/elements/cloneFactoryRegistry.d.ts +14 -0
  77. package/dist/elements/cloneFactoryRegistry.js +15 -0
  78. package/dist/elements/cloneFactoryRegistry.js.map +1 -0
  79. package/dist/elements/renderTemporalAudio.js +8 -6
  80. package/dist/elements/renderTemporalAudio.js.map +1 -1
  81. package/dist/elements/setupTemporalHierarchy.js +62 -0
  82. package/dist/elements/setupTemporalHierarchy.js.map +1 -0
  83. package/dist/elements/updateAnimations.js +62 -87
  84. package/dist/elements/updateAnimations.js.map +1 -1
  85. package/dist/getRenderInfo.d.ts +3 -2
  86. package/dist/getRenderInfo.js +20 -4
  87. package/dist/getRenderInfo.js.map +1 -1
  88. package/dist/gui/ContextMixin.js +68 -12
  89. package/dist/gui/ContextMixin.js.map +1 -1
  90. package/dist/gui/Controllable.js +1 -1
  91. package/dist/gui/Controllable.js.map +1 -1
  92. package/dist/gui/EFActiveRootTemporal.d.ts +2 -2
  93. package/dist/gui/EFActiveRootTemporal.js.map +1 -1
  94. package/dist/gui/EFControls.d.ts +2 -2
  95. package/dist/gui/EFControls.js +2 -2
  96. package/dist/gui/EFControls.js.map +1 -1
  97. package/dist/gui/EFDial.d.ts +2 -2
  98. package/dist/gui/EFDial.js +12 -9
  99. package/dist/gui/EFDial.js.map +1 -1
  100. package/dist/gui/EFFilmstrip.d.ts +2 -0
  101. package/dist/gui/EFFilmstrip.js +18 -10
  102. package/dist/gui/EFFilmstrip.js.map +1 -1
  103. package/dist/gui/EFFitScale.d.ts +28 -4
  104. package/dist/gui/EFFitScale.js +88 -26
  105. package/dist/gui/EFFitScale.js.map +1 -1
  106. package/dist/gui/EFFocusOverlay.d.ts +2 -2
  107. package/dist/gui/EFFocusOverlay.js +3 -3
  108. package/dist/gui/EFFocusOverlay.js.map +1 -1
  109. package/dist/gui/EFOverlayItem.d.ts +2 -2
  110. package/dist/gui/EFOverlayLayer.d.ts +2 -2
  111. package/dist/gui/EFPause.d.ts +2 -2
  112. package/dist/gui/EFPause.js +1 -1
  113. package/dist/gui/EFPlay.d.ts +2 -2
  114. package/dist/gui/EFPlay.js +1 -1
  115. package/dist/gui/EFPreview.js +1 -1
  116. package/dist/gui/EFResizableBox.d.ts +2 -2
  117. package/dist/gui/EFResizableBox.js +5 -5
  118. package/dist/gui/EFResizableBox.js.map +1 -1
  119. package/dist/gui/EFScrubber.d.ts +2 -2
  120. package/dist/gui/EFScrubber.js +8 -13
  121. package/dist/gui/EFScrubber.js.map +1 -1
  122. package/dist/gui/EFTimeDisplay.d.ts +6 -2
  123. package/dist/gui/EFTimeDisplay.js +25 -7
  124. package/dist/gui/EFTimeDisplay.js.map +1 -1
  125. package/dist/gui/EFTimelineRuler.d.ts +2 -2
  126. package/dist/gui/EFTimelineRuler.js +3 -3
  127. package/dist/gui/EFTimelineRuler.js.map +1 -1
  128. package/dist/gui/EFToggleLoop.d.ts +2 -2
  129. package/dist/gui/EFToggleLoop.js +1 -1
  130. package/dist/gui/EFTogglePlay.d.ts +2 -2
  131. package/dist/gui/EFTogglePlay.js +1 -1
  132. package/dist/gui/EFTransformHandles.d.ts +2 -2
  133. package/dist/gui/EFTransformHandles.js +6 -6
  134. package/dist/gui/EFTransformHandles.js.map +1 -1
  135. package/dist/gui/EFWorkbench.d.ts +40 -36
  136. package/dist/gui/EFWorkbench.js +436 -822
  137. package/dist/gui/EFWorkbench.js.map +1 -1
  138. package/dist/gui/FitScaleHelpers.js.map +1 -1
  139. package/dist/gui/PlaybackController.d.ts +3 -8
  140. package/dist/gui/PlaybackController.js +59 -56
  141. package/dist/gui/PlaybackController.js.map +1 -1
  142. package/dist/gui/TWMixin.js +1 -1
  143. package/dist/gui/TWMixin.js.map +1 -1
  144. package/dist/gui/TargetOrContextMixin.js +43 -6
  145. package/dist/gui/TargetOrContextMixin.js.map +1 -1
  146. package/dist/gui/ef-theme.css +136 -0
  147. package/dist/gui/hierarchy/EFHierarchy.d.ts +2 -2
  148. package/dist/gui/hierarchy/EFHierarchy.js +14 -24
  149. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -1
  150. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +3 -3
  151. package/dist/gui/hierarchy/EFHierarchyItem.js +22 -10
  152. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -1
  153. package/dist/gui/icons.js.map +1 -1
  154. package/dist/gui/previewSettingsContext.d.ts +18 -0
  155. package/dist/gui/previewSettingsContext.js.map +1 -1
  156. package/dist/gui/theme.js +34 -0
  157. package/dist/gui/theme.js.map +1 -0
  158. package/dist/gui/timeline/EFTimeline.d.ts +2 -2
  159. package/dist/gui/timeline/EFTimeline.js +70 -52
  160. package/dist/gui/timeline/EFTimeline.js.map +1 -1
  161. package/dist/gui/timeline/EFTimelineRow.d.ts +5 -3
  162. package/dist/gui/timeline/EFTimelineRow.js +55 -32
  163. package/dist/gui/timeline/EFTimelineRow.js.map +1 -1
  164. package/dist/gui/timeline/TrimHandles.d.ts +23 -9
  165. package/dist/gui/timeline/TrimHandles.js +224 -51
  166. package/dist/gui/timeline/TrimHandles.js.map +1 -1
  167. package/dist/gui/timeline/flattenHierarchy.js.map +1 -1
  168. package/dist/gui/timeline/timelineEditingContext.d.ts +34 -0
  169. package/dist/gui/timeline/timelineEditingContext.js +24 -0
  170. package/dist/gui/timeline/timelineEditingContext.js.map +1 -0
  171. package/dist/gui/timeline/timelineStateContext.js.map +1 -1
  172. package/dist/gui/timeline/tracks/AudioTrack.js +1 -1
  173. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -1
  174. package/dist/gui/timeline/tracks/CaptionsTrack.d.ts +2 -3
  175. package/dist/gui/timeline/tracks/CaptionsTrack.js +17 -75
  176. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -1
  177. package/dist/gui/timeline/tracks/EFThumbnailStrip.d.ts +52 -0
  178. package/dist/gui/timeline/tracks/EFThumbnailStrip.js +596 -0
  179. package/dist/gui/timeline/tracks/EFThumbnailStrip.js.map +1 -0
  180. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -1
  181. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -1
  182. package/dist/gui/timeline/tracks/TextTrack.d.ts +3 -2
  183. package/dist/gui/timeline/tracks/TextTrack.js +17 -43
  184. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -1
  185. package/dist/gui/timeline/tracks/TimegroupTrack.d.ts +3 -4
  186. package/dist/gui/timeline/tracks/TimegroupTrack.js +33 -23
  187. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -1
  188. package/dist/gui/timeline/tracks/TrackItem.d.ts +7 -9
  189. package/dist/gui/timeline/tracks/TrackItem.js +18 -17
  190. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -1
  191. package/dist/gui/timeline/tracks/VideoTrack.d.ts +3 -3
  192. package/dist/gui/timeline/tracks/VideoTrack.js +11 -14
  193. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -1
  194. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -1
  195. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -1
  196. package/dist/gui/timeline/tracks/waveformUtils.js +1 -1
  197. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -1
  198. package/dist/gui/tree/EFTree.d.ts +2 -2
  199. package/dist/gui/tree/EFTree.js +8 -14
  200. package/dist/gui/tree/EFTree.js.map +1 -1
  201. package/dist/gui/tree/EFTreeItem.d.ts +2 -2
  202. package/dist/gui/tree/EFTreeItem.js +3 -3
  203. package/dist/gui/tree/EFTreeItem.js.map +1 -1
  204. package/dist/gui/tree/treeContext.js.map +1 -1
  205. package/dist/index.d.ts +10 -8
  206. package/dist/index.js +6 -5
  207. package/dist/index.js.map +1 -1
  208. package/dist/node.d.ts +2 -2
  209. package/dist/node.js +2 -2
  210. package/dist/preview/AdaptiveResolutionTracker.js +3 -3
  211. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -1
  212. package/dist/preview/FrameController.d.ts +2 -17
  213. package/dist/preview/FrameController.js +40 -63
  214. package/dist/preview/FrameController.js.map +1 -1
  215. package/dist/preview/QualityUpgradeScheduler.d.ts +76 -0
  216. package/dist/preview/QualityUpgradeScheduler.js +158 -0
  217. package/dist/preview/QualityUpgradeScheduler.js.map +1 -0
  218. package/dist/preview/RenderContext.d.ts +119 -1
  219. package/dist/preview/RenderContext.js +21 -3
  220. package/dist/preview/RenderContext.js.map +1 -1
  221. package/dist/preview/RenderProfiler.js.map +1 -1
  222. package/dist/preview/RenderStats.js +85 -0
  223. package/dist/preview/RenderStats.js.map +1 -0
  224. package/dist/preview/encoding/canvasEncoder.js +2 -52
  225. package/dist/preview/encoding/canvasEncoder.js.map +1 -1
  226. package/dist/preview/encoding/mainThreadEncoder.js.map +1 -1
  227. package/dist/preview/encoding/workerEncoder.js.map +1 -1
  228. package/dist/preview/logger.js.map +1 -1
  229. package/dist/preview/previewSettings.d.ts +34 -0
  230. package/dist/preview/previewSettings.js +29 -17
  231. package/dist/preview/previewSettings.js.map +1 -1
  232. package/dist/preview/previewTypes.js +4 -4
  233. package/dist/preview/previewTypes.js.map +1 -1
  234. package/dist/preview/renderElementToCanvas.d.ts +44 -0
  235. package/dist/preview/renderElementToCanvas.js +72 -0
  236. package/dist/preview/renderElementToCanvas.js.map +1 -0
  237. package/dist/preview/renderTimegroupToCanvas.d.ts +134 -32
  238. package/dist/preview/renderTimegroupToCanvas.js +321 -146
  239. package/dist/preview/renderTimegroupToCanvas.js.map +1 -1
  240. package/dist/preview/renderTimegroupToCanvas.types.d.ts +51 -0
  241. package/dist/preview/renderTimegroupToVideo.d.ts +20 -35
  242. package/dist/preview/renderTimegroupToVideo.js +94 -106
  243. package/dist/preview/renderTimegroupToVideo.js.map +1 -1
  244. package/dist/preview/renderTimegroupToVideo.types.d.ts +42 -0
  245. package/dist/preview/renderVideoToVideo.js +286 -0
  246. package/dist/preview/renderVideoToVideo.js.map +1 -0
  247. package/dist/preview/renderers.d.ts +56 -0
  248. package/dist/preview/renderers.js +13 -1
  249. package/dist/preview/renderers.js.map +1 -1
  250. package/dist/preview/rendering/ScaleConfig.js +74 -0
  251. package/dist/preview/rendering/ScaleConfig.js.map +1 -0
  252. package/dist/preview/rendering/inlineImages.d.ts +13 -0
  253. package/dist/preview/rendering/inlineImages.js +7 -44
  254. package/dist/preview/rendering/inlineImages.js.map +1 -1
  255. package/dist/preview/rendering/loadImage.d.ts +8 -0
  256. package/dist/preview/rendering/loadImage.js +22 -0
  257. package/dist/preview/rendering/loadImage.js.map +1 -0
  258. package/dist/preview/rendering/renderToImageNative.js +3 -3
  259. package/dist/preview/rendering/renderToImageNative.js.map +1 -1
  260. package/dist/preview/rendering/serializeTimelineDirect.js +224 -68
  261. package/dist/preview/rendering/serializeTimelineDirect.js.map +1 -1
  262. package/dist/preview/statsTrackingStrategy.js +1 -101
  263. package/dist/preview/statsTrackingStrategy.js.map +1 -1
  264. package/dist/preview/workers/WorkerPool.js +0 -1
  265. package/dist/preview/workers/WorkerPool.js.map +1 -1
  266. package/dist/preview/workers/encoderWorkerInline.js +21 -54
  267. package/dist/preview/workers/encoderWorkerInline.js.map +1 -1
  268. package/dist/render/EFRenderAPI.d.ts +2 -1
  269. package/dist/render/EFRenderAPI.js +12 -36
  270. package/dist/render/EFRenderAPI.js.map +1 -1
  271. package/dist/render/getRenderData.js +4 -4
  272. package/dist/render/getRenderData.js.map +1 -1
  273. package/dist/style.css +114 -163
  274. package/dist/transcoding/cache/RequestDeduplicator.js +1 -0
  275. package/dist/transcoding/cache/RequestDeduplicator.js.map +1 -1
  276. package/dist/transcoding/types/index.d.ts +1 -1
  277. package/dist/transcoding/utils/UrlGenerator.js +10 -3
  278. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  279. package/dist/utils/LRUCache.js +1 -0
  280. package/dist/utils/LRUCache.js.map +1 -1
  281. package/dist/utils/frameTime.js +23 -1
  282. package/dist/utils/frameTime.js.map +1 -1
  283. package/package.json +45 -8
  284. package/scripts/build-css.js +8 -1
  285. package/test/setup.ts +0 -1
  286. package/test/useAssetMSW.ts +50 -0
  287. package/test/visualRegressionUtils.ts +23 -9
  288. package/tsdown.config.ts +6 -1
  289. package/dist/_virtual/rolldown_runtime.js +0 -27
  290. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +0 -1
  291. package/dist/elements/EFThumbnailStrip.d.ts +0 -167
  292. package/dist/elements/EFThumbnailStrip.js +0 -731
  293. package/dist/elements/EFThumbnailStrip.js.map +0 -1
  294. package/dist/elements/SessionThumbnailCache.js +0 -154
  295. package/dist/elements/SessionThumbnailCache.js.map +0 -1
  296. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +0 -688
  297. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +0 -1
  298. package/dist/node_modules/react/cjs/react.development.js +0 -1521
  299. package/dist/node_modules/react/cjs/react.development.js.map +0 -1
  300. package/dist/node_modules/react/index.js +0 -13
  301. package/dist/node_modules/react/index.js.map +0 -1
  302. package/dist/node_modules/react/jsx-runtime.js +0 -13
  303. package/dist/node_modules/react/jsx-runtime.js.map +0 -1
  304. package/dist/preview/encoding/types.d.ts +0 -1
  305. package/dist/preview/renderTimegroupPreview.js +0 -686
  306. package/dist/preview/renderTimegroupPreview.js.map +0 -1
  307. package/dist/preview/rendering/renderToImage.d.ts +0 -2
  308. package/dist/preview/rendering/renderToImage.js +0 -95
  309. package/dist/preview/rendering/renderToImage.js.map +0 -1
  310. package/dist/preview/rendering/renderToImageForeignObject.js +0 -163
  311. package/dist/preview/rendering/renderToImageForeignObject.js.map +0 -1
  312. package/dist/preview/rendering/renderToImageNative.d.ts +0 -1
  313. package/dist/preview/rendering/svgSerializer.js +0 -43
  314. package/dist/preview/rendering/svgSerializer.js.map +0 -1
  315. package/dist/preview/rendering/types.d.ts +0 -2
  316. package/dist/preview/thumbnailCacheSettings.js +0 -52
  317. package/dist/preview/thumbnailCacheSettings.js.map +0 -1
  318. package/dist/sandbox/PlaybackControls.d.ts +0 -1
  319. package/dist/sandbox/PlaybackControls.js +0 -10
  320. package/dist/sandbox/PlaybackControls.js.map +0 -1
  321. package/dist/sandbox/ScenarioRunner.d.ts +0 -1
  322. package/dist/sandbox/ScenarioRunner.js +0 -1
  323. package/dist/sandbox/defineSandbox.d.ts +0 -1
  324. package/dist/sandbox/index.d.ts +0 -3
  325. package/dist/sandbox/index.js +0 -2
  326. package/test/EFVideo.framegen.browsertest.ts +0 -80
  327. package/test/thumbnail-performance-test.html +0 -116
@@ -1,14 +1,17 @@
1
+ import { TWMixin } from "../TWMixin2.js";
1
2
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
2
3
  import { isEFTemporal } from "../../elements/EFTemporal.js";
3
- import { TWMixin } from "../TWMixin2.js";
4
4
  import { EFAudio } from "../../elements/EFAudio.js";
5
5
  import { EFVideo } from "../../elements/EFVideo.js";
6
6
  import { EFCaptions } from "../../elements/EFCaptions.js";
7
7
  import { EFImage } from "../../elements/EFImage.js";
8
8
  import { EFText } from "../../elements/EFText.js";
9
9
  import { ICONS, phosphorIcon } from "../icons.js";
10
+ import { getElementTypeColor } from "../theme.js";
11
+ import { timelineEditingContext } from "./timelineEditingContext.js";
10
12
  import { renderTrackChildren } from "./tracks/renderTrackChildren.js";
11
13
  import { EFTimegroup } from "../../elements/EFTimegroup.js";
14
+ import { consume } from "@lit/context";
12
15
  import { LitElement, css, html, nothing } from "lit";
13
16
  import { customElement, property } from "lit/decorators.js";
14
17
  import { styleMap } from "lit/directives/style-map.js";
@@ -21,9 +24,11 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
21
24
  this.depth = 0;
22
25
  this.pixelsPerMs = .04;
23
26
  this.enableTrim = false;
27
+ this.hideLabel = false;
24
28
  this.highlightedElement = null;
25
29
  this.selectedIds = /* @__PURE__ */ new Set();
26
30
  this.handleMouseEnter = () => {
31
+ if (this.editingContext && !this.editingContext.canInteract()) return;
27
32
  this.dispatchEvent(new CustomEvent("row-hover", {
28
33
  detail: { element: this.element },
29
34
  bubbles: true,
@@ -31,6 +36,7 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
31
36
  }));
32
37
  };
33
38
  this.handleMouseLeave = () => {
39
+ if (this.editingContext && !this.editingContext.canInteract()) return;
34
40
  this.dispatchEvent(new CustomEvent("row-hover", {
35
41
  detail: { element: null },
36
42
  bubbles: true,
@@ -55,7 +61,17 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
55
61
  :host {
56
62
  display: flex;
57
63
  min-height: var(--timeline-row-height, 28px);
58
- border-bottom: 1px solid rgba(71, 85, 105, 0.4);
64
+ border-bottom: 1px solid var(--ef-color-border-subtle);
65
+ }
66
+
67
+ :host(.nested-timegroup) {
68
+ min-height: 18px;
69
+ --timeline-track-height: 14px;
70
+ }
71
+
72
+ :host(.nested-timegroup) .row-label {
73
+ font-size: 10px;
74
+ opacity: 0.7;
59
75
  }
60
76
 
61
77
  /* Root timegroup row with filmstrip - taller to show thumbnails */
@@ -67,8 +83,8 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
67
83
  top: 24px;
68
84
  /* Higher z-index than regular row labels (z-index: 8) so everything scrolls underneath */
69
85
  z-index: 15;
70
- background: var(--timeline-bg, rgb(30 41 59));
71
- border-bottom: 1px solid rgba(71, 85, 105, 0.6);
86
+ background: var(--timeline-bg, var(--ef-color-bg));
87
+ border-bottom: 1px solid var(--ef-color-border);
72
88
  }
73
89
 
74
90
  /* Root timegroup label needs higher z-index to stay above other labels when scrolling */
@@ -78,22 +94,22 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
78
94
 
79
95
  /* Hover state - this row is directly hovered */
80
96
  :host(.hovered) {
81
- background: rgba(59, 130, 246, 0.1);
97
+ background: var(--ef-color-hover);
82
98
  }
83
99
 
84
100
  /* Ancestor hovered - a descendant of this row is hovered */
85
101
  :host(.ancestor-hovered) {
86
- background: rgba(59, 130, 246, 0.05);
102
+ background: var(--ef-color-selected-subtle);
87
103
  }
88
104
 
89
105
  /* Descendant hovered - an ancestor of this row is hovered */
90
106
  :host(.descendant-hovered) {
91
- background: rgba(59, 130, 246, 0.03);
107
+ background: var(--ef-color-selected-subtle);
92
108
  }
93
109
 
94
110
  /* Selected state */
95
111
  :host(.selected) {
96
- background: rgba(59, 130, 246, 0.2);
112
+ background: var(--ef-color-selected);
97
113
  }
98
114
 
99
115
  :host(.selected) .row-label {
@@ -102,7 +118,7 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
102
118
 
103
119
  /* Ancestor has selected descendant */
104
120
  :host(.ancestor-selected) {
105
- background: rgba(59, 130, 246, 0.1);
121
+ background: var(--ef-color-selected-subtle);
106
122
  }
107
123
 
108
124
  .row-label {
@@ -112,31 +128,38 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
112
128
  z-index: 8;
113
129
  width: var(--timeline-hierarchy-width, 200px);
114
130
  flex-shrink: 0;
115
- background: rgb(38, 50, 68);
116
- border-right: 1px solid rgba(71, 85, 105, 0.5);
131
+ background: var(--ef-color-bg-panel);
132
+ border-right: 1px solid var(--ef-color-border-subtle);
117
133
  display: flex;
118
134
  align-items: center;
119
135
  font-size: 11px;
120
136
  white-space: nowrap;
121
137
  overflow: hidden;
122
138
  text-overflow: ellipsis;
123
- color: rgba(226, 232, 240, 0.9);
139
+ color: var(--ef-color-text);
124
140
  cursor: pointer;
125
141
  transition: background-color 0.1s ease;
126
142
  }
127
143
 
144
+ /* Hide label column when hierarchy is disabled */
145
+ :host([hide-label]) .row-label {
146
+ display: none;
147
+ }
148
+
128
149
  .row-label:hover {
129
- background: rgb(51, 65, 85);
150
+ background: color-mix(in srgb, var(--ef-color-bg-panel) 70%, var(--ef-color-hover) 30%);
130
151
  }
131
152
 
132
153
  :host(.hovered) .row-label {
133
- background: rgb(55, 90, 150);
134
- color: white;
154
+ background: var(--ef-color-bg-elevated);
155
+ border-left: 3px solid var(--ef-color-primary);
156
+ padding-left: calc(var(--indent, 0px) - 3px);
135
157
  }
136
158
 
137
159
  :host(.selected) .row-label {
138
- background: rgb(45, 85, 140);
139
- color: white;
160
+ background: var(--ef-color-bg-elevated);
161
+ border-left: 3px solid var(--ef-color-primary);
162
+ padding-left: calc(var(--indent, 0px) - 3px);
140
163
  }
141
164
 
142
165
  .row-track {
@@ -204,7 +227,9 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
204
227
  }
205
228
  if (changedProperties.has("element")) {
206
229
  const isRoot = this.element instanceof EFTimegroup && this.element.isRootTimegroup;
230
+ const isNested = this.element instanceof EFTimegroup && !this.element.isRootTimegroup;
207
231
  this.classList.toggle("root-timegroup", isRoot);
232
+ this.classList.toggle("nested-timegroup", isNested);
208
233
  }
209
234
  }
210
235
  getElementType(element) {
@@ -216,18 +241,6 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
216
241
  if (element instanceof EFTimegroup) return "timegroup";
217
242
  return "unknown";
218
243
  }
219
- getElementTypeColor(type) {
220
- const colors = {
221
- video: "rgb(59, 130, 246)",
222
- audio: "rgb(34, 197, 94)",
223
- image: "rgb(168, 85, 247)",
224
- text: "rgb(249, 115, 22)",
225
- captions: "rgb(34, 197, 94)",
226
- timegroup: "rgb(148, 163, 184)",
227
- unknown: "rgb(148, 163, 184)"
228
- };
229
- return colors[type] || colors.unknown;
230
- }
231
244
  getElementIcon(type) {
232
245
  const iconMap = {
233
246
  video: phosphorIcon(ICONS.filmStrip, 14),
@@ -294,7 +307,7 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
294
307
  .showSelectors=${this.showSelectors}
295
308
  ></ef-timegroup-track>`;
296
309
  }
297
- return html`${renderTrackChildren([this.element], this.pixelsPerMs, this.hideSelectors, this.showSelectors, true, this.enableTrim, true)}`;
310
+ return html`${renderTrackChildren([this.element], this.pixelsPerMs, this.hideSelectors, this.showSelectors, true, this.enableTrim)}`;
298
311
  }
299
312
  connectedCallback() {
300
313
  super.connectedCallback();
@@ -313,11 +326,12 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
313
326
  const type = this.getElementType(this.element);
314
327
  const label = this.getElementLabel(this.element);
315
328
  const detail = this.getElementDetail(this.element);
316
- const typeColor = this.getElementTypeColor(type);
329
+ const typeColor = getElementTypeColor(type, this);
317
330
  const icon = this.getElementIcon(type);
318
331
  return html`
319
332
  <div
320
333
  class="row-label"
334
+ part="label"
321
335
  style=${styleMap({
322
336
  paddingLeft: `${this.depth * INDENT_PX}px`,
323
337
  borderLeftColor: typeColor,
@@ -335,7 +349,7 @@ let EFTimelineRow = class EFTimelineRow$1 extends TWMixin(LitElement) {
335
349
  </span>
336
350
  ` : nothing}
337
351
  </div>
338
- <div class="row-track">${this.renderTrack()}</div>
352
+ <div class="row-track" part="track">${this.renderTrack()}</div>
339
353
  `;
340
354
  }
341
355
  };
@@ -352,6 +366,11 @@ __decorate([property({
352
366
  type: Boolean,
353
367
  attribute: "enable-trim"
354
368
  })], EFTimelineRow.prototype, "enableTrim", void 0);
369
+ __decorate([property({
370
+ type: Boolean,
371
+ attribute: "hide-label",
372
+ reflect: true
373
+ })], EFTimelineRow.prototype, "hideLabel", void 0);
355
374
  __decorate([property({
356
375
  type: Array,
357
376
  attribute: false
@@ -368,6 +387,10 @@ __decorate([property({
368
387
  type: Object,
369
388
  attribute: false
370
389
  })], EFTimelineRow.prototype, "selectedIds", void 0);
390
+ __decorate([consume({
391
+ context: timelineEditingContext,
392
+ subscribe: true
393
+ })], EFTimelineRow.prototype, "editingContext", void 0);
371
394
  EFTimelineRow = __decorate([customElement("ef-timeline-row")], EFTimelineRow);
372
395
 
373
396
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"EFTimelineRow.js","names":["EFTimelineRow","colors: Record<string, string>","iconMap: Record<string, TemplateResult>"],"sources":["../../../src/gui/timeline/EFTimelineRow.ts"],"sourcesContent":["import {\n css,\n html,\n LitElement,\n nothing,\n type PropertyValues,\n type TemplateResult,\n} from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport {\n isEFTemporal,\n type TemporalMixinInterface,\n} 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 { EFCaptions } from \"../../elements/EFCaptions.js\";\nimport { TWMixin } from \"../TWMixin.js\";\nimport { renderTrackChildren } from \"./tracks/renderTrackChildren.js\";\nimport { phosphorIcon, ICONS } from \"../icons.js\";\n// NOTE: Track components (ef-timegroup-track, etc.) are NOT imported here\n// to avoid circular dependencies with TrackItem. They must be registered before\n// EFTimelineRow is used. See preloadTracks.ts for the registration sequence.\n\nconst INDENT_PX = 16;\n\n/**\n * EFTimelineRow - A unified timeline row containing both label and track\n *\n * This component renders a single row in the timeline with:\n * - A sticky label on the left (stays fixed during horizontal scroll)\n * - Track content on the right (scrolls horizontally with the timeline)\n *\n * Heights are determined by content, not hardcoded.\n */\n@customElement(\"ef-timeline-row\")\nexport class EFTimelineRow extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: flex;\n min-height: var(--timeline-row-height, 28px);\n border-bottom: 1px solid rgba(71, 85, 105, 0.4);\n }\n\n /* Root timegroup row with filmstrip - taller to show thumbnails */\n :host(.root-timegroup) {\n min-height: 52px;\n height: 52px;\n /* Sticky at top below ruler (ruler is 24px) */\n position: sticky;\n top: 24px;\n /* Higher z-index than regular row labels (z-index: 8) so everything scrolls underneath */\n z-index: 15;\n background: var(--timeline-bg, rgb(30 41 59));\n border-bottom: 1px solid rgba(71, 85, 105, 0.6);\n }\n\n /* Root timegroup label needs higher z-index to stay above other labels when scrolling */\n :host(.root-timegroup) .row-label {\n z-index: 16;\n }\n\n /* Hover state - this row is directly hovered */\n :host(.hovered) {\n background: rgba(59, 130, 246, 0.1);\n }\n\n /* Ancestor hovered - a descendant of this row is hovered */\n :host(.ancestor-hovered) {\n background: rgba(59, 130, 246, 0.05);\n }\n\n /* Descendant hovered - an ancestor of this row is hovered */\n :host(.descendant-hovered) {\n background: rgba(59, 130, 246, 0.03);\n }\n\n /* Selected state */\n :host(.selected) {\n background: rgba(59, 130, 246, 0.2);\n }\n \n :host(.selected) .row-label {\n font-weight: 500;\n }\n\n /* Ancestor has selected descendant */\n :host(.ancestor-selected) {\n background: rgba(59, 130, 246, 0.1);\n }\n\n .row-label {\n position: sticky;\n left: 0;\n /* Lower z-index so labels scroll underneath the sticky root timegroup row (z-index: 15) */\n z-index: 8;\n width: var(--timeline-hierarchy-width, 200px);\n flex-shrink: 0;\n background: rgb(38, 50, 68);\n border-right: 1px solid rgba(71, 85, 105, 0.5);\n display: flex;\n align-items: center;\n font-size: 11px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: rgba(226, 232, 240, 0.9);\n cursor: pointer;\n transition: background-color 0.1s ease;\n }\n\n .row-label:hover {\n background: rgb(51, 65, 85);\n }\n\n :host(.hovered) .row-label {\n background: rgb(55, 90, 150);\n color: white;\n }\n\n :host(.selected) .row-label {\n background: rgb(45, 85, 140);\n color: white;\n }\n\n .row-track {\n flex: 1;\n position: relative;\n min-width: 0;\n }\n \n :host(:first-child) .row-track::before {\n display: none;\n }\n \n /* Grouping indicator for nested elements */\n .row-track::after {\n content: \"\";\n position: absolute;\n left: -12px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--timeline-border, rgb(71 85 105));\n opacity: 0.2;\n z-index: 0;\n }\n \n :host(:first-child) .row-track::after {\n display: none;\n }\n `,\n ];\n\n @property({ type: Object, attribute: false })\n element!: TemporalMixinInterface & Element;\n\n @property({ type: Number })\n depth = 0;\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 /**\n * The currently highlighted element from canvas (source of truth).\n * Passed from parent timeline which reads it from canvas.\n */\n @property({ type: Object, attribute: false })\n highlightedElement: Element | null = null;\n\n @property({ type: Object, attribute: false })\n selectedIds: ReadonlySet<string> = new Set();\n\n // Derived interaction states (computed on-demand)\n private get isHovered(): boolean {\n return this.highlightedElement === this.element;\n }\n\n private get isSelected(): boolean {\n const elementId = (this.element as unknown as HTMLElement)?.id;\n return elementId ? this.selectedIds.has(elementId) : false;\n }\n\n private get isAncestorSelected(): boolean {\n if (!this.element) return false;\n // Check if this element contains any selected element\n const elementAsHTMLElement = this.element as unknown as HTMLElement;\n for (const selectedId of this.selectedIds) {\n const selectedElement = document.getElementById(selectedId);\n if (\n selectedElement &&\n elementAsHTMLElement.contains(selectedElement) &&\n selectedElement !== elementAsHTMLElement\n ) {\n return true;\n }\n }\n return false;\n }\n\n private get isAncestorHovered(): boolean {\n if (!this.highlightedElement || !this.element) return false;\n // This row's element contains the highlighted element (highlighted is a descendant)\n return (\n this.element !== this.highlightedElement &&\n this.element.contains(this.highlightedElement)\n );\n }\n\n private get isDescendantHovered(): boolean {\n if (!this.highlightedElement || !this.element) return false;\n // The highlighted element contains this row's element (highlighted is an ancestor)\n return (\n this.element !== this.highlightedElement &&\n this.highlightedElement.contains(this.element)\n );\n }\n\n protected updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n // Update host classes based on interaction state\n if (\n changedProperties.has(\"highlightedElement\") ||\n changedProperties.has(\"element\")\n ) {\n this.classList.toggle(\"hovered\", this.isHovered);\n this.classList.toggle(\"ancestor-hovered\", this.isAncestorHovered);\n this.classList.toggle(\"descendant-hovered\", this.isDescendantHovered);\n }\n\n // Update selection classes\n if (\n changedProperties.has(\"selectedIds\") ||\n changedProperties.has(\"element\")\n ) {\n this.classList.toggle(\"selected\", this.isSelected);\n this.classList.toggle(\"ancestor-selected\", this.isAncestorSelected);\n }\n\n // Update root timegroup class for filmstrip rows\n if (changedProperties.has(\"element\")) {\n const isRoot = this.element instanceof EFTimegroup && this.element.isRootTimegroup;\n this.classList.toggle(\"root-timegroup\", isRoot);\n }\n }\n\n private handleMouseEnter = (): void => {\n this.dispatchEvent(\n new CustomEvent(\"row-hover\", {\n detail: { element: this.element },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n private handleMouseLeave = (): void => {\n this.dispatchEvent(\n new CustomEvent(\"row-hover\", {\n detail: { element: null },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n private handleClick = (e: Event): void => {\n e.stopPropagation();\n const elementId = (this.element as unknown as HTMLElement)?.id;\n if (elementId) {\n this.dispatchEvent(\n new CustomEvent(\"row-select\", {\n detail: { elementId, element: this.element },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n private getElementType(element: Element): string {\n if (element instanceof EFVideo) return \"video\";\n if (element instanceof EFAudio) return \"audio\";\n if (element instanceof EFImage) return \"image\";\n if (element instanceof EFText) return \"text\";\n if (element instanceof EFCaptions) return \"captions\";\n if (element instanceof EFTimegroup) return \"timegroup\";\n return \"unknown\";\n }\n\n private getElementTypeColor(type: string): string {\n const colors: Record<string, string> = {\n video: \"rgb(59, 130, 246)\", // Blue\n audio: \"rgb(34, 197, 94)\", // Green\n image: \"rgb(168, 85, 247)\", // Purple\n text: \"rgb(249, 115, 22)\", // Orange\n captions: \"rgb(34, 197, 94)\", // Green (like audio/subtitles)\n timegroup: \"rgb(148, 163, 184)\", // Gray\n unknown: \"rgb(148, 163, 184)\",\n };\n return colors[type] || colors.unknown!;\n }\n\n private getElementIcon(type: string): TemplateResult {\n const iconMap: Record<string, TemplateResult> = {\n video: phosphorIcon(ICONS.filmStrip, 14),\n audio: phosphorIcon(ICONS.speakerHigh, 14),\n image: phosphorIcon(ICONS.image, 14),\n text: phosphorIcon(ICONS.textT, 14),\n captions: phosphorIcon(ICONS.subtitles, 14),\n timegroup: phosphorIcon(ICONS.filmSlate, 14),\n unknown: phosphorIcon(ICONS.code, 14),\n };\n return iconMap[type] ?? iconMap.unknown!;\n }\n\n private getElementLabel(element: Element): string {\n const id = element.id || \"\";\n const type = this.getElementType(element);\n \n // If element has a meaningful ID (not auto-generated), use it\n if (id && !id.includes(\"-\") && !id.match(/^\\d+$/)) {\n return id;\n }\n \n // For auto-generated IDs, create a friendly name based on type\n // Count siblings of same type to generate \"Video 1\", \"Video 2\", etc.\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => this.getElementType(child) === type\n );\n const index = siblings.indexOf(element) + 1;\n const typeLabels: Record<string, string> = {\n video: \"Video\",\n audio: \"Audio\",\n image: \"Image\",\n text: \"Text\",\n captions: \"Captions\",\n timegroup: \"Composition\",\n unknown: \"Layer\",\n };\n const label = typeLabels[type] || \"Layer\";\n \n // If there's only one of this type, don't add number\n if (siblings.length === 1) {\n return label;\n }\n return `${label} ${index}`;\n }\n \n // Fallback: capitalize the type\n return type.charAt(0).toUpperCase() + type.slice(1);\n }\n\n /**\n * Get additional detail text for the label (mode, preview, etc.)\n */\n private getElementDetail(element: Element): string | null {\n if (element instanceof EFTimegroup) {\n const mode = element.mode || \"fixed\";\n const modeLabels: Record<string, string> = {\n fixed: \"Fixed\",\n sequence: \"Sequence\",\n contain: \"Container\",\n };\n return modeLabels[mode] || mode;\n }\n if (element instanceof EFText) {\n // Get text preview\n const textContent = Array.from(element.childNodes)\n .filter(node => node.nodeType === Node.TEXT_NODE)\n .map(node => node.textContent?.trim())\n .filter(Boolean)\n .join(\" \");\n if (textContent) {\n return textContent.length > 20 ? textContent.slice(0, 20) + \"...\" : textContent;\n }\n }\n return null;\n }\n\n private renderTrack(): TemplateResult | typeof nothing {\n if (!this.element || !isEFTemporal(this.element)) return nothing;\n\n // For timegroups, use skip-children since children get their own rows\n if (this.element instanceof EFTimegroup) {\n // Show filmstrip for root timegroups (no parent timegroup)\n // Use the timegroup's own isRootTimegroup property for reliability\n const showFilmstrip = this.element.isRootTimegroup;\n return html`<ef-timegroup-track\n .element=${this.element}\n pixels-per-ms=${this.pixelsPerMs}\n ?enable-trim=${this.enableTrim}\n ?skip-children=${true}\n ?show-filmstrip=${showFilmstrip}\n .hideSelectors=${this.hideSelectors}\n .showSelectors=${this.showSelectors}\n ></ef-timegroup-track>`;\n }\n\n return html`${renderTrackChildren(\n [this.element as unknown as Element],\n this.pixelsPerMs,\n this.hideSelectors,\n this.showSelectors,\n true, // skipRootFiltering - the row itself handles filtering\n this.enableTrim,\n true, // useAbsolutePosition - flat row architecture needs absolute positioning\n )}`;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.addEventListener(\"click\", this.handleClick);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"mouseenter\", this.handleMouseEnter);\n this.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n this.removeEventListener(\"click\", this.handleClick);\n }\n\n render() {\n if (!this.element) return nothing;\n\n const type = this.getElementType(this.element);\n const label = this.getElementLabel(this.element);\n const detail = this.getElementDetail(this.element);\n const typeColor = this.getElementTypeColor(type);\n const icon = this.getElementIcon(type);\n const indentPx = this.depth * INDENT_PX;\n\n return html`\n <div\n class=\"row-label\"\n style=${styleMap({ \n paddingLeft: `${indentPx}px`,\n borderLeftColor: typeColor,\n borderLeftWidth: \"3px\",\n borderLeftStyle: \"solid\",\n })}\n >\n <span style=\"color: ${typeColor}; opacity: 0.9; margin-right: 6px; flex-shrink: 0;\">\n ${icon}\n </span>\n <span style=\"flex-shrink: 0;\">${label}</span>\n ${detail ? html`\n <span style=\"margin-left: 6px; opacity: 0.6; font-size: 10px; overflow: hidden; text-overflow: ellipsis;\">\n ${detail}\n </span>\n ` : nothing}\n </div>\n <div class=\"row-track\">${this.renderTrack()}</div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-timeline-row\": EFTimelineRow;\n }\n}\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"EFTimelineRow.js","names":["EFTimelineRow","iconMap: Record<string, TemplateResult>"],"sources":["../../../src/gui/timeline/EFTimelineRow.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport {\n css,\n html,\n LitElement,\n nothing,\n type PropertyValues,\n type TemplateResult,\n} from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport {\n isEFTemporal,\n type TemporalMixinInterface,\n} 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 { EFCaptions } from \"../../elements/EFCaptions.js\";\nimport { TWMixin } from \"../TWMixin.js\";\nimport { renderTrackChildren } from \"./tracks/renderTrackChildren.js\";\nimport { phosphorIcon, ICONS } from \"../icons.js\";\nimport {\n timelineEditingContext,\n type TimelineEditingContext,\n} from \"./timelineEditingContext.js\";\nimport { getElementTypeColor } from \"../theme.js\";\n// NOTE: Track components (ef-timegroup-track, etc.) are NOT imported here\n// to avoid circular dependencies with TrackItem. They must be registered before\n// EFTimelineRow is used. See preloadTracks.ts for the registration sequence.\n\nconst INDENT_PX = 16;\n\n/**\n * EFTimelineRow - A unified timeline row containing both label and track\n *\n * This component renders a single row in the timeline with:\n * - A sticky label on the left (stays fixed during horizontal scroll)\n * - Track content on the right (scrolls horizontally with the timeline)\n *\n * Heights are determined by content, not hardcoded.\n */\n@customElement(\"ef-timeline-row\")\nexport class EFTimelineRow extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: flex;\n min-height: var(--timeline-row-height, 28px);\n border-bottom: 1px solid var(--ef-color-border-subtle);\n }\n\n :host(.nested-timegroup) {\n min-height: 18px;\n --timeline-track-height: 14px;\n }\n\n :host(.nested-timegroup) .row-label {\n font-size: 10px;\n opacity: 0.7;\n }\n\n /* Root timegroup row with filmstrip - taller to show thumbnails */\n :host(.root-timegroup) {\n min-height: 52px;\n height: 52px;\n /* Sticky at top below ruler (ruler is 24px) */\n position: sticky;\n top: 24px;\n /* Higher z-index than regular row labels (z-index: 8) so everything scrolls underneath */\n z-index: 15;\n background: var(--timeline-bg, var(--ef-color-bg));\n border-bottom: 1px solid var(--ef-color-border);\n }\n\n /* Root timegroup label needs higher z-index to stay above other labels when scrolling */\n :host(.root-timegroup) .row-label {\n z-index: 16;\n }\n\n /* Hover state - this row is directly hovered */\n :host(.hovered) {\n background: var(--ef-color-hover);\n }\n\n /* Ancestor hovered - a descendant of this row is hovered */\n :host(.ancestor-hovered) {\n background: var(--ef-color-selected-subtle);\n }\n\n /* Descendant hovered - an ancestor of this row is hovered */\n :host(.descendant-hovered) {\n background: var(--ef-color-selected-subtle);\n }\n\n /* Selected state */\n :host(.selected) {\n background: var(--ef-color-selected);\n }\n \n :host(.selected) .row-label {\n font-weight: 500;\n }\n\n /* Ancestor has selected descendant */\n :host(.ancestor-selected) {\n background: var(--ef-color-selected-subtle);\n }\n\n .row-label {\n position: sticky;\n left: 0;\n /* Lower z-index so labels scroll underneath the sticky root timegroup row (z-index: 15) */\n z-index: 8;\n width: var(--timeline-hierarchy-width, 200px);\n flex-shrink: 0;\n background: var(--ef-color-bg-panel);\n border-right: 1px solid var(--ef-color-border-subtle);\n display: flex;\n align-items: center;\n font-size: 11px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--ef-color-text);\n cursor: pointer;\n transition: background-color 0.1s ease;\n }\n\n /* Hide label column when hierarchy is disabled */\n :host([hide-label]) .row-label {\n display: none;\n }\n\n .row-label:hover {\n background: color-mix(in srgb, var(--ef-color-bg-panel) 70%, var(--ef-color-hover) 30%);\n }\n\n :host(.hovered) .row-label {\n background: var(--ef-color-bg-elevated);\n border-left: 3px solid var(--ef-color-primary);\n padding-left: calc(var(--indent, 0px) - 3px);\n }\n\n :host(.selected) .row-label {\n background: var(--ef-color-bg-elevated);\n border-left: 3px solid var(--ef-color-primary);\n padding-left: calc(var(--indent, 0px) - 3px);\n }\n\n .row-track {\n flex: 1;\n position: relative;\n min-width: 0;\n }\n \n :host(:first-child) .row-track::before {\n display: none;\n }\n \n /* Grouping indicator for nested elements */\n .row-track::after {\n content: \"\";\n position: absolute;\n left: -12px;\n top: 0;\n bottom: 0;\n width: 2px;\n background: var(--timeline-border, rgb(71 85 105));\n opacity: 0.2;\n z-index: 0;\n }\n \n :host(:first-child) .row-track::after {\n display: none;\n }\n `,\n ];\n\n @property({ type: Object, attribute: false })\n element!: TemporalMixinInterface & Element;\n\n @property({ type: Number })\n depth = 0;\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: Boolean, attribute: \"hide-label\", reflect: true })\n hideLabel = false;\n\n @property({ type: Array, attribute: false })\n hideSelectors?: string[];\n\n @property({ type: Array, attribute: false })\n showSelectors?: string[];\n\n /**\n * The currently highlighted element from canvas (source of truth).\n * Passed from parent timeline which reads it from canvas.\n */\n @property({ type: Object, attribute: false })\n highlightedElement: Element | null = null;\n\n @property({ type: Object, attribute: false })\n selectedIds: ReadonlySet<string> = new Set();\n\n @consume({ context: timelineEditingContext, subscribe: true })\n editingContext?: TimelineEditingContext;\n\n // Derived interaction states (computed on-demand)\n private get isHovered(): boolean {\n return this.highlightedElement === this.element;\n }\n\n private get isSelected(): boolean {\n const elementId = (this.element as unknown as HTMLElement)?.id;\n return elementId ? this.selectedIds.has(elementId) : false;\n }\n\n private get isAncestorSelected(): boolean {\n if (!this.element) return false;\n // Check if this element contains any selected element\n const elementAsHTMLElement = this.element as unknown as HTMLElement;\n for (const selectedId of this.selectedIds) {\n const selectedElement = document.getElementById(selectedId);\n if (\n selectedElement &&\n elementAsHTMLElement.contains(selectedElement) &&\n selectedElement !== elementAsHTMLElement\n ) {\n return true;\n }\n }\n return false;\n }\n\n private get isAncestorHovered(): boolean {\n if (!this.highlightedElement || !this.element) return false;\n // This row's element contains the highlighted element (highlighted is a descendant)\n return (\n this.element !== this.highlightedElement &&\n this.element.contains(this.highlightedElement)\n );\n }\n\n private get isDescendantHovered(): boolean {\n if (!this.highlightedElement || !this.element) return false;\n // The highlighted element contains this row's element (highlighted is an ancestor)\n return (\n this.element !== this.highlightedElement &&\n this.highlightedElement.contains(this.element)\n );\n }\n\n protected updated(changedProperties: PropertyValues): void {\n super.updated(changedProperties);\n\n // Update host classes based on interaction state\n if (\n changedProperties.has(\"highlightedElement\") ||\n changedProperties.has(\"element\")\n ) {\n this.classList.toggle(\"hovered\", this.isHovered);\n this.classList.toggle(\"ancestor-hovered\", this.isAncestorHovered);\n this.classList.toggle(\"descendant-hovered\", this.isDescendantHovered);\n }\n\n // Update selection classes\n if (\n changedProperties.has(\"selectedIds\") ||\n changedProperties.has(\"element\")\n ) {\n this.classList.toggle(\"selected\", this.isSelected);\n this.classList.toggle(\"ancestor-selected\", this.isAncestorSelected);\n }\n\n // Update root/nested timegroup classes\n if (changedProperties.has(\"element\")) {\n const isRoot =\n this.element instanceof EFTimegroup && this.element.isRootTimegroup;\n const isNested =\n this.element instanceof EFTimegroup && !this.element.isRootTimegroup;\n this.classList.toggle(\"root-timegroup\", isRoot);\n this.classList.toggle(\"nested-timegroup\", isNested);\n }\n }\n\n private handleMouseEnter = (): void => {\n // Skip hover interactions during active editing operations (scrubbing, trimming, etc.)\n if (this.editingContext && !this.editingContext.canInteract()) {\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent(\"row-hover\", {\n detail: { element: this.element },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n private handleMouseLeave = (): void => {\n // Skip hover interactions during active editing operations (scrubbing, trimming, etc.)\n if (this.editingContext && !this.editingContext.canInteract()) {\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent(\"row-hover\", {\n detail: { element: null },\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n private handleClick = (e: Event): void => {\n e.stopPropagation();\n const elementId = (this.element as unknown as HTMLElement)?.id;\n if (elementId) {\n this.dispatchEvent(\n new CustomEvent(\"row-select\", {\n detail: { elementId, element: this.element },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n private getElementType(element: Element): string {\n if (element instanceof EFVideo) return \"video\";\n if (element instanceof EFAudio) return \"audio\";\n if (element instanceof EFImage) return \"image\";\n if (element instanceof EFText) return \"text\";\n if (element instanceof EFCaptions) return \"captions\";\n if (element instanceof EFTimegroup) return \"timegroup\";\n return \"unknown\";\n }\n\n // Use shared type color utility from theme.ts\n // This reads from CSS variables (--ef-color-type-video, etc.) defined in ef-theme.css\n\n private getElementIcon(type: string): TemplateResult {\n const iconMap: Record<string, TemplateResult> = {\n video: phosphorIcon(ICONS.filmStrip, 14),\n audio: phosphorIcon(ICONS.speakerHigh, 14),\n image: phosphorIcon(ICONS.image, 14),\n text: phosphorIcon(ICONS.textT, 14),\n captions: phosphorIcon(ICONS.subtitles, 14),\n timegroup: phosphorIcon(ICONS.filmSlate, 14),\n unknown: phosphorIcon(ICONS.code, 14),\n };\n return iconMap[type] ?? iconMap.unknown!;\n }\n\n private getElementLabel(element: Element): string {\n const id = element.id || \"\";\n const type = this.getElementType(element);\n\n // If element has a meaningful ID (not auto-generated), use it\n if (id && !id.includes(\"-\") && !id.match(/^\\d+$/)) {\n return id;\n }\n\n // For auto-generated IDs, create a friendly name based on type\n // Count siblings of same type to generate \"Video 1\", \"Video 2\", etc.\n const parent = element.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n (child) => this.getElementType(child) === type,\n );\n const index = siblings.indexOf(element) + 1;\n const typeLabels: Record<string, string> = {\n video: \"Video\",\n audio: \"Audio\",\n image: \"Image\",\n text: \"Text\",\n captions: \"Captions\",\n timegroup: \"Composition\",\n unknown: \"Layer\",\n };\n const label = typeLabels[type] || \"Layer\";\n\n // If there's only one of this type, don't add number\n if (siblings.length === 1) {\n return label;\n }\n return `${label} ${index}`;\n }\n\n // Fallback: capitalize the type\n return type.charAt(0).toUpperCase() + type.slice(1);\n }\n\n /**\n * Get additional detail text for the label (mode, preview, etc.)\n */\n private getElementDetail(element: Element): string | null {\n if (element instanceof EFTimegroup) {\n const mode = element.mode || \"fixed\";\n const modeLabels: Record<string, string> = {\n fixed: \"Fixed\",\n sequence: \"Sequence\",\n contain: \"Container\",\n };\n return modeLabels[mode] || mode;\n }\n if (element instanceof EFText) {\n // Get text preview\n const textContent = Array.from(element.childNodes)\n .filter((node) => node.nodeType === Node.TEXT_NODE)\n .map((node) => node.textContent?.trim())\n .filter(Boolean)\n .join(\" \");\n if (textContent) {\n return textContent.length > 20\n ? textContent.slice(0, 20) + \"...\"\n : textContent;\n }\n }\n return null;\n }\n\n private renderTrack(): TemplateResult | typeof nothing {\n if (!this.element || !isEFTemporal(this.element)) return nothing;\n\n // For timegroups, use skip-children since children get their own rows\n if (this.element instanceof EFTimegroup) {\n // Show filmstrip for root timegroups (no parent timegroup)\n // Use the timegroup's own isRootTimegroup property for reliability\n const showFilmstrip = this.element.isRootTimegroup;\n return html`<ef-timegroup-track\n .element=${this.element}\n pixels-per-ms=${this.pixelsPerMs}\n ?enable-trim=${this.enableTrim}\n ?skip-children=${true}\n ?show-filmstrip=${showFilmstrip}\n .hideSelectors=${this.hideSelectors}\n .showSelectors=${this.showSelectors}\n ></ef-timegroup-track>`;\n }\n\n return html`${renderTrackChildren(\n [this.element as unknown as Element],\n this.pixelsPerMs,\n this.hideSelectors,\n this.showSelectors,\n true, // skipRootFiltering - the row itself handles filtering\n this.enableTrim,\n )}`;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener(\"mouseenter\", this.handleMouseEnter);\n this.addEventListener(\"mouseleave\", this.handleMouseLeave);\n this.addEventListener(\"click\", this.handleClick);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener(\"mouseenter\", this.handleMouseEnter);\n this.removeEventListener(\"mouseleave\", this.handleMouseLeave);\n this.removeEventListener(\"click\", this.handleClick);\n }\n\n render() {\n if (!this.element) return nothing;\n\n const type = this.getElementType(this.element);\n const label = this.getElementLabel(this.element);\n const detail = this.getElementDetail(this.element);\n const typeColor = getElementTypeColor(type, this);\n const icon = this.getElementIcon(type);\n const indentPx = this.depth * INDENT_PX;\n\n return html`\n <div\n class=\"row-label\"\n part=\"label\"\n style=${styleMap({\n paddingLeft: `${indentPx}px`,\n borderLeftColor: typeColor,\n borderLeftWidth: \"3px\",\n borderLeftStyle: \"solid\",\n })}\n >\n <span style=\"color: ${typeColor}; opacity: 0.9; margin-right: 6px; flex-shrink: 0;\">\n ${icon}\n </span>\n <span style=\"flex-shrink: 0;\">${label}</span>\n ${\n detail\n ? html`\n <span style=\"margin-left: 6px; opacity: 0.6; font-size: 10px; overflow: hidden; text-overflow: ellipsis;\">\n ${detail}\n </span>\n `\n : nothing\n }\n </div>\n <div class=\"row-track\" part=\"track\">${this.renderTrack()}</div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-timeline-row\": EFTimelineRow;\n }\n}\n"],"mappings":"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"}
@@ -1,30 +1,44 @@
1
+ import { TimelineEditingContext } from "./timelineEditingContext.js";
1
2
  import * as lit35 from "lit";
2
3
  import { LitElement } from "lit";
3
- import * as lit_html33 from "lit-html";
4
+ import * as lit_html32 from "lit-html";
4
5
 
5
6
  //#region src/gui/timeline/TrimHandles.d.ts
7
+ interface TrimValue {
8
+ startMs: number;
9
+ endMs: number;
10
+ }
6
11
  interface TrimChangeDetail {
7
12
  elementId: string;
8
- type: "start" | "end";
9
- deltaMs: number;
10
- newValueMs: number;
13
+ type: "start" | "end" | "region";
14
+ value: TrimValue;
11
15
  }
12
16
  declare const EFTrimHandles_base: typeof LitElement;
13
17
  declare class EFTrimHandles extends EFTrimHandles_base {
18
+ #private;
14
19
  static styles: lit35.CSSResult[];
20
+ mode: "standalone" | "track";
15
21
  elementId: string;
16
- pixelsPerMs: number;
17
- trimStartMs: number;
18
- trimEndMs: number;
22
+ pixelsPerMs: number | null;
23
+ value: TrimValue;
19
24
  intrinsicDurationMs: number;
25
+ get trimStartMs(): number;
26
+ set trimStartMs(v: number);
27
+ get trimEndMs(): number;
28
+ set trimEndMs(v: number);
20
29
  showOverlays: boolean;
30
+ seekTarget: string;
31
+ editingContext?: TimelineEditingContext;
21
32
  private draggingHandle;
22
33
  private dragStartX;
23
34
  private dragStartValue;
35
+ connectedCallback(): void;
36
+ disconnectedCallback(): void;
24
37
  private handlePointerDown;
38
+ private handleRegionPointerDown;
25
39
  private handlePointerMove;
26
40
  private handlePointerUp;
27
- render(): lit_html33.TemplateResult<1>;
41
+ render(): lit_html32.TemplateResult<1>;
28
42
  }
29
43
  declare global {
30
44
  interface HTMLElementTagNameMap {
@@ -32,5 +46,5 @@ declare global {
32
46
  }
33
47
  }
34
48
  //#endregion
35
- export { EFTrimHandles, TrimChangeDetail };
49
+ export { EFTrimHandles, TrimChangeDetail, TrimValue };
36
50
  //# sourceMappingURL=TrimHandles.d.ts.map