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