type Uid = number | string; type TextType = { text: string[] | string; }; type UrlType = { url: string; }; type FontType = { fontId?: string; fontUrl?: string; }; type ThemeType = { themeId?: string; themeUrl?: string; }; interface VideoSource extends UrlType { } interface AudioSource extends UrlType { } interface ImageSource extends UrlType { } interface TextSource extends TextType, FontType, ThemeType { } interface CaptionSource extends TextType, FontType, ThemeType { } interface StickerSource extends ThemeType { } interface EffectSource extends ThemeType { } type Source = VideoSource | AudioSource | ImageSource | TextSource | CaptionSource | StickerSource | EffectSource; interface RGBA { color: { R: number; G: number; B: number; }; opacity: number; } interface SrcRange { start: number; end: number; } interface TrimRange { start: number; end: number; } interface FillColorConfig extends RGBA { fillType: number; gradient?: any; } interface ShadowColorConfig extends RGBA { angle: number; distance: number; size: number; spread: number; } interface StrokeColorConfig extends RGBA { size: number; } interface BackgroundColorConfig extends RGBA { showBoard: boolean; boardRound?: number; } interface TokenRangeConfig { textOffset: { start: number; end: number; }; timeRange: { start: number; end: number; }; styleConfig: { fill: FillColorConfig; shadow: ShadowColorConfig; stroke: StrokeColorConfig; background: BackgroundColorConfig; }; } interface Crop { top: number; left: number; bottom: number; right: number; } interface Transform { translate?: { x: number; y: number; }; scale?: { x: number; y: number; }; rotate?: number; origin?: { x: number; y: number; }; delta?: { shift: { y: number[]; }; }; } interface StyleObject { size?: { width: number; height: number; }; fontFamily?: string; fontSize?: number; fontWeight?: 'normal' | 'bold'; fontStyle?: 'normal' | 'italic'; textDecoration?: { line: 'underline' | 'line-through' | 'overline' | 'blink'; style: 'solid' | 'wavy' | 'dashed' | 'double' | 'dotted'; color: string; thickness: number; }; textAlign?: 'left' | 'center' | 'right'; fill?: FillColorConfig; shadow?: ShadowColorConfig; stroke?: StrokeColorConfig; background?: BackgroundColorConfig; tokenInfo?: Array[]; opacity?: number; isTheme?: boolean; } type ElementTypes = 'video' | 'audio' | 'text' | 'caption' | 'image' | 'sticker' | 'effect'; interface Track { id: Uid; isMain: boolean; type: ElementTypes; zIndex: number; groupId?: Uid; visible: boolean; volume: number; muted: boolean; locked: boolean; elements: Array; } interface BaseElement { id: Uid; trackId: Uid; type: T; groupId?: Uid; srcRange: SrcRange; trimRange: TrimRange; startPos: number; extendInfo?: Record; } interface VideoElement extends BaseElement<'video'> { style?: Pick; volume: number; mute: boolean; speed: number; transform: Transform; transitionPath?: string; extendInfo: { assetId: string; mediaFormType: number; } & Record; src: VideoSource; crop: Crop; } interface AudioElement extends BaseElement<'audio'> { volume: number; mute: boolean; speed: number; extendInfo: { assetId: string; mediaFormType: number; } & Record; src: AudioSource; } interface TextElement extends BaseElement<'text'> { style?: StyleObject; transform: Transform; src: TextSource; } interface CaptionElement extends BaseElement<'caption'> { style?: StyleObject; transform: Transform; src: CaptionSource; } interface ImageElement extends BaseElement<'image'> { style?: StyleObject; transform: Transform; extendInfo: { assetId: string; mediaFormType: number; } & Record; src: ImageSource; crop: Crop; } interface StickerElement extends BaseElement<'sticker'> { style?: StyleObject; transform: Transform; themeId: string; themeUrl: string; extendInfo: { assetId: string; } & Record; src: StickerSource; } interface EffectElement extends BaseElement<'effect'> { style?: StyleObject; transform: Transform; src: EffectSource; } type TrackElement = VideoElement | AudioElement | TextElement | CaptionElement | ImageElement | StickerElement | EffectElement; interface Stage { id: Uid; size: { width: number; height: number; }; tracks: Array; trackItemsMap: Record; } interface CalcElementPosRes { curTrack: Track; originTrack?: Track; tracks: Track[]; trackItemsMap: Record; trackItemsMapChanged: Record; } interface CalcTrackIndexRes { zIndex: number; position: number; tracks: Track[]; trackItemsMap: Record; } interface CalcElementTrimRes { trackItemsMapChanged: Record; } interface CalcAdsorptionLineRes { startPos: number; adsorptionLines: number[]; } export type { AudioElement, AudioSource, BackgroundColorConfig, BaseElement, CalcAdsorptionLineRes, CalcElementPosRes, CalcElementTrimRes, CalcTrackIndexRes, CaptionElement, CaptionSource, Crop, EffectElement, EffectSource, ElementTypes, FillColorConfig, FontType, ImageElement, ImageSource, ShadowColorConfig, Source, SrcRange, Stage, StickerElement, StickerSource, StrokeColorConfig, StyleObject, TextElement, TextSource, TextType, ThemeType, TokenRangeConfig, Track, TrackElement, Transform, TrimRange, Uid, UrlType, VideoElement, VideoSource };