@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EFTimeDisplay.js","names":["EFTimeDisplay"],"sources":["../../src/gui/EFTimeDisplay.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { currentTimeContext } from \"./currentTimeContext.js\";\nimport { durationContext } from \"./durationContext.js\";\nimport { efContext } from \"./efContext.js\";\nimport { TargetOrContextMixin } from \"./TargetOrContextMixin.js\";\n\n@customElement(\"ef-time-display\")\nexport class EFTimeDisplay extends TargetOrContextMixin(LitElement, efContext) {\n static styles = css`\n :host {\n display: inline-
|
|
1
|
+
{"version":3,"file":"EFTimeDisplay.js","names":["EFTimeDisplay"],"sources":["../../src/gui/EFTimeDisplay.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { currentTimeContext } from \"./currentTimeContext.js\";\nimport { durationContext } from \"./durationContext.js\";\nimport { efContext } from \"./efContext.js\";\nimport { TargetOrContextMixin } from \"./TargetOrContextMixin.js\";\n\n@customElement(\"ef-time-display\")\nexport class EFTimeDisplay extends TargetOrContextMixin(LitElement, efContext) {\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n font-family: var(--ef-font-family, system-ui);\n font-size: var(--ef-font-size-xs, 0.75rem);\n color: var(--ef-text-color, rgb(75 85 99));\n white-space: nowrap;\n }\n\n ::part(time) {}\n `;\n\n @consume({ context: currentTimeContext, subscribe: true })\n currentTimeMs = Number.NaN;\n\n @consume({ context: durationContext, subscribe: true })\n durationMs = 0;\n\n private formatTime(ms: number): string {\n // Handle NaN, undefined, null, or negative values\n if (!Number.isFinite(ms) || ms < 0) {\n return \"0:00\";\n }\n\n const totalSeconds = Math.floor(ms / 1000);\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n }\n\n render() {\n const currentTime = this.currentTimeMs;\n const totalTime = this.durationMs;\n\n return html`\n <span part=\"time\">\n ${this.formatTime(currentTime)} / ${this.formatTime(totalTime)}\n </span>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-time-display\": EFTimeDisplay;\n }\n}\n"],"mappings":";;;;;;;;;;AASO,0BAAMA,wBAAsB,qBAAqB,YAAY,UAAU,CAAC;;;uBAe7D;oBAGH;;;gBAjBG,GAAG;;;;;;;;;;;;;CAmBnB,AAAQ,WAAW,IAAoB;AAErC,MAAI,CAAC,OAAO,SAAS,GAAG,IAAI,KAAK,EAC/B,QAAO;EAGT,MAAM,eAAe,KAAK,MAAM,KAAK,IAAK;AAG1C,SAAO,GAFS,KAAK,MAAM,eAAe,GAAG,CAE3B,IADF,eAAe,IACF,UAAU,CAAC,SAAS,GAAG,IAAI;;CAG1D,SAAS;EACP,MAAM,cAAc,KAAK;EACzB,MAAM,YAAY,KAAK;AAEvB,SAAO,IAAI;;UAEL,KAAK,WAAW,YAAY,CAAC,KAAK,KAAK,WAAW,UAAU,CAAC;;;;;YAxBpE,QAAQ;CAAE,SAAS;CAAoB,WAAW;CAAM,CAAC;YAGzD,QAAQ;CAAE,SAAS;CAAiB,WAAW;CAAM,CAAC;4BAlBxD,cAAc,kBAAkB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { TimelineState } from "./timeline/timelineStateContext.js";
|
|
2
|
+
import * as lit37 from "lit";
|
|
3
|
+
import { LitElement } from "lit";
|
|
4
|
+
import * as lit_html36 from "lit-html";
|
|
5
|
+
|
|
6
|
+
//#region src/gui/EFTimelineRuler.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Quantize a time value to the nearest frame boundary.
|
|
9
|
+
* This ensures frame markers align perfectly with playhead position.
|
|
10
|
+
*/
|
|
11
|
+
declare function quantizeToFrameTimeMs(timeMs: number, fps: number): number;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate the duration of a single frame in milliseconds.
|
|
14
|
+
*/
|
|
15
|
+
declare function calculateFrameIntervalMs(fps: number): number;
|
|
16
|
+
/**
|
|
17
|
+
* Calculate pixels per frame given frame interval and zoom scale.
|
|
18
|
+
* @param frameIntervalMs Duration of one frame in ms
|
|
19
|
+
* @param pixelsPerMs Current zoom level (pixels per millisecond)
|
|
20
|
+
*/
|
|
21
|
+
declare function calculatePixelsPerFrame(frameIntervalMs: number, pixelsPerMs: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* Determine if frame markers should be visible at the current zoom level.
|
|
24
|
+
* Frame markers appear when each frame is at least MIN_FRAME_SPACING_PX wide.
|
|
25
|
+
*/
|
|
26
|
+
declare function shouldShowFrameMarkers(pixelsPerFrame: number, minSpacing?: number): boolean;
|
|
27
|
+
declare class EFTimelineRuler extends LitElement {
|
|
28
|
+
static styles: lit37.CSSResult[];
|
|
29
|
+
durationMs: number;
|
|
30
|
+
contextDurationMs: number;
|
|
31
|
+
timelineState?: TimelineState;
|
|
32
|
+
fps: number;
|
|
33
|
+
/** Full content width in pixels (for virtualization) */
|
|
34
|
+
contentWidth: number;
|
|
35
|
+
private containerRef;
|
|
36
|
+
private canvasRef;
|
|
37
|
+
private resizeObserver?;
|
|
38
|
+
private viewportWidth;
|
|
39
|
+
/** Canvas viewport left position for virtualization */
|
|
40
|
+
private _canvasViewportLeft;
|
|
41
|
+
/** Canvas viewport width for virtualization */
|
|
42
|
+
private _canvasViewportWidth;
|
|
43
|
+
/** Last rendered scroll position - for detecting scroll changes */
|
|
44
|
+
private _lastRenderedScrollLeft;
|
|
45
|
+
/** Last rendered viewport width - for detecting viewport changes */
|
|
46
|
+
private _lastRenderedViewportWidth;
|
|
47
|
+
get effectiveDurationMs(): number;
|
|
48
|
+
get pixelsPerMs(): number;
|
|
49
|
+
get scrollLeft(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Calculate canvas viewport bounds for virtualization.
|
|
52
|
+
* Returns the left position and width of the canvas viewport.
|
|
53
|
+
*/
|
|
54
|
+
private calculateCanvasViewport;
|
|
55
|
+
connectedCallback(): void;
|
|
56
|
+
disconnectedCallback(): void;
|
|
57
|
+
protected firstUpdated(): void;
|
|
58
|
+
protected updated(changedProperties: Map<string | number | symbol, unknown>): void;
|
|
59
|
+
private calculateLabelInterval;
|
|
60
|
+
private getVisibleLabels;
|
|
61
|
+
private renderCanvas;
|
|
62
|
+
render(): lit_html36.TemplateResult<1>;
|
|
63
|
+
}
|
|
64
|
+
declare global {
|
|
65
|
+
interface HTMLElementTagNameMap {
|
|
66
|
+
"ef-timeline-ruler": EFTimelineRuler;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { EFTimelineRuler, calculateFrameIntervalMs, calculatePixelsPerFrame, quantizeToFrameTimeMs, shouldShowFrameMarkers };
|
|
71
|
+
//# sourceMappingURL=EFTimelineRuler.d.ts.map
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
import { durationContext } from "./durationContext.js";
|
|
2
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.94.0/helpers/decorate.js";
|
|
3
|
+
import { DEFAULT_PIXELS_PER_MS, timelineStateContext } from "./timeline/timelineStateContext.js";
|
|
4
|
+
import { consume } from "@lit/context";
|
|
5
|
+
import { LitElement, css, html } from "lit";
|
|
6
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
7
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
8
|
+
import { createRef, ref } from "lit/directives/ref.js";
|
|
9
|
+
|
|
10
|
+
//#region src/gui/EFTimelineRuler.ts
|
|
11
|
+
const MIN_LABEL_SPACING_PX = 80;
|
|
12
|
+
const MIN_FRAME_SPACING_PX = 5;
|
|
13
|
+
/** Maximum canvas width for ruler virtualization */
|
|
14
|
+
const MAX_RULER_CANVAS_WIDTH = 2e3;
|
|
15
|
+
/** Buffer pixels on each side of viewport for smooth scrolling */
|
|
16
|
+
const RULER_CANVAS_BUFFER = 200;
|
|
17
|
+
/**
|
|
18
|
+
* Quantize a time value to the nearest frame boundary.
|
|
19
|
+
* This ensures frame markers align perfectly with playhead position.
|
|
20
|
+
*/
|
|
21
|
+
function quantizeToFrameTimeMs(timeMs, fps) {
|
|
22
|
+
if (!fps || fps <= 0) return timeMs;
|
|
23
|
+
const frameDurationS = 1 / fps;
|
|
24
|
+
const timeSeconds = timeMs / 1e3;
|
|
25
|
+
return Math.round(timeSeconds / frameDurationS) * frameDurationS * 1e3;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Calculate the duration of a single frame in milliseconds.
|
|
29
|
+
*/
|
|
30
|
+
function calculateFrameIntervalMs(fps) {
|
|
31
|
+
if (fps <= 0) return 1e3 / 30;
|
|
32
|
+
return 1e3 / fps;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Calculate pixels per frame given frame interval and zoom scale.
|
|
36
|
+
* @param frameIntervalMs Duration of one frame in ms
|
|
37
|
+
* @param pixelsPerMs Current zoom level (pixels per millisecond)
|
|
38
|
+
*/
|
|
39
|
+
function calculatePixelsPerFrame(frameIntervalMs, pixelsPerMs) {
|
|
40
|
+
return frameIntervalMs * pixelsPerMs;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Determine if frame markers should be visible at the current zoom level.
|
|
44
|
+
* Frame markers appear when each frame is at least MIN_FRAME_SPACING_PX wide.
|
|
45
|
+
*/
|
|
46
|
+
function shouldShowFrameMarkers(pixelsPerFrame, minSpacing = MIN_FRAME_SPACING_PX) {
|
|
47
|
+
return pixelsPerFrame >= minSpacing;
|
|
48
|
+
}
|
|
49
|
+
let EFTimelineRuler = class EFTimelineRuler$1 extends LitElement {
|
|
50
|
+
constructor(..._args) {
|
|
51
|
+
super(..._args);
|
|
52
|
+
this.durationMs = 0;
|
|
53
|
+
this.contextDurationMs = 0;
|
|
54
|
+
this.fps = 30;
|
|
55
|
+
this.contentWidth = 0;
|
|
56
|
+
this.containerRef = createRef();
|
|
57
|
+
this.canvasRef = createRef();
|
|
58
|
+
this.viewportWidth = 0;
|
|
59
|
+
this._canvasViewportLeft = 0;
|
|
60
|
+
this._canvasViewportWidth = 0;
|
|
61
|
+
this._lastRenderedScrollLeft = -1;
|
|
62
|
+
this._lastRenderedViewportWidth = 0;
|
|
63
|
+
}
|
|
64
|
+
static {
|
|
65
|
+
this.styles = [css`
|
|
66
|
+
:host {
|
|
67
|
+
display: block;
|
|
68
|
+
position: relative;
|
|
69
|
+
height: 100%;
|
|
70
|
+
pointer-events: none;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.ruler-container {
|
|
74
|
+
position: relative;
|
|
75
|
+
width: 100%;
|
|
76
|
+
height: 100%;
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.canvas-viewport {
|
|
81
|
+
position: absolute;
|
|
82
|
+
top: 0;
|
|
83
|
+
height: 100%;
|
|
84
|
+
/* left and width set via inline styles for virtualization */
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
canvas {
|
|
88
|
+
display: block;
|
|
89
|
+
position: absolute;
|
|
90
|
+
top: 0;
|
|
91
|
+
left: 0;
|
|
92
|
+
pointer-events: none;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.label {
|
|
96
|
+
position: absolute;
|
|
97
|
+
top: 50%;
|
|
98
|
+
font-size: 10px;
|
|
99
|
+
color: rgb(156, 163, 175);
|
|
100
|
+
font-family: ui-monospace, monospace;
|
|
101
|
+
white-space: nowrap;
|
|
102
|
+
pointer-events: none;
|
|
103
|
+
user-select: none;
|
|
104
|
+
}
|
|
105
|
+
`];
|
|
106
|
+
}
|
|
107
|
+
get effectiveDurationMs() {
|
|
108
|
+
return this.durationMs || this.contextDurationMs || 0;
|
|
109
|
+
}
|
|
110
|
+
get pixelsPerMs() {
|
|
111
|
+
return this.timelineState?.pixelsPerMs ?? DEFAULT_PIXELS_PER_MS;
|
|
112
|
+
}
|
|
113
|
+
get scrollLeft() {
|
|
114
|
+
return this.timelineState?.viewportScrollLeft ?? 0;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Calculate canvas viewport bounds for virtualization.
|
|
118
|
+
* Returns the left position and width of the canvas viewport.
|
|
119
|
+
*/
|
|
120
|
+
calculateCanvasViewport() {
|
|
121
|
+
const totalWidth = this.contentWidth || this.viewportWidth;
|
|
122
|
+
if (totalWidth <= MAX_RULER_CANVAS_WIDTH) return {
|
|
123
|
+
left: 0,
|
|
124
|
+
width: totalWidth
|
|
125
|
+
};
|
|
126
|
+
const viewportScrollLeft = this.scrollLeft;
|
|
127
|
+
const viewportWidth = this.timelineState?.viewportWidth ?? this.viewportWidth;
|
|
128
|
+
const canvasLeft = Math.max(0, viewportScrollLeft - RULER_CANVAS_BUFFER);
|
|
129
|
+
let canvasWidth = Math.min(totalWidth, viewportScrollLeft + viewportWidth + RULER_CANVAS_BUFFER) - canvasLeft;
|
|
130
|
+
if (canvasWidth > MAX_RULER_CANVAS_WIDTH) canvasWidth = MAX_RULER_CANVAS_WIDTH;
|
|
131
|
+
return {
|
|
132
|
+
left: canvasLeft,
|
|
133
|
+
width: canvasWidth
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
connectedCallback() {
|
|
137
|
+
super.connectedCallback();
|
|
138
|
+
}
|
|
139
|
+
disconnectedCallback() {
|
|
140
|
+
super.disconnectedCallback();
|
|
141
|
+
if (this.resizeObserver) this.resizeObserver.disconnect();
|
|
142
|
+
}
|
|
143
|
+
firstUpdated() {
|
|
144
|
+
const container = this.containerRef.value;
|
|
145
|
+
if (container) {
|
|
146
|
+
this.resizeObserver = new ResizeObserver((entries) => {
|
|
147
|
+
const entry = entries[0];
|
|
148
|
+
if (entry) {
|
|
149
|
+
const width = entry.contentRect.width;
|
|
150
|
+
if (width !== this.viewportWidth) this.viewportWidth = width;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
this.resizeObserver.observe(container);
|
|
154
|
+
this.viewportWidth = container.clientWidth;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
updated(changedProperties) {
|
|
158
|
+
const currentScrollLeft = this.scrollLeft;
|
|
159
|
+
const currentViewportWidth = this.timelineState?.viewportWidth ?? this.viewportWidth;
|
|
160
|
+
const scrollChanged = currentScrollLeft !== this._lastRenderedScrollLeft;
|
|
161
|
+
const viewportChanged = currentViewportWidth !== this._lastRenderedViewportWidth;
|
|
162
|
+
const pixelsPerMsChanged = changedProperties.has("timelineState") || changedProperties.has("pixelsPerMs");
|
|
163
|
+
const contentWidthChanged = changedProperties.has("contentWidth");
|
|
164
|
+
const durationChanged = changedProperties.has("durationMs") || changedProperties.has("contextDurationMs");
|
|
165
|
+
if (scrollChanged || viewportChanged || pixelsPerMsChanged || contentWidthChanged || durationChanged || this._lastRenderedScrollLeft < 0) {
|
|
166
|
+
this.renderCanvas();
|
|
167
|
+
this._lastRenderedScrollLeft = currentScrollLeft;
|
|
168
|
+
this._lastRenderedViewportWidth = currentViewportWidth;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
calculateLabelInterval() {
|
|
172
|
+
const pixelsPerSecond = this.pixelsPerMs * 1e3;
|
|
173
|
+
for (const intervalS of [
|
|
174
|
+
.1,
|
|
175
|
+
.25,
|
|
176
|
+
.5,
|
|
177
|
+
1,
|
|
178
|
+
2,
|
|
179
|
+
5,
|
|
180
|
+
10,
|
|
181
|
+
30,
|
|
182
|
+
60
|
|
183
|
+
]) if (intervalS * pixelsPerSecond >= MIN_LABEL_SPACING_PX) return intervalS * 1e3;
|
|
184
|
+
return 6e4;
|
|
185
|
+
}
|
|
186
|
+
getVisibleLabels() {
|
|
187
|
+
const canvasWidth = this._canvasViewportWidth;
|
|
188
|
+
if (canvasWidth <= 0) return [];
|
|
189
|
+
const pixelsPerMs = this.pixelsPerMs;
|
|
190
|
+
const canvasLeft = this._canvasViewportLeft;
|
|
191
|
+
const intervalMs = this.calculateLabelInterval();
|
|
192
|
+
const visibleStartTimeMs = Math.max(0, canvasLeft / pixelsPerMs - intervalMs);
|
|
193
|
+
const visibleEndTimeMs = (canvasLeft + canvasWidth) / pixelsPerMs + intervalMs;
|
|
194
|
+
const firstLabelIndex = Math.floor(visibleStartTimeMs / intervalMs);
|
|
195
|
+
const lastLabelIndex = Math.ceil(visibleEndTimeMs / intervalMs);
|
|
196
|
+
const labels = [];
|
|
197
|
+
for (let i = firstLabelIndex; i <= lastLabelIndex; i++) {
|
|
198
|
+
const timeMs = i * intervalMs;
|
|
199
|
+
if (timeMs < 0) continue;
|
|
200
|
+
const viewportX = timeMs * pixelsPerMs - canvasLeft;
|
|
201
|
+
if (viewportX >= -50 && viewportX <= canvasWidth + 50) {
|
|
202
|
+
const timeSeconds = timeMs / 1e3;
|
|
203
|
+
const text = timeSeconds % 1 === 0 ? `${timeSeconds}s` : `${timeSeconds.toFixed(1)}s`;
|
|
204
|
+
labels.push({
|
|
205
|
+
timeMs,
|
|
206
|
+
viewportX,
|
|
207
|
+
text
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
return labels;
|
|
212
|
+
}
|
|
213
|
+
renderCanvas() {
|
|
214
|
+
const canvas = this.canvasRef.value;
|
|
215
|
+
const container = this.containerRef.value;
|
|
216
|
+
if (!canvas || !container) return;
|
|
217
|
+
const viewport = this.calculateCanvasViewport();
|
|
218
|
+
this._canvasViewportLeft = viewport.left;
|
|
219
|
+
this._canvasViewportWidth = viewport.width;
|
|
220
|
+
const width = viewport.width;
|
|
221
|
+
const height = container.getBoundingClientRect().height;
|
|
222
|
+
if (width <= 0 || height <= 0) return;
|
|
223
|
+
const dpr = window.devicePixelRatio || 1;
|
|
224
|
+
canvas.width = width * dpr;
|
|
225
|
+
canvas.height = height * dpr;
|
|
226
|
+
canvas.style.width = `${width}px`;
|
|
227
|
+
canvas.style.height = `${height}px`;
|
|
228
|
+
const ctx = canvas.getContext("2d");
|
|
229
|
+
if (!ctx) return;
|
|
230
|
+
ctx.scale(dpr, dpr);
|
|
231
|
+
ctx.clearRect(0, 0, width, height);
|
|
232
|
+
const pixelsPerMs = this.pixelsPerMs;
|
|
233
|
+
const canvasLeft = viewport.left;
|
|
234
|
+
ctx.strokeStyle = "rgb(156, 163, 175)";
|
|
235
|
+
ctx.lineWidth = 1;
|
|
236
|
+
const labelIntervalMs = this.calculateLabelInterval();
|
|
237
|
+
const visibleStartTimeMs = Math.max(0, canvasLeft / pixelsPerMs - labelIntervalMs);
|
|
238
|
+
const visibleEndTimeMs = (canvasLeft + width) / pixelsPerMs + labelIntervalMs;
|
|
239
|
+
const firstTickIndex = Math.floor(visibleStartTimeMs / labelIntervalMs);
|
|
240
|
+
const lastTickIndex = Math.ceil(visibleEndTimeMs / labelIntervalMs);
|
|
241
|
+
for (let i = firstTickIndex; i <= lastTickIndex; i++) {
|
|
242
|
+
const timeMs = i * labelIntervalMs;
|
|
243
|
+
if (timeMs < 0) continue;
|
|
244
|
+
const canvasX = timeMs * pixelsPerMs - canvasLeft;
|
|
245
|
+
if (canvasX >= -1 && canvasX <= width + 1) {
|
|
246
|
+
ctx.beginPath();
|
|
247
|
+
ctx.moveTo(canvasX, 0);
|
|
248
|
+
ctx.lineTo(canvasX, height * .4);
|
|
249
|
+
ctx.stroke();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
const frameIntervalMs = 1e3 / this.fps;
|
|
253
|
+
if (frameIntervalMs * pixelsPerMs >= MIN_FRAME_SPACING_PX) {
|
|
254
|
+
ctx.strokeStyle = "rgb(107, 114, 128)";
|
|
255
|
+
ctx.lineWidth = 1;
|
|
256
|
+
const firstFrameIndex = Math.floor(visibleStartTimeMs / frameIntervalMs);
|
|
257
|
+
const lastFrameIndex = Math.ceil(visibleEndTimeMs / frameIntervalMs);
|
|
258
|
+
for (let i = firstFrameIndex; i <= lastFrameIndex; i++) {
|
|
259
|
+
const timeMs = i * frameIntervalMs;
|
|
260
|
+
if (timeMs < 0) continue;
|
|
261
|
+
if (timeMs % labelIntervalMs === 0) continue;
|
|
262
|
+
const canvasX = timeMs * pixelsPerMs - canvasLeft;
|
|
263
|
+
if (canvasX >= -1 && canvasX <= width + 1) {
|
|
264
|
+
ctx.beginPath();
|
|
265
|
+
ctx.moveTo(canvasX, 0);
|
|
266
|
+
ctx.lineTo(canvasX, height * .25);
|
|
267
|
+
ctx.stroke();
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
render() {
|
|
273
|
+
const visibleLabels = this.getVisibleLabels();
|
|
274
|
+
const canvasViewportStyles = styleMap({
|
|
275
|
+
left: `${this._canvasViewportLeft}px`,
|
|
276
|
+
width: `${this._canvasViewportWidth}px`
|
|
277
|
+
});
|
|
278
|
+
return html`
|
|
279
|
+
<div ${ref(this.containerRef)} class="ruler-container">
|
|
280
|
+
<div class="canvas-viewport" style=${canvasViewportStyles}>
|
|
281
|
+
<canvas ${ref(this.canvasRef)}></canvas>
|
|
282
|
+
${visibleLabels.map(({ viewportX, text }) => html`
|
|
283
|
+
<span
|
|
284
|
+
class="label"
|
|
285
|
+
style="transform: translateX(${viewportX}px)"
|
|
286
|
+
>${text}</span>
|
|
287
|
+
`)}
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
`;
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
__decorate([property({
|
|
294
|
+
type: Number,
|
|
295
|
+
attribute: "duration-ms"
|
|
296
|
+
})], EFTimelineRuler.prototype, "durationMs", void 0);
|
|
297
|
+
__decorate([consume({
|
|
298
|
+
context: durationContext,
|
|
299
|
+
subscribe: true
|
|
300
|
+
})], EFTimelineRuler.prototype, "contextDurationMs", void 0);
|
|
301
|
+
__decorate([consume({
|
|
302
|
+
context: timelineStateContext,
|
|
303
|
+
subscribe: true
|
|
304
|
+
})], EFTimelineRuler.prototype, "timelineState", void 0);
|
|
305
|
+
__decorate([property({
|
|
306
|
+
type: Number,
|
|
307
|
+
attribute: "fps"
|
|
308
|
+
})], EFTimelineRuler.prototype, "fps", void 0);
|
|
309
|
+
__decorate([property({
|
|
310
|
+
type: Number,
|
|
311
|
+
attribute: "content-width"
|
|
312
|
+
})], EFTimelineRuler.prototype, "contentWidth", void 0);
|
|
313
|
+
__decorate([state()], EFTimelineRuler.prototype, "viewportWidth", void 0);
|
|
314
|
+
__decorate([state()], EFTimelineRuler.prototype, "_canvasViewportLeft", void 0);
|
|
315
|
+
__decorate([state()], EFTimelineRuler.prototype, "_canvasViewportWidth", void 0);
|
|
316
|
+
EFTimelineRuler = __decorate([customElement("ef-timeline-ruler")], EFTimelineRuler);
|
|
317
|
+
|
|
318
|
+
//#endregion
|
|
319
|
+
export { EFTimelineRuler, calculateFrameIntervalMs, calculatePixelsPerFrame, quantizeToFrameTimeMs, shouldShowFrameMarkers };
|
|
320
|
+
//# sourceMappingURL=EFTimelineRuler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EFTimelineRuler.js","names":["EFTimelineRuler","labels: VisibleLabel[]"],"sources":["../../src/gui/EFTimelineRuler.ts"],"sourcesContent":["import { consume } from \"@lit/context\";\nimport { css, html, LitElement } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { styleMap } from \"lit/directives/style-map.js\";\nimport { durationContext } from \"./durationContext.js\";\nimport {\n timelineStateContext,\n type TimelineState,\n DEFAULT_PIXELS_PER_MS,\n} from \"./timeline/timelineStateContext.js\";\n\nconst MIN_LABEL_SPACING_PX = 80;\nconst MIN_FRAME_SPACING_PX = 5;\n\n/** Maximum canvas width for ruler virtualization */\nconst MAX_RULER_CANVAS_WIDTH = 2000;\n\n/** Buffer pixels on each side of viewport for smooth scrolling */\nconst RULER_CANVAS_BUFFER = 200;\n\n/**\n * Quantize a time value to the nearest frame boundary.\n * This ensures frame markers align perfectly with playhead position.\n */\nexport function quantizeToFrameTimeMs(timeMs: number, fps: number): number {\n if (!fps || fps <= 0) return timeMs;\n const frameDurationS = 1 / fps;\n const timeSeconds = timeMs / 1000;\n const quantizedSeconds =\n Math.round(timeSeconds / frameDurationS) * frameDurationS;\n return quantizedSeconds * 1000;\n}\n\n/**\n * Calculate the duration of a single frame in milliseconds.\n */\nexport function calculateFrameIntervalMs(fps: number): number {\n if (fps <= 0) return 1000 / 30; // fallback to 30fps\n return 1000 / fps;\n}\n\n/**\n * Calculate pixels per frame given frame interval and zoom scale.\n * @param frameIntervalMs Duration of one frame in ms\n * @param pixelsPerMs Current zoom level (pixels per millisecond)\n */\nexport function calculatePixelsPerFrame(\n frameIntervalMs: number,\n pixelsPerMs: number,\n): number {\n return frameIntervalMs * pixelsPerMs;\n}\n\n/**\n * Determine if frame markers should be visible at the current zoom level.\n * Frame markers appear when each frame is at least MIN_FRAME_SPACING_PX wide.\n */\nexport function shouldShowFrameMarkers(\n pixelsPerFrame: number,\n minSpacing: number = MIN_FRAME_SPACING_PX,\n): boolean {\n return pixelsPerFrame >= minSpacing;\n}\n\ninterface VisibleLabel {\n timeMs: number;\n viewportX: number;\n text: string;\n}\n\n@customElement(\"ef-timeline-ruler\")\nexport class EFTimelineRuler extends LitElement {\n static styles = [\n css`\n :host {\n display: block;\n position: relative;\n height: 100%;\n pointer-events: none;\n }\n \n .ruler-container {\n position: relative;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n \n .canvas-viewport {\n position: absolute;\n top: 0;\n height: 100%;\n /* left and width set via inline styles for virtualization */\n }\n \n canvas {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n pointer-events: none;\n }\n \n .label {\n position: absolute;\n top: 50%;\n font-size: 10px;\n color: rgb(156, 163, 175);\n font-family: ui-monospace, monospace;\n white-space: nowrap;\n pointer-events: none;\n user-select: none;\n }\n `,\n ];\n\n @property({ type: Number, attribute: \"duration-ms\" })\n durationMs = 0;\n\n @consume({ context: durationContext, subscribe: true })\n contextDurationMs = 0;\n\n @consume({ context: timelineStateContext, subscribe: true })\n timelineState?: TimelineState;\n\n @property({ type: Number, attribute: \"fps\" })\n fps = 30;\n\n /** Full content width in pixels (for virtualization) */\n @property({ type: Number, attribute: \"content-width\" })\n contentWidth = 0;\n\n private containerRef = createRef<HTMLDivElement>();\n private canvasRef = createRef<HTMLCanvasElement>();\n private resizeObserver?: ResizeObserver;\n\n @state()\n private viewportWidth = 0;\n\n /** Canvas viewport left position for virtualization */\n @state()\n private _canvasViewportLeft = 0;\n\n /** Canvas viewport width for virtualization */\n @state()\n private _canvasViewportWidth = 0;\n\n /** Last rendered scroll position - for detecting scroll changes */\n private _lastRenderedScrollLeft = -1;\n\n /** Last rendered viewport width - for detecting viewport changes */\n private _lastRenderedViewportWidth = 0;\n\n get effectiveDurationMs(): number {\n return this.durationMs || this.contextDurationMs || 0;\n }\n\n get pixelsPerMs(): number {\n return this.timelineState?.pixelsPerMs ?? DEFAULT_PIXELS_PER_MS;\n }\n\n get scrollLeft(): number {\n return this.timelineState?.viewportScrollLeft ?? 0;\n }\n\n /**\n * Calculate canvas viewport bounds for virtualization.\n * Returns the left position and width of the canvas viewport.\n */\n private calculateCanvasViewport(): { left: number; width: number } {\n const totalWidth = this.contentWidth || this.viewportWidth;\n \n // If content is small enough, no virtualization needed\n if (totalWidth <= MAX_RULER_CANVAS_WIDTH) {\n return { left: 0, width: totalWidth };\n }\n\n // Get visible region from scroll position\n const viewportScrollLeft = this.scrollLeft;\n const viewportWidth = this.timelineState?.viewportWidth ?? this.viewportWidth;\n\n // Calculate canvas viewport with buffer for smooth scrolling\n const canvasLeft = Math.max(0, viewportScrollLeft - RULER_CANVAS_BUFFER);\n const canvasRight = Math.min(\n totalWidth,\n viewportScrollLeft + viewportWidth + RULER_CANVAS_BUFFER\n );\n\n // Cap canvas width at maximum\n let canvasWidth = canvasRight - canvasLeft;\n if (canvasWidth > MAX_RULER_CANVAS_WIDTH) {\n canvasWidth = MAX_RULER_CANVAS_WIDTH;\n }\n\n return { left: canvasLeft, width: canvasWidth };\n }\n\n connectedCallback() {\n super.connectedCallback();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n if (this.resizeObserver) {\n this.resizeObserver.disconnect();\n }\n }\n\n protected firstUpdated(): void {\n const container = this.containerRef.value;\n if (container) {\n this.resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n const width = entry.contentRect.width;\n if (width !== this.viewportWidth) {\n this.viewportWidth = width;\n }\n }\n });\n this.resizeObserver.observe(container);\n this.viewportWidth = container.clientWidth;\n }\n }\n\n protected updated(changedProperties: Map<string | number | symbol, unknown>): void {\n // Check if scroll position or viewport changed from context\n const currentScrollLeft = this.scrollLeft;\n const currentViewportWidth = this.timelineState?.viewportWidth ?? this.viewportWidth;\n \n // Check if scroll changed, viewport changed, or other relevant properties changed\n const scrollChanged = currentScrollLeft !== this._lastRenderedScrollLeft;\n const viewportChanged = currentViewportWidth !== this._lastRenderedViewportWidth;\n const pixelsPerMsChanged = changedProperties.has(\"timelineState\") || \n changedProperties.has(\"pixelsPerMs\");\n const contentWidthChanged = changedProperties.has(\"contentWidth\");\n const durationChanged = changedProperties.has(\"durationMs\") || \n changedProperties.has(\"contextDurationMs\");\n \n // Only render if something actually changed\n if (scrollChanged || viewportChanged || pixelsPerMsChanged || \n contentWidthChanged || durationChanged || \n this._lastRenderedScrollLeft < 0) {\n this.renderCanvas();\n this._lastRenderedScrollLeft = currentScrollLeft;\n this._lastRenderedViewportWidth = currentViewportWidth;\n }\n }\n\n private calculateLabelInterval(): number {\n const pixelsPerMs = this.pixelsPerMs;\n const pixelsPerSecond = pixelsPerMs * 1000;\n\n const intervals = [0.1, 0.25, 0.5, 1, 2, 5, 10, 30, 60];\n\n for (const intervalS of intervals) {\n const pixelsPerInterval = intervalS * pixelsPerSecond;\n if (pixelsPerInterval >= MIN_LABEL_SPACING_PX) {\n return intervalS * 1000;\n }\n }\n\n return 60000;\n }\n\n private getVisibleLabels(): VisibleLabel[] {\n const canvasWidth = this._canvasViewportWidth;\n if (canvasWidth <= 0) return [];\n\n const pixelsPerMs = this.pixelsPerMs;\n const canvasLeft = this._canvasViewportLeft;\n\n const intervalMs = this.calculateLabelInterval();\n\n // Generate labels for the canvas viewport range\n const visibleStartTimeMs = Math.max(\n 0,\n canvasLeft / pixelsPerMs - intervalMs,\n );\n const visibleEndTimeMs =\n (canvasLeft + canvasWidth) / pixelsPerMs + intervalMs;\n\n const firstLabelIndex = Math.floor(visibleStartTimeMs / intervalMs);\n const lastLabelIndex = Math.ceil(visibleEndTimeMs / intervalMs);\n\n const labels: VisibleLabel[] = [];\n\n for (let i = firstLabelIndex; i <= lastLabelIndex; i++) {\n const timeMs = i * intervalMs;\n if (timeMs < 0) continue;\n\n const absoluteX = timeMs * pixelsPerMs;\n // Position relative to canvas viewport (canvas is positioned at canvasLeft)\n const viewportX = absoluteX - canvasLeft;\n\n if (viewportX >= -50 && viewportX <= canvasWidth + 50) {\n const timeSeconds = timeMs / 1000;\n const text =\n timeSeconds % 1 === 0\n ? `${timeSeconds}s`\n : `${timeSeconds.toFixed(1)}s`;\n\n labels.push({ timeMs, viewportX, text });\n }\n }\n\n return labels;\n }\n\n private renderCanvas(): void {\n const canvas = this.canvasRef.value;\n const container = this.containerRef.value;\n if (!canvas || !container) return;\n\n // Calculate virtualized canvas viewport\n const viewport = this.calculateCanvasViewport();\n this._canvasViewportLeft = viewport.left;\n this._canvasViewportWidth = viewport.width;\n\n const width = viewport.width;\n const height = container.getBoundingClientRect().height;\n\n if (width <= 0 || height <= 0) return;\n\n const dpr = window.devicePixelRatio || 1;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, width, height);\n\n const pixelsPerMs = this.pixelsPerMs;\n const canvasLeft = viewport.left;\n\n // Time label ticks - more prominent (gray-400)\n ctx.strokeStyle = \"rgb(156, 163, 175)\";\n ctx.lineWidth = 1;\n\n const labelIntervalMs = this.calculateLabelInterval();\n // Fill the canvas viewport with ticks\n const visibleStartTimeMs = Math.max(\n 0,\n canvasLeft / pixelsPerMs - labelIntervalMs,\n );\n const visibleEndTimeMs =\n (canvasLeft + width) / pixelsPerMs + labelIntervalMs;\n\n const firstTickIndex = Math.floor(visibleStartTimeMs / labelIntervalMs);\n const lastTickIndex = Math.ceil(visibleEndTimeMs / labelIntervalMs);\n\n for (let i = firstTickIndex; i <= lastTickIndex; i++) {\n const timeMs = i * labelIntervalMs;\n if (timeMs < 0) continue;\n\n const absoluteX = timeMs * pixelsPerMs;\n // Position relative to canvas viewport\n const canvasX = absoluteX - canvasLeft;\n\n if (canvasX >= -1 && canvasX <= width + 1) {\n ctx.beginPath();\n ctx.moveTo(canvasX, 0);\n ctx.lineTo(canvasX, height * 0.4);\n ctx.stroke();\n }\n }\n\n const frameIntervalMs = 1000 / this.fps;\n const pixelsPerFrame = frameIntervalMs * pixelsPerMs;\n\n if (pixelsPerFrame >= MIN_FRAME_SPACING_PX) {\n // Frame markers should be lighter than background (gray-500) to be visible\n ctx.strokeStyle = \"rgb(107, 114, 128)\";\n ctx.lineWidth = 1;\n\n const firstFrameIndex = Math.floor(visibleStartTimeMs / frameIntervalMs);\n const lastFrameIndex = Math.ceil(visibleEndTimeMs / frameIntervalMs);\n\n for (let i = firstFrameIndex; i <= lastFrameIndex; i++) {\n const timeMs = i * frameIntervalMs;\n if (timeMs < 0) continue;\n\n if (timeMs % labelIntervalMs === 0) continue;\n\n const absoluteX = timeMs * pixelsPerMs;\n // Position relative to canvas viewport\n const canvasX = absoluteX - canvasLeft;\n\n if (canvasX >= -1 && canvasX <= width + 1) {\n ctx.beginPath();\n ctx.moveTo(canvasX, 0);\n ctx.lineTo(canvasX, height * 0.25);\n ctx.stroke();\n }\n }\n }\n }\n\n render() {\n const visibleLabels = this.getVisibleLabels();\n \n const canvasViewportStyles = styleMap({\n left: `${this._canvasViewportLeft}px`,\n width: `${this._canvasViewportWidth}px`,\n });\n\n return html`\n <div ${ref(this.containerRef)} class=\"ruler-container\">\n <div class=\"canvas-viewport\" style=${canvasViewportStyles}>\n <canvas ${ref(this.canvasRef)}></canvas>\n ${visibleLabels.map(\n ({ viewportX, text }) => html`\n <span \n class=\"label\" \n style=\"transform: translateX(${viewportX}px)\"\n >${text}</span>\n `,\n )}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"ef-timeline-ruler\": EFTimelineRuler;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ControllableInterface } from "./Controllable.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as lit21 from "lit";
|
|
3
3
|
import { LitElement } from "lit";
|
|
4
|
-
import * as
|
|
4
|
+
import * as lit_html21 from "lit-html";
|
|
5
5
|
|
|
6
6
|
//#region src/gui/EFToggleLoop.d.ts
|
|
7
7
|
declare const EFToggleLoop_base: (new (...args: any[]) => {
|
|
@@ -10,9 +10,9 @@ declare const EFToggleLoop_base: (new (...args: any[]) => {
|
|
|
10
10
|
effectiveContext: ControllableInterface | null;
|
|
11
11
|
}) & typeof LitElement;
|
|
12
12
|
declare class EFToggleLoop extends EFToggleLoop_base {
|
|
13
|
-
static styles:
|
|
13
|
+
static styles: lit21.CSSResult[];
|
|
14
14
|
get context(): ControllableInterface | null;
|
|
15
|
-
render():
|
|
15
|
+
render(): lit_html21.TemplateResult<1>;
|
|
16
16
|
}
|
|
17
17
|
declare global {
|
|
18
18
|
interface HTMLElementTagNameMap {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ControllableInterface } from "./Controllable.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as lit18 from "lit";
|
|
3
3
|
import { LitElement } from "lit";
|
|
4
|
-
import * as
|
|
4
|
+
import * as lit_html18 from "lit-html";
|
|
5
5
|
|
|
6
6
|
//#region src/gui/EFTogglePlay.d.ts
|
|
7
7
|
declare const EFTogglePlay_base: (new (...args: any[]) => {
|
|
@@ -10,12 +10,12 @@ declare const EFTogglePlay_base: (new (...args: any[]) => {
|
|
|
10
10
|
effectiveContext: ControllableInterface | null;
|
|
11
11
|
}) & typeof LitElement;
|
|
12
12
|
declare class EFTogglePlay extends EFTogglePlay_base {
|
|
13
|
-
static styles:
|
|
13
|
+
static styles: lit18.CSSResult[];
|
|
14
14
|
playing: boolean;
|
|
15
15
|
get efContext(): ControllableInterface | null;
|
|
16
16
|
connectedCallback(): void;
|
|
17
17
|
disconnectedCallback(): void;
|
|
18
|
-
render():
|
|
18
|
+
render(): lit_html18.TemplateResult<1>;
|
|
19
19
|
togglePlay: () => void;
|
|
20
20
|
private getPlaybackController;
|
|
21
21
|
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { PanZoomTransform } from "../elements/EFPanZoom.js";
|
|
2
|
+
import * as lit28 from "lit";
|
|
3
|
+
import { LitElement } from "lit";
|
|
4
|
+
import * as lit_html27 from "lit-html";
|
|
5
|
+
|
|
6
|
+
//#region src/gui/EFTransformHandles.d.ts
|
|
7
|
+
interface TransformBounds {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
width: number;
|
|
11
|
+
height: number;
|
|
12
|
+
rotation?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Interaction mode enumeration.
|
|
16
|
+
* Only one mode can be active at a time (invariant).
|
|
17
|
+
*/
|
|
18
|
+
type InteractionMode = "idle" | "dragging" | "resizing" | "rotating";
|
|
19
|
+
declare class EFTransformHandles extends LitElement {
|
|
20
|
+
bounds: TransformBounds;
|
|
21
|
+
minSize: number;
|
|
22
|
+
target?: string;
|
|
23
|
+
panZoomTransformFromContext?: PanZoomTransform;
|
|
24
|
+
canvasScale: number;
|
|
25
|
+
enableRotation: boolean;
|
|
26
|
+
enableResize: boolean;
|
|
27
|
+
cornersOnly: boolean;
|
|
28
|
+
lockAspectRatio: boolean;
|
|
29
|
+
enableDrag: boolean;
|
|
30
|
+
rotationStep?: number;
|
|
31
|
+
/**
|
|
32
|
+
* Current interaction mode.
|
|
33
|
+
* Invariant: Only one mode active at a time.
|
|
34
|
+
*/
|
|
35
|
+
interactionMode: InteractionMode;
|
|
36
|
+
/**
|
|
37
|
+
* Active resize handle when in "resizing" mode.
|
|
38
|
+
* Only valid when interactionMode === "resizing".
|
|
39
|
+
*/
|
|
40
|
+
private activeResizeHandle;
|
|
41
|
+
/**
|
|
42
|
+
* Mouse start position for calculating deltas.
|
|
43
|
+
* Only valid during active interaction.
|
|
44
|
+
*/
|
|
45
|
+
private mouseStart;
|
|
46
|
+
/**
|
|
47
|
+
* Initial bounds at interaction start - NEVER mutated during interaction.
|
|
48
|
+
* All calculations derive from this + mouse deltas.
|
|
49
|
+
* Note: Not a @state() property to avoid re-renders during interaction.
|
|
50
|
+
*/
|
|
51
|
+
private initialBounds;
|
|
52
|
+
static styles: lit28.CSSResult;
|
|
53
|
+
private resizeObserver?;
|
|
54
|
+
/**
|
|
55
|
+
* Single source of truth for zoom scale.
|
|
56
|
+
* Priority: context > prop > 1.0
|
|
57
|
+
*/
|
|
58
|
+
private getZoomScale;
|
|
59
|
+
/**
|
|
60
|
+
* Convert screen pixel bounds to canvas coordinates.
|
|
61
|
+
*/
|
|
62
|
+
private screenToCanvas;
|
|
63
|
+
connectedCallback(): void;
|
|
64
|
+
disconnectedCallback(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Transition interaction mode state machine.
|
|
67
|
+
* Ensures only one mode is active at a time (invariant).
|
|
68
|
+
*/
|
|
69
|
+
private transitionInteractionMode;
|
|
70
|
+
private handleMouseDown;
|
|
71
|
+
private handleResizeMouseDown;
|
|
72
|
+
private handleRotateMouseDown;
|
|
73
|
+
/**
|
|
74
|
+
* Dispatch bounds change event (one-way data flow).
|
|
75
|
+
* Parent updates element, then reads element and updates handle bounds prop.
|
|
76
|
+
* We don't modify this.bounds directly - always render from prop.
|
|
77
|
+
*/
|
|
78
|
+
private dispatchBoundsChange;
|
|
79
|
+
private handleMouseMove;
|
|
80
|
+
private handleMouseUp;
|
|
81
|
+
private cleanup;
|
|
82
|
+
render(): lit_html27.TemplateResult<1>;
|
|
83
|
+
}
|
|
84
|
+
declare global {
|
|
85
|
+
interface HTMLElementTagNameMap {
|
|
86
|
+
"ef-transform-handles": EFTransformHandles;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//#endregion
|
|
90
|
+
export { EFTransformHandles, TransformBounds };
|
|
91
|
+
//# sourceMappingURL=EFTransformHandles.d.ts.map
|