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