// YouTube IFrame API type declarations interface Window { YT: typeof YT; onYouTubeIframeAPIReady: (() => void) | undefined; } declare namespace YT { class Player { constructor( elementId: string | HTMLElement | null, options?: PlayerOptions ); playVideo(): void; pauseVideo(): void; stopVideo(): void; seekTo(seconds: number, allowSeekAhead?: boolean): void; mute(): void; unMute(): void; isMuted(): boolean; setVolume(volume: number): void; getVolume(): number; getCurrentTime(): number; getDuration(): number; getPlayerState(): PlayerState; destroy(): void; } interface PlayerOptions { width?: number | string; height?: number | string; videoId?: string; playerVars?: PlayerVars; events?: PlayerEvents; } interface PlayerVars { autoplay?: 0 | 1; controls?: 0 | 1; disablekb?: 0 | 1; enablejsapi?: 0 | 1; fs?: 0 | 1; iv_load_policy?: 1 | 3; modestbranding?: 0 | 1; rel?: 0 | 1; showinfo?: 0 | 1; start?: number; end?: number; } interface PlayerEvents { onReady?: (event: PlayerEvent) => void; onStateChange?: (event: OnStateChangeEvent) => void; onPlaybackQualityChange?: (event: PlayerEvent) => void; onPlaybackRateChange?: (event: PlayerEvent) => void; onError?: (event: OnErrorEvent) => void; onApiChange?: (event: PlayerEvent) => void; } interface PlayerEvent { target: Player; } interface OnStateChangeEvent extends PlayerEvent { data: PlayerState; } interface OnErrorEvent extends PlayerEvent { data: number; } enum PlayerState { UNSTARTED = -1, ENDED = 0, PLAYING = 1, PAUSED = 2, BUFFERING = 3, CUED = 5, } }