import Konva from 'konva'; import { ScrollableHorizontally } from './scrollbar/scrollbar'; import { Dimension, Horizontals, Position, RectMeasurement } from '../common'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { Destroyable, PlayheadMoveEvent, ScrubberMoveEvent, TimecodeClickEvent, TimecodeMouseMoveEvent, TimelineReadyEvent, TimelineScrollEvent, TimelineZoomEvent } from '../types'; import { ScrubberLane } from './scrubber'; import { TimelineApi, TimelineLaneApi } from '../api'; import { AxiosRequestConfig } from 'axios'; import { MediaElementPlaybackState, VideoControllerApi } from '../video'; import { FlexNode } from '../layout/flex-node'; import { ThumbnailVttFile } from '../vtt'; import { ConfigWithOptionalStyle } from '../layout'; export interface TimelineStyle { textFontFamily: string; textFontStyle: string; stageMinWidth: number; stageMinHeight: number; backgroundFill: string; backgroundOpacity: number; headerHeight: number; headerMarginBottom: number; headerBackgroundFill: string; headerBackgroundOpacity: number; footerHeight: number; footerMarginTop: number; footerBackgroundFill: string; footerBackgroundOpacity: number; scrollbarHeight: number; scrollbarWidth: number; scrollbarBackgroundFill: string; scrollbarBackgroundFillOpacity: number; scrollbarHandleBarFill: string; scrollbarHandleBarOpacity: number; scrollbarHandleOpacity: number; thumbnailHoverWidth: number; thumbnailHoverStroke: string; thumbnailHoverStrokeWidth: number; thumbnailHoverYOffset: number; leftPaneWidth: number; rightPaneMarginLeft: number; rightPaneMarginRight: number; rightPaneClipPadding: number; playheadVisible: boolean; playheadFill: string; playheadLineWidth: number; playheadSymbolHeight: number; playheadScrubberHeight: number; playheadBackgroundFill: string; playheadBackgroundOpacity: number; playheadTextFill: string; playheadTextYOffset: number; playheadTextFontSize: number; playheadPlayProgressFill: string; playheadPlayProgressOpacity: number; playheadBufferedFill: string; playheadBufferedOpacity: number; scrubberVisible: boolean; scrubberFill: string; scrubberSnappedFill: string; scrubberNorthLineWidth: number; scrubberNorthLineOpacity: number; scrubberSouthLineWidth: number; scrubberSouthLineOpacity: number; scrubberSymbolHeight: number; scrubberTextFill: string; scrubberTextYOffset: number; scrubberTextFontSize: number; scrubberHeight: number; scrubberMarginBottom: number; loadingAnimationTheme: 'light' | 'dark'; } export interface TimelineConfig { timelineHTMLElementId: string; thumbnailVttUrl?: string; thumbnailVttFile?: ThumbnailVttFile; axiosConfig?: AxiosRequestConfig; scrubberSnapArea: number; playheadDragScrollMaxSpeedAfterPx: number; zoomWheelEnabled: boolean; zoomScale: number; zoomScaleWheel: number; zoomBaseline: number; zoomMax: number; layoutEasingDuration: number; zoomEasingDuration: number; scrollEasingDuration: number; scrubberClickSeek: boolean; timecodeClickEdit: boolean; style: TimelineStyle; } interface DragConditions { positionBeforeDrag: Position | undefined; playbackState: MediaElementPlaybackState | undefined; isPlayheadDrag: boolean; } export declare class Timeline implements Destroyable, ScrollableHorizontally, TimelineApi { readonly onReady$: BehaviorSubject; readonly onScroll$: Subject; readonly onZoom$: Subject; readonly onStyleChange$: Subject; readonly onTimecodeClick$: Subject; readonly onTimecodeMouseMove$: Subject; readonly onScrubberMove$: Subject; readonly onPlayheadMove$: Subject; protected _dragBreaker$: Subject; protected _dragConditions?: DragConditions; private _config; private _styleAdapter; private readonly _vttAdapter; private _videoController; private _timelineDomController; private _timelineLanes; private _timelineLanesMap; private _konvaStage; private _mainLayer; private _timecodedContainer; private _timecodedFloatingGroup; private _timecodedFloatingBg; private _timecodedFloatingEventCatcher; private _timecodedFloatingContentGroups; private _surfaceLayer; private _surfaceLayer_timecodedContainer; private _surfaceLayer_timecodedFloatingGroup; private _surfaceLayer_timecodedFloatingContentGroups; private _layoutBg; private _headerBg; private _footerBg; private _layoutFlexGroup; private _headerFlexGroup; private _mainFlexGroup; private _mainLeftFlexGroup; private _mainRightFlexGroup; private _timelineLaneStaticFlexGroup; private _timecodedWrapperFlexGroup; private _timecodedContainerFlexGroup; private _timecodedContainerStaticFlexGroup; private _footerFlexGroup; private _scrubber; private _playhead; private _scrubberLane; private _thumbnailHover; private _scrollWithPlayhead; private _syncTimelineWithPlayheadInProgress; private _descriptionPaneVisible; private _videoEventBreaker$; private readonly _destroyed$; constructor(config: Partial>, videoController: VideoControllerApi); protected init(): void; private handleTimecodeClick; private hideScrubber; settleLayout(): void; private settleTimecodedGroups; private layersSync; private onWindowResize; private resolveStageDimension; private showThumbnailHover; private hideThumbnailHover; private resolveThumbnailPosition; private createScrollEvent; private createZoomEvent; getHorizontalScrollPercent(): number; scrollHorizontallyToPercent(percent: number): void; getScrollHandleHorizontals(scrollbarWidth: number): Horizontals; scrollToEased(percent: number): Observable; scrollToPlayheadEased(): Observable; private scrollToPercent; private scrollToPercentEased; private scrollToPositionEased; private isPlayheadInTimecodedView; private refreshScrollWithPlayhead; /** * Scrolls timecoded group so that playhead is at left most position * @private */ private syncTimelineWithPlayhead; scrollTimeline(x: number): void; private calculateTimelineXFromScrollPercent; getZoomPercent(): number; zoomTo(percent: number, zoomFocusPercent?: number | undefined): number; zoomToEased(percent: number, zoomFocusPercent?: number | undefined): Observable; private resolveTimecodedFloatingPosition; zoomInEased(): Observable; zoomOutEased(): Observable; zoomToMaxEased(): Observable; private zoomByStep; private zoomByPercent; private zoomByWidth; private settleTimecodedFloating; private zoomByStepEased; private zoomByPercentEased; private zoomByWidthEased; private resolveTimelineContainerZoomFocusPosition; private calculateTimecodedWidthFromZoomRatioPercent; private getConstrainedTimecodedWidth; private getConstrainedZoomPercent; private getConstrainedScrollPercent; private scrubberMove; private onVideoLoadedEvent; private fireVideoEventBreaker; private syncVideoMetadata; addTimelineLane(timelineLane: TimelineLaneApi): TimelineLaneApi; private _addTimelineLane; addTimelineLaneAtIndex(timelineLane: TimelineLaneApi, index: number): TimelineLaneApi; private _addTimelineLaneAtIndex; removeTimelineLane(id: string): void; removeTimelineLanes(ids: string[]): void; removeAllTimelineLanes(): void; private _removeTimelineLane; addTimelineLanes(timelineLanes: TimelineLaneApi[]): TimelineLaneApi[]; getTimelineLanes(): TimelineLaneApi[]; getTimelineLane(id: string): T | undefined; getScrubberLane(): ScrubberLane; addToTimecodedFloatingContent(node: Konva.Group | Konva.Shape, zIndex?: number): void; addToTimecodedStaticContent(node: Konva.Group | Konva.Shape, zIndex?: number): void; addToSurfaceLayerTimecodedFloatingContent(node: Konva.Group | Konva.Shape, zIndex?: number): void; addToFooterFlexGroup(flexNode: FlexNode): void; constrainTimelinePosition(x: number): number; timelinePositionToTime(xOnTimeline: number): number; timelineContainerPositionToTime(xOnTimeline: number): number; timelinePositionToTimecode(x: number): string; timelinePositionToFrame(x: number): number; timeToTimelinePosition(time: number): number; private convertTimeToTimelinePosition; private convertPositionOnTimelineToTime; private constrainTimecodedFloatingPosition; getTimecodedContainerDimension(): Dimension; getTimecodedFloatingDimension(): Dimension; getTimecodedFloatingPosition(): Position; getTimecodedFloatingRelativePointerPosition(): Position | undefined; getTimecodedFloatingRect(): RectMeasurement; getTimecodedFloatingHorizontals(): Horizontals; getVisiblePositionRange(): { start: number; end: number; }; private isInVisiblePositionRange; private isSnappedStart; private isSnappedEnd; getVisibleTimeRange(): { start: number; end: number; }; loadThumbnailVttFile(vttFile: ThumbnailVttFile): void; loadThumbnailVttFileFromUrl(vttUrl: string): Observable; setDescriptionPaneVisible(visible: boolean): void; toggleDescriptionPaneVisible(): void; setDescriptionPaneVisibleEased(visible: boolean): Observable; toggleDescriptionPaneVisibleEased(): Observable; protected _minimizeTimelineLane(timelineLane: TimelineLaneApi, refreshLayout?: boolean): void; minimizeTimelineLanes(timelineLanes: TimelineLaneApi[]): void; protected _maximizeTimelineLane(timelineLane: TimelineLaneApi, refreshLayout?: boolean): void; maximizeTimelineLanes(timelineLanes: TimelineLaneApi[]): void; get thumbnailVttFile(): ThumbnailVttFile | undefined; get style(): TimelineStyle; set style(value: Partial); private clearContent; get config(): TimelineConfig; get descriptionPaneVisible(): boolean; toggleTimecodeEdit(): void; destroy(): void; } export {};