@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 +1 @@
1
- {"version":3,"file":"EFHierarchyItem.js","names":["EFHierarchyItem","position: \"before\" | \"after\" | \"inside\"","EFTimegroupHierarchyItem","EFAudioHierarchyItem","EFVideoHierarchyItem","EFCaptionsHierarchyItem","EFCaptionsActiveWordHierarchyItem","EFTextHierarchyItem","EFTextSegmentHierarchyItem","EFWaveformHierarchyItem","EFImageHierarchyItem","EFHTMLHierarchyItem"],"sources":["../../../src/gui/hierarchy/EFHierarchyItem.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, LitElement, nothing, type PropertyValues, type TemplateResult } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport { EFAudio } from \"../../elements/EFAudio.js\";\nimport { EFCaptions, EFCaptionsActiveWord } from \"../../elements/EFCaptions.js\";\nimport { EFImage } from \"../../elements/EFImage.js\";\nimport { EFText } from \"../../elements/EFText.js\";\nimport { EFTextSegment } from \"../../elements/EFTextSegment.js\";\nimport { EFTimegroup } from \"../../elements/EFTimegroup.js\";\nimport { EFVideo } from \"../../elements/EFVideo.js\";\nimport { EFWaveform } from \"../../elements/EFWaveform.js\";\nimport { selectionContext } from \"../../canvas/selection/selectionContext.js\";\nimport { findRootTemporal } from \"../../elements/findRootTemporal.js\";\nimport { isEFTemporal } from \"../../elements/EFTemporal.js\";\nimport { TWMixin } from \"../TWMixin.js\";\nimport { phosphorIcon, ICONS } from \"../icons.js\";\nimport { type HierarchyContext, hierarchyContext } from \"./hierarchyContext.js\";\n\nconst DEFAULT_HIDDEN_TAGS = new Set([\n \"SPAN\",\n \"STYLE\",\n \"SCRIPT\",\n \"LINK\",\n \"META\",\n \"SLOT\",\n \"TEMPLATE\",\n \"EF-WORKBENCH\",\n \"EF-FILMSTRIP\",\n \"EF-CONTROLS\",\n \"EF-SCRUBBER\",\n \"EF-TIMELINE-RULER\",\n \"EF-TRIM-HANDLES\",\n \"EF-TEXT-SEGMENT\",\n]);\n\nexport const shouldRenderElement = (\n element: Element,\n hideSelectors?: string[],\n showSelectors?: string[],\n): boolean => {\n if (element instanceof HTMLElement && element.dataset?.efHidden) {\n return false;\n }\n\n // Skip default hidden tags (but allow them if explicitly shown)\n if (DEFAULT_HIDDEN_TAGS.has(element.tagName)) {\n // Still check show selectors - if explicitly shown, allow it\n if (showSelectors && showSelectors.length > 0) {\n return showSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n return false;\n }\n\n if (showSelectors && showSelectors.length > 0) {\n return showSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n\n if (hideSelectors && hideSelectors.length > 0) {\n return !hideSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n\n return true;\n};\n\nexport function renderHierarchyChildren(\n children: Element[],\n hideSelectors?: string[],\n showSelectors?: string[],\n skipRootFiltering = false,\n temporalOnly = false,\n): Array<TemplateResult<1> | typeof nothing> {\n return children.flatMap((child) => {\n if (\n !skipRootFiltering &&\n !shouldRenderElement(child, hideSelectors, showSelectors)\n ) {\n return nothing;\n }\n\n if (child instanceof EFTimegroup) {\n return html`<ef-timegroup-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-timegroup-hierarchy-item>`;\n }\n if (child instanceof EFImage) {\n return html`<ef-image-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-image-hierarchy-item>`;\n }\n if (child instanceof EFAudio) {\n return html`<ef-audio-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-audio-hierarchy-item>`;\n }\n if (child instanceof EFVideo) {\n return html`<ef-video-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-video-hierarchy-item>`;\n }\n if (child instanceof EFCaptions) {\n return html`<ef-captions-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-captions-hierarchy-item>`;\n }\n if (child instanceof EFCaptionsActiveWord) {\n return html`<ef-captions-active-word-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-captions-active-word-hierarchy-item>`;\n }\n if (child instanceof EFText) {\n return html`<ef-text-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-text-hierarchy-item>`;\n }\n // Skip text segments - they're shown within the parent text element\n if (child instanceof EFTextSegment) {\n return nothing;\n }\n if (child instanceof EFWaveform) {\n return html`<ef-waveform-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-waveform-hierarchy-item>`;\n }\n\n // Skip non-temporal HTML elements when temporalOnly is true\n if (temporalOnly) {\n return nothing;\n }\n\n // Handle all other HTML elements (plain DOM nodes, custom elements, etc.)\n if (child instanceof HTMLElement) {\n return html`<ef-html-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-html-hierarchy-item>`;\n }\n\n // Skip non-HTML elements\n return nothing;\n });\n}\n\n@customElement(\"ef-hierarchy-item\")\nexport class EFHierarchyItem<\n ElementType extends HTMLElement = HTMLElement,\n> extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: block;\n }\n .item-row {\n display: flex;\n align-items: center;\n height: var(--hierarchy-item-height, 1.5rem);\n padding-left: var(--hierarchy-item-padding-left, 0.5rem);\n padding-right: var(--hierarchy-item-padding-right, 0.5rem);\n padding-top: var(--hierarchy-item-padding-top, 0);\n padding-bottom: var(--hierarchy-item-padding-bottom, 0);\n font-size: var(--hierarchy-item-font-size, 0.75rem);\n font-family: system-ui, -apple-system, sans-serif;\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n }\n .item-row:hover {\n background: var(--hierarchy-hover-bg, rgba(148, 163, 184, 0.2));\n }\n .item-row[data-selected] {\n background: var(--hierarchy-selected-bg, rgba(59, 130, 246, 0.3));\n }\n .item-row[data-ancestor-selected] {\n background: var(--hierarchy-ancestor-selected-bg, rgba(59, 130, 246, 0.15));\n }\n .item-row[data-focused] {\n background: var(--hierarchy-focused-bg, var(--filmstrip-timegroup-focused, rgba(148, 163, 184, 0.4)));\n }\n .item-row[data-dragging] {\n opacity: 0.5;\n }\n .expand-icon {\n width: var(--hierarchy-expand-icon-size, 1rem);\n height: var(--hierarchy-expand-icon-size, 1rem);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n }\n .expand-icon svg {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.15s ease;\n }\n .expand-icon[data-expanded] svg {\n transform: rotate(90deg);\n }\n .icon {\n margin-right: var(--hierarchy-icon-gap, 0.25rem);\n flex-shrink: 0;\n }\n .label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n }\n .children {\n padding-left: var(--hierarchy-indent, 0.75rem);\n }\n .children[data-collapsed] {\n display: none;\n }\n .drop-indicator {\n height: 2px;\n background: var(--hierarchy-drop-indicator, #3b82f6);\n margin-left: var(--hierarchy-indent, 0.75rem);\n }\n .drop-inside {\n outline: 2px solid var(--hierarchy-drop-indicator, #3b82f6);\n outline-offset: -2px;\n }\n `,\n ];\n\n @consume({ context: hierarchyContext, subscribe: true })\n hierarchyContext?: HierarchyContext;\n\n @consume({ context: selectionContext, subscribe: true })\n canvasSelectionContext?: import(\"../../canvas/selection/selectionContext.js\").SelectionContext;\n\n @property({ type: Object, attribute: false })\n element: ElementType = new EFTimegroup() as unknown as ElementType;\n\n @property({ type: Array, attribute: false })\n hideSelectors?: string[];\n\n @property({ type: Array, attribute: false })\n showSelectors?: string[];\n\n @property({ type: Boolean, attribute: false })\n temporalOnly = false;\n\n @state()\n private localExpanded = true;\n\n private selectionChangeHandler?: (event: CustomEvent) => void;\n\n get elementId(): string {\n return this.element?.id || \"\";\n }\n\n get icon(): TemplateResult<1> | string {\n return phosphorIcon(ICONS.code);\n }\n\n get typeColor(): string {\n return \"rgb(148, 163, 184)\"; // Default gray\n }\n\n get isFocused(): boolean {\n const highlightedElement = this.hierarchyContext?.getHighlightedElement?.();\n return this.element && highlightedElement === this.element;\n }\n\n get isSelected(): boolean {\n // Try to get selection context from hierarchy parent (which can access canvas)\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n\n if (selectionCtx && this.elementId) {\n // Check if this element's ID is in the selected IDs\n return selectionCtx.selectedIds.has(this.elementId);\n }\n // Fall back to hierarchy's own selection state\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.selectedElementId === this.elementId;\n }\n\n get isAncestorSelected(): boolean {\n // Check if this element contains any selected element\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n\n if (selectionCtx && this.element) {\n for (const selectedId of selectionCtx.selectedIds) {\n const selectedElement = document.getElementById(selectedId);\n if (\n selectedElement &&\n this.element.contains(selectedElement) &&\n selectedElement !== this.element\n ) {\n return true;\n }\n }\n }\n return false;\n }\n\n get isExpanded(): boolean {\n if (!this.hierarchyContext || !this.elementId) return this.localExpanded;\n return this.hierarchyContext.state.expandedIds.has(this.elementId);\n }\n\n get isDragging(): boolean {\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.draggedElementId === this.elementId;\n }\n\n get isDropTarget(): boolean {\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.dropTargetId === this.elementId;\n }\n\n get dropPosition(): \"before\" | \"after\" | \"inside\" | null {\n if (!this.isDropTarget || !this.hierarchyContext) return null;\n return this.hierarchyContext.state.dropPosition;\n }\n\n get hasChildren(): boolean {\n return this.element.children.length > 0;\n }\n\n displayLabel(): TemplateResult<1> | string | typeof nothing {\n return this.elementId || \"(unnamed)\";\n }\n\n private handleClick(e: Event): void {\n e.stopPropagation();\n if (this.hierarchyContext && this.elementId) {\n this.hierarchyContext.actions.select(this.elementId);\n }\n // Also set highlight on click for visual feedback\n this.hierarchyContext?.setHighlightedElement?.(this.element);\n }\n\n private handleExpandClick(e: Event): void {\n e.stopPropagation();\n if (this.hierarchyContext && this.elementId) {\n this.hierarchyContext.actions.toggleExpanded(this.elementId);\n } else {\n this.localExpanded = !this.localExpanded;\n }\n }\n\n private handleDragStart(e: DragEvent): void {\n if (!this.hierarchyContext || !this.elementId) return;\n e.dataTransfer?.setData(\"text/plain\", this.elementId);\n this.hierarchyContext.actions.startDrag(this.elementId);\n }\n\n private handleDragEnd(): void {\n if (this.hierarchyContext) {\n this.hierarchyContext.actions.endDrag();\n }\n }\n\n private handleDragOver(e: DragEvent): void {\n e.preventDefault();\n if (!this.hierarchyContext || !this.elementId) return;\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const y = e.clientY - rect.top;\n const height = rect.height;\n\n let position: \"before\" | \"after\" | \"inside\";\n if (y < height * 0.25) {\n position = \"before\";\n } else if (y > height * 0.75) {\n position = \"after\";\n } else {\n position = \"inside\";\n }\n\n this.hierarchyContext.actions.updateDropTarget(this.elementId, position);\n }\n\n private handleDragLeave(): void {\n if (this.hierarchyContext && this.isDropTarget) {\n this.hierarchyContext.actions.updateDropTarget(null, null);\n }\n }\n\n private handleDrop(e: DragEvent): void {\n e.preventDefault();\n if (!this.hierarchyContext || !this.elementId) return;\n\n const sourceId = e.dataTransfer?.getData(\"text/plain\");\n if (sourceId && this.dropPosition) {\n this.hierarchyContext.actions.reorder(\n sourceId,\n this.elementId,\n this.dropPosition,\n );\n }\n this.hierarchyContext.actions.endDrag();\n }\n\n private handleMouseEnter(): void {\n // Update canvas highlight (source of truth)\n this.hierarchyContext?.setHighlightedElement?.(this.element);\n }\n\n private handleMouseLeave(): void {\n // Clear canvas highlight (source of truth)\n const currentHighlight = this.hierarchyContext?.getHighlightedElement?.();\n if (currentHighlight === this.element) {\n this.hierarchyContext?.setHighlightedElement?.(null);\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.setupSelectionListener();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeSelectionListener();\n }\n\n protected willUpdate(changedProperties: PropertyValues): void {\n // Set up listener if context becomes available or context changed\n if (!this.selectionChangeHandler || changedProperties.has(\"hierarchyContext\")) {\n // Remove old listener if context changed\n if (changedProperties.has(\"hierarchyContext\") && this.selectionChangeHandler) {\n this.removeSelectionListener();\n this.selectionChangeHandler = undefined;\n }\n this.setupSelectionListener();\n }\n }\n\n private setupSelectionListener(): void {\n // Don't set up if already set up\n if (this.selectionChangeHandler) {\n return;\n }\n\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n if (selectionCtx && \"addEventListener\" in selectionCtx) {\n this.selectionChangeHandler = () => {\n this.requestUpdate(); // Trigger re-render to update selected state\n };\n (selectionCtx as any).addEventListener(\n \"selectionchange\",\n this.selectionChangeHandler,\n );\n }\n }\n\n private removeSelectionListener(): void {\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n if (\n selectionCtx &&\n \"removeEventListener\" in selectionCtx &&\n this.selectionChangeHandler\n ) {\n (selectionCtx as any).removeEventListener(\n \"selectionchange\",\n this.selectionChangeHandler,\n );\n this.selectionChangeHandler = undefined;\n }\n }\n\n render() {\n const expanded = this.isExpanded;\n\n return html`\n ${this.dropPosition === \"before\" ? html`<div class=\"drop-indicator\"></div>` : nothing}\n <div\n class=\"item-row ${this.dropPosition === \"inside\" ? \"drop-inside\" : \"\"}\"\n style=${styleMap({ borderLeftColor: this.typeColor })}\n ?data-focused=${this.isFocused}\n ?data-selected=${this.isSelected}\n ?data-ancestor-selected=${this.isAncestorSelected}\n ?data-dragging=${this.isDragging}\n draggable=\"true\"\n @click=${this.handleClick}\n @dragstart=${this.handleDragStart}\n @dragend=${this.handleDragEnd}\n @dragover=${this.handleDragOver}\n @dragleave=${this.handleDragLeave}\n @drop=${this.handleDrop}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n ${\n this.hasChildren\n ? html`\n <span\n class=\"expand-icon\"\n ?data-expanded=${expanded}\n @click=${this.handleExpandClick}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </span>\n `\n : html`<span class=\"expand-icon\"></span>`\n }\n <span class=\"icon\">${this.icon}</span>\n <span class=\"label\">${this.displayLabel()}</span>\n </div>\n ${\n this.hasChildren\n ? html`\n <div class=\"children\" ?data-collapsed=${!expanded}>\n ${this.renderChildren()}\n </div>\n `\n : nothing\n }\n ${this.dropPosition === \"after\" ? html`<div class=\"drop-indicator\"></div>` : nothing}\n `;\n }\n\n renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing {\n return renderHierarchyChildren(\n Array.from(this.element.children),\n this.hideSelectors,\n this.showSelectors,\n false,\n this.temporalOnly,\n );\n }\n}\n\n/**\n * Generate a friendly label for an element based on its type and siblings\n */\nfunction getFriendlyLabel(element: HTMLElement, typeLabel: string): string {\n // If element has a meaningful ID (not auto-generated), use it\n const id = element.id || \"\";\n if (id && !id.includes(\"-\") && !id.match(/^\\d+$/)) {\n return id;\n }\n \n // Count siblings of same type to generate \"Video 1\", \"Video 2\", etc.\n const parent = element.parentElement;\n if (parent) {\n const tagName = element.tagName;\n const siblings = Array.from(parent.children).filter(\n (child) => child.tagName === tagName\n );\n const index = siblings.indexOf(element) + 1;\n \n // If there's only one of this type, don't add number\n if (siblings.length === 1) {\n return typeLabel;\n }\n return `${typeLabel} ${index}`;\n }\n \n return typeLabel;\n}\n\n@customElement(\"ef-timegroup-hierarchy-item\")\nexport class EFTimegroupHierarchyItem extends EFHierarchyItem<EFTimegroup> {\n get icon() {\n return phosphorIcon(ICONS.filmSlate);\n }\n\n get typeColor(): string {\n return \"rgb(148, 163, 184)\"; // Gray for compositions\n }\n\n displayLabel(): string | TemplateResult<1> | typeof nothing {\n return getFriendlyLabel(this.element, \"Composition\");\n }\n}\n\n@customElement(\"ef-audio-hierarchy-item\")\nexport class EFAudioHierarchyItem extends EFHierarchyItem<EFAudio> {\n get icon() {\n return phosphorIcon(ICONS.speakerHigh);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green for audio\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Audio\");\n }\n}\n\n@customElement(\"ef-video-hierarchy-item\")\nexport class EFVideoHierarchyItem extends EFHierarchyItem<EFVideo> {\n get icon() {\n return phosphorIcon(ICONS.filmStrip);\n }\n\n get typeColor(): string {\n return \"rgb(59, 130, 246)\"; // Blue for video\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Video\");\n }\n}\n\n@customElement(\"ef-captions-hierarchy-item\")\nexport class EFCaptionsHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.subtitles);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element as HTMLElement, \"Captions\");\n }\n}\n\n@customElement(\"ef-captions-active-word-hierarchy-item\")\nexport class EFCaptionsActiveWordHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.microphone);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n displayLabel() {\n return \"Active Word\";\n }\n}\n\n@customElement(\"ef-text-hierarchy-item\")\nexport class EFTextHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.textT);\n }\n\n get typeColor(): string {\n return \"rgb(249, 115, 22)\"; // Orange for text\n }\n\n get hasChildren(): boolean {\n return false; // Text segments are internal, not shown as children\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element as HTMLElement, \"Text\");\n }\n\n renderChildren(): typeof nothing {\n return nothing;\n }\n}\n\n@customElement(\"ef-text-segment-hierarchy-item\")\nexport class EFTextSegmentHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.textT);\n }\n\n get typeColor(): string {\n return \"rgb(249, 115, 22)\"; // Orange\n }\n\n displayLabel() {\n return \"Segment\";\n }\n}\n\n@customElement(\"ef-waveform-hierarchy-item\")\nexport class EFWaveformHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.waveform);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n renderChildren(): typeof nothing {\n return nothing;\n }\n}\n\n@customElement(\"ef-image-hierarchy-item\")\nexport class EFImageHierarchyItem extends EFHierarchyItem<EFImage> {\n get icon() {\n return phosphorIcon(ICONS.image);\n }\n\n get typeColor(): string {\n return \"rgb(168, 85, 247)\"; // Purple for images\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Image\");\n }\n}\n\n@customElement(\"ef-html-hierarchy-item\")\nexport class EFHTMLHierarchyItem extends EFHierarchyItem {\n get icon() {\n return html`<code>${`<${this.element.tagName.toLowerCase()}>`}</code>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-hierarchy-item\": EFHierarchyItem;\n \"ef-timegroup-hierarchy-item\": EFTimegroupHierarchyItem;\n \"ef-audio-hierarchy-item\": EFAudioHierarchyItem;\n \"ef-video-hierarchy-item\": EFVideoHierarchyItem;\n \"ef-captions-hierarchy-item\": EFCaptionsHierarchyItem;\n \"ef-captions-active-word-hierarchy-item\": EFCaptionsActiveWordHierarchyItem;\n \"ef-text-hierarchy-item\": EFTextHierarchyItem;\n \"ef-text-segment-hierarchy-item\": EFTextSegmentHierarchyItem;\n \"ef-waveform-hierarchy-item\": EFWaveformHierarchyItem;\n \"ef-image-hierarchy-item\": EFImageHierarchyItem;\n \"ef-html-hierarchy-item\": EFHTMLHierarchyItem;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"EFHierarchyItem.js","names":["EFHierarchyItem","position: \"before\" | \"after\" | \"inside\"","EFTimegroupHierarchyItem","EFAudioHierarchyItem","EFVideoHierarchyItem","EFCaptionsHierarchyItem","EFCaptionsActiveWordHierarchyItem","EFTextHierarchyItem","EFTextSegmentHierarchyItem","EFWaveformHierarchyItem","EFImageHierarchyItem","EFHTMLHierarchyItem"],"sources":["../../../src/gui/hierarchy/EFHierarchyItem.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, state } from \"lit/decorators.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\n\nimport { EFAudio } from \"../../elements/EFAudio.js\";\nimport { EFCaptions, EFCaptionsActiveWord } from \"../../elements/EFCaptions.js\";\nimport { EFImage } from \"../../elements/EFImage.js\";\nimport { EFText } from \"../../elements/EFText.js\";\nimport { EFTextSegment } from \"../../elements/EFTextSegment.js\";\nimport { EFTimegroup } from \"../../elements/EFTimegroup.js\";\nimport { EFVideo } from \"../../elements/EFVideo.js\";\nimport { EFWaveform } from \"../../elements/EFWaveform.js\";\nimport { selectionContext } from \"../../canvas/selection/selectionContext.js\";\n\nimport { TWMixin } from \"../TWMixin.js\";\nimport { phosphorIcon, ICONS } from \"../icons.js\";\nimport { type HierarchyContext, hierarchyContext } from \"./hierarchyContext.js\";\nimport { getElementTypeColor } from \"../theme.js\";\n\nconst DEFAULT_HIDDEN_TAGS = new Set([\n \"SPAN\",\n \"STYLE\",\n \"SCRIPT\",\n \"LINK\",\n \"META\",\n \"SLOT\",\n \"TEMPLATE\",\n \"EF-WORKBENCH\",\n \"EF-FILMSTRIP\",\n \"EF-CONTROLS\",\n \"EF-SCRUBBER\",\n \"EF-TIMELINE-RULER\",\n \"EF-TRIM-HANDLES\",\n \"EF-TEXT-SEGMENT\",\n]);\n\nexport const shouldRenderElement = (\n element: Element,\n hideSelectors?: string[],\n showSelectors?: string[],\n): boolean => {\n if (element instanceof HTMLElement && element.dataset?.efHidden) {\n return false;\n }\n\n // Skip default hidden tags (but allow them if explicitly shown)\n if (DEFAULT_HIDDEN_TAGS.has(element.tagName)) {\n // Still check show selectors - if explicitly shown, allow it\n if (showSelectors && showSelectors.length > 0) {\n return showSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n return false;\n }\n\n if (showSelectors && showSelectors.length > 0) {\n return showSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n\n if (hideSelectors && hideSelectors.length > 0) {\n return !hideSelectors.some((selector) => {\n try {\n return element.matches(selector);\n } catch {\n return false;\n }\n });\n }\n\n return true;\n};\n\nexport function renderHierarchyChildren(\n children: Element[],\n hideSelectors?: string[],\n showSelectors?: string[],\n skipRootFiltering = false,\n temporalOnly = false,\n): Array<TemplateResult<1> | typeof nothing> {\n return children.flatMap((child) => {\n if (\n !skipRootFiltering &&\n !shouldRenderElement(child, hideSelectors, showSelectors)\n ) {\n return nothing;\n }\n\n if (child instanceof EFTimegroup) {\n return html`<ef-timegroup-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-timegroup-hierarchy-item>`;\n }\n if (child instanceof EFImage) {\n return html`<ef-image-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-image-hierarchy-item>`;\n }\n if (child instanceof EFAudio) {\n return html`<ef-audio-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-audio-hierarchy-item>`;\n }\n if (child instanceof EFVideo) {\n return html`<ef-video-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-video-hierarchy-item>`;\n }\n if (child instanceof EFCaptions) {\n return html`<ef-captions-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-captions-hierarchy-item>`;\n }\n if (child instanceof EFCaptionsActiveWord) {\n return html`<ef-captions-active-word-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-captions-active-word-hierarchy-item>`;\n }\n if (child instanceof EFText) {\n return html`<ef-text-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-text-hierarchy-item>`;\n }\n // Skip text segments - they're shown within the parent text element\n if (child instanceof EFTextSegment) {\n return nothing;\n }\n if (child instanceof EFWaveform) {\n return html`<ef-waveform-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n .temporalOnly=${temporalOnly}\n ></ef-waveform-hierarchy-item>`;\n }\n\n // Skip non-temporal HTML elements when temporalOnly is true\n if (temporalOnly) {\n return nothing;\n }\n\n // Handle all other HTML elements (plain DOM nodes, custom elements, etc.)\n if (child instanceof HTMLElement) {\n return html`<ef-html-hierarchy-item\n .element=${child}\n .hideSelectors=${hideSelectors}\n .showSelectors=${showSelectors}\n ></ef-html-hierarchy-item>`;\n }\n\n // Skip non-HTML elements\n return nothing;\n });\n}\n\n@customElement(\"ef-hierarchy-item\")\nexport class EFHierarchyItem<\n ElementType extends HTMLElement = HTMLElement,\n> extends TWMixin(LitElement) {\n static styles = [\n css`\n :host {\n display: block;\n }\n .item-row {\n display: flex;\n align-items: center;\n height: var(--hierarchy-item-height, 1.5rem);\n padding-left: var(--hierarchy-item-padding-left, 0.5rem);\n padding-right: var(--hierarchy-item-padding-right, 0.5rem);\n padding-top: var(--hierarchy-item-padding-top, 0);\n padding-bottom: var(--hierarchy-item-padding-bottom, 0);\n font-size: var(--hierarchy-item-font-size, 0.75rem);\n font-family: system-ui, -apple-system, sans-serif;\n cursor: pointer;\n user-select: none;\n border-left: 3px solid transparent;\n transition: background-color 0.1s ease;\n }\n .item-row:hover {\n background: var(--ef-color-hover);\n }\n .item-row[data-selected] {\n background: var(--ef-color-selected);\n border-left-color: var(--ef-color-primary);\n }\n .item-row[data-ancestor-selected] {\n background: var(--ef-color-selected-subtle);\n }\n .item-row[data-focused] {\n background: var(--ef-color-focused);\n border-left-color: var(--ef-color-primary);\n }\n .item-row[data-dragging] {\n opacity: 0.5;\n }\n .expand-icon {\n width: var(--hierarchy-expand-icon-size, 1rem);\n height: var(--hierarchy-expand-icon-size, 1rem);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n flex-shrink: 0;\n }\n .expand-icon svg {\n width: 0.75rem;\n height: 0.75rem;\n transition: transform 0.15s ease;\n }\n .expand-icon[data-expanded] svg {\n transform: rotate(90deg);\n }\n .icon {\n margin-right: var(--hierarchy-icon-gap, 0.25rem);\n flex-shrink: 0;\n }\n .label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n }\n .children {\n padding-left: var(--hierarchy-indent, 0.75rem);\n }\n .children[data-collapsed] {\n display: none;\n }\n .drop-indicator {\n height: 2px;\n background: var(--hierarchy-drop-indicator, #3b82f6);\n margin-left: var(--hierarchy-indent, 0.75rem);\n }\n .drop-inside {\n outline: 2px solid var(--hierarchy-drop-indicator, #3b82f6);\n outline-offset: -2px;\n }\n `,\n ];\n\n @consume({ context: hierarchyContext, subscribe: true })\n hierarchyContext?: HierarchyContext;\n\n @consume({ context: selectionContext, subscribe: true })\n canvasSelectionContext?: import(\"../../canvas/selection/selectionContext.js\").SelectionContext;\n\n @property({ type: Object, attribute: false })\n element: ElementType = new EFTimegroup() as unknown as ElementType;\n\n @property({ type: Array, attribute: false })\n hideSelectors?: string[];\n\n @property({ type: Array, attribute: false })\n showSelectors?: string[];\n\n @property({ type: Boolean, attribute: false })\n temporalOnly = false;\n\n @state()\n private localExpanded = true;\n\n private selectionChangeHandler?: (event: CustomEvent) => void;\n\n get elementId(): string {\n return this.element?.id || \"\";\n }\n\n get icon(): TemplateResult<1> | string {\n return phosphorIcon(ICONS.code);\n }\n\n get typeColor(): string {\n return getElementTypeColor(\"timegroup\", this);\n }\n\n get isFocused(): boolean {\n const highlightedElement = this.hierarchyContext?.getHighlightedElement?.();\n return this.element && highlightedElement === this.element;\n }\n\n get isSelected(): boolean {\n // Try to get selection context from hierarchy parent (which can access canvas)\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n\n if (selectionCtx && this.elementId) {\n // Check if this element's ID is in the selected IDs\n return selectionCtx.selectedIds.has(this.elementId);\n }\n // Fall back to hierarchy's own selection state\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.selectedElementId === this.elementId;\n }\n\n get isAncestorSelected(): boolean {\n // Check if this element contains any selected element\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n\n if (selectionCtx && this.element) {\n for (const selectedId of selectionCtx.selectedIds) {\n const selectedElement = document.getElementById(selectedId);\n if (\n selectedElement &&\n this.element.contains(selectedElement) &&\n selectedElement !== this.element\n ) {\n return true;\n }\n }\n }\n return false;\n }\n\n get isExpanded(): boolean {\n if (!this.hierarchyContext || !this.elementId) return this.localExpanded;\n return this.hierarchyContext.state.expandedIds.has(this.elementId);\n }\n\n get isDragging(): boolean {\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.draggedElementId === this.elementId;\n }\n\n get isDropTarget(): boolean {\n if (!this.hierarchyContext) return false;\n return this.hierarchyContext.state.dropTargetId === this.elementId;\n }\n\n get dropPosition(): \"before\" | \"after\" | \"inside\" | null {\n if (!this.isDropTarget || !this.hierarchyContext) return null;\n return this.hierarchyContext.state.dropPosition;\n }\n\n get hasChildren(): boolean {\n return this.element.children.length > 0;\n }\n\n displayLabel(): TemplateResult<1> | string | typeof nothing {\n return this.elementId || \"(unnamed)\";\n }\n\n private handleClick(e: Event): void {\n e.stopPropagation();\n if (this.hierarchyContext && this.elementId) {\n this.hierarchyContext.actions.select(this.elementId);\n }\n // Also set highlight on click for visual feedback\n this.hierarchyContext?.setHighlightedElement?.(this.element);\n }\n\n private handleExpandClick(e: Event): void {\n e.stopPropagation();\n if (this.hierarchyContext && this.elementId) {\n this.hierarchyContext.actions.toggleExpanded(this.elementId);\n } else {\n this.localExpanded = !this.localExpanded;\n }\n }\n\n private handleDragStart(e: DragEvent): void {\n if (!this.hierarchyContext || !this.elementId) return;\n e.dataTransfer?.setData(\"text/plain\", this.elementId);\n this.hierarchyContext.actions.startDrag(this.elementId);\n }\n\n private handleDragEnd(): void {\n if (this.hierarchyContext) {\n this.hierarchyContext.actions.endDrag();\n }\n }\n\n private handleDragOver(e: DragEvent): void {\n e.preventDefault();\n if (!this.hierarchyContext || !this.elementId) return;\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const y = e.clientY - rect.top;\n const height = rect.height;\n\n let position: \"before\" | \"after\" | \"inside\";\n if (y < height * 0.25) {\n position = \"before\";\n } else if (y > height * 0.75) {\n position = \"after\";\n } else {\n position = \"inside\";\n }\n\n this.hierarchyContext.actions.updateDropTarget(this.elementId, position);\n }\n\n private handleDragLeave(): void {\n if (this.hierarchyContext && this.isDropTarget) {\n this.hierarchyContext.actions.updateDropTarget(null, null);\n }\n }\n\n private handleDrop(e: DragEvent): void {\n e.preventDefault();\n if (!this.hierarchyContext || !this.elementId) return;\n\n const sourceId = e.dataTransfer?.getData(\"text/plain\");\n if (sourceId && this.dropPosition) {\n this.hierarchyContext.actions.reorder(\n sourceId,\n this.elementId,\n this.dropPosition,\n );\n }\n this.hierarchyContext.actions.endDrag();\n }\n\n private handleMouseEnter(): void {\n // Update canvas highlight (source of truth)\n this.hierarchyContext?.setHighlightedElement?.(this.element);\n }\n\n private handleMouseLeave(): void {\n // Clear canvas highlight (source of truth)\n const currentHighlight = this.hierarchyContext?.getHighlightedElement?.();\n if (currentHighlight === this.element) {\n this.hierarchyContext?.setHighlightedElement?.(null);\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.setupSelectionListener();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeSelectionListener();\n }\n\n protected willUpdate(changedProperties: PropertyValues): void {\n // Set up listener if context becomes available or context changed\n if (\n !this.selectionChangeHandler ||\n changedProperties.has(\"hierarchyContext\")\n ) {\n // Remove old listener if context changed\n if (\n changedProperties.has(\"hierarchyContext\") &&\n this.selectionChangeHandler\n ) {\n this.removeSelectionListener();\n this.selectionChangeHandler = undefined;\n }\n this.setupSelectionListener();\n }\n }\n\n private setupSelectionListener(): void {\n // Don't set up if already set up\n if (this.selectionChangeHandler) {\n return;\n }\n\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n if (selectionCtx && \"addEventListener\" in selectionCtx) {\n this.selectionChangeHandler = () => {\n this.requestUpdate(); // Trigger re-render to update selected state\n };\n (selectionCtx as any).addEventListener(\n \"selectionchange\",\n this.selectionChangeHandler,\n );\n }\n }\n\n private removeSelectionListener(): void {\n const selectionCtx =\n this.canvasSelectionContext ||\n this.hierarchyContext?.getCanvasSelectionContext?.();\n if (\n selectionCtx &&\n \"removeEventListener\" in selectionCtx &&\n this.selectionChangeHandler\n ) {\n (selectionCtx as any).removeEventListener(\n \"selectionchange\",\n this.selectionChangeHandler,\n );\n this.selectionChangeHandler = undefined;\n }\n }\n\n render() {\n const expanded = this.isExpanded;\n\n return html`\n ${this.dropPosition === \"before\" ? html`<div class=\"drop-indicator\"></div>` : nothing}\n <div\n class=\"item-row ${this.dropPosition === \"inside\" ? \"drop-inside\" : \"\"}\"\n part=\"row\"\n style=${styleMap({ borderLeftColor: this.typeColor })}\n ?data-focused=${this.isFocused}\n ?data-selected=${this.isSelected}\n ?data-ancestor-selected=${this.isAncestorSelected}\n ?data-dragging=${this.isDragging}\n draggable=\"true\"\n @click=${this.handleClick}\n @dragstart=${this.handleDragStart}\n @dragend=${this.handleDragEnd}\n @dragover=${this.handleDragOver}\n @dragleave=${this.handleDragLeave}\n @drop=${this.handleDrop}\n @mouseenter=${this.handleMouseEnter}\n @mouseleave=${this.handleMouseLeave}\n >\n ${\n this.hasChildren\n ? html`\n <span\n class=\"expand-icon\"\n ?data-expanded=${expanded}\n @click=${this.handleExpandClick}\n >\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n </span>\n `\n : html`<span class=\"expand-icon\"></span>`\n }\n <span class=\"icon\" part=\"icon\">${this.icon}</span>\n <span class=\"label\" part=\"label\">${this.displayLabel()}</span>\n </div>\n ${\n this.hasChildren\n ? html`\n <div class=\"children\" ?data-collapsed=${!expanded}>\n ${this.renderChildren()}\n </div>\n `\n : nothing\n }\n ${this.dropPosition === \"after\" ? html`<div class=\"drop-indicator\"></div>` : nothing}\n `;\n }\n\n renderChildren(): Array<TemplateResult<1> | typeof nothing> | typeof nothing {\n return renderHierarchyChildren(\n Array.from(this.element.children),\n this.hideSelectors,\n this.showSelectors,\n false,\n this.temporalOnly,\n );\n }\n}\n\n/**\n * Generate a friendly label for an element based on its type and siblings\n */\nfunction getFriendlyLabel(element: HTMLElement, typeLabel: string): string {\n // If element has a meaningful ID (not auto-generated), use it\n const id = element.id || \"\";\n if (id && !id.includes(\"-\") && !id.match(/^\\d+$/)) {\n return id;\n }\n\n // Count siblings of same type to generate \"Video 1\", \"Video 2\", etc.\n const parent = element.parentElement;\n if (parent) {\n const tagName = element.tagName;\n const siblings = Array.from(parent.children).filter(\n (child) => child.tagName === tagName,\n );\n const index = siblings.indexOf(element) + 1;\n\n // If there's only one of this type, don't add number\n if (siblings.length === 1) {\n return typeLabel;\n }\n return `${typeLabel} ${index}`;\n }\n\n return typeLabel;\n}\n\n@customElement(\"ef-timegroup-hierarchy-item\")\nexport class EFTimegroupHierarchyItem extends EFHierarchyItem<EFTimegroup> {\n get icon() {\n return phosphorIcon(ICONS.filmSlate);\n }\n\n get typeColor(): string {\n return getElementTypeColor(\"timegroup\", this);\n }\n\n displayLabel(): string | TemplateResult<1> | typeof nothing {\n const label = getFriendlyLabel(this.element, \"Composition\");\n const mode = this.element.mode || \"fixed\";\n const modeLabels: Record<string, string> = {\n fixed: \"Fixed\",\n sequence: \"Sequence\",\n contain: \"Container\",\n fit: \"Fit\",\n };\n const modeLabel = modeLabels[mode] || mode;\n return html`${label} <span style=\"opacity: 0.5; font-size: 0.65rem;\">${modeLabel}</span>`;\n }\n}\n\n@customElement(\"ef-audio-hierarchy-item\")\nexport class EFAudioHierarchyItem extends EFHierarchyItem<EFAudio> {\n get icon() {\n return phosphorIcon(ICONS.speakerHigh);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green for audio\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Audio\");\n }\n}\n\n@customElement(\"ef-video-hierarchy-item\")\nexport class EFVideoHierarchyItem extends EFHierarchyItem<EFVideo> {\n get icon() {\n return phosphorIcon(ICONS.filmStrip);\n }\n\n get typeColor(): string {\n return \"rgb(59, 130, 246)\"; // Blue for video\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Video\");\n }\n}\n\n@customElement(\"ef-captions-hierarchy-item\")\nexport class EFCaptionsHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.subtitles);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element as HTMLElement, \"Captions\");\n }\n}\n\n@customElement(\"ef-captions-active-word-hierarchy-item\")\nexport class EFCaptionsActiveWordHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.microphone);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n displayLabel() {\n return \"Active Word\";\n }\n}\n\n@customElement(\"ef-text-hierarchy-item\")\nexport class EFTextHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.textT);\n }\n\n get typeColor(): string {\n return \"rgb(249, 115, 22)\"; // Orange for text\n }\n\n get hasChildren(): boolean {\n return false; // Text segments are internal, not shown as children\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element as HTMLElement, \"Text\");\n }\n\n renderChildren(): typeof nothing {\n return nothing;\n }\n}\n\n@customElement(\"ef-text-segment-hierarchy-item\")\nexport class EFTextSegmentHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.textT);\n }\n\n get typeColor(): string {\n return \"rgb(249, 115, 22)\"; // Orange\n }\n\n displayLabel() {\n return \"Segment\";\n }\n}\n\n@customElement(\"ef-waveform-hierarchy-item\")\nexport class EFWaveformHierarchyItem extends EFHierarchyItem {\n get icon() {\n return phosphorIcon(ICONS.waveform);\n }\n\n get typeColor(): string {\n return \"rgb(34, 197, 94)\"; // Green\n }\n\n renderChildren(): typeof nothing {\n return nothing;\n }\n}\n\n@customElement(\"ef-image-hierarchy-item\")\nexport class EFImageHierarchyItem extends EFHierarchyItem<EFImage> {\n get icon() {\n return phosphorIcon(ICONS.image);\n }\n\n get typeColor(): string {\n return \"rgb(168, 85, 247)\"; // Purple for images\n }\n\n displayLabel() {\n return getFriendlyLabel(this.element, \"Image\");\n }\n}\n\n@customElement(\"ef-html-hierarchy-item\")\nexport class EFHTMLHierarchyItem extends EFHierarchyItem {\n get icon() {\n return html`<code>${`<${this.element.tagName.toLowerCase()}>`}</code>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-hierarchy-item\": EFHierarchyItem;\n \"ef-timegroup-hierarchy-item\": EFTimegroupHierarchyItem;\n \"ef-audio-hierarchy-item\": EFAudioHierarchyItem;\n \"ef-video-hierarchy-item\": EFVideoHierarchyItem;\n \"ef-captions-hierarchy-item\": EFCaptionsHierarchyItem;\n \"ef-captions-active-word-hierarchy-item\": EFCaptionsActiveWordHierarchyItem;\n \"ef-text-hierarchy-item\": EFTextHierarchyItem;\n \"ef-text-segment-hierarchy-item\": EFTextSegmentHierarchyItem;\n \"ef-waveform-hierarchy-item\": EFWaveformHierarchyItem;\n \"ef-image-hierarchy-item\": EFImageHierarchyItem;\n \"ef-html-hierarchy-item\": EFHTMLHierarchyItem;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"icons.js","names":[],"sources":["../../src/gui/icons.ts"],"sourcesContent":["import { html, type TemplateResult } from \"lit\";\n\n/**\n * Helper function to create Phosphor icon SVG templates\n * Icons are sized to match typical UI font sizes (12-14px)\n */\nexport function phosphorIcon(path: string, size = 14): TemplateResult<1> {\n return html`\n <svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 256 256\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"${path}\" />\n </svg>\n `;\n}\n\n// Phosphor icon paths (from @phosphor-icons/core)\nexport const ICONS = {\n gear: \"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z\",\n clock: \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z\",\n filmStrip: \"M184,32H72A24,24,0,0,0,48,56V200a24,24,0,0,0,24,24H184a24,24,0,0,0,24-24V56A24,24,0,0,0,184,32Zm8,168a8,8,0,0,1-8,8H72a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8ZM80,80a8,8,0,0,1,16,0v96a8,8,0,0,1-16,0Zm80,0a8,8,0,0,1,16,0v96a8,8,0,0,1-16,0Z\",\n filmSlate: \"M216,48H40a16,16,0,0,0-16,16V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,64H216V192H40ZM56,88a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H64A8,8,0,0,1,56,88Zm144,0a8,8,0,0,1,8-8h16a8,8,0,0,1,0,16H208A8,8,0,0,1,200,88ZM56,168a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H64A8,8,0,0,1,56,168Zm144,0a8,8,0,0,1,8-8h16a8,8,0,0,1,0,16H208A8,8,0,0,1,200,168ZM128,120a8,8,0,0,1-8-8V96a8,8,0,0,1,16,0v16A8,8,0,0,1,128,120Zm0,48a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v16A8,8,0,0,1,128,168Z\",\n speakerHigh: \"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88.91,160H32V96H88.91L144,48.36Zm53.66-90.37a8,8,0,0,1,0-11.32,40,40,0,0,1,0,56.58,8,8,0,0,1-11.32-11.32,24,24,0,0,0,0-33.94A8,8,0,0,1,197.66,117.27Zm-17-45.25a8,8,0,0,1,11.32,0,72,72,0,0,1,0,101.82,8,8,0,0,1-11.32-11.32,56,56,0,0,0,0-79.18A8,8,0,0,1,180.66,72Z\",\n textT: \"M212,56V88a8,8,0,0,1-16,0V64H140V192h20a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h20V64H60V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H204A8,8,0,0,1,212,56Z\",\n image: \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H40V56H216V200ZM56,96a12,12,0,1,1,12,12A12,12,0,0,1,56,96Zm152,84H96l48-48,24,24,16-16Z\",\n subtitles: \"M224,48H32a16,16,0,0,0-16,16V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM48,128a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H56A8,8,0,0,1,48,128Zm112,0a8,8,0,0,1,8-8h32a8,8,0,0,1,0,16H168A8,8,0,0,1,160,128Zm-64,32a8,8,0,0,1,8-8h96a8,8,0,0,1,0,16H104A8,8,0,0,1,96,160Z\",\n microphone: \"M128,24A48,48,0,0,0,80,72V128a48,48,0,0,0,96,0V72A48,48,0,0,0,128,24Zm32,104a32,32,0,0,1-64,0V72a32,32,0,0,1,64,0Zm48,0a8,8,0,0,1-16,0A96.11,96.11,0,0,0,128,32a8,8,0,0,1,0-16A112.12,112.12,0,0,1,240,128Zm-40,0a8,8,0,0,1-16,0A72.08,72.08,0,0,0,128,56a8,8,0,0,1,0-16A88.1,88.1,0,0,1,216,128Zm24,40a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16H192A8,8,0,0,1,200,168Z\",\n waveform: \"M80,96a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v64a8,8,0,0,1-8,8H88a8,8,0,0,1-8-8Zm32-32a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v128a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Zm32,16a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v96a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Zm32-48a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v192a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Z\",\n code: \"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.3l-48-40a8,8,0,0,1,0-12.3l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,0,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.3l48-40a8,8,0,0,0,0-12.3Zm-82.39-89.37a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\",\n arrowLeft: \"M192,128a8,8,0,0,1-2.34,5.66l-56,56a8,8,0,0,1-11.32-11.32L172.69,128,122.34,77.66a8,8,0,0,1,11.32-11.32l56,56A8,8,0,0,1,192,128Z\",\n arrowRight: \"M64,128a8,8,0,0,1,2.34-5.66l56-56a8,8,0,0,1,11.32,11.32L83.31,128l50.35,50.34a8,8,0,0,1-11.32,11.32l-56-56A8,8,0,0,1,64,128Z\",\n lightning: \"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17Z\",\n} as const;\n\n"],"mappings":";;;;;;;AAMA,SAAgB,aAAa,MAAc,OAAO,IAAuB;AACvE,QAAO,IAAI;kBACK,KAAK,YAAY,KAAK;iBACvB,KAAK;;;;AAMtB,MAAa,QAAQ;CACnB,MAAM;CACN,OAAO;CACP,WAAW;CACX,WAAW;CACX,aAAa;CACb,OAAO;CACP,OAAO;CACP,WAAW;CACX,YAAY;CACZ,UAAU;CACV,MAAM;CACN,WAAW;CACX,YAAY;CACZ,WAAW;CACZ"}
1
+ {"version":3,"file":"icons.js","names":[],"sources":["../../src/gui/icons.ts"],"sourcesContent":["import { html, type TemplateResult } from \"lit\";\n\n/**\n * Helper function to create Phosphor icon SVG templates\n * Icons are sized to match typical UI font sizes (12-14px)\n */\nexport function phosphorIcon(path: string, size = 14): TemplateResult<1> {\n return html`\n <svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 256 256\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"${path}\" />\n </svg>\n `;\n}\n\n// Phosphor icon paths (from @phosphor-icons/core)\nexport const ICONS = {\n gear: \"M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.21,107.21,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.71,107.71,0,0,0-26.25-10.87,8,8,0,0,0-7.06,1.49L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.21,107.21,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8,8,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8,8,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z\",\n clock:\n \"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm64-88a8,8,0,0,1-8,8H128a8,8,0,0,1-8-8V72a8,8,0,0,1,16,0v48h48A8,8,0,0,1,192,128Z\",\n filmStrip:\n \"M184,32H72A24,24,0,0,0,48,56V200a24,24,0,0,0,24,24H184a24,24,0,0,0,24-24V56A24,24,0,0,0,184,32Zm8,168a8,8,0,0,1-8,8H72a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H184a8,8,0,0,1,8,8ZM80,80a8,8,0,0,1,16,0v96a8,8,0,0,1-16,0Zm80,0a8,8,0,0,1,16,0v96a8,8,0,0,1-16,0Z\",\n filmSlate:\n \"M216,48H40a16,16,0,0,0-16,16V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,64H216V192H40ZM56,88a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H64A8,8,0,0,1,56,88Zm144,0a8,8,0,0,1,8-8h16a8,8,0,0,1,0,16H208A8,8,0,0,1,200,88ZM56,168a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H64A8,8,0,0,1,56,168Zm144,0a8,8,0,0,1,8-8h16a8,8,0,0,1,0,16H208A8,8,0,0,1,200,168ZM128,120a8,8,0,0,1-8-8V96a8,8,0,0,1,16,0v16A8,8,0,0,1,128,120Zm0,48a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v16A8,8,0,0,1,128,168Z\",\n speakerHigh:\n \"M155.51,24.81a8,8,0,0,0-8.42.88L77.25,80H32A16,16,0,0,0,16,96v64a16,16,0,0,0,16,16H77.25l69.84,54.31A8,8,0,0,0,160,224V32A8,8,0,0,0,155.51,24.81ZM32,96H72v64H32ZM144,207.64,88.91,160H32V96H88.91L144,48.36Zm53.66-90.37a8,8,0,0,1,0-11.32,40,40,0,0,1,0,56.58,8,8,0,0,1-11.32-11.32,24,24,0,0,0,0-33.94A8,8,0,0,1,197.66,117.27Zm-17-45.25a8,8,0,0,1,11.32,0,72,72,0,0,1,0,101.82,8,8,0,0,1-11.32-11.32,56,56,0,0,0,0-79.18A8,8,0,0,1,180.66,72Z\",\n textT:\n \"M212,56V88a8,8,0,0,1-16,0V64H140V192h20a8,8,0,0,1,0,16H96a8,8,0,0,1,0-16h20V64H60V88a8,8,0,0,1-16,0V56a8,8,0,0,1,8-8H204A8,8,0,0,1,212,56Z\",\n image:\n \"M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,160H40V56H216V200ZM56,96a12,12,0,1,1,12,12A12,12,0,0,1,56,96Zm152,84H96l48-48,24,24,16-16Z\",\n subtitles:\n \"M224,48H32a16,16,0,0,0-16,16V192a16,16,0,0,0,16,16H224a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm0,144H32V64H224V192ZM48,128a8,8,0,0,1,8-8H80a8,8,0,0,1,0,16H56A8,8,0,0,1,48,128Zm112,0a8,8,0,0,1,8-8h32a8,8,0,0,1,0,16H168A8,8,0,0,1,160,128Zm-64,32a8,8,0,0,1,8-8h96a8,8,0,0,1,0,16H104A8,8,0,0,1,96,160Z\",\n microphone:\n \"M128,24A48,48,0,0,0,80,72V128a48,48,0,0,0,96,0V72A48,48,0,0,0,128,24Zm32,104a32,32,0,0,1-64,0V72a32,32,0,0,1,64,0Zm48,0a8,8,0,0,1-16,0A96.11,96.11,0,0,0,128,32a8,8,0,0,1,0-16A112.12,112.12,0,0,1,240,128Zm-40,0a8,8,0,0,1-16,0A72.08,72.08,0,0,0,128,56a8,8,0,0,1,0-16A88.1,88.1,0,0,1,216,128Zm24,40a8,8,0,0,1-8,8H32a8,8,0,0,1,0-16H192A8,8,0,0,1,200,168Z\",\n waveform:\n \"M80,96a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v64a8,8,0,0,1-8,8H88a8,8,0,0,1-8-8Zm32-32a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v128a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Zm32,16a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v96a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Zm32-48a8,8,0,0,1,8-8h8a8,8,0,0,1,8,8v192a8,8,0,0,1-8,8h-8a8,8,0,0,1-8-8Z\",\n code: \"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.3l-48-40a8,8,0,0,1,0-12.3l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,0,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.3l48-40a8,8,0,0,0,0-12.3Zm-82.39-89.37a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\",\n arrowLeft:\n \"M192,128a8,8,0,0,1-2.34,5.66l-56,56a8,8,0,0,1-11.32-11.32L172.69,128,122.34,77.66a8,8,0,0,1,11.32-11.32l56,56A8,8,0,0,1,192,128Z\",\n arrowRight:\n \"M64,128a8,8,0,0,1,2.34-5.66l56-56a8,8,0,0,1,11.32,11.32L83.31,128l50.35,50.34a8,8,0,0,1-11.32,11.32l-56-56A8,8,0,0,1,64,128Z\",\n lightning:\n \"M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17Z\",\n} as const;\n"],"mappings":";;;;;;;AAMA,SAAgB,aAAa,MAAc,OAAO,IAAuB;AACvE,QAAO,IAAI;kBACK,KAAK,YAAY,KAAK;iBACvB,KAAK;;;;AAMtB,MAAa,QAAQ;CACnB,MAAM;CACN,OACE;CACF,WACE;CACF,WACE;CACF,aACE;CACF,OACE;CACF,OACE;CACF,WACE;CACF,YACE;CACF,UACE;CACF,MAAM;CACN,WACE;CACF,YACE;CACF,WACE;CACH"}
@@ -0,0 +1,18 @@
1
+ import { PreviewPresentationMode, PreviewResolutionScale, RenderMode } from "../preview/previewSettings.js";
2
+
3
+ //#region src/gui/previewSettingsContext.d.ts
4
+
5
+ /**
6
+ * Settings for the preview workbench.
7
+ * Provided by EFWorkbench via context, consumable by any descendant.
8
+ */
9
+ interface PreviewSettings {
10
+ presentationMode: PreviewPresentationMode;
11
+ renderMode: RenderMode;
12
+ resolutionScale: PreviewResolutionScale;
13
+ showStats: boolean;
14
+ showThumbnailTimestamps: boolean;
15
+ }
16
+ //#endregion
17
+ export { PreviewSettings };
18
+ //# sourceMappingURL=previewSettingsContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"previewSettingsContext.js","names":[],"sources":["../../src/gui/previewSettingsContext.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\nimport type { PreviewPresentationMode, PreviewResolutionScale, RenderMode } from \"../preview/previewSettings.js\";\n\n/**\n * Settings for the preview workbench.\n * Provided by EFWorkbench via context, consumable by any descendant.\n */\nexport interface PreviewSettings {\n presentationMode: PreviewPresentationMode;\n renderMode: RenderMode;\n resolutionScale: PreviewResolutionScale;\n showStats: boolean;\n thumbnailCacheMaxSize: number;\n}\n\n/**\n * Context for propagating preview settings through the component tree.\n * Provided by EFWorkbench, consumable by any descendant.\n */\nexport const previewSettingsContext = createContext<PreviewSettings>(\n Symbol(\"preview-settings\")\n);\n"],"mappings":";;;;;;;AAmBA,MAAa,yBAAyB,cACpC,OAAO,mBAAmB,CAC3B"}
1
+ {"version":3,"file":"previewSettingsContext.js","names":[],"sources":["../../src/gui/previewSettingsContext.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\nimport type {\n PreviewPresentationMode,\n PreviewResolutionScale,\n RenderMode,\n} from \"../preview/previewSettings.js\";\n\n/**\n * Settings for the preview workbench.\n * Provided by EFWorkbench via context, consumable by any descendant.\n */\nexport interface PreviewSettings {\n presentationMode: PreviewPresentationMode;\n renderMode: RenderMode;\n resolutionScale: PreviewResolutionScale;\n showStats: boolean;\n showThumbnailTimestamps: boolean;\n}\n\n/**\n * Context for propagating preview settings through the component tree.\n * Provided by EFWorkbench, consumable by any descendant.\n */\nexport const previewSettingsContext = createContext<PreviewSettings>(\n Symbol(\"preview-settings\"),\n);\n"],"mappings":";;;;;;;AAuBA,MAAa,yBAAyB,cACpC,OAAO,mBAAmB,CAC3B"}
@@ -0,0 +1,34 @@
1
+ //#region src/gui/theme.ts
2
+ /**
3
+ * Editframe GUI Theme Utilities
4
+ *
5
+ * Shared utilities for working with theme tokens.
6
+ */
7
+ /**
8
+ * Fallback colors for element types when CSS variables are not available.
9
+ * These match the default values in ef-theme.css.
10
+ */
11
+ const fallbackTypeColors = {
12
+ video: "rgb(59, 130, 246)",
13
+ audio: "rgb(34, 197, 94)",
14
+ image: "rgb(168, 85, 247)",
15
+ text: "rgb(249, 115, 22)",
16
+ captions: "rgb(34, 197, 94)",
17
+ timegroup: "rgb(148, 163, 184)"
18
+ };
19
+ /**
20
+ * Get the color for a specific element type from CSS variables.
21
+ * Falls back to hardcoded values if the CSS variable is not defined.
22
+ *
23
+ * @param type - The element type (video, audio, image, text, captions, timegroup)
24
+ * @param element - Optional element to compute styles from (defaults to document.documentElement)
25
+ * @returns The color string (rgb format)
26
+ */
27
+ function getElementTypeColor(type, element = document.documentElement) {
28
+ const varName = `--ef-color-type-${type}`;
29
+ return getComputedStyle(element).getPropertyValue(varName).trim() || fallbackTypeColors[type] || fallbackTypeColors.timegroup;
30
+ }
31
+
32
+ //#endregion
33
+ export { getElementTypeColor };
34
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","names":["fallbackTypeColors: Record<string, string>"],"sources":["../../src/gui/theme.ts"],"sourcesContent":["/**\n * Editframe GUI Theme Utilities\n *\n * Shared utilities for working with theme tokens.\n */\n\n/**\n * Fallback colors for element types when CSS variables are not available.\n * These match the default values in ef-theme.css.\n */\nconst fallbackTypeColors: Record<string, string> = {\n video: \"rgb(59, 130, 246)\", // blue-500\n audio: \"rgb(34, 197, 94)\", // green-500\n image: \"rgb(168, 85, 247)\", // purple-500\n text: \"rgb(249, 115, 22)\", // orange-500\n captions: \"rgb(34, 197, 94)\", // green-500\n timegroup: \"rgb(148, 163, 184)\", // slate-400\n};\n\n/**\n * Get the color for a specific element type from CSS variables.\n * Falls back to hardcoded values if the CSS variable is not defined.\n *\n * @param type - The element type (video, audio, image, text, captions, timegroup)\n * @param element - Optional element to compute styles from (defaults to document.documentElement)\n * @returns The color string (rgb format)\n */\nexport function getElementTypeColor(\n type: string,\n element: Element = document.documentElement,\n): string {\n const varName = `--ef-color-type-${type}`;\n const computedValue = getComputedStyle(element)\n .getPropertyValue(varName)\n .trim();\n\n return (\n computedValue || fallbackTypeColors[type] || fallbackTypeColors.timegroup!\n );\n}\n\n/**\n * Get a theme token value from CSS variables.\n *\n * @param tokenName - The CSS variable name (with or without -- prefix)\n * @param element - Optional element to compute styles from (defaults to document.documentElement)\n * @returns The token value, or empty string if not defined\n */\nexport function getThemeToken(\n tokenName: string,\n element: Element = document.documentElement,\n): string {\n const varName = tokenName.startsWith(\"--\") ? tokenName : `--${tokenName}`;\n return getComputedStyle(element).getPropertyValue(varName).trim();\n}\n\n/**\n * Check if light mode is active on the given element or any ancestor.\n *\n * @param element - The element to check\n * @returns true if light mode is active\n */\nexport function isLightMode(element: Element): boolean {\n let current: Element | null = element;\n while (current) {\n if (current.classList.contains(\"light\")) {\n return true;\n }\n current = current.parentElement;\n }\n return false;\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAMA,qBAA6C;CACjD,OAAO;CACP,OAAO;CACP,OAAO;CACP,MAAM;CACN,UAAU;CACV,WAAW;CACZ;;;;;;;;;AAUD,SAAgB,oBACd,MACA,UAAmB,SAAS,iBACpB;CACR,MAAM,UAAU,mBAAmB;AAKnC,QAJsB,iBAAiB,QAAQ,CAC5C,iBAAiB,QAAQ,CACzB,MAAM,IAGU,mBAAmB,SAAS,mBAAmB"}
@@ -1,9 +1,8 @@
1
1
  import { TemporalMixinInterface } from "../../elements/EFTemporal.js";
2
2
  import { SelectionContext } from "../../canvas/selection/selectionContext.js";
3
- import "../../elements/EFThumbnailStrip.js";
3
+ import { TimelineState } from "./timelineStateContext.js";
4
4
  import "./tracks/preloadTracks.js";
5
5
  import "./EFTimelineRow.js";
6
- import { TimelineState } from "./timelineStateContext.js";
7
6
  import "../EFTimelineRuler.js";
8
7
  import * as lit34 from "lit";
9
8
  import { LitElement, PropertyValues, TemplateResult } from "lit";
@@ -77,6 +76,7 @@ declare class EFTimeline extends EFTimeline_base {
77
76
  private isLooping;
78
77
  private viewportScrollLeft;
79
78
  private _timelineState;
79
+ private _editingContext;
80
80
  private targetController?;
81
81
  private tracksScrollRef;
82
82
  private containerRef;
@@ -1,17 +1,17 @@
1
+ import { TWMixin } from "../TWMixin2.js";
1
2
  import { currentTimeContext } from "../currentTimeContext.js";
2
3
  import { durationContext } from "../durationContext.js";
3
4
  import { loopContext, playingContext } from "../playingContext.js";
4
5
  import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.95.0/helpers/decorate.js";
5
6
  import { isEFTemporal } from "../../elements/EFTemporal.js";
6
7
  import { targetTemporalContext } from "../ContextMixin.js";
7
- import { TWMixin } from "../TWMixin2.js";
8
8
  import { TargetController } from "../../elements/TargetController.js";
9
9
  import { selectionContext } from "../../canvas/selection/selectionContext.js";
10
10
  import { findRootTemporal } from "../../elements/findRootTemporal.js";
11
11
  import { shouldRenderElement } from "../hierarchy/EFHierarchyItem.js";
12
12
  import { createDirectTemporalSubscription } from "../Controllable.js";
13
+ import { createTimelineEditingContext, timelineEditingContext } from "./timelineEditingContext.js";
13
14
  import { DEFAULT_PIXELS_PER_MS, pixelsPerMsToZoom, pxToTime, timeToPx, timelineStateContext } from "./timelineStateContext.js";
14
- import "../../elements/EFThumbnailStrip.js";
15
15
  import "./tracks/preloadTracks.js";
16
16
  import { flattenHierarchy } from "./flattenHierarchy.js";
17
17
  import "./EFTimelineRow.js";
@@ -62,6 +62,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
62
62
  zoomIn: () => {},
63
63
  zoomOut: () => {}
64
64
  };
65
+ this._editingContext = createTimelineEditingContext();
65
66
  this.tracksScrollRef = createRef();
66
67
  this.containerRef = createRef();
67
68
  this.playheadRef = createRef();
@@ -83,30 +84,19 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
83
84
  min-height: 100px;
84
85
 
85
86
  /* Layout coordination via CSS custom properties */
86
- --timeline-hierarchy-width: 200px;
87
- --timeline-row-height: 24px;
88
- --timeline-track-height: 24px;
87
+ --timeline-hierarchy-width: var(--ef-hierarchy-width, 200px);
88
+ --timeline-row-height: var(--ef-row-height, 24px);
89
+ --timeline-track-height: var(--ef-track-height, 24px);
89
90
 
90
- /* Theme */
91
- --timeline-bg: rgb(30 41 59);
92
- --timeline-border: rgb(71 85 105);
93
- --timeline-header-bg: rgb(51 65 85);
94
- --timeline-text: rgb(226 232 240);
95
- --timeline-ruler-bg: rgb(51 65 85);
96
- --timeline-track-bg: rgb(51 65 85);
97
- --timeline-track-hover: rgb(71 85 105);
98
- --timeline-playhead: rgb(239 68 68);
99
- }
100
-
101
- :host(.light) {
102
- --timeline-bg: rgb(241 245 249);
103
- --timeline-border: rgb(203 213 225);
104
- --timeline-header-bg: rgb(226 232 240);
105
- --timeline-text: rgb(30 41 59);
106
- --timeline-ruler-bg: rgb(226 232 240);
107
- --timeline-track-bg: rgb(226 232 240);
108
- --timeline-track-hover: rgb(203 213 225);
109
- --timeline-playhead: rgb(185 28 28);
91
+ /* Component tokens (reference globals from ef-theme.css) */
92
+ --timeline-bg: var(--ef-color-bg);
93
+ --timeline-border: var(--ef-color-border);
94
+ --timeline-header-bg: var(--ef-color-bg-panel);
95
+ --timeline-text: var(--ef-color-text);
96
+ --timeline-ruler-bg: var(--ef-color-bg-panel);
97
+ --timeline-track-bg: var(--ef-color-bg-inset);
98
+ --timeline-track-hover: var(--ef-color-hover);
99
+ --timeline-playhead: var(--ef-color-playhead);
110
100
  }
111
101
 
112
102
  .timeline-container {
@@ -149,8 +139,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
149
139
  min-width: 32px;
150
140
  height: 32px;
151
141
  padding: 6px 10px;
152
- background: rgba(255, 255, 255, 0.1);
153
- border: 1px solid rgba(255, 255, 255, 0.2);
142
+ background: var(--ef-color-bg-inset);
143
+ border: 1px solid var(--ef-color-border-subtle);
154
144
  border-radius: 6px;
155
145
  color: inherit;
156
146
  font-size: 14px;
@@ -162,8 +152,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
162
152
  }
163
153
 
164
154
  .control-btn:hover:not(:disabled) {
165
- background: rgba(255, 255, 255, 0.2);
166
- border-color: rgba(255, 255, 255, 0.3);
155
+ background: var(--ef-color-hover);
156
+ border-color: var(--ef-color-border);
167
157
  }
168
158
 
169
159
  .control-btn:disabled {
@@ -172,8 +162,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
172
162
  }
173
163
 
174
164
  .control-btn.active {
175
- background: rgba(59, 130, 246, 0.6);
176
- border-color: rgba(59, 130, 246, 0.8);
165
+ background: var(--ef-color-primary-subtle);
166
+ border-color: var(--ef-color-primary);
177
167
  }
178
168
 
179
169
  .time-display {
@@ -181,7 +171,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
181
171
  font-size: 13px;
182
172
  font-weight: 500;
183
173
  padding: 6px 12px;
184
- background: rgba(0, 0, 0, 0.3);
174
+ background: var(--ef-color-bg-elevated);
185
175
  border-radius: 6px;
186
176
  letter-spacing: 0.5px;
187
177
  }
@@ -198,8 +188,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
198
188
  display: flex;
199
189
  align-items: center;
200
190
  justify-content: center;
201
- background: rgba(255, 255, 255, 0.1);
202
- border: 1px solid rgba(255, 255, 255, 0.2);
191
+ background: var(--ef-color-bg-inset);
192
+ border: 1px solid var(--ef-color-border-subtle);
203
193
  border-radius: 6px;
204
194
  color: inherit;
205
195
  font-size: 18px;
@@ -209,8 +199,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
209
199
  }
210
200
 
211
201
  .zoom-btn:hover {
212
- background: rgba(255, 255, 255, 0.2);
213
- border-color: rgba(255, 255, 255, 0.3);
202
+ background: var(--ef-color-hover);
203
+ border-color: var(--ef-color-border);
214
204
  transform: scale(1.05);
215
205
  }
216
206
 
@@ -376,8 +366,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
376
366
  position: absolute;
377
367
  top: 0;
378
368
  bottom: 0;
379
- background: rgba(59, 130, 246, 0.3);
380
- border-left: 2px solid rgba(59, 130, 246, 0.7);
369
+ background: var(--ef-color-primary-subtle);
370
+ border-left: 2px solid var(--ef-color-primary);
381
371
  pointer-events: none;
382
372
  }
383
373
 
@@ -386,7 +376,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
386
376
  align-items: center;
387
377
  justify-content: center;
388
378
  height: 100%;
389
- color: rgba(148, 163, 184, 0.6);
379
+ color: var(--ef-color-text-subtle);
390
380
  font-style: italic;
391
381
  }
392
382
  `];
@@ -481,7 +471,6 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
481
471
  if (this.controlTarget && this.controlTarget !== "" && this.controlTarget !== "selection") {
482
472
  const element = document.getElementById(this.controlTarget);
483
473
  if (element && isEFTemporal(element)) return element;
484
- if (this.isPlaying) console.warn("[EFTimeline] controlTarget set but element not found:", this.controlTarget, "isPlaying:", this.isPlaying);
485
474
  }
486
475
  const selectionCtx = this.getCanvasSelectionContext();
487
476
  if (selectionCtx) {
@@ -493,9 +482,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
493
482
  if (rootTemporal) return rootTemporal;
494
483
  }
495
484
  }
496
- if (this.isPlaying && selectedIds.length > 0) console.warn("[EFTimeline] Selection found but no temporal element:", selectedIds[0], "isPlaying:", this.isPlaying);
497
485
  }
498
- if (this.isPlaying) console.warn("[EFTimeline] targetTemporal is null during playback. controlTarget:", this.controlTarget, "target:", this.target, "hasSelectionContext:", !!this.getCanvasSelectionContext());
499
486
  return null;
500
487
  }
501
488
  get durationMs() {
@@ -652,6 +639,13 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
652
639
  }
653
640
  updated(changedProperties) {
654
641
  super.updated(changedProperties);
642
+ if (changedProperties.has("showHierarchy")) if (this.showHierarchy) {
643
+ this.style.removeProperty("--timeline-hierarchy-width");
644
+ this.removeAttribute("hide-hierarchy");
645
+ } else {
646
+ this.style.setProperty("--timeline-hierarchy-width", "0px");
647
+ this.setAttribute("hide-hierarchy", "");
648
+ }
655
649
  if (changedProperties.has("targetTemporal") || changedProperties.has("controlTarget")) this.subscribeToPlaybackController();
656
650
  if (changedProperties.has("targetTemporal") || changedProperties.has("target")) requestAnimationFrame(() => {
657
651
  this.restoreTimelineState();
@@ -806,7 +800,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
806
800
  /**
807
801
  * Smooth playhead following - scrolls to keep playhead at a fixed screen position.
808
802
  * This eliminates jitter by scrolling exactly as much as the playhead moves.
809
- *
803
+ *
810
804
  * PERFORMANCE NOTE: We DO update viewportScrollLeft state here, but the context
811
805
  * cascade is prevented in updateTimelineState() during playback. This means:
812
806
  * - State stays in sync (for non-context consumers)
@@ -1033,6 +1027,10 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1033
1027
  }
1034
1028
  startPlayheadDrag(e) {
1035
1029
  this.isDraggingPlayhead = true;
1030
+ this._editingContext.setState({
1031
+ mode: "scrubbing",
1032
+ startTimeMs: this.currentTimeMs
1033
+ });
1036
1034
  const tracksScroll = this.tracksScrollRef.value;
1037
1035
  if (tracksScroll) this.viewportScrollLeft = tracksScroll.scrollLeft;
1038
1036
  const hierarchyWidth = this.showHierarchy ? _EFTimeline.HIERARCHY_WIDTH : 0;
@@ -1082,6 +1080,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1082
1080
  };
1083
1081
  const onUp = () => {
1084
1082
  this.isDraggingPlayhead = false;
1083
+ this._editingContext.setState({ mode: "idle" });
1085
1084
  if (edgeScrollAnimationId) cancelAnimationFrame(edgeScrollAnimationId);
1086
1085
  window.removeEventListener("pointermove", onMove);
1087
1086
  window.removeEventListener("pointerup", onUp);
@@ -1101,8 +1100,22 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1101
1100
  if (!this.showPlaybackControls) return nothing;
1102
1101
  return html`
1103
1102
  <div class="playback-controls">
1104
- ${this.isPlaying ? html`<button class="control-btn" @click=${this.handlePause} title="Pause">⏸</button>` : html`<button class="control-btn" @click=${this.handlePlay} title="Play">▶</button>`}
1105
- <button class="control-btn ${this.isLooping ? "active" : ""}" @click=${this.handleToggleLoop} title="Loop">🔁</button>
1103
+ ${this.isPlaying ? html`<button class="control-btn" @click=${this.handlePause} title="Pause">
1104
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
1105
+ <rect x="4" y="3" width="3" height="10" rx="0.5"/>
1106
+ <rect x="9" y="3" width="3" height="10" rx="0.5"/>
1107
+ </svg>
1108
+ </button>` : html`<button class="control-btn" @click=${this.handlePlay} title="Play">
1109
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
1110
+ <path d="M5 3.5v9l7-4.5z"/>
1111
+ </svg>
1112
+ </button>`}
1113
+ <button class="control-btn ${this.isLooping ? "active" : ""}" @click=${this.handleToggleLoop} title="Loop">
1114
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
1115
+ <path d="M13.5 7.5H4.707l2.147-2.146a.5.5 0 0 0-.708-.708l-3 3a.5.5 0 0 0 0 .708l3 3a.5.5 0 0 0 .708-.708L4.707 8.5H13.5a1.5 1.5 0 0 1 0 3h-2a.5.5 0 0 0 0 1h2a2.5 2.5 0 0 0 0-5z"/>
1116
+ <path d="M2.5 8.5a1.5 1.5 0 0 1 1.5-1.5h2a.5.5 0 0 0 0-1H4a2.5 2.5 0 0 0 0 5h8.793l-2.147 2.146a.5.5 0 0 0 .708.708l3-3a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708.708L12.793 9.5H4a1.5 1.5 0 0 1-1.5-1.5z"/>
1117
+ </svg>
1118
+ </button>
1106
1119
  </div>
1107
1120
  `;
1108
1121
  }
@@ -1162,7 +1175,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1162
1175
  renderControls() {
1163
1176
  if (!this.showControls) return nothing;
1164
1177
  return html`
1165
- <div class="header">
1178
+ <div class="header" part="header">
1166
1179
  <div class="controls">
1167
1180
  ${this.renderPlaybackControls()}
1168
1181
  ${this.renderTimeDisplay()}
@@ -1172,10 +1185,12 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1172
1185
  `;
1173
1186
  }
1174
1187
  handleTrimChange(e) {
1175
- const { elementId, type, newValueMs } = e.detail;
1188
+ const { elementId, value } = e.detail;
1176
1189
  const element = this.targetElement?.querySelector(`#${elementId}`);
1177
- if (element) if (type === "start") element.trimStartMs = newValueMs;
1178
- else element.trimEndMs = newValueMs;
1190
+ if (element) {
1191
+ element.trimStartMs = value.startMs;
1192
+ element.trimEndMs = value.endMs;
1193
+ }
1179
1194
  }
1180
1195
  /**
1181
1196
  * Handle row hover events - update canvas highlighted element.
@@ -1215,6 +1230,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1215
1230
  depth=${row.depth}
1216
1231
  pixels-per-ms=${this.pixelsPerMs}
1217
1232
  ?enable-trim=${this.enableTrim}
1233
+ ?hide-label=${!this.showHierarchy}
1218
1234
  .hideSelectors=${this.hideSelectors}
1219
1235
  .showSelectors=${this.showSelectors}
1220
1236
  .highlightedElement=${highlightedElement}
@@ -1240,7 +1256,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1240
1256
  ${this.renderControls()}
1241
1257
  <div class="timeline-area">
1242
1258
  <!-- Tracks Viewport - Single scrollable container -->
1243
- <div class="tracks-viewport">
1259
+ <div class="tracks-viewport" part="tracks">
1244
1260
  <div
1245
1261
  class="tracks-scroll"
1246
1262
  ${ref(this.tracksScrollRef)}
@@ -1251,7 +1267,8 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1251
1267
  <div class="ruler-row" style="width: ${this.contentWidthPx + hierarchyWidth}px;">
1252
1268
  ${this.showHierarchy ? html`<div class="ruler-spacer"></div>` : nothing}
1253
1269
  <div
1254
- class="ruler-content"
1270
+ class="ruler-content"
1271
+ part="ruler"
1255
1272
  @pointerdown=${this.handleRulerPointerDown}
1256
1273
  >
1257
1274
  <ef-timeline-ruler
@@ -1280,7 +1297,7 @@ let EFTimeline = class EFTimeline$1 extends TWMixin(LitElement) {
1280
1297
  <div class="playhead-layer">
1281
1298
  ${this.renderFrameHighlight()}
1282
1299
  ${this.showPlayhead ? html`
1283
- <div ${ref(this.playheadRef)} class="playhead" style="left: ${playheadLeft - 1}px;">
1300
+ <div ${ref(this.playheadRef)} class="playhead" part="playhead" style="left: ${playheadLeft - 1}px;">
1284
1301
  <div class="playhead-drag-target" @pointerdown=${this.handlePlayheadPointerDown}></div>
1285
1302
  </div>
1286
1303
  ` : nothing}
@@ -1350,6 +1367,7 @@ __decorate([state()], EFTimeline.prototype, "isPlaying", void 0);
1350
1367
  __decorate([state()], EFTimeline.prototype, "isLooping", void 0);
1351
1368
  __decorate([state()], EFTimeline.prototype, "viewportScrollLeft", void 0);
1352
1369
  __decorate([provide({ context: timelineStateContext }), state()], EFTimeline.prototype, "_timelineState", void 0);
1370
+ __decorate([provide({ context: timelineEditingContext }), state()], EFTimeline.prototype, "_editingContext", void 0);
1353
1371
  __decorate([consume({
1354
1372
  context: selectionContext,
1355
1373
  subscribe: true