@editframe/elements 0.30.2-beta.0 → 0.31.0-beta.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 (326) hide show
  1. package/dist/EF_FRAMEGEN.d.ts +5 -0
  2. package/dist/EF_FRAMEGEN.js +20 -4
  3. package/dist/EF_FRAMEGEN.js.map +1 -1
  4. package/dist/EF_INTERACTIVE.js.map +1 -1
  5. package/dist/_virtual/rolldown_runtime.js +27 -0
  6. package/dist/canvas/EFCanvas.d.ts +311 -0
  7. package/dist/canvas/EFCanvas.js +1089 -0
  8. package/dist/canvas/EFCanvas.js.map +1 -0
  9. package/dist/canvas/EFCanvasItem.d.ts +55 -0
  10. package/dist/canvas/EFCanvasItem.js +72 -0
  11. package/dist/canvas/EFCanvasItem.js.map +1 -0
  12. package/dist/canvas/api/CanvasAPI.d.ts +115 -0
  13. package/dist/canvas/api/CanvasAPI.js +182 -0
  14. package/dist/canvas/api/CanvasAPI.js.map +1 -0
  15. package/dist/canvas/api/types.d.ts +42 -0
  16. package/dist/canvas/coordinateTransform.js +90 -0
  17. package/dist/canvas/coordinateTransform.js.map +1 -0
  18. package/dist/canvas/getElementBounds.js +40 -0
  19. package/dist/canvas/getElementBounds.js.map +1 -0
  20. package/dist/canvas/overlays/SelectionOverlay.js +265 -0
  21. package/dist/canvas/overlays/SelectionOverlay.js.map +1 -0
  22. package/dist/canvas/overlays/overlayState.js +153 -0
  23. package/dist/canvas/overlays/overlayState.js.map +1 -0
  24. package/dist/canvas/selection/SelectionController.js +105 -0
  25. package/dist/canvas/selection/SelectionController.js.map +1 -0
  26. package/dist/canvas/selection/SelectionModel.d.ts +98 -0
  27. package/dist/canvas/selection/SelectionModel.js +229 -0
  28. package/dist/canvas/selection/SelectionModel.js.map +1 -0
  29. package/dist/canvas/selection/selectionContext.d.ts +31 -0
  30. package/dist/canvas/selection/selectionContext.js +12 -0
  31. package/dist/canvas/selection/selectionContext.js.map +1 -0
  32. package/dist/elements/ContainerInfo.d.ts +29 -0
  33. package/dist/elements/ContainerInfo.js +30 -0
  34. package/dist/elements/ContainerInfo.js.map +1 -0
  35. package/dist/elements/EFAudio.d.ts +13 -3
  36. package/dist/elements/EFAudio.js +64 -10
  37. package/dist/elements/EFAudio.js.map +1 -1
  38. package/dist/elements/EFCaptions.d.ts +18 -16
  39. package/dist/elements/EFCaptions.js +110 -19
  40. package/dist/elements/EFCaptions.js.map +1 -1
  41. package/dist/elements/EFImage.d.ts +16 -6
  42. package/dist/elements/EFImage.js +79 -9
  43. package/dist/elements/EFImage.js.map +1 -1
  44. package/dist/elements/EFMedia/AssetIdMediaEngine.js +51 -4
  45. package/dist/elements/EFMedia/AssetIdMediaEngine.js.map +1 -1
  46. package/dist/elements/EFMedia/AssetMediaEngine.js +125 -52
  47. package/dist/elements/EFMedia/AssetMediaEngine.js.map +1 -1
  48. package/dist/elements/EFMedia/BaseMediaEngine.js +24 -6
  49. package/dist/elements/EFMedia/BaseMediaEngine.js.map +1 -1
  50. package/dist/elements/EFMedia/JitMediaEngine.js +12 -8
  51. package/dist/elements/EFMedia/JitMediaEngine.js.map +1 -1
  52. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js +46 -7
  53. package/dist/elements/EFMedia/audioTasks/makeAudioBufferTask.js.map +1 -1
  54. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js +98 -73
  55. package/dist/elements/EFMedia/audioTasks/makeAudioFrequencyAnalysisTask.js.map +1 -1
  56. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js +28 -5
  57. package/dist/elements/EFMedia/audioTasks/makeAudioInitSegmentFetchTask.js.map +1 -1
  58. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js +18 -6
  59. package/dist/elements/EFMedia/audioTasks/makeAudioInputTask.js.map +1 -1
  60. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js +8 -2
  61. package/dist/elements/EFMedia/audioTasks/makeAudioSeekTask.js.map +1 -1
  62. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js +31 -6
  63. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentFetchTask.js.map +1 -1
  64. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js +28 -5
  65. package/dist/elements/EFMedia/audioTasks/makeAudioSegmentIdTask.js.map +1 -1
  66. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js +97 -72
  67. package/dist/elements/EFMedia/audioTasks/makeAudioTimeDomainAnalysisTask.js.map +1 -1
  68. package/dist/elements/EFMedia/shared/AudioSpanUtils.js +3 -1
  69. package/dist/elements/EFMedia/shared/AudioSpanUtils.js.map +1 -1
  70. package/dist/elements/EFMedia/shared/BufferUtils.js +1 -1
  71. package/dist/elements/EFMedia/shared/BufferUtils.js.map +1 -1
  72. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js +25 -14
  73. package/dist/elements/EFMedia/shared/ThumbnailExtractor.js.map +1 -1
  74. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js +47 -16
  75. package/dist/elements/EFMedia/tasks/makeMediaEngineTask.js.map +1 -1
  76. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js +37 -19
  77. package/dist/elements/EFMedia/videoTasks/MainVideoInputCache.js.map +1 -1
  78. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js +65 -21
  79. package/dist/elements/EFMedia/videoTasks/ScrubInputCache.js.map +1 -1
  80. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js +8 -3
  81. package/dist/elements/EFMedia/videoTasks/makeScrubVideoBufferTask.js.map +1 -1
  82. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js +32 -9
  83. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInitSegmentFetchTask.js.map +1 -1
  84. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js +33 -10
  85. package/dist/elements/EFMedia/videoTasks/makeScrubVideoInputTask.js.map +1 -1
  86. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js +23 -8
  87. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSeekTask.js.map +1 -1
  88. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js +34 -10
  89. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentFetchTask.js.map +1 -1
  90. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js +31 -8
  91. package/dist/elements/EFMedia/videoTasks/makeScrubVideoSegmentIdTask.js.map +1 -1
  92. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js +31 -114
  93. package/dist/elements/EFMedia/videoTasks/makeUnifiedVideoSeekTask.js.map +1 -1
  94. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js +44 -8
  95. package/dist/elements/EFMedia/videoTasks/makeVideoBufferTask.js.map +1 -1
  96. package/dist/elements/EFMedia.d.ts +18 -7
  97. package/dist/elements/EFMedia.js +23 -3
  98. package/dist/elements/EFMedia.js.map +1 -1
  99. package/dist/elements/EFPanZoom.d.ts +96 -0
  100. package/dist/elements/EFPanZoom.js +290 -0
  101. package/dist/elements/EFPanZoom.js.map +1 -0
  102. package/dist/elements/EFSourceMixin.js +7 -6
  103. package/dist/elements/EFSourceMixin.js.map +1 -1
  104. package/dist/elements/EFSurface.d.ts +6 -6
  105. package/dist/elements/EFSurface.js +7 -2
  106. package/dist/elements/EFSurface.js.map +1 -1
  107. package/dist/elements/EFTemporal.d.ts +2 -1
  108. package/dist/elements/EFTemporal.js +192 -71
  109. package/dist/elements/EFTemporal.js.map +1 -1
  110. package/dist/elements/EFText.d.ts +5 -4
  111. package/dist/elements/EFText.js +102 -13
  112. package/dist/elements/EFText.js.map +1 -1
  113. package/dist/elements/EFTextSegment.d.ts +32 -6
  114. package/dist/elements/EFTextSegment.js +53 -15
  115. package/dist/elements/EFTextSegment.js.map +1 -1
  116. package/dist/elements/EFThumbnailStrip.d.ts +129 -56
  117. package/dist/elements/EFThumbnailStrip.js +605 -359
  118. package/dist/elements/EFThumbnailStrip.js.map +1 -1
  119. package/dist/elements/EFTimegroup.d.ts +233 -25
  120. package/dist/elements/EFTimegroup.js +865 -144
  121. package/dist/elements/EFTimegroup.js.map +1 -1
  122. package/dist/elements/EFVideo.d.ts +42 -5
  123. package/dist/elements/EFVideo.js +165 -11
  124. package/dist/elements/EFVideo.js.map +1 -1
  125. package/dist/elements/EFWaveform.d.ts +6 -6
  126. package/dist/elements/EFWaveform.js +2 -1
  127. package/dist/elements/EFWaveform.js.map +1 -1
  128. package/dist/elements/ElementPositionInfo.d.ts +35 -0
  129. package/dist/elements/ElementPositionInfo.js +49 -0
  130. package/dist/elements/ElementPositionInfo.js.map +1 -0
  131. package/dist/elements/FetchMixin.js +16 -1
  132. package/dist/elements/FetchMixin.js.map +1 -1
  133. package/dist/elements/SessionThumbnailCache.js +154 -0
  134. package/dist/elements/SessionThumbnailCache.js.map +1 -0
  135. package/dist/elements/TargetController.js +3 -1
  136. package/dist/elements/TargetController.js.map +1 -1
  137. package/dist/elements/TimegroupController.js +9 -3
  138. package/dist/elements/TimegroupController.js.map +1 -1
  139. package/dist/elements/findRootTemporal.js +30 -0
  140. package/dist/elements/findRootTemporal.js.map +1 -0
  141. package/dist/elements/renderTemporalAudio.js +18 -5
  142. package/dist/elements/renderTemporalAudio.js.map +1 -1
  143. package/dist/elements/updateAnimations.js +171 -28
  144. package/dist/elements/updateAnimations.js.map +1 -1
  145. package/dist/getRenderInfo.d.ts +2 -2
  146. package/dist/gui/ContextMixin.js +4 -2
  147. package/dist/gui/ContextMixin.js.map +1 -1
  148. package/dist/gui/Controllable.js +74 -1
  149. package/dist/gui/Controllable.js.map +1 -1
  150. package/dist/gui/EFActiveRootTemporal.d.ts +50 -0
  151. package/dist/gui/EFActiveRootTemporal.js +94 -0
  152. package/dist/gui/EFActiveRootTemporal.js.map +1 -0
  153. package/dist/gui/EFConfiguration.d.ts +7 -1
  154. package/dist/gui/EFConfiguration.js.map +1 -1
  155. package/dist/gui/EFControls.d.ts +2 -2
  156. package/dist/gui/EFControls.js +109 -13
  157. package/dist/gui/EFControls.js.map +1 -1
  158. package/dist/gui/EFDial.d.ts +4 -4
  159. package/dist/gui/EFFilmstrip.d.ts +11 -214
  160. package/dist/gui/EFFilmstrip.js +53 -1152
  161. package/dist/gui/EFFilmstrip.js.map +1 -1
  162. package/dist/gui/EFFitScale.d.ts +3 -3
  163. package/dist/gui/EFFitScale.js +39 -12
  164. package/dist/gui/EFFitScale.js.map +1 -1
  165. package/dist/gui/EFFocusOverlay.d.ts +4 -4
  166. package/dist/gui/EFOverlayItem.d.ts +48 -0
  167. package/dist/gui/EFOverlayItem.js +97 -0
  168. package/dist/gui/EFOverlayItem.js.map +1 -0
  169. package/dist/gui/EFOverlayLayer.d.ts +70 -0
  170. package/dist/gui/EFOverlayLayer.js +104 -0
  171. package/dist/gui/EFOverlayLayer.js.map +1 -0
  172. package/dist/gui/EFPause.d.ts +4 -4
  173. package/dist/gui/EFPlay.d.ts +4 -4
  174. package/dist/gui/EFResizableBox.d.ts +12 -16
  175. package/dist/gui/EFResizableBox.js +109 -451
  176. package/dist/gui/EFResizableBox.js.map +1 -1
  177. package/dist/gui/EFScrubber.d.ts +30 -5
  178. package/dist/gui/EFScrubber.js +224 -31
  179. package/dist/gui/EFScrubber.js.map +1 -1
  180. package/dist/gui/EFTimeDisplay.d.ts +4 -4
  181. package/dist/gui/EFTimeDisplay.js +4 -1
  182. package/dist/gui/EFTimeDisplay.js.map +1 -1
  183. package/dist/gui/EFTimelineRuler.d.ts +71 -0
  184. package/dist/gui/EFTimelineRuler.js +320 -0
  185. package/dist/gui/EFTimelineRuler.js.map +1 -0
  186. package/dist/gui/EFToggleLoop.d.ts +4 -4
  187. package/dist/gui/EFTogglePlay.d.ts +4 -4
  188. package/dist/gui/EFTransformHandles.d.ts +91 -0
  189. package/dist/gui/EFTransformHandles.js +393 -0
  190. package/dist/gui/EFTransformHandles.js.map +1 -0
  191. package/dist/gui/EFWorkbench.d.ts +178 -0
  192. package/dist/gui/EFWorkbench.js +2067 -22
  193. package/dist/gui/EFWorkbench.js.map +1 -1
  194. package/dist/gui/FitScaleHelpers.d.ts +31 -0
  195. package/dist/gui/FitScaleHelpers.js +41 -0
  196. package/dist/gui/FitScaleHelpers.js.map +1 -0
  197. package/dist/gui/PlaybackController.d.ts +2 -1
  198. package/dist/gui/PlaybackController.js +46 -15
  199. package/dist/gui/PlaybackController.js.map +1 -1
  200. package/dist/gui/TWMixin.js +1 -1
  201. package/dist/gui/TWMixin.js.map +1 -1
  202. package/dist/gui/hierarchy/EFHierarchy.d.ts +65 -0
  203. package/dist/gui/hierarchy/EFHierarchy.js +338 -0
  204. package/dist/gui/hierarchy/EFHierarchy.js.map +1 -0
  205. package/dist/gui/hierarchy/EFHierarchyItem.d.ts +118 -0
  206. package/dist/gui/hierarchy/EFHierarchyItem.js +551 -0
  207. package/dist/gui/hierarchy/EFHierarchyItem.js.map +1 -0
  208. package/dist/gui/hierarchy/hierarchyContext.d.ts +38 -0
  209. package/dist/gui/hierarchy/hierarchyContext.js +8 -0
  210. package/dist/gui/hierarchy/hierarchyContext.js.map +1 -0
  211. package/dist/gui/icons.js +34 -0
  212. package/dist/gui/icons.js.map +1 -0
  213. package/dist/gui/panZoomTransformContext.js +12 -0
  214. package/dist/gui/panZoomTransformContext.js.map +1 -0
  215. package/dist/gui/previewSettingsContext.js +12 -0
  216. package/dist/gui/previewSettingsContext.js.map +1 -0
  217. package/dist/gui/timeline/EFTimeline.d.ts +270 -0
  218. package/dist/gui/timeline/EFTimeline.js +1369 -0
  219. package/dist/gui/timeline/EFTimeline.js.map +1 -0
  220. package/dist/gui/timeline/EFTimelineRow.js +374 -0
  221. package/dist/gui/timeline/EFTimelineRow.js.map +1 -0
  222. package/dist/gui/timeline/TrimHandles.d.ts +36 -0
  223. package/dist/gui/timeline/TrimHandles.js +204 -0
  224. package/dist/gui/timeline/TrimHandles.js.map +1 -0
  225. package/dist/gui/timeline/flattenHierarchy.js +31 -0
  226. package/dist/gui/timeline/flattenHierarchy.js.map +1 -0
  227. package/dist/gui/timeline/timelineStateContext.d.ts +26 -0
  228. package/dist/gui/timeline/timelineStateContext.js +42 -0
  229. package/dist/gui/timeline/timelineStateContext.js.map +1 -0
  230. package/dist/gui/timeline/tracks/AudioTrack.js +264 -0
  231. package/dist/gui/timeline/tracks/AudioTrack.js.map +1 -0
  232. package/dist/gui/timeline/tracks/CaptionsTrack.js +595 -0
  233. package/dist/gui/timeline/tracks/CaptionsTrack.js.map +1 -0
  234. package/dist/gui/timeline/tracks/HTMLTrack.js +19 -0
  235. package/dist/gui/timeline/tracks/HTMLTrack.js.map +1 -0
  236. package/dist/gui/timeline/tracks/ImageTrack.js +53 -0
  237. package/dist/gui/timeline/tracks/ImageTrack.js.map +1 -0
  238. package/dist/gui/timeline/tracks/TextTrack.js +250 -0
  239. package/dist/gui/timeline/tracks/TextTrack.js.map +1 -0
  240. package/dist/gui/timeline/tracks/TimegroupTrack.js +143 -0
  241. package/dist/gui/timeline/tracks/TimegroupTrack.js.map +1 -0
  242. package/dist/gui/timeline/tracks/TrackItem.js +269 -0
  243. package/dist/gui/timeline/tracks/TrackItem.js.map +1 -0
  244. package/dist/gui/timeline/tracks/VideoTrack.js +265 -0
  245. package/dist/gui/timeline/tracks/VideoTrack.js.map +1 -0
  246. package/dist/gui/timeline/tracks/WaveformTrack.js +19 -0
  247. package/dist/gui/timeline/tracks/WaveformTrack.js.map +1 -0
  248. package/dist/gui/timeline/tracks/ensureTrackItemInit.js +1 -0
  249. package/dist/gui/timeline/tracks/preloadTracks.js +9 -0
  250. package/dist/gui/timeline/tracks/renderTrackChildren.js +119 -0
  251. package/dist/gui/timeline/tracks/renderTrackChildren.js.map +1 -0
  252. package/dist/gui/timeline/tracks/waveformUtils.js +80 -0
  253. package/dist/gui/timeline/tracks/waveformUtils.js.map +1 -0
  254. package/dist/gui/transformCalculations.js +217 -0
  255. package/dist/gui/transformCalculations.js.map +1 -0
  256. package/dist/gui/transformUtils.d.ts +37 -0
  257. package/dist/gui/transformUtils.js +77 -0
  258. package/dist/gui/transformUtils.js.map +1 -0
  259. package/dist/gui/tree/EFTree.d.ts +59 -0
  260. package/dist/gui/tree/EFTree.js +174 -0
  261. package/dist/gui/tree/EFTree.js.map +1 -0
  262. package/dist/gui/tree/EFTreeItem.d.ts +38 -0
  263. package/dist/gui/tree/EFTreeItem.js +146 -0
  264. package/dist/gui/tree/EFTreeItem.js.map +1 -0
  265. package/dist/gui/tree/treeContext.d.ts +60 -0
  266. package/dist/gui/tree/treeContext.js +23 -0
  267. package/dist/gui/tree/treeContext.js.map +1 -0
  268. package/dist/index.d.ts +32 -8
  269. package/dist/index.js +30 -6
  270. package/dist/index.js.map +1 -1
  271. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js +688 -0
  272. package/dist/node_modules/react/cjs/react-jsx-runtime.development.js.map +1 -0
  273. package/dist/node_modules/react/cjs/react.development.js +1521 -0
  274. package/dist/node_modules/react/cjs/react.development.js.map +1 -0
  275. package/dist/node_modules/react/index.js +13 -0
  276. package/dist/node_modules/react/index.js.map +1 -0
  277. package/dist/node_modules/react/jsx-runtime.js +13 -0
  278. package/dist/node_modules/react/jsx-runtime.js.map +1 -0
  279. package/dist/preview/AdaptiveResolutionTracker.js +228 -0
  280. package/dist/preview/AdaptiveResolutionTracker.js.map +1 -0
  281. package/dist/preview/RenderProfiler.js +135 -0
  282. package/dist/preview/RenderProfiler.js.map +1 -0
  283. package/dist/preview/previewSettings.js +131 -0
  284. package/dist/preview/previewSettings.js.map +1 -0
  285. package/dist/preview/previewTypes.js +64 -0
  286. package/dist/preview/previewTypes.js.map +1 -0
  287. package/dist/preview/renderTimegroupPreview.js +656 -0
  288. package/dist/preview/renderTimegroupPreview.js.map +1 -0
  289. package/dist/preview/renderTimegroupToCanvas.d.ts +37 -0
  290. package/dist/preview/renderTimegroupToCanvas.js +833 -0
  291. package/dist/preview/renderTimegroupToCanvas.js.map +1 -0
  292. package/dist/preview/renderTimegroupToVideo.d.ts +39 -0
  293. package/dist/preview/renderTimegroupToVideo.js +274 -0
  294. package/dist/preview/renderTimegroupToVideo.js.map +1 -0
  295. package/dist/preview/renderers.js +16 -0
  296. package/dist/preview/renderers.js.map +1 -0
  297. package/dist/preview/statsTrackingStrategy.js +201 -0
  298. package/dist/preview/statsTrackingStrategy.js.map +1 -0
  299. package/dist/preview/thumbnailCacheSettings.js +52 -0
  300. package/dist/preview/thumbnailCacheSettings.js.map +1 -0
  301. package/dist/preview/workers/WorkerPool.js +178 -0
  302. package/dist/preview/workers/WorkerPool.js.map +1 -0
  303. package/dist/preview/workers/encoderWorkerInline.js +103 -0
  304. package/dist/preview/workers/encoderWorkerInline.js.map +1 -0
  305. package/dist/sandbox/PlaybackControls.js +10 -0
  306. package/dist/sandbox/PlaybackControls.js.map +1 -0
  307. package/dist/sandbox/ScenarioRunner.js +1 -0
  308. package/dist/sandbox/index.js +2 -0
  309. package/dist/style.css +71 -67
  310. package/dist/transcoding/types/index.d.ts +2 -1
  311. package/dist/transcoding/utils/UrlGenerator.d.ts +6 -1
  312. package/dist/transcoding/utils/UrlGenerator.js +12 -3
  313. package/dist/transcoding/utils/UrlGenerator.js.map +1 -1
  314. package/dist/utils/LRUCache.js +1 -375
  315. package/dist/utils/LRUCache.js.map +1 -1
  316. package/dist/utils/frameTime.js +14 -0
  317. package/dist/utils/frameTime.js.map +1 -0
  318. package/package.json +3 -3
  319. package/test/profilingPlugin.ts +223 -0
  320. package/test/recordReplayProxyPlugin.js +22 -27
  321. package/test/thumbnail-performance-test.html +116 -0
  322. package/test/visualRegressionUtils.ts +286 -0
  323. package/types.json +1 -1
  324. package/dist/elements/TimegroupController.d.ts +0 -18
  325. package/dist/msToTimeCode.js +0 -17
  326. package/dist/msToTimeCode.js.map +0 -1
@@ -0,0 +1,551 @@
1
+ import { __decorate } from "../../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
2
+ import { TWMixin } from "../TWMixin2.js";
3
+ import { selectionContext } from "../../canvas/selection/selectionContext.js";
4
+ import { hierarchyContext } from "./hierarchyContext.js";
5
+ import { EFAudio } from "../../elements/EFAudio.js";
6
+ import { EFVideo } from "../../elements/EFVideo.js";
7
+ import { EFCaptions, EFCaptionsActiveWord } from "../../elements/EFCaptions.js";
8
+ import { EFImage } from "../../elements/EFImage.js";
9
+ import { EFText } from "../../elements/EFText.js";
10
+ import { EFTextSegment } from "../../elements/EFTextSegment.js";
11
+ import { EFWaveform } from "../../elements/EFWaveform.js";
12
+ import { ICONS, phosphorIcon } from "../icons.js";
13
+ import { EFTimegroup } from "../../elements/EFTimegroup.js";
14
+ import { consume } from "@lit/context";
15
+ import { LitElement, css, html, nothing } from "lit";
16
+ import { customElement, property, state } from "lit/decorators.js";
17
+ import { styleMap } from "lit/directives/style-map.js";
18
+
19
+ //#region src/gui/hierarchy/EFHierarchyItem.ts
20
+ const DEFAULT_HIDDEN_TAGS = new Set([
21
+ "SPAN",
22
+ "STYLE",
23
+ "SCRIPT",
24
+ "LINK",
25
+ "META",
26
+ "SLOT",
27
+ "TEMPLATE",
28
+ "EF-WORKBENCH",
29
+ "EF-FILMSTRIP",
30
+ "EF-CONTROLS",
31
+ "EF-SCRUBBER",
32
+ "EF-TIMELINE-RULER",
33
+ "EF-TRIM-HANDLES",
34
+ "EF-TEXT-SEGMENT"
35
+ ]);
36
+ const shouldRenderElement = (element, hideSelectors, showSelectors) => {
37
+ if (element instanceof HTMLElement && element.dataset?.efHidden) return false;
38
+ if (DEFAULT_HIDDEN_TAGS.has(element.tagName)) {
39
+ if (showSelectors && showSelectors.length > 0) return showSelectors.some((selector) => {
40
+ try {
41
+ return element.matches(selector);
42
+ } catch {
43
+ return false;
44
+ }
45
+ });
46
+ return false;
47
+ }
48
+ if (showSelectors && showSelectors.length > 0) return showSelectors.some((selector) => {
49
+ try {
50
+ return element.matches(selector);
51
+ } catch {
52
+ return false;
53
+ }
54
+ });
55
+ if (hideSelectors && hideSelectors.length > 0) return !hideSelectors.some((selector) => {
56
+ try {
57
+ return element.matches(selector);
58
+ } catch {
59
+ return false;
60
+ }
61
+ });
62
+ return true;
63
+ };
64
+ function renderHierarchyChildren(children, hideSelectors, showSelectors, skipRootFiltering = false, temporalOnly = false) {
65
+ return children.flatMap((child) => {
66
+ if (!skipRootFiltering && !shouldRenderElement(child, hideSelectors, showSelectors)) return nothing;
67
+ if (child instanceof EFTimegroup) return html`<ef-timegroup-hierarchy-item
68
+ .element=${child}
69
+ .hideSelectors=${hideSelectors}
70
+ .showSelectors=${showSelectors}
71
+ .temporalOnly=${temporalOnly}
72
+ ></ef-timegroup-hierarchy-item>`;
73
+ if (child instanceof EFImage) return html`<ef-image-hierarchy-item
74
+ .element=${child}
75
+ .hideSelectors=${hideSelectors}
76
+ .showSelectors=${showSelectors}
77
+ .temporalOnly=${temporalOnly}
78
+ ></ef-image-hierarchy-item>`;
79
+ if (child instanceof EFAudio) return html`<ef-audio-hierarchy-item
80
+ .element=${child}
81
+ .hideSelectors=${hideSelectors}
82
+ .showSelectors=${showSelectors}
83
+ .temporalOnly=${temporalOnly}
84
+ ></ef-audio-hierarchy-item>`;
85
+ if (child instanceof EFVideo) return html`<ef-video-hierarchy-item
86
+ .element=${child}
87
+ .hideSelectors=${hideSelectors}
88
+ .showSelectors=${showSelectors}
89
+ .temporalOnly=${temporalOnly}
90
+ ></ef-video-hierarchy-item>`;
91
+ if (child instanceof EFCaptions) return html`<ef-captions-hierarchy-item
92
+ .element=${child}
93
+ .hideSelectors=${hideSelectors}
94
+ .showSelectors=${showSelectors}
95
+ .temporalOnly=${temporalOnly}
96
+ ></ef-captions-hierarchy-item>`;
97
+ if (child instanceof EFCaptionsActiveWord) return html`<ef-captions-active-word-hierarchy-item
98
+ .element=${child}
99
+ .hideSelectors=${hideSelectors}
100
+ .showSelectors=${showSelectors}
101
+ .temporalOnly=${temporalOnly}
102
+ ></ef-captions-active-word-hierarchy-item>`;
103
+ if (child instanceof EFText) return html`<ef-text-hierarchy-item
104
+ .element=${child}
105
+ .hideSelectors=${hideSelectors}
106
+ .showSelectors=${showSelectors}
107
+ .temporalOnly=${temporalOnly}
108
+ ></ef-text-hierarchy-item>`;
109
+ if (child instanceof EFTextSegment) return nothing;
110
+ if (child instanceof EFWaveform) return html`<ef-waveform-hierarchy-item
111
+ .element=${child}
112
+ .hideSelectors=${hideSelectors}
113
+ .showSelectors=${showSelectors}
114
+ .temporalOnly=${temporalOnly}
115
+ ></ef-waveform-hierarchy-item>`;
116
+ if (temporalOnly) return nothing;
117
+ if (child instanceof HTMLElement) return html`<ef-html-hierarchy-item
118
+ .element=${child}
119
+ .hideSelectors=${hideSelectors}
120
+ .showSelectors=${showSelectors}
121
+ ></ef-html-hierarchy-item>`;
122
+ return nothing;
123
+ });
124
+ }
125
+ let EFHierarchyItem = class EFHierarchyItem$1 extends TWMixin(LitElement) {
126
+ constructor(..._args) {
127
+ super(..._args);
128
+ this.element = new EFTimegroup();
129
+ this.temporalOnly = false;
130
+ this.localExpanded = true;
131
+ }
132
+ static {
133
+ this.styles = [css`
134
+ :host {
135
+ display: block;
136
+ }
137
+ .item-row {
138
+ display: flex;
139
+ align-items: center;
140
+ height: var(--hierarchy-item-height, 1.5rem);
141
+ padding-left: var(--hierarchy-item-padding-left, 0.5rem);
142
+ padding-right: var(--hierarchy-item-padding-right, 0.5rem);
143
+ padding-top: var(--hierarchy-item-padding-top, 0);
144
+ padding-bottom: var(--hierarchy-item-padding-bottom, 0);
145
+ font-size: var(--hierarchy-item-font-size, 0.75rem);
146
+ font-family: system-ui, -apple-system, sans-serif;
147
+ cursor: pointer;
148
+ user-select: none;
149
+ border-left: 3px solid transparent;
150
+ }
151
+ .item-row:hover {
152
+ background: var(--hierarchy-hover-bg, rgba(148, 163, 184, 0.2));
153
+ }
154
+ .item-row[data-selected] {
155
+ background: var(--hierarchy-selected-bg, rgba(59, 130, 246, 0.3));
156
+ }
157
+ .item-row[data-ancestor-selected] {
158
+ background: var(--hierarchy-ancestor-selected-bg, rgba(59, 130, 246, 0.15));
159
+ }
160
+ .item-row[data-focused] {
161
+ background: var(--hierarchy-focused-bg, var(--filmstrip-timegroup-focused, rgba(148, 163, 184, 0.4)));
162
+ }
163
+ .item-row[data-dragging] {
164
+ opacity: 0.5;
165
+ }
166
+ .expand-icon {
167
+ width: var(--hierarchy-expand-icon-size, 1rem);
168
+ height: var(--hierarchy-expand-icon-size, 1rem);
169
+ display: flex;
170
+ align-items: center;
171
+ justify-content: center;
172
+ cursor: pointer;
173
+ flex-shrink: 0;
174
+ }
175
+ .expand-icon svg {
176
+ width: 0.75rem;
177
+ height: 0.75rem;
178
+ transition: transform 0.15s ease;
179
+ }
180
+ .expand-icon[data-expanded] svg {
181
+ transform: rotate(90deg);
182
+ }
183
+ .icon {
184
+ margin-right: var(--hierarchy-icon-gap, 0.25rem);
185
+ flex-shrink: 0;
186
+ }
187
+ .label {
188
+ overflow: hidden;
189
+ text-overflow: ellipsis;
190
+ white-space: nowrap;
191
+ flex: 1;
192
+ }
193
+ .children {
194
+ padding-left: var(--hierarchy-indent, 0.75rem);
195
+ }
196
+ .children[data-collapsed] {
197
+ display: none;
198
+ }
199
+ .drop-indicator {
200
+ height: 2px;
201
+ background: var(--hierarchy-drop-indicator, #3b82f6);
202
+ margin-left: var(--hierarchy-indent, 0.75rem);
203
+ }
204
+ .drop-inside {
205
+ outline: 2px solid var(--hierarchy-drop-indicator, #3b82f6);
206
+ outline-offset: -2px;
207
+ }
208
+ `];
209
+ }
210
+ get elementId() {
211
+ return this.element?.id || "";
212
+ }
213
+ get icon() {
214
+ return phosphorIcon(ICONS.code);
215
+ }
216
+ get typeColor() {
217
+ return "rgb(148, 163, 184)";
218
+ }
219
+ get isFocused() {
220
+ const highlightedElement = this.hierarchyContext?.getHighlightedElement?.();
221
+ return this.element && highlightedElement === this.element;
222
+ }
223
+ get isSelected() {
224
+ const selectionCtx = this.canvasSelectionContext || this.hierarchyContext?.getCanvasSelectionContext?.();
225
+ if (selectionCtx && this.elementId) return selectionCtx.selectedIds.has(this.elementId);
226
+ if (!this.hierarchyContext) return false;
227
+ return this.hierarchyContext.state.selectedElementId === this.elementId;
228
+ }
229
+ get isAncestorSelected() {
230
+ const selectionCtx = this.canvasSelectionContext || this.hierarchyContext?.getCanvasSelectionContext?.();
231
+ if (selectionCtx && this.element) for (const selectedId of selectionCtx.selectedIds) {
232
+ const selectedElement = document.getElementById(selectedId);
233
+ if (selectedElement && this.element.contains(selectedElement) && selectedElement !== this.element) return true;
234
+ }
235
+ return false;
236
+ }
237
+ get isExpanded() {
238
+ if (!this.hierarchyContext || !this.elementId) return this.localExpanded;
239
+ return this.hierarchyContext.state.expandedIds.has(this.elementId);
240
+ }
241
+ get isDragging() {
242
+ if (!this.hierarchyContext) return false;
243
+ return this.hierarchyContext.state.draggedElementId === this.elementId;
244
+ }
245
+ get isDropTarget() {
246
+ if (!this.hierarchyContext) return false;
247
+ return this.hierarchyContext.state.dropTargetId === this.elementId;
248
+ }
249
+ get dropPosition() {
250
+ if (!this.isDropTarget || !this.hierarchyContext) return null;
251
+ return this.hierarchyContext.state.dropPosition;
252
+ }
253
+ get hasChildren() {
254
+ return this.element.children.length > 0;
255
+ }
256
+ displayLabel() {
257
+ return this.elementId || "(unnamed)";
258
+ }
259
+ handleClick(e) {
260
+ e.stopPropagation();
261
+ if (this.hierarchyContext && this.elementId) this.hierarchyContext.actions.select(this.elementId);
262
+ this.hierarchyContext?.setHighlightedElement?.(this.element);
263
+ }
264
+ handleExpandClick(e) {
265
+ e.stopPropagation();
266
+ if (this.hierarchyContext && this.elementId) this.hierarchyContext.actions.toggleExpanded(this.elementId);
267
+ else this.localExpanded = !this.localExpanded;
268
+ }
269
+ handleDragStart(e) {
270
+ if (!this.hierarchyContext || !this.elementId) return;
271
+ e.dataTransfer?.setData("text/plain", this.elementId);
272
+ this.hierarchyContext.actions.startDrag(this.elementId);
273
+ }
274
+ handleDragEnd() {
275
+ if (this.hierarchyContext) this.hierarchyContext.actions.endDrag();
276
+ }
277
+ handleDragOver(e) {
278
+ e.preventDefault();
279
+ if (!this.hierarchyContext || !this.elementId) return;
280
+ const rect = e.currentTarget.getBoundingClientRect();
281
+ const y = e.clientY - rect.top;
282
+ const height = rect.height;
283
+ let position;
284
+ if (y < height * .25) position = "before";
285
+ else if (y > height * .75) position = "after";
286
+ else position = "inside";
287
+ this.hierarchyContext.actions.updateDropTarget(this.elementId, position);
288
+ }
289
+ handleDragLeave() {
290
+ if (this.hierarchyContext && this.isDropTarget) this.hierarchyContext.actions.updateDropTarget(null, null);
291
+ }
292
+ handleDrop(e) {
293
+ e.preventDefault();
294
+ if (!this.hierarchyContext || !this.elementId) return;
295
+ const sourceId = e.dataTransfer?.getData("text/plain");
296
+ if (sourceId && this.dropPosition) this.hierarchyContext.actions.reorder(sourceId, this.elementId, this.dropPosition);
297
+ this.hierarchyContext.actions.endDrag();
298
+ }
299
+ handleMouseEnter() {
300
+ this.hierarchyContext?.setHighlightedElement?.(this.element);
301
+ }
302
+ handleMouseLeave() {
303
+ if (this.hierarchyContext?.getHighlightedElement?.() === this.element) this.hierarchyContext?.setHighlightedElement?.(null);
304
+ }
305
+ connectedCallback() {
306
+ super.connectedCallback();
307
+ this.setupSelectionListener();
308
+ }
309
+ disconnectedCallback() {
310
+ super.disconnectedCallback();
311
+ this.removeSelectionListener();
312
+ }
313
+ willUpdate(changedProperties) {
314
+ if (!this.selectionChangeHandler || changedProperties.has("hierarchyContext")) {
315
+ if (changedProperties.has("hierarchyContext") && this.selectionChangeHandler) {
316
+ this.removeSelectionListener();
317
+ this.selectionChangeHandler = void 0;
318
+ }
319
+ this.setupSelectionListener();
320
+ }
321
+ }
322
+ setupSelectionListener() {
323
+ if (this.selectionChangeHandler) return;
324
+ const selectionCtx = this.canvasSelectionContext || this.hierarchyContext?.getCanvasSelectionContext?.();
325
+ if (selectionCtx && "addEventListener" in selectionCtx) {
326
+ this.selectionChangeHandler = () => {
327
+ this.requestUpdate();
328
+ };
329
+ selectionCtx.addEventListener("selectionchange", this.selectionChangeHandler);
330
+ }
331
+ }
332
+ removeSelectionListener() {
333
+ const selectionCtx = this.canvasSelectionContext || this.hierarchyContext?.getCanvasSelectionContext?.();
334
+ if (selectionCtx && "removeEventListener" in selectionCtx && this.selectionChangeHandler) {
335
+ selectionCtx.removeEventListener("selectionchange", this.selectionChangeHandler);
336
+ this.selectionChangeHandler = void 0;
337
+ }
338
+ }
339
+ render() {
340
+ const expanded = this.isExpanded;
341
+ return html`
342
+ ${this.dropPosition === "before" ? html`<div class="drop-indicator"></div>` : nothing}
343
+ <div
344
+ class="item-row ${this.dropPosition === "inside" ? "drop-inside" : ""}"
345
+ style=${styleMap({ borderLeftColor: this.typeColor })}
346
+ ?data-focused=${this.isFocused}
347
+ ?data-selected=${this.isSelected}
348
+ ?data-ancestor-selected=${this.isAncestorSelected}
349
+ ?data-dragging=${this.isDragging}
350
+ draggable="true"
351
+ @click=${this.handleClick}
352
+ @dragstart=${this.handleDragStart}
353
+ @dragend=${this.handleDragEnd}
354
+ @dragover=${this.handleDragOver}
355
+ @dragleave=${this.handleDragLeave}
356
+ @drop=${this.handleDrop}
357
+ @mouseenter=${this.handleMouseEnter}
358
+ @mouseleave=${this.handleMouseLeave}
359
+ >
360
+ ${this.hasChildren ? html`
361
+ <span
362
+ class="expand-icon"
363
+ ?data-expanded=${expanded}
364
+ @click=${this.handleExpandClick}
365
+ >
366
+ <svg viewBox="0 0 24 24" fill="currentColor">
367
+ <path d="M8 5v14l11-7z" />
368
+ </svg>
369
+ </span>
370
+ ` : html`<span class="expand-icon"></span>`}
371
+ <span class="icon">${this.icon}</span>
372
+ <span class="label">${this.displayLabel()}</span>
373
+ </div>
374
+ ${this.hasChildren ? html`
375
+ <div class="children" ?data-collapsed=${!expanded}>
376
+ ${this.renderChildren()}
377
+ </div>
378
+ ` : nothing}
379
+ ${this.dropPosition === "after" ? html`<div class="drop-indicator"></div>` : nothing}
380
+ `;
381
+ }
382
+ renderChildren() {
383
+ return renderHierarchyChildren(Array.from(this.element.children), this.hideSelectors, this.showSelectors, false, this.temporalOnly);
384
+ }
385
+ };
386
+ __decorate([consume({
387
+ context: hierarchyContext,
388
+ subscribe: true
389
+ })], EFHierarchyItem.prototype, "hierarchyContext", void 0);
390
+ __decorate([consume({
391
+ context: selectionContext,
392
+ subscribe: true
393
+ })], EFHierarchyItem.prototype, "canvasSelectionContext", void 0);
394
+ __decorate([property({
395
+ type: Object,
396
+ attribute: false
397
+ })], EFHierarchyItem.prototype, "element", void 0);
398
+ __decorate([property({
399
+ type: Array,
400
+ attribute: false
401
+ })], EFHierarchyItem.prototype, "hideSelectors", void 0);
402
+ __decorate([property({
403
+ type: Array,
404
+ attribute: false
405
+ })], EFHierarchyItem.prototype, "showSelectors", void 0);
406
+ __decorate([property({
407
+ type: Boolean,
408
+ attribute: false
409
+ })], EFHierarchyItem.prototype, "temporalOnly", void 0);
410
+ __decorate([state()], EFHierarchyItem.prototype, "localExpanded", void 0);
411
+ EFHierarchyItem = __decorate([customElement("ef-hierarchy-item")], EFHierarchyItem);
412
+ /**
413
+ * Generate a friendly label for an element based on its type and siblings
414
+ */
415
+ function getFriendlyLabel(element, typeLabel) {
416
+ const id = element.id || "";
417
+ if (id && !id.includes("-") && !id.match(/^\d+$/)) return id;
418
+ const parent = element.parentElement;
419
+ if (parent) {
420
+ const tagName = element.tagName;
421
+ const siblings = Array.from(parent.children).filter((child) => child.tagName === tagName);
422
+ const index = siblings.indexOf(element) + 1;
423
+ if (siblings.length === 1) return typeLabel;
424
+ return `${typeLabel} ${index}`;
425
+ }
426
+ return typeLabel;
427
+ }
428
+ let EFTimegroupHierarchyItem = class EFTimegroupHierarchyItem$1 extends EFHierarchyItem {
429
+ get icon() {
430
+ return phosphorIcon(ICONS.filmSlate);
431
+ }
432
+ get typeColor() {
433
+ return "rgb(148, 163, 184)";
434
+ }
435
+ displayLabel() {
436
+ return getFriendlyLabel(this.element, "Composition");
437
+ }
438
+ };
439
+ EFTimegroupHierarchyItem = __decorate([customElement("ef-timegroup-hierarchy-item")], EFTimegroupHierarchyItem);
440
+ let EFAudioHierarchyItem = class EFAudioHierarchyItem$1 extends EFHierarchyItem {
441
+ get icon() {
442
+ return phosphorIcon(ICONS.speakerHigh);
443
+ }
444
+ get typeColor() {
445
+ return "rgb(34, 197, 94)";
446
+ }
447
+ displayLabel() {
448
+ return getFriendlyLabel(this.element, "Audio");
449
+ }
450
+ };
451
+ EFAudioHierarchyItem = __decorate([customElement("ef-audio-hierarchy-item")], EFAudioHierarchyItem);
452
+ let EFVideoHierarchyItem = class EFVideoHierarchyItem$1 extends EFHierarchyItem {
453
+ get icon() {
454
+ return phosphorIcon(ICONS.filmStrip);
455
+ }
456
+ get typeColor() {
457
+ return "rgb(59, 130, 246)";
458
+ }
459
+ displayLabel() {
460
+ return getFriendlyLabel(this.element, "Video");
461
+ }
462
+ };
463
+ EFVideoHierarchyItem = __decorate([customElement("ef-video-hierarchy-item")], EFVideoHierarchyItem);
464
+ let EFCaptionsHierarchyItem = class EFCaptionsHierarchyItem$1 extends EFHierarchyItem {
465
+ get icon() {
466
+ return phosphorIcon(ICONS.subtitles);
467
+ }
468
+ get typeColor() {
469
+ return "rgb(34, 197, 94)";
470
+ }
471
+ displayLabel() {
472
+ return getFriendlyLabel(this.element, "Captions");
473
+ }
474
+ };
475
+ EFCaptionsHierarchyItem = __decorate([customElement("ef-captions-hierarchy-item")], EFCaptionsHierarchyItem);
476
+ let EFCaptionsActiveWordHierarchyItem = class EFCaptionsActiveWordHierarchyItem$1 extends EFHierarchyItem {
477
+ get icon() {
478
+ return phosphorIcon(ICONS.microphone);
479
+ }
480
+ get typeColor() {
481
+ return "rgb(34, 197, 94)";
482
+ }
483
+ displayLabel() {
484
+ return "Active Word";
485
+ }
486
+ };
487
+ EFCaptionsActiveWordHierarchyItem = __decorate([customElement("ef-captions-active-word-hierarchy-item")], EFCaptionsActiveWordHierarchyItem);
488
+ let EFTextHierarchyItem = class EFTextHierarchyItem$1 extends EFHierarchyItem {
489
+ get icon() {
490
+ return phosphorIcon(ICONS.textT);
491
+ }
492
+ get typeColor() {
493
+ return "rgb(249, 115, 22)";
494
+ }
495
+ get hasChildren() {
496
+ return false;
497
+ }
498
+ displayLabel() {
499
+ return getFriendlyLabel(this.element, "Text");
500
+ }
501
+ renderChildren() {
502
+ return nothing;
503
+ }
504
+ };
505
+ EFTextHierarchyItem = __decorate([customElement("ef-text-hierarchy-item")], EFTextHierarchyItem);
506
+ let EFTextSegmentHierarchyItem = class EFTextSegmentHierarchyItem$1 extends EFHierarchyItem {
507
+ get icon() {
508
+ return phosphorIcon(ICONS.textT);
509
+ }
510
+ get typeColor() {
511
+ return "rgb(249, 115, 22)";
512
+ }
513
+ displayLabel() {
514
+ return "Segment";
515
+ }
516
+ };
517
+ EFTextSegmentHierarchyItem = __decorate([customElement("ef-text-segment-hierarchy-item")], EFTextSegmentHierarchyItem);
518
+ let EFWaveformHierarchyItem = class EFWaveformHierarchyItem$1 extends EFHierarchyItem {
519
+ get icon() {
520
+ return phosphorIcon(ICONS.waveform);
521
+ }
522
+ get typeColor() {
523
+ return "rgb(34, 197, 94)";
524
+ }
525
+ renderChildren() {
526
+ return nothing;
527
+ }
528
+ };
529
+ EFWaveformHierarchyItem = __decorate([customElement("ef-waveform-hierarchy-item")], EFWaveformHierarchyItem);
530
+ let EFImageHierarchyItem = class EFImageHierarchyItem$1 extends EFHierarchyItem {
531
+ get icon() {
532
+ return phosphorIcon(ICONS.image);
533
+ }
534
+ get typeColor() {
535
+ return "rgb(168, 85, 247)";
536
+ }
537
+ displayLabel() {
538
+ return getFriendlyLabel(this.element, "Image");
539
+ }
540
+ };
541
+ EFImageHierarchyItem = __decorate([customElement("ef-image-hierarchy-item")], EFImageHierarchyItem);
542
+ let EFHTMLHierarchyItem = class EFHTMLHierarchyItem$1 extends EFHierarchyItem {
543
+ get icon() {
544
+ return html`<code>${`<${this.element.tagName.toLowerCase()}>`}</code>`;
545
+ }
546
+ };
547
+ EFHTMLHierarchyItem = __decorate([customElement("ef-html-hierarchy-item")], EFHTMLHierarchyItem);
548
+
549
+ //#endregion
550
+ export { EFAudioHierarchyItem, EFCaptionsActiveWordHierarchyItem, EFCaptionsHierarchyItem, EFHTMLHierarchyItem, EFHierarchyItem, EFImageHierarchyItem, EFTextHierarchyItem, EFTextSegmentHierarchyItem, EFTimegroupHierarchyItem, EFVideoHierarchyItem, EFWaveformHierarchyItem, renderHierarchyChildren, shouldRenderElement };
551
+ //# sourceMappingURL=EFHierarchyItem.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,38 @@
1
+ import { SelectionContext } from "../../canvas/selection/selectionContext.js";
2
+
3
+ //#region src/gui/hierarchy/hierarchyContext.d.ts
4
+ interface HierarchyState {
5
+ selectedElementId: string | null;
6
+ expandedIds: Set<string>;
7
+ draggedElementId: string | null;
8
+ dropTargetId: string | null;
9
+ dropPosition: "before" | "after" | "inside" | null;
10
+ }
11
+ interface HierarchyActions {
12
+ select(elementId: string | null): void;
13
+ toggleExpanded(elementId: string): void;
14
+ setExpanded(elementId: string, expanded: boolean): void;
15
+ startDrag(elementId: string): void;
16
+ updateDropTarget(targetId: string | null, position: "before" | "after" | "inside" | null): void;
17
+ endDrag(): void;
18
+ reorder(sourceId: string, targetId: string, position: "before" | "after" | "inside"): void;
19
+ }
20
+ interface HierarchyContext {
21
+ state: HierarchyState;
22
+ actions: HierarchyActions;
23
+ getCanvasSelectionContext?: () => SelectionContext | undefined;
24
+ /**
25
+ * Get the currently highlighted element from the canvas.
26
+ */
27
+ getHighlightedElement?: () => HTMLElement | null;
28
+ /**
29
+ * Set the highlighted element on the canvas.
30
+ */
31
+ setHighlightedElement?: (element: HTMLElement | null) => void;
32
+ }
33
+ declare const hierarchyContext: {
34
+ __context__: HierarchyContext;
35
+ };
36
+ //#endregion
37
+ export { HierarchyActions, HierarchyContext, HierarchyState, hierarchyContext };
38
+ //# sourceMappingURL=hierarchyContext.d.ts.map
@@ -0,0 +1,8 @@
1
+ import { createContext } from "@lit/context";
2
+
3
+ //#region src/gui/hierarchy/hierarchyContext.ts
4
+ const hierarchyContext = createContext(Symbol("hierarchyContext"));
5
+
6
+ //#endregion
7
+ export { hierarchyContext };
8
+ //# sourceMappingURL=hierarchyContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchyContext.js","names":[],"sources":["../../../src/gui/hierarchy/hierarchyContext.ts"],"sourcesContent":["import { createContext } from \"@lit/context\";\n\nexport interface HierarchyState {\n selectedElementId: string | null;\n expandedIds: Set<string>;\n draggedElementId: string | null;\n dropTargetId: string | null;\n dropPosition: \"before\" | \"after\" | \"inside\" | null;\n}\n\nexport interface HierarchyActions {\n select(elementId: string | null): void;\n toggleExpanded(elementId: string): void;\n setExpanded(elementId: string, expanded: boolean): void;\n startDrag(elementId: string): void;\n updateDropTarget(\n targetId: string | null,\n position: \"before\" | \"after\" | \"inside\" | null,\n ): void;\n endDrag(): void;\n reorder(\n sourceId: string,\n targetId: string,\n position: \"before\" | \"after\" | \"inside\",\n ): void;\n}\n\nexport interface HierarchyContext {\n state: HierarchyState;\n actions: HierarchyActions;\n getCanvasSelectionContext?: () =>\n | import(\"../../canvas/selection/selectionContext.js\").SelectionContext\n | undefined;\n /**\n * Get the currently highlighted element from the canvas.\n */\n getHighlightedElement?: () => HTMLElement | null;\n /**\n * Set the highlighted element on the canvas.\n */\n setHighlightedElement?: (element: HTMLElement | null) => void;\n}\n\nexport const hierarchyContext = createContext<HierarchyContext>(\n Symbol(\"hierarchyContext\"),\n);\n"],"mappings":";;;AA2CA,MAAa,mBAAmB,cAC9B,OAAO,mBAAmB,CAC3B"}