@grizzshutsdown/simpleplayer 0.1.6 → 0.1.8

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.
@@ -1 +1 @@
1
- {"version":3,"file":"simple-player.js","sources":["../src/player/constants.ts","../src/player/fullscreen.ts","../src/player/media.ts","../src/player/progress.ts","../src/player/styles.ts","../src/player/template.ts","../src/player/simple-player-element.ts","../src/simple-player.ts"],"sourcesContent":["export const DEFAULT_ASPECT_RATIO = '16 / 9';\nexport const DEFAULT_PRELOAD_MARGIN = '360px 0px';\n\nexport const OBSERVED_ATTRIBUTES = [\n 'src',\n 'aspect-ratio',\n 'preload-margin',\n 'controls',\n 'disable-autoplay',\n 'enable-volume',\n 'disable-volume',\n 'disable-volume-slider',\n 'enable-picture-in-picture',\n 'disable-picture-in-picture',\n 'enable-fullscreen',\n 'disable-fullscreen',\n 'show-time',\n 'no-autoplay',\n 'no-volume',\n 'no-volume-slider',\n 'no-picture-in-picture',\n 'no-fullscreen',\n] as const;\n","import type { FullscreenDocument, FullscreenPlayer, FullscreenVideo } from './types';\n\nexport function getFullscreenElement(root: ShadowRoot): Element | null {\n const fullscreenDocument = document as FullscreenDocument;\n\n return (\n root.fullscreenElement ||\n document.fullscreenElement ||\n fullscreenDocument.webkitFullscreenElement ||\n fullscreenDocument.mozFullScreenElement ||\n fullscreenDocument.msFullscreenElement ||\n null\n );\n}\n\nexport function isFullscreenSupported(\n fullscreenEnabled: boolean,\n player: HTMLElement,\n video: HTMLVideoElement,\n): boolean {\n const fullscreenDocument = document as FullscreenDocument;\n const fullscreenPlayer = player as FullscreenPlayer;\n const fullscreenVideo = video as FullscreenVideo;\n const canFullscreenPlayer = !!(\n (\n document.fullscreenEnabled ??\n fullscreenDocument.webkitFullscreenEnabled ??\n fullscreenDocument.mozFullScreenEnabled ??\n fullscreenDocument.msFullscreenEnabled ??\n false\n ) &&\n (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n )\n );\n const canFullscreenVideo = !!(\n fullscreenVideo.webkitSupportsFullscreen ||\n fullscreenVideo.webkitEnterFullscreen ||\n fullscreenVideo.webkitEnterFullScreen\n );\n\n return !!(fullscreenEnabled && (canFullscreenPlayer || canFullscreenVideo));\n}\n\nexport function requestPlayerFullscreen(player: HTMLElement): Promise<void> {\n const fullscreenPlayer = player as FullscreenPlayer;\n const requestFullscreen = (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n );\n\n return Promise.resolve(requestFullscreen?.call(fullscreenPlayer));\n}\n\nexport function canRequestPlayerFullscreen(player: HTMLElement): boolean {\n const fullscreenPlayer = player as FullscreenPlayer;\n\n return (\n typeof fullscreenPlayer.requestFullscreen === 'function' ||\n typeof fullscreenPlayer.webkitRequestFullscreen === 'function' ||\n typeof fullscreenPlayer.mozRequestFullScreen === 'function' ||\n typeof fullscreenPlayer.msRequestFullscreen === 'function'\n );\n}\n\nexport function requestVideoFullscreen(video: HTMLVideoElement): void {\n const fullscreenVideo = video as FullscreenVideo;\n const requestFullscreen = fullscreenVideo.webkitEnterFullscreen || fullscreenVideo.webkitEnterFullScreen;\n\n requestFullscreen?.call(fullscreenVideo);\n}\n\nexport function exitFullscreen(): Promise<void> {\n const fullscreenDocument = document as FullscreenDocument;\n const exitFullscreen = (\n document.exitFullscreen ||\n fullscreenDocument.webkitExitFullscreen ||\n fullscreenDocument.mozCancelFullScreen ||\n fullscreenDocument.msExitFullscreen\n );\n\n return Promise.resolve(exitFullscreen?.call(fullscreenDocument));\n}\n","export function formatVideoTime(time: number): string {\n if (!Number.isFinite(time) || time < 0) return '0:00';\n\n const totalSeconds = Math.floor(time);\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n\n if (hours > 0) {\n return hours + ':' + String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0');\n }\n\n return minutes + ':' + String(seconds).padStart(2, '0');\n}\n\nexport function detectAudioAvailability(video: HTMLVideoElement, fallback: boolean): boolean {\n const audioTrackVideo = video as HTMLVideoElement & { audioTracks?: { length: number } };\n if (audioTrackVideo.audioTracks && typeof audioTrackVideo.audioTracks.length === 'number') {\n return audioTrackVideo.audioTracks.length > 0;\n }\n\n const firefoxVideo = video as HTMLVideoElement & { mozHasAudio?: boolean };\n if (typeof firefoxVideo.mozHasAudio === 'boolean') {\n return firefoxVideo.mozHasAudio;\n }\n\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n if (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n !video.muted &&\n video.currentTime > 0.25\n ) {\n return webkitVideo.webkitAudioDecodedByteCount > 0;\n }\n\n return fallback;\n}\n","import type { ProgressMetrics } from './types';\n\nexport function getProgressMetrics(rect: DOMRect): ProgressMetrics {\n const sideInset = Math.min(2, Math.max(0, rect.width / 2));\n const innerWidth = Math.max(1, rect.width - (sideInset * 2));\n\n return { rect, sideInset, innerWidth };\n}\n\nexport function getProgressXFromPercent(percent: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n const clampedPercent = Math.min(1, Math.max(0, percent));\n\n return sideInset + (clampedPercent * innerWidth);\n}\n\nexport function getProgressPercentFromClientX(clientX: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n\n return Math.min(1, Math.max(0, (clientX - rect.left - sideInset) / innerWidth));\n}\n","import { DEFAULT_ASPECT_RATIO } from './constants';\n\nexport const styles: string = `\n :host {\n --simple-player-aspect-ratio: ${DEFAULT_ASPECT_RATIO};\n --space: 4px;\n --white: #fff;\n --black: #000;\n --white-rgb: 255 255 255;\n --overlay-soft: rgb(0 0 0 / 0.42);\n --overlay-blur: 0px;\n --sp-glass-surface: rgb(255 255 255 / 0.04);\n --sp-glass-opacity: 0.28;\n --sp-control-glass-surface: rgb(255 255 255 / 0.12);\n --sp-control-glass-opacity: 0.62;\n --sp-control-hover-surface: rgb(255 255 255 / 0.14);\n --sp-glass-filter: invert(1) grayscale(1);\n --sp-shimmer-highlight: rgb(255 255 255 / 0.42);\n --sp-control-tray-display: block;\n --sp-enabled-controls-count: 3;\n --sp-control-tray-width: 0px;\n --sp-control-tray-expanded-width: calc((var(--sp-control-slot-size) * var(--sp-enabled-controls-count)) + (var(--sp-control-tray-padding) * 2));\n --sp-control-tray-gap: 0px;\n --sp-control-icon-size: 20px;\n --sp-control-icon-render-size: 20px;\n --sp-control-icon-opacity: 0.82;\n --sp-control-icon-hidden-opacity: 0;\n --sp-control-icon-hidden-transform: translateY(2px) scale(0.84);\n --sp-control-icon-hover-opacity: 0.96;\n --sp-control-icon-stroke-width: 1.6;\n --sp-control-icon-delay-1: 30ms;\n --sp-control-icon-delay-2: 55ms;\n --sp-control-icon-delay-3: 80ms;\n --sp-control-hover-opacity: 1;\n --sp-control-slot-hover-surface: transparent;\n --sp-control-tray-padding: 2px;\n --sp-control-slot-size: calc(var(--sp-control-icon-size) + 4px);\n --sp-touch-control-hover-offset: -9999px;\n --sp-volume-level: 100%;\n\n position: relative;\n display: block;\n width: 100%;\n aspect-ratio: var(--simple-player-aspect-ratio);\n isolation: isolate;\n overflow: hidden;\n contain: paint;\n background: #1E1E1E;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n .sp-video {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n object-fit: cover;\n }\n\n .sp-asset {\n pointer-events: none;\n opacity: 0;\n transition: opacity 160ms ease;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n -webkit-touch-callout: none;\n }\n\n .sp-player.has-visible-frame .sp-asset {\n opacity: 1;\n }\n\n .sp-player {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n min-width: 100%;\n min-height: 100%;\n overflow: hidden;\n --sp-progress-inset: 100%;\n --sp-scrub-preview-left: 0px;\n --sp-return-marker-left: 0px;\n --sp-return-marker-base-opacity: 1;\n --sp-return-marker-hole-left: -9999px;\n user-select: none;\n -webkit-user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-player:fullscreen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-player:-webkit-full-screen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-color: var(--overlay-soft);\n backdrop-filter: blur(var(--overlay-blur));\n -webkit-backdrop-filter: blur(var(--overlay-blur));\n opacity: 0;\n transition: opacity 260ms ease;\n transform: translateZ(0);\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-controls-visible .sp-overlay,\n :host(:hover) .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay {\n opacity: 0;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 3;\n display: grid;\n place-items: center;\n width: 60px;\n height: 60px;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: var(--white);\n background: transparent;\n cursor: pointer;\n opacity: 0;\n pointer-events: none;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 260ms ease, transform 260ms cubic-bezier(0.23, 1, 0.32, 1);\n -webkit-tap-highlight-color: transparent;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-controls-visible .sp-button,\n :host(:hover) .sp-button {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button:focus {\n outline: 0;\n }\n\n .sp-icon {\n grid-area: 1 / 1;\n position: relative;\n z-index: 1;\n display: block;\n overflow: visible;\n transition: opacity 160ms ease, transform 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-icon--play {\n width: 54px;\n height: 60px;\n opacity: 1;\n transform: translate(4px, 0) rotate(0deg) scale(1);\n }\n\n .sp-icon--pause {\n width: 54px;\n height: 60px;\n opacity: 0;\n transform: translate(0, 0) rotate(-70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--play {\n opacity: 0;\n transform: translate(4px, 0) rotate(70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--pause {\n opacity: 1;\n transform: translate(0, 0) rotate(0deg) scale(1);\n }\n\n .sp-progress-cluster {\n position: absolute;\n top: calc(100% - 28px);\n left: 50%;\n z-index: 4;\n display: block;\n width: calc(100% - (var(--space) * 8));\n height: 28px;\n --sp-progress-height: 4px;\n transform: translateX(-50%);\n transition:\n top 360ms cubic-bezier(0.23, 1, 0.32, 1),\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n transform 360ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-progress {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n height: 28px;\n cursor: pointer;\n touch-action: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster {\n top: 50%;\n left: 50%;\n width: min(148px, calc(100% - (var(--space) * 12)));\n height: 20px;\n --sp-progress-height: 4px;\n transform: translate(-50%, -50%);\n }\n\n .sp-progress-surface,\n .sp-progress-fill {\n position: absolute;\n bottom: calc(var(--space) * 2);\n left: 0;\n height: var(--sp-progress-height);\n border-radius: 3px;\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-progress-surface {\n right: 0;\n bottom: calc((var(--space) * 2) - 2px);\n z-index: 0;\n height: calc(var(--sp-progress-height) + 4px);\n border-radius: 5px;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n }\n\n .sp-progress-surface::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n border-radius: inherit;\n background: linear-gradient(90deg, transparent 0%, var(--sp-shimmer-highlight) 46%, transparent 100%);\n transform: translateX(-120%);\n }\n\n .sp-player.is-loading .sp-progress-surface::after {\n opacity: 1;\n animation: sp-progress-shimmer 1.35s ease-in-out infinite;\n }\n\n .sp-player.is-loading.has-loaded-once .sp-progress-surface {\n opacity: 0.48;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-surface {\n background: rgb(255 255 255 / 0.08);\n opacity: 1;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-fill,\n .sp-player.is-progress-settling .sp-progress-fill {\n opacity: 0;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover),\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-control-tray {\n position: absolute;\n display: var(--sp-control-tray-display);\n right: 0;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n z-index: 3;\n width: var(--sp-control-tray-expanded-width);\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: right bottom;\n transition:\n bottom 180ms ease,\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-pointer-active .sp-control-tray,\n .sp-player.is-controls-visible .sp-control-tray,\n :host(:hover) .sp-control-tray {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n opacity: var(--sp-control-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-control-tray-slots {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 0;\n height: 100%;\n box-sizing: border-box;\n padding: var(--sp-control-tray-padding);\n border-radius: 5px;\n overflow: visible;\n opacity: 1;\n transition: height 180ms ease;\n }\n\n .sp-control-tray-slots::before {\n content: '';\n position: absolute;\n top: var(--sp-control-tray-padding);\n left: var(--sp-control-tray-padding);\n z-index: 0;\n width: var(--sp-control-slot-size);\n height: var(--sp-control-slot-size);\n border-radius: 3px;\n background: var(--sp-control-hover-surface);\n opacity: 0;\n pointer-events: none;\n transform: translateX(var(--sp-control-hover-offset, 0px));\n transition:\n opacity 120ms ease,\n transform 240ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: var(--sp-control-hover-opacity);\n transition:\n opacity 80ms ease 120ms,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n transform: translateX(var(--sp-touch-control-hover-offset));\n transition:\n opacity 80ms ease,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:not(:has(.sp-control-button:hover))::before {\n transition:\n opacity 100ms ease,\n transform 0ms linear 100ms;\n }\n\n .sp-control-button {\n position: relative;\n z-index: 1;\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n aspect-ratio: 1 / 1;\n width: var(--sp-control-slot-size);\n min-width: 0;\n height: var(--sp-control-slot-size);\n border: 0;\n border-radius: 3px;\n color: var(--white);\n background: transparent;\n padding: 0;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n }\n\n .sp-control-button:focus {\n outline: 0;\n }\n\n .sp-control-button:hover {\n background: var(--sp-control-slot-hover-surface);\n }\n\n .sp-player:not(.has-volume-control) [data-sp-volume-control],\n .sp-player:not(.has-picture-in-picture-control) [data-sp-picture-in-picture-control],\n .sp-player:not(.has-fullscreen-control) [data-sp-fullscreen-control] {\n display: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control] {\n cursor: default;\n pointer-events: none;\n }\n\n .sp-player.is-volume-unavailable .sp-volume-icon {\n transition: none;\n }\n\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control]:hover)::before,\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control].is-control-tap-active)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-icon {\n display: block;\n width: var(--sp-control-icon-render-size);\n height: var(--sp-control-icon-render-size);\n color: currentColor;\n overflow: visible;\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n transition:\n opacity 180ms ease,\n transform 280ms cubic-bezier(0.18, 0.9, 0.22, 1);\n transition-delay: 0ms;\n }\n\n .sp-control-icon [stroke] {\n stroke-width: var(--sp-control-icon-stroke-width);\n }\n\n .sp-volume-icon,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: none;\n }\n\n .sp-player.is-volume-sound .sp-volume-icon--sound,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: block;\n }\n\n .sp-player.is-volume-icon-animating .sp-volume-icon {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-popover {\n position: absolute;\n left: 0;\n bottom: calc(var(--sp-control-slot-size) + var(--sp-control-tray-padding) + 4px);\n z-index: -1;\n display: grid;\n place-items: center;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(8px) scale(0.98);\n transform-origin: center bottom;\n transition:\n opacity 140ms ease,\n filter 180ms ease,\n transform 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-slot::after {\n content: '';\n position: absolute;\n right: 0;\n bottom: 100%;\n left: 0;\n height: calc(var(--sp-control-tray-padding) + 4px);\n z-index: 5;\n pointer-events: auto;\n }\n\n .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-volume-popover.is-scrubbing-volume {\n z-index: 4;\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n transition:\n opacity 150ms ease,\n filter 220ms ease,\n transform 260ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-volume-unavailable .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player:not(.has-volume-slider-control) .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player.is-volume-unavailable .sp-volume-popover.is-scrubbing-volume {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-volume-track {\n position: relative;\n z-index: 1;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n overflow: hidden;\n touch-action: none;\n cursor: ns-resize;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n }\n\n .sp-volume-fill {\n position: absolute;\n right: 2px;\n bottom: 2px;\n left: 2px;\n height: max(0px, calc(var(--sp-volume-level) - 4px));\n min-height: 0;\n border-radius: 3px;\n background: var(--white);\n opacity: 1;\n transition: height 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-fullscreen-icon,\n .sp-player.is-fullscreen .sp-fullscreen-icon--enter,\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--exit {\n display: none;\n }\n\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--enter,\n .sp-player.is-fullscreen .sp-fullscreen-icon--exit {\n display: block;\n }\n\n .sp-player.is-pointer-active .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-icon,\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(1) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(1) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(1) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(2) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(2) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(2) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-2);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(3) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(3) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(3) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-3);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-control-tray,\n .sp-player.is-progress-settling .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n }\n\n .sp-player.has-controls-collision .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(1.4px);\n transform: translateY(-2px) scale(0.985);\n }\n\n .sp-progress-fill {\n display: block;\n z-index: 1;\n left: 2px;\n right: 2px;\n background: var(--white);\n border-radius: 3px;\n clip-path: inset(0 var(--sp-progress-inset) 0 0 round 3px);\n -webkit-mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n mask-composite: exclude;\n transform: translateZ(0);\n will-change: clip-path;\n }\n\n .sp-progress-marker {\n position: absolute;\n bottom: calc((var(--space) * 2) + 1.5px);\n left: clamp(1px, var(--sp-return-marker-left), calc(100% - 1px));\n z-index: 2;\n width: 2px;\n height: max(1px, calc(var(--sp-progress-height) - 3px));\n border-radius: 2px;\n background: rgb(var(--white-rgb) / calc(var(--sp-return-marker-base-opacity) * 0.58));\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n transform: translateX(-50%) translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-player.is-scrubbing.has-return-marker .sp-progress-marker {\n opacity: 1;\n }\n\n .sp-time {\n position: absolute;\n display: block;\n bottom: calc(100% + var(--space));\n left: var(--sp-scrub-preview-left);\n z-index: 2;\n padding: 2px calc(var(--space) * 1.5);\n color: var(--white);\n background: transparent;\n border-radius: 4px;\n isolation: isolate;\n overflow: hidden;\n pointer-events: none;\n opacity: 0;\n transition: transform 120ms ease;\n transform: translateX(-50%) translateY(2px);\n white-space: nowrap;\n font: 500 12px/1.35 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-time-surface {\n position: absolute;\n inset: 0;\n z-index: 0;\n border-radius: inherit;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n will-change: backdrop-filter, opacity;\n }\n\n .sp-time-text {\n position: relative;\n z-index: 1;\n }\n\n .sp-progress:hover .sp-time,\n .sp-player.is-progress-hovering .sp-time,\n .sp-player.is-scrubbing .sp-time {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .sp-player.has-pinned-time .sp-time {\n display: none !important;\n }\n\n .sp-tray-time {\n position: absolute;\n display: none;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n left: 0;\n z-index: 3;\n color: var(--white);\n isolation: isolate;\n overflow: visible;\n pointer-events: none;\n white-space: nowrap;\n opacity: 0;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: left bottom;\n transition:\n bottom 180ms ease,\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.has-pinned-time .sp-tray-time {\n display: block;\n }\n\n .sp-player.has-pinned-time.is-pointer-active .sp-tray-time,\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time,\n :host(:hover) .sp-player.has-pinned-time .sp-tray-time {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-tray-time-holder {\n position: relative;\n right: auto;\n bottom: auto;\n width: var(--sp-tray-time-width, max-content);\n transition: width 240ms cubic-bezier(0.23, 1, 0.32, 1);\n overflow: hidden;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots {\n position: relative;\n width: max-content;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots::before {\n width: calc(100% - (var(--sp-control-tray-padding) * 2));\n }\n\n .sp-tray-time-holder .sp-tray-time-text {\n aspect-ratio: auto;\n min-width: max-content;\n width: auto;\n height: var(--sp-control-slot-size);\n max-height: var(--sp-control-slot-size);\n padding: 0 8px;\n font: 600 13px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-tray-time-text {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .sp-tray-time-text.is-time-animating {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-tray-time {\n opacity: 0;\n }\n\n .sp-button:focus-visible,\n .sp-progress:focus-visible,\n .sp-control-button:focus-visible,\n .sp-volume-track:focus-visible {\n outline: 2px solid rgb(255 255 255 / 0.92);\n outline-offset: 3px;\n box-shadow: 0 0 0 5px rgb(0 0 0 / 0.32);\n }\n\n @media (max-width: 768px) and (hover: none) and (pointer: coarse) {\n .sp-overlay,\n .sp-button {\n transition-duration: 340ms;\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n opacity: 0;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n transform: translate(-50%, -50%) scale(0.96);\n }\n\n .sp-player.is-controls-visible .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button,\n .sp-player.is-scrubbing .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time {\n opacity: 1;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n :host(:hover) .sp-overlay,\n :host(:hover) .sp-button,\n :host(:hover) .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n }\n\n .sp-player.is-controls-visible .sp-overlay,\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n pointer-events: auto;\n }\n\n .sp-player.is-controls-visible .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes sp-progress-shimmer {\n 0% {\n transform: translateX(-120%);\n }\n\n 58%,\n 100% {\n transform: translateX(120%);\n }\n }\n\n @keyframes sp-volume-icon-swap {\n 0% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n 42% {\n filter: blur(1.2px);\n transform: translateY(0) scale(0.9);\n }\n\n 100% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n }\n`;\n","import { styles } from './styles';\n\nexport const template = document.createElement('template');\ntemplate.innerHTML = `\n <style>${styles}</style>\n <div class=\"sp-player is-loading\" data-sp-player>\n <video\n class=\"sp-video sp-asset\"\n autoplay\n muted\n playsinline\n loop\n preload=\"none\"\n controlslist=\"nodownload nofullscreen noremoteplayback\"\n disableRemotePlayback\n data-sp-video>\n </video>\n <span class=\"sp-overlay\" aria-hidden=\"true\"></span>\n <button class=\"sp-button\" type=\"button\" aria-label=\"Play video\" data-sp-button>\n <svg class=\"sp-icon sp-icon--play\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <path d=\"M3 3.5L15 10L3 16.5Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-icon sp-icon--pause\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n <rect x=\"10\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n </svg>\n </button>\n <div class=\"sp-progress-cluster\">\n <div class=\"sp-progress\" aria-label=\"Video progress\" role=\"slider\" tabindex=\"0\" data-sp-progress-track>\n <span class=\"sp-progress-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time\" data-sp-time>\n <span class=\"sp-time-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time-text\" data-sp-time-text>0:00</span>\n </span>\n <span class=\"sp-progress-fill\" data-sp-progress></span>\n <span class=\"sp-progress-marker\" aria-hidden=\"true\"></span>\n </div>\n <span class=\"sp-tray-time\" data-sp-tray-time>\n <span class=\"sp-control-tray sp-tray-time-holder\">\n <span class=\"sp-control-tray-slots\">\n <button class=\"sp-control-button sp-tray-time-text\" type=\"button\" tabindex=\"-1\" data-sp-tray-time-text>0:00</button>\n </span>\n </span>\n </span>\n <span class=\"sp-control-tray\" data-sp-control-tray>\n <span class=\"sp-control-tray-slots\" data-sp-control-tray-slots>\n <button class=\"sp-control-button sp-volume-slot\" type=\"button\" aria-label=\"Toggle sound\" data-sp-volume-control>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--sound\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 7.00002H5C3.8954 7.00002 3 7.89542 3 9.00002V11C3 12.1046 3.8954 13 5 13H8L12.5227 16.7689C13.1093 17.2578 14 16.8406 14 16.077V3.92302C14 3.15942 13.1094 2.74222 12.5227 3.23112L8 7.00002Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17.4141 8.58582C18.1951 9.36682 18.1951 10.6332 17.4141 11.4142\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--muted\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M3 17L17 3\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M15 16.0773C14.9998 17.6883 13.1207 18.5686 11.8828 17.5372L9.8333 15.8303C9.38114 15.4538 9.35003 14.7702 9.76611 14.3541C10.132 13.9882 10.7165 13.9617 11.114 14.2929L13 15.8644V11.5354C13 11.2702 13.1054 11.0158 13.2929 10.8283C13.9229 10.1983 15 10.6445 15 11.5354V16.0773Z\" fill=\"currentColor\"></path>\n <path d=\"M12 2.37218C13.2358 1.48685 15 2.36173 15 3.92296V4.87902L13 6.87902V4.13488L8.64062 7.76867C8.46092 7.91841 8.23392 8.00011 8 8.00011H5C4.44768 8.00011 4 8.4478 4 9.00011V11.0001C4.00009 11.5524 4.44774 12.0001 5 12.0001H7.87891L5.87891 14.0001H5C3.34317 14.0001 2.00009 12.6569 2 11.0001V9.00011C2 7.34323 3.34312 6.00011 5 6.00011H7.63672L11.8828 2.463L12 2.37218Z\" fill=\"currentColor\"></path>\n </svg>\n <span class=\"sp-volume-popover\" data-sp-volume-popover>\n <span class=\"sp-volume-track\" role=\"slider\" aria-label=\"Volume\" aria-valuemin=\"0\" aria-valuemax=\"100\" tabindex=\"0\" data-sp-volume-track>\n <span class=\"sp-volume-fill\" data-sp-volume-fill></span>\n </span>\n </span>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Picture in picture\" data-sp-picture-in-picture-control>\n <svg class=\"sp-control-icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m5.5,13c-1.381,0-2.5-1.119-2.5-2.5v-5c0-1.381,1.119-2.5,2.5-2.5h7c1.381,0,2.5,1.119,2.5,2.5v2.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></path>\n <rect x=\"9\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" ry=\"1.5\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></rect>\n <line x1=\"8\" y1=\"8\" x2=\"6\" y2=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></line>\n <polygon points=\"9 6 9 9 6 9 9 6\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></polygon>\n </svg>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Enter fullscreen\" data-sp-fullscreen-control>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--enter\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"12.5 16 16 16 16 12.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"16\" y1=\"16\" x2=\"12\" y2=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"7.5 4 4 4 4 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"4\" y1=\"4\" x2=\"8\" y2=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--exit\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"16 12.5 12.5 12.5 12.5 16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"12\" y1=\"12\" x2=\"16\" y2=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"4 7.5 7.5 7.5 7.5 4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n </button>\n </span>\n </span>\n </div>\n </div>\n`;\n","import { DEFAULT_ASPECT_RATIO, DEFAULT_PRELOAD_MARGIN, OBSERVED_ATTRIBUTES } from './constants';\nimport {\n canRequestPlayerFullscreen,\n exitFullscreen,\n getFullscreenElement,\n isFullscreenSupported,\n requestPlayerFullscreen,\n requestVideoFullscreen,\n} from './fullscreen';\nimport { detectAudioAvailability, formatVideoTime } from './media';\nimport { getProgressMetrics, getProgressPercentFromClientX, getProgressXFromPercent } from './progress';\nimport { template } from './template';\nimport type { Cleanup, PlaybackState } from './types';\n\nexport class SimplePlayer extends HTMLElement {\n static observedAttributes = OBSERVED_ATTRIBUTES;\n\n #root: ShadowRoot;\n #cleanup: Cleanup[] = [];\n #observer: IntersectionObserver | null = null;\n #initialized = false;\n #videoSourceLoaded = false;\n #player!: HTMLElement;\n #video!: HTMLVideoElement;\n #button!: HTMLButtonElement;\n #progressTrack!: HTMLElement;\n #controlTray!: HTMLElement;\n #controlTraySlots!: HTMLElement;\n #trayTime!: HTMLElement;\n #trayTimeText!: HTMLElement;\n #scrubTime!: HTMLElement;\n #scrubTimeText!: HTMLElement;\n #volumeControl!: HTMLButtonElement;\n #volumePopover!: HTMLElement;\n #volumeTrack!: HTMLElement;\n #pictureInPictureControl!: HTMLButtonElement;\n #fullscreenControl!: HTMLButtonElement;\n #controlButtons: HTMLButtonElement[] = [];\n\n #progressFrame = 0;\n #isScrubbing = false;\n #isTrackingScrub = false;\n #scrubWasPlaying = false;\n #scrubTargetTime = 0;\n #scrubReturnTime = 0;\n #scrubReturnPercent = 0;\n #hasScrubReturnMarker = false;\n #isCommittedScrubPending = false;\n #committedScrubWasPlaying = false;\n #scrubStartX = 0;\n #scrubLongPressTimer = 0;\n #activeScrubPointerId: number | null = null;\n #optimisticPlaybackState: PlaybackState = null;\n #videoLoadAttempt = 0;\n #videoRetryTimer = 0;\n #controlsHideTimer = 0;\n #loadingStateTimer = 0;\n #initialProgressSettleTimer = 0;\n #suppressTouchButtonClickUntil = 0;\n #suppressTouchControlClickUntil = 0;\n #timeWidthObserver: ResizeObserver | null = null;\n #hasDecodedFirstFrame = false;\n #hasPresentedFirstFrame = false;\n #firstFrameRequestPending = false;\n #firstFramePresentationPending = false;\n #firstFrameRequestToken = 0;\n #firstFrameFallbackTimer = 0;\n #hasInitialProgressSettled = false;\n #initialProgressEstimateUnlockAt = 0;\n #isPlaybackBuffering = true;\n #visualProgressTime = 0;\n #visualProgressUpdatedAt = performance.now();\n #lastRenderedProgressTime = 0;\n #pausedVisualProgressTime: number | null = null;\n #pauseFrozenProgressPercent: number | null = null;\n #hasControlsCollision = false;\n #isProgressHoverPreviewing = false;\n #hasAudioTrack = true;\n #isPointerOverControlSurface = false;\n #lastPointerClientX: number | null = null;\n #lastPointerClientY: number | null = null;\n #lastPointerWasTouch = false;\n #isVolumeScrubbing = false;\n #isVolumeHovering = false;\n #activeVolumePointerId: number | null = null;\n #volumeCloseTimer = 0;\n #volumeIconAnimationTimer = 0;\n #controlTapTimer = 0;\n #volumeIconState: 'sound' | 'muted' | null = null;\n #showRemainingTime = false;\n #timeAnimationTimer = 0;\n\n readonly #scrubDragThreshold = 4;\n readonly #scrubSnapDistance = 3.5;\n readonly #scrubReturnMarkerBodyInset = 6;\n readonly #scrubReturnMarkerMinTime = 0.08;\n readonly #scrubLongPressDelay = 240;\n readonly #controlsAutoHideDelay = 1200;\n readonly #pointerControlsIdleDelay = 1600;\n readonly #loadingStateDelay = 140;\n readonly #initialProgressSettleDelay = 380;\n readonly #initialProgressEstimateHold = 650;\n readonly #videoRetryDelay = 2000;\n readonly #maxVideoLoadAttempts = 3;\n readonly #bufferedAheadTarget = 10;\n readonly #bufferedRangeFuzz = 0.18;\n readonly #controlsCollisionEnterMargin = 8;\n readonly #controlsCollisionExitMargin = 18;\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n this.#root.append(template.content.cloneNode(true));\n }\n\n get src() {\n return this.getAttribute('src') ?? '';\n }\n\n set src(value: string) {\n this.#setStringAttribute('src', value);\n }\n\n get aspectRatio() {\n return this.getAttribute('aspect-ratio') || DEFAULT_ASPECT_RATIO;\n }\n\n set aspectRatio(value: string) {\n this.#setStringAttribute('aspect-ratio', value);\n }\n\n get preloadMargin() {\n return this.getAttribute('preload-margin') || DEFAULT_PRELOAD_MARGIN;\n }\n\n set preloadMargin(value: string) {\n this.#setStringAttribute('preload-margin', value);\n }\n\n get autoplayEnabled() {\n return !this.hasAttribute('disable-autoplay') && !this.hasAttribute('no-autoplay');\n }\n\n set autoplayEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-autoplay');\n this.removeAttribute('no-autoplay');\n return;\n }\n\n this.setAttribute('disable-autoplay', '');\n }\n\n get controlsEnabled() {\n return this.hasAttribute('controls');\n }\n\n set controlsEnabled(value: boolean) {\n if (value) {\n this.setAttribute('controls', '');\n return;\n }\n\n this.removeAttribute('controls');\n }\n\n get timeVisible() {\n return this.hasAttribute('show-time');\n }\n\n set timeVisible(value: boolean) {\n if (value) {\n this.setAttribute('show-time', '');\n return;\n }\n\n this.removeAttribute('show-time');\n }\n\n get volumeEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-volume') &&\n !this.hasAttribute('no-volume')\n );\n }\n\n set volumeEnabled(value: boolean) {\n this.#setOptionalControlAttributes('volume', value);\n }\n\n get volumeSliderEnabled() {\n return !this.hasAttribute('disable-volume-slider') && !this.hasAttribute('no-volume-slider');\n }\n\n set volumeSliderEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-volume-slider');\n this.removeAttribute('no-volume-slider');\n return;\n }\n\n this.setAttribute('disable-volume-slider', '');\n }\n\n get pictureInPictureEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-picture-in-picture') &&\n !this.hasAttribute('no-picture-in-picture')\n );\n }\n\n set pictureInPictureEnabled(value: boolean) {\n this.#setOptionalControlAttributes('picture-in-picture', value);\n }\n\n get fullscreenEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-fullscreen') &&\n !this.hasAttribute('no-fullscreen')\n );\n }\n\n set fullscreenEnabled(value: boolean) {\n this.#setOptionalControlAttributes('fullscreen', value);\n }\n\n connectedCallback() {\n this.#player = this.#root.querySelector('[data-sp-player]')!;\n this.#video = this.#root.querySelector('[data-sp-video]')!;\n this.#button = this.#root.querySelector('[data-sp-button]')!;\n this.#progressTrack = this.#root.querySelector('[data-sp-progress-track]')!;\n this.#controlTray = this.#root.querySelector('[data-sp-control-tray]')!;\n this.#controlTraySlots = this.#root.querySelector('[data-sp-control-tray-slots]')!;\n this.#trayTime = this.#root.querySelector('[data-sp-tray-time]')!;\n this.#trayTimeText = this.#root.querySelector('[data-sp-tray-time-text]')!;\n this.#scrubTime = this.#root.querySelector('[data-sp-time]')!;\n this.#scrubTimeText = this.#root.querySelector('[data-sp-time-text]')!;\n this.#volumeControl = this.#root.querySelector('[data-sp-volume-control]')!;\n this.#volumePopover = this.#root.querySelector('[data-sp-volume-popover]')!;\n this.#volumeTrack = this.#root.querySelector('[data-sp-volume-track]')!;\n this.#pictureInPictureControl = this.#root.querySelector('[data-sp-picture-in-picture-control]')!;\n this.#fullscreenControl = this.#root.querySelector('[data-sp-fullscreen-control]')!;\n this.#controlButtons = [this.#volumeControl, this.#pictureInPictureControl, this.#fullscreenControl];\n this.#syncAspectRatio();\n\n if (!this.#initialized) {\n this.#bindEvents();\n this.#initialized = true;\n }\n\n this.#syncAutoplayState();\n this.#setupLazyLoading();\n this.#syncOptionalControls();\n this.#syncTimeVisibility();\n this.#syncVideoLoading();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncVideoState();\n }\n\n disconnectedCallback() {\n this.#observer?.disconnect();\n this.#observer = null;\n this.#cleanup.forEach((cleanup) => cleanup());\n this.#cleanup = [];\n this.#initialized = false;\n this.#clearControlsHideTimer();\n this.#clearLoadingStateTimer();\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#clearScrubLongPressTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#clearVolumeCloseTimer();\n this.#clearVolumeIconAnimationTimer();\n this.#clearControlTapTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.style.removeProperty('--sp-touch-control-hover-offset');\n this.#clearControlsCollision();\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#isPointerOverControlSurface = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open');\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.#player.classList.remove('is-pointer-active');\n this.#stopProgressLoop();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n\n if (name === 'aspect-ratio') {\n this.#syncAspectRatio();\n return;\n }\n\n if (name === 'preload-margin' && this.isConnected) {\n this.#observer?.disconnect();\n this.#setupLazyLoading();\n return;\n }\n\n if (name === 'src' && this.isConnected) {\n this.#resetSource();\n this.#setupLazyLoading();\n return;\n }\n\n if ((name === 'disable-autoplay' || name === 'no-autoplay') && this.isConnected) {\n this.#syncAutoplayState();\n this.#syncAudioControlState();\n this.#syncVideoState();\n return;\n }\n\n if (name === 'show-time' && this.isConnected) {\n this.#syncTimeVisibility();\n return;\n }\n\n if (\n (\n name === 'controls' ||\n name.startsWith('enable-') ||\n name.startsWith('disable-') ||\n name.startsWith('no-')\n ) &&\n this.isConnected\n ) {\n this.#syncOptionalControls();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncTimeVisibility();\n }\n }\n\n #setStringAttribute(name: string, value: string) {\n if (value === '') {\n this.removeAttribute(name);\n return;\n }\n\n this.setAttribute(name, value);\n }\n\n #setOptionalControlAttributes(name: 'volume' | 'picture-in-picture' | 'fullscreen', enabled: boolean) {\n if (enabled) {\n this.setAttribute(`enable-${name}`, '');\n this.removeAttribute(`disable-${name}`);\n this.removeAttribute(`no-${name}`);\n return;\n }\n\n this.removeAttribute(`enable-${name}`);\n this.setAttribute(`disable-${name}`, '');\n }\n\n #syncAspectRatio() {\n this.style.setProperty('--simple-player-aspect-ratio', this.aspectRatio);\n }\n\n #syncAutoplayState() {\n if (!this.#video) return;\n\n const isEnabled = this.autoplayEnabled;\n this.#video.autoplay = isEnabled;\n\n if (isEnabled) {\n this.#video.muted = true;\n this.#video.setAttribute('autoplay', '');\n this.#video.setAttribute('muted', '');\n return;\n }\n\n this.#video.removeAttribute('autoplay');\n\n if (!this.#videoSourceLoaded) {\n this.#video.muted = false;\n this.#video.removeAttribute('muted');\n }\n }\n\n #syncOptionalControls() {\n if (!this.#player) return;\n\n const controls = [\n { button: this.#volumeControl, enabled: this.volumeEnabled, className: 'has-volume-control' },\n { button: this.#pictureInPictureControl, enabled: this.pictureInPictureEnabled, className: 'has-picture-in-picture-control' },\n { button: this.#fullscreenControl, enabled: this.fullscreenEnabled, className: 'has-fullscreen-control' },\n ];\n\n let index = 0;\n for (const control of controls) {\n this.#player.classList.toggle(control.className, control.enabled);\n control.button.hidden = !control.enabled;\n\n if (control.enabled) {\n control.button.dataset.spControlIndex = `${index}`;\n index += 1;\n } else {\n delete control.button.dataset.spControlIndex;\n }\n }\n\n this.style.setProperty('--sp-enabled-controls-count', `${index}`);\n this.style.setProperty('--sp-control-tray-display', index > 0 ? 'block' : 'none');\n this.#player.classList.toggle('has-volume-slider-control', this.volumeEnabled && this.volumeSliderEnabled);\n\n if (!this.volumeEnabled || !this.volumeSliderEnabled) {\n this.#closeVolumePopover();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n }\n\n get #hasPinnedTime() {\n return this.timeVisible && this.controlsEnabled;\n }\n\n #syncTimeVisibility() {\n if (!this.#player) return;\n\n this.#player.classList.toggle('has-pinned-time', this.#hasPinnedTime);\n if (this.#hasPinnedTime) {\n this.#syncPinnedTimeText();\n }\n }\n\n #bindEvents() {\n this.#listen(this.#button, 'click', this.#handleButtonClick);\n this.#listen(this, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#button, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#button, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleProgressPointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleProgressPointerLeave);\n this.#listen(this.#controlTray, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#controlTray, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#root, 'focusin', this.#handleControlSurfaceFocusIn);\n this.#listen(this.#root, 'focusout', this.#handleControlSurfaceFocusOut);\n this.#listen(this.#player, 'pointerdown', this.#handlePlayerPointerDown);\n this.#listen(this.#player, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#player, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#progressTrack, 'pointerdown', this.#handleProgressPointerDown);\n this.#listen(this.#progressTrack, 'pointermove', this.#handleProgressPointerMove);\n this.#listen(this.#progressTrack, 'pointerup', this.#handleProgressPointerUp);\n this.#listen(this.#progressTrack, 'pointercancel', this.#handleProgressPointerCancel);\n this.#listen(this.#progressTrack, 'keydown', this.#handleProgressKeyDown);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeControl, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumePopover, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeTrack, 'pointerdown', this.#handleVolumePointerDown);\n this.#listen(this.#volumeTrack, 'pointermove', this.#handleVolumePointerMove);\n this.#listen(this.#volumeTrack, 'pointerup', this.#handleVolumePointerUp);\n this.#listen(this.#volumeTrack, 'pointercancel', this.#handleVolumePointerCancel);\n this.#listen(this.#volumeTrack, 'click', this.#preventVolumeTrackClick);\n this.#listen(this.#volumeTrack, 'keydown', this.#handleVolumeKeyDown);\n this.#listen(this.#pictureInPictureControl, 'click', this.#handlePictureInPictureClick);\n this.#listen(this.#fullscreenControl, 'click', this.#handleFullscreenClick);\n this.#listen(this.#trayTimeText, 'click', this.#handleTimeToggleClick);\n for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'mouseenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\n }\n\n if ('ResizeObserver' in window) {\n this.#timeWidthObserver = new ResizeObserver(() => {\n this.#player.style.setProperty('--sp-tray-time-width', `${this.#trayTimeText.offsetWidth + 4}px`);\n });\n this.#timeWidthObserver.observe(this.#trayTimeText);\n this.#cleanup.push(() => {\n this.#timeWidthObserver?.disconnect();\n this.#timeWidthObserver = null;\n });\n }\n\n this.#listen(document, 'pointerup', this.#handleDocumentPointerUp);\n this.#listen(document, 'pointercancel', this.#handleDocumentPointerCancel);\n this.#listen(document, 'pointermove', this.#handleDocumentPointerMove);\n this.#listen(document, 'mousemove', this.#handleDocumentPointerMove);\n this.#listen(document, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'webkitfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'mozfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'MSFullscreenChange', this.#handleFullscreenChange);\n this.#listen(this.#root, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(window, 'blur', this.#handleWindowBlur);\n this.#listen(window, 'focus', this.#handleWindowFocus);\n\n this.#listen(this.#video, 'play', this.#handleVideoPlay);\n this.#listen(this.#video, 'pause', this.#handleVideoPause);\n this.#listen(this.#video, 'ended', this.#handleVideoEnded);\n this.#listen(this.#video, 'loadstart', this.#handleVideoLoadStart);\n this.#listen(this.#video, 'waiting', this.#handleVideoWaiting);\n this.#listen(this.#video, 'stalled', this.#handleVideoWaiting);\n this.#listen(this.#video, 'seeking', this.#handleVideoWaiting);\n this.#listen(this.#video, 'loadeddata', this.#markVideoReady);\n this.#listen(this.#video, 'loadedmetadata', this.#handleVideoLoadedMetadata);\n this.#listen(this.#video, 'canplay', this.#markVideoReady);\n this.#listen(this.#video, 'canplaythrough', this.#markVideoReady);\n this.#listen(this.#video, 'playing', this.#handleVideoPlaying);\n this.#listen(this.#video, 'seeked', this.#handleVideoSeeked);\n this.#listen(this.#video, 'error', this.#handleVideoError);\n this.#listen(this.#video, 'progress', this.#syncVideoLoading);\n this.#listen(this.#video, 'suspend', this.#syncVideoLoading);\n this.#listen(this.#video, 'timeupdate', this.#handleVideoTimeUpdate);\n this.#listen(this.#video, 'volumechange', this.#handleVideoVolumeChange);\n this.#listen(this.#video, 'enterpictureinpicture', this.#syncPictureInPictureState);\n this.#listen(this.#video, 'leavepictureinpicture', this.#syncPictureInPictureState);\n }\n\n #listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject) {\n target.addEventListener(type, listener);\n this.#cleanup.push(() => target.removeEventListener(type, listener));\n }\n\n #setupLazyLoading() {\n if (!this.src || this.#videoSourceLoaded) return;\n\n this.#observer?.disconnect();\n this.#video.dataset.src = this.src;\n\n if ('IntersectionObserver' in window) {\n this.#observer = new IntersectionObserver((entries, observer) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n observer.disconnect();\n this.#observer = null;\n void this.#hydrateVideoSource();\n }, { rootMargin: this.preloadMargin });\n\n this.#observer.observe(this.#player);\n return;\n }\n\n void this.#hydrateVideoSource();\n }\n\n #preventNativeVideoAction = (event: Event) => {\n event.preventDefault();\n };\n\n #clearControlsHideTimer() {\n if (!this.#controlsHideTimer) return;\n window.clearTimeout(this.#controlsHideTimer);\n this.#controlsHideTimer = 0;\n }\n\n #hideControls = () => {\n this.#controlsHideTimer = 0;\n if (this.#isTrackingScrub || this.#isScrubbing || this.#isVolumeScrubbing) return;\n\n if (this.#isTouchControls()) {\n this.#player.classList.remove('is-controls-visible');\n return;\n }\n\n if (this.#isPointerOverControlSurface) return;\n this.#player.classList.remove('is-pointer-active');\n };\n\n #scheduleControlsHide(delay = this.#isTouchControls() ? this.#controlsAutoHideDelay : this.#pointerControlsIdleDelay) {\n this.#clearControlsHideTimer();\n this.#controlsHideTimer = window.setTimeout(this.#hideControls, delay);\n }\n\n #scheduleTouchControlsHide() {\n if (!this.#isTouchControls()) return;\n this.#scheduleControlsHide(this.#controlsAutoHideDelay);\n }\n\n #showTouchControls() {\n if (!this.#isTouchControls()) return false;\n const wasVisible = this.#player.classList.contains('is-controls-visible');\n this.#player.classList.add('is-controls-visible');\n this.#scheduleTouchControlsHide();\n return !wasVisible;\n }\n\n #showPointerControls(forcePointer = false) {\n if (!forcePointer && this.#isTouchControls()) return;\n this.#player.classList.add('is-pointer-active');\n if (!this.#isPointerOverControlSurface) {\n this.#scheduleControlsHide(forcePointer ? this.#pointerControlsIdleDelay : undefined);\n } else {\n this.#clearControlsHideTimer();\n }\n }\n\n #hidePointerControls() {\n this.#isPointerOverControlSurface = false;\n this.#clearControlsHideTimer();\n this.#player.classList.remove('is-pointer-active');\n }\n\n #trackPointerPosition(event: Event) {\n if (event instanceof PointerEvent) {\n this.#lastPointerWasTouch = event.pointerType === 'touch';\n if (this.#lastPointerWasTouch) return false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n if (event instanceof MouseEvent) {\n this.#lastPointerWasTouch = false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n return false;\n }\n\n #isPointInsidePlayer(clientX: number | null, clientY: number | null) {\n if (clientX === null || clientY === null) return false;\n if (clientX < 0 || clientY < 0 || clientX > window.innerWidth || clientY > window.innerHeight) return false;\n\n const rect = this.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #isPointInsideElement(element: Element | null, clientX: number, clientY: number) {\n if (!element) return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #clearProgressHoverPreview() {\n if (!this.#isProgressHoverPreviewing) return;\n\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#clearControlsCollision();\n this.#syncPinnedTimeText();\n }\n\n #syncHoverTargetsFromPointer(clientX: number, clientY: number) {\n if (this.#isTouchControls()) return;\n\n if (!this.#isScrubPreviewLocked() && this.#isPointInsideElement(this.#progressTrack, clientX, clientY)) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(clientX, false, false);\n } else if (!this.#isScrubPreviewLocked()) {\n this.#clearProgressHoverPreview();\n }\n\n const hoveredControl = this.#controlButtons.find((button) => {\n return !button.hidden && !this.#isUnavailableControlButton(button) && this.#isPointInsideElement(button, clientX, clientY);\n }) ?? null;\n\n if (!hoveredControl) return;\n\n const index = Number(hoveredControl.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n }\n\n #areControlsVisible() {\n return (\n this.#player.classList.contains('is-controls-visible') ||\n this.#player.classList.contains('is-pointer-active') ||\n this.#root.activeElement instanceof HTMLElement\n );\n }\n\n #shouldSuppressControlAction() {\n return this.#isTouchControls() && performance.now() < this.#suppressTouchControlClickUntil;\n }\n\n #isUnavailableControlButton(button: HTMLElement | null) {\n return (\n button instanceof HTMLButtonElement &&\n (button.disabled || (button === this.#volumeControl && (!this.volumeEnabled || !this.#hasAudioTrack)))\n );\n }\n\n #syncPointerControlsFromLastPosition() {\n if (!this.#lastPointerWasTouch && this.#isPointInsidePlayer(this.#lastPointerClientX, this.#lastPointerClientY)) {\n this.#showPointerControls(true);\n return;\n }\n\n this.#hidePointerControls();\n }\n\n #handlePlayerPointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#showPointerControls(true);\n };\n\n #handlePlayerPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#showPointerControls(true);\n };\n\n #handleDocumentPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#syncPointerControlsFromLastPosition();\n };\n\n #handlePlayerPointerLeave = () => {\n this.#hidePointerControls();\n };\n\n #handleControlSurfacePointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#isPointerOverControlSurface = true;\n this.#player.classList.add('is-pointer-active');\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfacePointerLeave = () => {\n this.#isPointerOverControlSurface = false;\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlSurfaceFocusIn = () => {\n if (this.#isTouchControls()) {\n this.#player.classList.add('is-controls-visible');\n } else {\n this.#player.classList.add('is-pointer-active');\n }\n\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfaceFocusOut = () => {\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlButtonPointerEnter = (event: Event) => {\n const target = event.currentTarget as HTMLElement | null;\n if (this.#isUnavailableControlButton(target)) {\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n return;\n }\n\n const button = target as HTMLButtonElement;\n const index = Number(button.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n };\n\n #clearControlTapTimer() {\n if (!this.#controlTapTimer) return;\n window.clearTimeout(this.#controlTapTimer);\n this.#controlTapTimer = 0;\n }\n\n #clearControlTapActive = () => {\n this.#controlTapTimer = 0;\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.style.removeProperty('--sp-touch-control-hover-offset');\n };\n\n #handleControlButtonPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent) || event.pointerType !== 'touch') return;\n\n const target = event.currentTarget as HTMLButtonElement | null;\n if (!target || !this.#areControlsVisible() || this.#isUnavailableControlButton(target)) return;\n\n const index = Number(target.dataset.spControlIndex ?? 0);\n this.#clearControlTapTimer();\n this.#controlButtons.forEach((button) => button.classList.toggle('is-control-tap-active', button === target));\n this.style.setProperty('--sp-touch-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n this.#controlTapTimer = window.setTimeout(this.#clearControlTapActive, 280);\n };\n\n #clearLoadingStateTimer() {\n if (!this.#loadingStateTimer) return;\n window.clearTimeout(this.#loadingStateTimer);\n this.#loadingStateTimer = 0;\n }\n\n #clearVideoRetryTimer() {\n if (!this.#videoRetryTimer) return;\n window.clearTimeout(this.#videoRetryTimer);\n this.#videoRetryTimer = 0;\n }\n\n #clearInitialProgressSettleTimer() {\n if (!this.#initialProgressSettleTimer) return;\n window.clearTimeout(this.#initialProgressSettleTimer);\n this.#initialProgressSettleTimer = 0;\n }\n\n #clearFirstFrameFallbackTimer() {\n if (!this.#firstFrameFallbackTimer) return;\n window.clearTimeout(this.#firstFrameFallbackTimer);\n this.#firstFrameFallbackTimer = 0;\n }\n\n #clearVolumeIconAnimationTimer() {\n if (!this.#volumeIconAnimationTimer) return;\n window.clearTimeout(this.#volumeIconAnimationTimer);\n this.#volumeIconAnimationTimer = 0;\n }\n\n #animateVolumeIconSwap() {\n this.#clearVolumeIconAnimationTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n void this.#volumeControl.offsetWidth;\n this.#player.classList.add('is-volume-icon-animating');\n this.#volumeIconAnimationTimer = window.setTimeout(() => {\n this.#volumeIconAnimationTimer = 0;\n this.#player.classList.remove('is-volume-icon-animating');\n }, 240);\n }\n\n #finishInitialProgressSettle = () => {\n const wasSettling = Boolean(this.#initialProgressSettleTimer) || this.#player.classList.contains('is-progress-settling');\n if (!wasSettling) return;\n\n this.#clearInitialProgressSettleTimer();\n if (this.#hasInitialProgressSettled) {\n this.#player.classList.remove('is-progress-settling');\n return;\n }\n\n this.#hasInitialProgressSettled = true;\n this.#initialProgressEstimateUnlockAt = performance.now() + this.#initialProgressEstimateHold;\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n this.#player.classList.remove('is-progress-settling');\n this.#syncVideoState();\n };\n\n #queueInitialProgressSettle() {\n if (this.#hasInitialProgressSettled || this.#initialProgressSettleTimer) return;\n\n this.#player.classList.add('is-progress-settling');\n this.#setProgressVisual(0);\n this.#initialProgressSettleTimer = window.setTimeout(this.#finishInitialProgressSettle, this.#initialProgressSettleDelay);\n }\n\n async #hydrateVideoSource() {\n if (this.#videoSourceLoaded) return;\n\n const source = this.#video.dataset.src || this.src;\n if (!source) return;\n\n this.#clearVideoRetryTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#videoLoadAttempt += 1;\n this.#videoSourceLoaded = true;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#syncAutoplayState();\n this.#video.src = source;\n this.#video.preload = 'auto';\n this.#video.load();\n\n if (this.#video.autoplay && this.#video.muted) {\n await this.#video.play().catch(() => undefined);\n }\n }\n\n #isLoopBoundaryBlip() {\n if (!this.#video.loop || this.#video.paused || !Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return false;\n return this.#video.currentTime < 0.28 || (this.#video.duration - this.#video.currentTime) < 0.28;\n }\n\n #getBufferedAhead(time = this.#video.currentTime) {\n if (!Number.isFinite(time)) return 0;\n\n const currentTime = Math.max(0, time);\n\n try {\n for (let index = 0; index < this.#video.buffered.length; index += 1) {\n const start = this.#video.buffered.start(index);\n const end = this.#video.buffered.end(index);\n\n if (currentTime + this.#bufferedRangeFuzz >= start && currentTime <= end + this.#bufferedRangeFuzz) {\n return Math.max(0, end - currentTime);\n }\n }\n } catch {\n return 0;\n }\n\n return 0;\n }\n\n #hasBufferedAhead(seconds = this.#bufferedAheadTarget) {\n if (\n !this.#videoSourceLoaded ||\n this.#video.error ||\n !this.#player.classList.contains('has-loaded-once') ||\n !Number.isFinite(this.#video.duration) ||\n this.#video.duration <= 0\n ) return false;\n\n const remainingDuration = Math.max(0, this.#video.duration - this.#video.currentTime);\n const requiredBuffer = Math.min(seconds, remainingDuration);\n\n return requiredBuffer <= this.#bufferedRangeFuzz || this.#getBufferedAhead() + this.#bufferedRangeFuzz >= requiredBuffer;\n }\n\n #setVideoLoading(isLoading: boolean, immediate = false) {\n this.#clearLoadingStateTimer();\n const shouldLoad = isLoading && !this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead();\n const shouldWaitForFirstFrame = isLoading && !this.#hasPresentedFirstFrame;\n const shouldShowLoading = shouldWaitForFirstFrame || shouldLoad;\n this.#isPlaybackBuffering = shouldShowLoading;\n\n if (!shouldShowLoading) {\n this.#player.classList.remove('is-loading');\n return;\n }\n\n if (immediate) {\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#loadingStateTimer = window.setTimeout(() => {\n this.#loadingStateTimer = 0;\n if (!this.#hasPresentedFirstFrame || (!this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead())) {\n this.#isPlaybackBuffering = true;\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#isPlaybackBuffering = false;\n this.#player.classList.remove('is-loading');\n }, this.#loadingStateDelay);\n }\n\n #syncVideoLoading = () => {\n if (this.#video.error) {\n this.#setVideoLoading(true, true);\n return;\n }\n\n this.#setVideoLoading(\n (\n !this.#videoSourceLoaded ||\n !this.#hasPresentedFirstFrame ||\n this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA\n ),\n );\n };\n\n #canStartImmediately() {\n return (\n this.#videoSourceLoaded &&\n !this.#video.error &&\n this.#hasDecodedFirstFrame &&\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA ||\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n !this.#player.classList.contains('is-loading')\n )\n )\n );\n }\n\n #isScrubPreviewLocked() {\n return this.#isTrackingScrub || this.#isScrubbing || this.#isCommittedScrubPending;\n }\n\n #retryVideoLoad() {\n if (this.#videoLoadAttempt >= this.#maxVideoLoadAttempts || this.#videoRetryTimer) return;\n\n this.#videoRetryTimer = window.setTimeout(() => {\n this.#videoRetryTimer = 0;\n this.#clearFirstFrameFallbackTimer();\n this.#videoSourceLoaded = false;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n\n if (!this.#player.classList.contains('has-loaded-once')) {\n this.#setProgressVisual(0);\n }\n\n this.#video.removeAttribute('src');\n this.#video.load();\n void this.#hydrateVideoSource();\n }, this.#videoRetryDelay);\n }\n\n #clearCommittedScrubPreview() {\n if (!this.#isCommittedScrubPending) return false;\n\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #commitVideoReady() {\n this.#clearVideoRetryTimer();\n const isFirstReady = !this.#player.classList.contains('has-loaded-once');\n\n if (isFirstReady) this.#queueInitialProgressSettle();\n\n this.#player.classList.add('has-loaded-once');\n this.#player.classList.add('has-visible-frame');\n this.#syncVideoLoading();\n this.#optimisticPlaybackState = null;\n if (this.#isCommittedScrubPending) {\n this.#clearCommittedScrubPreview();\n return true;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #requestFirstVideoFrame() {\n if (this.#hasDecodedFirstFrame || this.#firstFrameRequestPending || this.#video.error) return;\n\n this.#firstFrameRequestPending = true;\n const requestToken = this.#firstFrameRequestToken;\n const confirmFirstFrame = () => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#clearFirstFrameFallbackTimer();\n this.#firstFrameRequestPending = false;\n this.#hasDecodedFirstFrame =\n !this.#video.error &&\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n this.#video.videoWidth > 0 &&\n this.#video.videoHeight > 0;\n\n if (this.#hasDecodedFirstFrame) {\n if (this.#firstFramePresentationPending || this.#hasPresentedFirstFrame) return;\n\n this.#firstFramePresentationPending = true;\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#firstFramePresentationPending = false;\n this.#hasPresentedFirstFrame = true;\n this.#commitVideoReady();\n this.#syncVideoState();\n });\n });\n this.#syncVideoState();\n return;\n }\n\n this.#syncVideoLoading();\n };\n\n if ('requestVideoFrameCallback' in this.#video) {\n this.#video.requestVideoFrameCallback(confirmFirstFrame);\n this.#firstFrameFallbackTimer = window.setTimeout(confirmFirstFrame, 180);\n return;\n }\n\n window.requestAnimationFrame(confirmFirstFrame);\n }\n\n #markVideoReady = () => {\n if (\n this.#video.error ||\n this.#video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA ||\n this.#video.videoWidth <= 0 ||\n this.#video.videoHeight <= 0\n ) {\n this.#syncVideoLoading();\n return false;\n }\n\n if (!this.#hasDecodedFirstFrame) {\n this.#requestFirstVideoFrame();\n this.#syncVideoLoading();\n return false;\n }\n\n const isReady = this.#commitVideoReady();\n this.#syncAudioControlState();\n return isReady;\n };\n\n #isVideoAdvancing() {\n return (\n !this.#video.paused &&\n (!this.#video.ended || this.#video.loop) &&\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA\n );\n }\n\n #syncVisualProgressClock(time = this.#video.currentTime) {\n this.#visualProgressTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#visualProgressUpdatedAt = performance.now();\n }\n\n #clearPausedVisualProgress() {\n this.#pausedVisualProgressTime = null;\n this.#pauseFrozenProgressPercent = null;\n }\n\n #holdPausedVisualProgress() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pausedVisualProgressTime = null;\n return;\n }\n\n const currentTime = Number.isFinite(this.#video.currentTime) ? Math.max(0, this.#video.currentTime) : 0;\n const renderedTime = Number.isFinite(this.#lastRenderedProgressTime) ? this.#lastRenderedProgressTime : currentTime;\n this.#pausedVisualProgressTime = Math.min(this.#video.duration, Math.max(currentTime, renderedTime));\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n }\n\n #freezeRenderedProgressForPause() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pauseFrozenProgressPercent = null;\n this.#holdPausedVisualProgress();\n return;\n }\n\n const rawInset = this.#player.style.getPropertyValue('--sp-progress-inset');\n const inset = Number.parseFloat(rawInset);\n const progressFromFill = Number.isFinite(inset) ? Math.min(1, Math.max(0, 1 - (inset / 100))) : null;\n const visualTime = this.#getVisualProgressTime();\n const progressFromTime = Math.min(1, Math.max(0, visualTime / this.#video.duration));\n const frozenProgress = Math.max(progressFromFill ?? 0, progressFromTime);\n\n this.#pauseFrozenProgressPercent = frozenProgress;\n this.#pausedVisualProgressTime = frozenProgress * this.#video.duration;\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n this.#setProgressVisual(frozenProgress);\n this.#progressTrack.setAttribute('aria-valuenow', `${this.#pausedVisualProgressTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(this.#pausedVisualProgressTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n #getVisualProgressTime() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime || 0;\n if (this.#isScrubPreviewLocked()) return this.#scrubTargetTime;\n if (this.#pausedVisualProgressTime !== null) return this.#pausedVisualProgressTime;\n if (!this.#isVideoAdvancing()) return this.#video.currentTime || 0;\n\n if (this.#isPlaybackBuffering || !this.#hasInitialProgressSettled || performance.now() < this.#initialProgressEstimateUnlockAt) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n if (this.#player.classList.contains('is-loading') && this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n const elapsed = (performance.now() - this.#visualProgressUpdatedAt) / 1000;\n const estimatedTime = this.#visualProgressTime + elapsed;\n const visualTime = this.#video.loop\n ? estimatedTime % this.#video.duration\n : Math.min(estimatedTime, this.#video.duration);\n\n if (!this.#video.loop && this.#video.currentTime - visualTime > 0.45) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime;\n }\n\n return visualTime;\n }\n\n #setProgressVisual(percent: number) {\n const clampedPercent = Math.min(1, Math.max(0, percent));\n const remainingPercent = (1 - clampedPercent) * 100;\n const { innerWidth } = this.#getProgressMetrics();\n const markerEdgePercent = 1 / innerWidth;\n const markerIsFullyOnFill =\n this.#isScrubbing &&\n this.#hasScrubReturnMarker &&\n this.#scrubReturnPercent + markerEdgePercent < clampedPercent;\n\n this.#player.style.setProperty('--sp-progress-inset', `${remainingPercent}%`);\n this.#player.style.setProperty('--sp-return-marker-base-opacity', markerIsFullyOnFill ? '0' : '1');\n\n if (markerIsFullyOnFill) {\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent);\n const maxHoleLeft = Math.max(0, innerWidth - 2);\n const holeLeft = Math.min(maxHoleLeft, Math.max(0, markerX - 3));\n\n this.#player.style.setProperty('--sp-return-marker-hole-left', `${holeLeft}px`);\n } else {\n this.#player.style.setProperty('--sp-return-marker-hole-left', '-9999px');\n }\n }\n\n #getProgressPercentFromTime(time: number) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return 0;\n\n return Math.min(1, Math.max(0, time / this.#video.duration));\n }\n\n #getProgressMetrics(rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressMetrics(rect);\n }\n\n #getProgressXFromPercent(percent: number, rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressXFromPercent(percent, rect);\n }\n\n #getProgressPercentFromClientX(clientX: number, rect: DOMRect) {\n return getProgressPercentFromClientX(clientX, rect);\n }\n\n #setScrubReturnMarker(time: number) {\n this.#scrubReturnTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#scrubReturnPercent = this.#getProgressPercentFromTime(this.#scrubReturnTime);\n const rect = this.#progressTrack.getBoundingClientRect();\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerIsInTrackBody =\n markerX >= this.#scrubReturnMarkerBodyInset &&\n markerX <= Math.max(this.#scrubReturnMarkerBodyInset, rect.width - this.#scrubReturnMarkerBodyInset);\n\n this.#hasScrubReturnMarker = this.#scrubReturnTime > this.#scrubReturnMarkerMinTime && markerIsInTrackBody;\n this.#player.classList.toggle('has-return-marker', this.#hasScrubReturnMarker);\n this.#player.style.setProperty('--sp-return-marker-left', `${markerX}px`);\n }\n\n #getScrubPoint(clientX: number, rect: DOMRect, percent: number, shouldSnap = this.#isScrubbing) {\n const targetTime = percent * this.#video.duration;\n\n if (!shouldSnap || !this.#hasScrubReturnMarker) {\n return { percent, targetTime };\n }\n\n const markerX = rect.left + this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerDistance = Math.abs(clientX - markerX);\n const isInSnapZone = markerDistance <= this.#scrubSnapDistance;\n\n if (!isInSnapZone) {\n return { percent, targetTime };\n }\n\n return {\n percent: this.#scrubReturnPercent,\n targetTime: this.#scrubReturnTime,\n };\n }\n\n #syncPinnedTimeText(time = this.#getVisualProgressTime()) {\n if (!this.#hasPinnedTime || this.#isProgressHoverPreviewing || this.#isScrubPreviewLocked()) return;\n\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(time);\n }\n\n #updateProgress(time = this.#getVisualProgressTime()) {\n const hasDuration = Number.isFinite(this.#video.duration) && this.#video.duration > 0;\n if (hasDuration && this.#pauseFrozenProgressPercent !== null) {\n const frozenTime = this.#pauseFrozenProgressPercent * this.#video.duration;\n this.#lastRenderedProgressTime = frozenTime;\n this.#setProgressVisual(this.#pauseFrozenProgressPercent);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', `${this.#video.duration}`);\n this.#progressTrack.setAttribute('aria-valuenow', `${frozenTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(frozenTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n this.#syncPinnedTimeText(frozenTime);\n return;\n }\n\n const renderedTime = hasDuration ? Math.min(this.#video.duration, Math.max(0, time)) : time;\n const progressValue = hasDuration ? renderedTime / this.#video.duration : 0;\n this.#lastRenderedProgressTime = Number.isFinite(renderedTime) ? Math.max(0, renderedTime) : 0;\n this.#setProgressVisual(progressValue);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', hasDuration ? `${this.#video.duration}` : '0');\n this.#progressTrack.setAttribute('aria-valuenow', hasDuration ? `${renderedTime}` : '0');\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n hasDuration ? `${formatVideoTime(renderedTime)} of ${formatVideoTime(this.#video.duration)}` : 'Loading video',\n );\n this.#syncPinnedTimeText(renderedTime);\n }\n\n #previewSeekFromClientX(clientX: number, shouldSnap = this.#isScrubbing, updateVisual = true) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime;\n\n const rect = this.#progressTrack.getBoundingClientRect();\n const percent = this.#getProgressPercentFromClientX(clientX, rect);\n const scrubPoint = this.#getScrubPoint(clientX, rect, percent, shouldSnap);\n\n if (updateVisual) {\n this.#setProgressVisual(scrubPoint.percent);\n }\n\n if (!this.#hasPinnedTime) {\n this.#player.style.setProperty('--sp-scrub-preview-left', `${this.#getProgressXFromPercent(scrubPoint.percent, rect)}px`);\n }\n\n this.#scrubTimeText.textContent = formatVideoTime(scrubPoint.targetTime);\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(scrubPoint.targetTime);\n\n if (updateVisual) {\n this.#progressTrack.setAttribute('aria-valuenow', `${scrubPoint.targetTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(scrubPoint.targetTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n this.#syncControlsCollision();\n return scrubPoint.targetTime;\n }\n\n #clearControlsCollision() {\n this.#hasControlsCollision = false;\n this.#player?.classList.remove('has-controls-collision');\n }\n\n #syncControlsCollision() {\n if ((!this.#isScrubbing && !this.#isProgressHoverPreviewing) || !this.#controlTray || !this.#scrubTime || this.#hasPinnedTime) {\n this.#clearControlsCollision();\n return;\n }\n\n const holderRect = this.#controlTray.getBoundingClientRect();\n const timeRect = this.#scrubTime.getBoundingClientRect();\n const holderIsVisible = holderRect.width > 0 && holderRect.height > 0;\n const margin = this.#hasControlsCollision ? this.#controlsCollisionExitMargin : this.#controlsCollisionEnterMargin;\n const timeTouchesHolder =\n holderIsVisible &&\n timeRect.right >= holderRect.left - margin &&\n timeRect.left <= holderRect.right + margin &&\n timeRect.bottom >= holderRect.top - margin &&\n timeRect.top <= holderRect.bottom + margin;\n\n this.#hasControlsCollision = timeTouchesHolder;\n this.#player.classList.toggle('has-controls-collision', this.#hasControlsCollision);\n }\n\n #stopProgressLoop() {\n if (!this.#progressFrame) return;\n window.cancelAnimationFrame(this.#progressFrame);\n this.#progressFrame = 0;\n }\n\n #startProgressLoop() {\n this.#stopProgressLoop();\n this.#syncVisualProgressClock();\n\n const tick = () => {\n this.#updateProgress(this.#getVisualProgressTime());\n if (this.#isVideoAdvancing()) {\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n };\n\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n\n #syncVideoState() {\n const realIsPlaying = (!this.#video.paused && (!this.#video.ended || this.#video.loop)) || (this.#isScrubbing && this.#scrubWasPlaying);\n const isPlaying = this.#optimisticPlaybackState ? this.#optimisticPlaybackState === 'playing' : realIsPlaying;\n this.#player.classList.toggle('is-playing', isPlaying);\n this.#button.setAttribute('aria-label', isPlaying ? 'Pause video' : 'Play video');\n\n if (this.#isScrubbing) {\n this.#stopProgressLoop();\n return;\n }\n\n if (\n realIsPlaying &&\n this.#player.classList.contains('has-loaded-once') &&\n !this.#player.classList.contains('is-progress-settling')\n ) {\n this.#startProgressLoop();\n } else {\n this.#stopProgressLoop();\n this.#updateProgress();\n }\n }\n\n #clearScrubLongPressTimer() {\n if (!this.#scrubLongPressTimer) return;\n window.clearTimeout(this.#scrubLongPressTimer);\n this.#scrubLongPressTimer = 0;\n }\n\n #detectAudioAvailability() {\n return detectAudioAvailability(this.#video, this.#hasAudioTrack);\n }\n\n #syncAudioControlState = () => {\n if (!this.volumeEnabled) {\n this.#player.classList.remove('is-volume-unavailable', 'is-volume-muted', 'is-volume-sound', 'is-volume-icon-animating');\n this.#volumeControl.disabled = true;\n this.#volumeControl.setAttribute('aria-disabled', 'true');\n return;\n }\n\n this.#hasAudioTrack = this.#detectAudioAvailability();\n const isMuted = !this.#hasAudioTrack || this.#video.muted || this.#video.volume <= 0;\n const visualVolume = this.#hasAudioTrack && !this.#video.muted ? this.#video.volume : 0;\n const volumePercent = Math.round(visualVolume * 100);\n const nextIconState = isMuted ? 'muted' : 'sound';\n\n if (this.#volumeIconState && this.#volumeIconState !== nextIconState) {\n this.#animateVolumeIconSwap();\n }\n\n this.#volumeIconState = nextIconState;\n\n this.#player.classList.toggle('is-volume-unavailable', !this.#hasAudioTrack);\n this.#player.classList.toggle('is-volume-muted', isMuted);\n this.#player.classList.toggle('is-volume-sound', !isMuted);\n this.#player.style.setProperty('--sp-volume-level', `${volumePercent}%`);\n this.#volumeControl.disabled = !this.#hasAudioTrack;\n this.#volumeControl.setAttribute('aria-disabled', `${!this.#hasAudioTrack}`);\n this.#volumeControl.setAttribute(\n 'aria-label',\n !this.#hasAudioTrack ? 'Video has no audio' : isMuted ? 'Unmute video' : 'Mute video',\n );\n this.#volumeTrack.setAttribute('aria-valuenow', `${volumePercent}`);\n this.#volumeTrack.setAttribute('aria-valuetext', `${volumePercent}%`);\n\n };\n\n #setVolumeFromClientY(clientY: number) {\n if (!this.#hasAudioTrack) return;\n const rect = this.#volumeTrack.getBoundingClientRect();\n const percent = Math.min(1, Math.max(0, 1 - ((clientY - rect.top) / rect.height)));\n const rounded = Math.round(percent * 100) / 100;\n this.#video.volume = rounded;\n this.#video.muted = rounded <= 0;\n this.#syncAudioControlState();\n }\n\n #releaseVolumePointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#volumeTrack.hasPointerCapture(pointerId)) {\n this.#volumeTrack.releasePointerCapture(pointerId);\n }\n }\n\n #finishVolumeScrub(pointerId: number | null) {\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#volumeTrack.blur();\n this.#releaseVolumePointer(pointerId);\n this.#scheduleVolumePopoverClose(260);\n }\n\n #syncPictureInPictureState = () => {\n const isActive = document.pictureInPictureElement === this.#video;\n const video = this.#video as HTMLVideoElement & { requestPictureInPicture?: () => Promise<PictureInPictureWindow> };\n const isSupported = Boolean(this.pictureInPictureEnabled && document.pictureInPictureEnabled && video.requestPictureInPicture);\n this.#player.classList.toggle('is-picture-in-picture', isActive);\n this.#pictureInPictureControl.disabled = !isSupported;\n this.#pictureInPictureControl.setAttribute('aria-label', isActive ? 'Exit picture in picture' : 'Enter picture in picture');\n };\n\n #getFullscreenElement() {\n return getFullscreenElement(this.#root);\n }\n\n #isFullscreenSupported() {\n return isFullscreenSupported(this.fullscreenEnabled, this.#player, this.#video);\n }\n\n #requestPlayerFullscreen() {\n return requestPlayerFullscreen(this.#player);\n }\n\n #requestVideoFullscreen() {\n requestVideoFullscreen(this.#video);\n }\n\n #exitFullscreen() {\n return exitFullscreen();\n }\n\n #syncFullscreenState = () => {\n const fullscreenElement = this.#getFullscreenElement();\n const isActive = fullscreenElement === this.#player || fullscreenElement === this;\n const isSupported = this.#isFullscreenSupported();\n this.#player.classList.toggle('is-fullscreen', isActive);\n this.#fullscreenControl.disabled = !isSupported;\n this.#fullscreenControl.setAttribute('aria-label', isActive ? 'Exit fullscreen' : 'Enter fullscreen');\n return isActive;\n };\n\n #handleFullscreenChange = () => {\n const isFullscreenActive = this.#syncFullscreenState();\n this.#resetFullscreenPointerState(isFullscreenActive);\n };\n\n #resetFullscreenPointerState(isFullscreenActive: boolean) {\n this.#clearControlsHideTimer();\n this.#clearVolumeCloseTimer();\n this.#releaseScrubPointer(this.#activeScrubPointerId);\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#isPointerOverControlSurface = false;\n this.#isVolumeHovering = false;\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#clearControlTapTimer();\n this.#clearControlTapActive();\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.#volumeControl.classList.remove('is-volume-open');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#player.classList.remove('is-scrubbing');\n this.#player.classList.remove('is-pointer-active');\n\n const activeElement = this.#root.activeElement;\n if (activeElement instanceof HTMLElement) {\n activeElement.blur();\n }\n\n if (isFullscreenActive) {\n this.#syncPointerControlsFromLastPosition();\n } else {\n this.#hidePointerControls();\n }\n }\n\n #enterScrubMode = () => {\n if (!this.#isTrackingScrub || this.#isScrubbing) return;\n\n this.#clearPausedVisualProgress();\n this.#clearControlsHideTimer();\n this.#clearScrubLongPressTimer();\n this.#isScrubbing = true;\n this.#player.classList.add('is-scrubbing');\n this.#scrubTargetTime = this.#previewSeekFromClientX(this.#scrubStartX, true);\n if (this.#scrubWasPlaying) this.#video.pause();\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n this.#updateProgress(this.#scrubTargetTime);\n this.#stopProgressLoop();\n this.#syncVideoState();\n };\n\n #releaseScrubPointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#progressTrack.hasPointerCapture(pointerId)) {\n this.#progressTrack.releasePointerCapture(pointerId);\n }\n }\n\n async #finishScrub(clientX: number | null, pointerId: number | null, shouldCommit: boolean) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n const wasDragging = this.#isScrubbing;\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n\n if (shouldCommit && clientX !== null) {\n this.#clearPausedVisualProgress();\n this.#scrubTargetTime = this.#previewSeekFromClientX(clientX, wasDragging);\n this.#isCommittedScrubPending = true;\n this.#committedScrubWasPlaying = this.#scrubWasPlaying;\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n }\n\n this.#updateProgress(this.#scrubTargetTime);\n\n if (wasDragging && this.#scrubWasPlaying) {\n await this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #cancelScrub(pointerId: number | null) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n this.#syncVisualProgressClock();\n this.#updateProgress();\n\n if (this.#scrubWasPlaying) {\n void this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #formatTimeForDisplay(time: number) {\n if (!this.#showRemainingTime) return formatVideoTime(time);\n const duration = Number.isFinite(this.#video.duration) ? this.#video.duration : 0;\n if (duration <= 0) return formatVideoTime(time);\n return `-${formatVideoTime(Math.max(0, duration - time))}`;\n }\n\n #clearTimeAnimationTimer() {\n if (!this.#timeAnimationTimer) return;\n window.clearTimeout(this.#timeAnimationTimer);\n this.#timeAnimationTimer = 0;\n }\n\n #animateTimeSwap() {\n this.#clearTimeAnimationTimer();\n this.#trayTimeText.classList.remove('is-time-animating');\n void this.#trayTimeText.offsetWidth;\n this.#trayTimeText.classList.add('is-time-animating');\n this.#timeAnimationTimer = window.setTimeout(() => {\n this.#timeAnimationTimer = 0;\n this.#trayTimeText.classList.remove('is-time-animating');\n }, 240);\n }\n\n #handleTimeToggleClick = (event: Event) => {\n event.stopPropagation();\n this.#showRemainingTime = !this.#showRemainingTime;\n this.#animateTimeSwap();\n if (this.#isScrubPreviewLocked() || this.#isProgressHoverPreviewing) {\n if (this.#trayTimeText) {\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(this.#scrubTargetTime);\n }\n } else {\n this.#syncPinnedTimeText(this.#getVisualProgressTime());\n }\n };\n\n #handleButtonClick = async () => {\n if (performance.now() < this.#suppressTouchButtonClickUntil) {\n return;\n }\n\n const shouldPlay = this.#optimisticPlaybackState\n ? this.#optimisticPlaybackState !== 'playing'\n : this.#video.paused || this.#video.ended;\n const shouldFlipImmediately = !shouldPlay || this.#canStartImmediately();\n\n this.#showTouchControls();\n\n if (shouldFlipImmediately) {\n this.#optimisticPlaybackState = shouldPlay ? 'playing' : 'paused';\n this.#syncVideoState();\n }\n\n if (shouldPlay) {\n this.#clearPausedVisualProgress();\n await this.#hydrateVideoSource();\n await this.#video.play().catch(() => {\n this.#optimisticPlaybackState = null;\n });\n } else {\n this.#freezeRenderedProgressForPause();\n this.#video.pause();\n }\n\n this.#syncVideoState();\n this.#scheduleTouchControlsHide();\n };\n\n #handlePlayerPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n\n const buttonRect = this.#button.getBoundingClientRect();\n const isInsideButton =\n event.clientX >= buttonRect.left &&\n event.clientX <= buttonRect.right &&\n event.clientY >= buttonRect.top &&\n event.clientY <= buttonRect.bottom;\n const controlTrayRect = this.#controlTray.getBoundingClientRect();\n const isInsideControlTray =\n event.clientX >= controlTrayRect.left &&\n event.clientX <= controlTrayRect.right &&\n event.clientY >= controlTrayRect.top &&\n event.clientY <= controlTrayRect.bottom;\n const progressRect = this.#progressTrack.getBoundingClientRect();\n const isInsideProgress =\n event.clientX >= progressRect.left &&\n event.clientX <= progressRect.right &&\n event.clientY >= progressRect.top &&\n event.clientY <= progressRect.bottom;\n const didRevealControls = this.#showTouchControls();\n\n if (didRevealControls && isInsideButton) {\n this.#suppressTouchButtonClickUntil = performance.now() + 260;\n }\n\n if (didRevealControls && (isInsideControlTray || isInsideProgress)) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n\n void this.#hydrateVideoSource();\n };\n\n #preventVolumeTrackClick = (event: Event) => {\n event.stopPropagation();\n };\n\n #clearVolumeCloseTimer() {\n if (!this.#volumeCloseTimer) return;\n window.clearTimeout(this.#volumeCloseTimer);\n this.#volumeCloseTimer = 0;\n }\n\n #openVolumePopover() {\n if (!this.volumeEnabled || !this.volumeSliderEnabled || !this.#hasAudioTrack) return;\n this.#clearVolumeCloseTimer();\n this.#volumeControl.classList.add('is-volume-open');\n }\n\n #closeVolumePopover = () => {\n this.#volumeCloseTimer = 0;\n if (this.#isVolumeHovering || this.#isVolumeScrubbing) return;\n this.#volumeControl.classList.remove('is-volume-open');\n };\n\n #scheduleVolumePopoverClose(delay = 150) {\n this.#clearVolumeCloseTimer();\n this.#volumeCloseTimer = window.setTimeout(this.#closeVolumePopover, delay);\n }\n\n #handleVolumePointerEnter = () => {\n if (this.#isTouchControls() || !this.volumeSliderEnabled || !this.#hasAudioTrack) return;\n this.#isVolumeHovering = true;\n this.#openVolumePopover();\n };\n\n #handleVolumePointerLeave = () => {\n if (this.#isTouchControls() || !this.volumeSliderEnabled || !this.#hasAudioTrack) return;\n this.#isVolumeHovering = false;\n this.#scheduleVolumePopoverClose();\n };\n\n #handleVolumeControlClick = (event: Event) => {\n if (!this.volumeEnabled || !this.#hasAudioTrack) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n this.#closeVolumePopover();\n if (this.#video.muted || this.#video.volume <= 0) {\n if (this.#video.volume <= 0) this.#video.volume = 0.7;\n this.#video.muted = false;\n } else {\n this.#video.muted = true;\n }\n\n this.#syncAudioControlState();\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.volumeEnabled || !this.volumeSliderEnabled || !this.#hasAudioTrack || this.#isTouchControls()) return;\n event.preventDefault();\n event.stopPropagation();\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#openVolumePopover();\n this.#isVolumeScrubbing = true;\n this.#activeVolumePointerId = event.pointerId;\n this.#volumePopover.classList.add('is-scrubbing-volume');\n this.#volumeTrack.setPointerCapture(event.pointerId);\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isVolumeScrubbing) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.preventDefault();\n event.stopPropagation();\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n };\n\n #handleVolumeKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent) || !this.volumeEnabled || !this.#hasAudioTrack) return;\n if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n const step = event.shiftKey ? 0.1 : 0.05;\n const nextVolume =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? 1\n : this.#video.volume + (event.key === 'ArrowUp' ? step : -step);\n this.#video.volume = Math.min(1, Math.max(0, nextVolume));\n this.#video.muted = this.#video.volume <= 0;\n this.#syncAudioControlState();\n };\n\n #handlePictureInPictureClick = async () => {\n const video = this.#video as HTMLVideoElement & {\n requestPictureInPicture?: () => Promise<PictureInPictureWindow>;\n };\n\n if (!this.pictureInPictureEnabled || !document.pictureInPictureEnabled || !video.requestPictureInPicture) return;\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n\n try {\n await this.#hydrateVideoSource();\n if (document.pictureInPictureElement === this.#video) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch {\n // Picture-in-Picture can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncPictureInPictureState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleFullscreenClick = async (event: Event) => {\n if (!this.#isFullscreenSupported()) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#trackPointerPosition(event);\n this.#showTouchControls();\n\n try {\n const fullscreenElement = this.#getFullscreenElement();\n if (fullscreenElement === this.#player || fullscreenElement === this) {\n await this.#exitFullscreen();\n } else {\n await this.#hydrateVideoSource();\n if (canRequestPlayerFullscreen(this.#player)) {\n await this.#requestPlayerFullscreen();\n } else {\n this.#requestVideoFullscreen();\n }\n }\n } catch {\n // Fullscreen can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncFullscreenState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleProgressPointerEnter = (event: Event) => {\n if (this.#isTouchControls() || this.#isScrubPreviewLocked()) return;\n if (!(event instanceof PointerEvent) && !(event instanceof MouseEvent)) return;\n\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n };\n\n #handleProgressPointerLeave = () => {\n if (this.#isScrubPreviewLocked()) return;\n\n this.#clearProgressHoverPreview();\n };\n\n #handleProgressPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) {\n this.#showTouchControls();\n if (this.#isTouchControls()) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n return;\n }\n\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#finishInitialProgressSettle();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#setScrubReturnMarker(this.#getVisualProgressTime());\n this.#isTrackingScrub = true;\n this.#activeScrubPointerId = event.pointerId;\n this.#scrubStartX = event.clientX;\n this.#scrubWasPlaying = !this.#video.paused && !this.#video.ended;\n this.#progressTrack.setPointerCapture(event.pointerId);\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX, false);\n this.#clearScrubLongPressTimer();\n this.#scrubLongPressTimer = window.setTimeout(this.#enterScrubMode, this.#scrubLongPressDelay);\n };\n\n #handleProgressKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.#handleControlSurfaceFocusIn();\n\n const baseTime = this.#getVisualProgressTime();\n const smallStep = event.shiftKey ? 10 : 5;\n const largeStep = Math.max(10, this.#video.duration * 0.1);\n const nextTime =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? this.#video.duration\n : event.key === 'PageUp'\n ? baseTime + largeStep\n : event.key === 'PageDown'\n ? baseTime - largeStep\n : baseTime + (event.key === 'ArrowRight' ? smallStep : -smallStep);\n\n this.#video.currentTime = Math.min(this.#video.duration, Math.max(0, nextTime));\n this.#syncVisualProgressClock(this.#video.currentTime);\n this.#updateProgress(this.#video.currentTime);\n };\n\n #handleProgressPointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isTrackingScrub) {\n if (!this.#isTouchControls()) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n }\n return;\n }\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n\n if (!this.#isScrubbing && Math.abs(event.clientX - this.#scrubStartX) >= this.#scrubDragThreshold) {\n this.#enterScrubMode();\n }\n\n if (!this.#isScrubbing) return;\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX);\n };\n\n #handleProgressPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleProgressPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleDocumentPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleDocumentPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleWindowBlur = () => {\n this.#finishVolumeScrub(this.#activeVolumePointerId);\n this.#cancelScrub(this.#activeScrubPointerId);\n };\n\n #handleWindowFocus = () => {\n if (this.#getFullscreenElement()) return;\n this.#hidePointerControls();\n };\n\n #handleVideoPlay = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoPause = () => {\n this.#optimisticPlaybackState = null;\n if (!this.#isScrubPreviewLocked()) this.#holdPausedVisualProgress();\n this.#syncVideoLoading();\n this.#syncVideoState();\n };\n\n #handleVideoEnded = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoLoadStart = () => {\n this.#setVideoLoading(true, true);\n };\n\n #handleVideoWaiting = () => {\n this.#setVideoLoading(true);\n };\n\n #handleVideoLoadedMetadata = () => {\n this.#clearPausedVisualProgress();\n this.#hasAudioTrack = true;\n this.#syncAudioControlState();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoLoading();\n this.#updateProgress();\n };\n\n #handleVideoPlaying = () => {\n const isReady = this.#markVideoReady();\n this.#syncAudioControlState();\n if (isReady && !this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoSeeked = () => {\n this.#clearPausedVisualProgress();\n this.#syncVideoLoading();\n if (\n this.#isCommittedScrubPending &&\n (!this.#committedScrubWasPlaying || this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA)\n ) {\n this.#clearCommittedScrubPreview();\n this.#syncVideoState();\n return;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n };\n\n #handleVideoError = () => {\n this.#optimisticPlaybackState = null;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#setVideoLoading(true, true);\n this.#syncVideoState();\n this.#retryVideoLoad();\n };\n\n #handleVideoTimeUpdate = () => {\n this.#syncAudioControlState();\n this.#updateProgress();\n };\n\n #handleVideoVolumeChange = () => {\n this.#syncAudioControlState();\n };\n\n #isTouchControls() {\n return (\n window.matchMedia('(max-width: 768px)').matches &&\n window.matchMedia('(hover: none), (pointer: coarse)').matches\n );\n }\n\n #resetSource() {\n if (!this.#video) return;\n this.#observer?.disconnect();\n this.#observer = null;\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#videoSourceLoaded = false;\n this.#videoLoadAttempt = 0;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#hasInitialProgressSettled = false;\n this.#lastRenderedProgressTime = 0;\n this.#clearPausedVisualProgress();\n this.#hasAudioTrack = true;\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#optimisticPlaybackState = null;\n this.#player.classList.remove('has-loaded-once', 'has-visible-frame', 'is-progress-settling');\n this.#video.dataset.src = this.src;\n this.#video.pause();\n this.#video.removeAttribute('src');\n this.#video.preload = 'none';\n this.#syncAutoplayState();\n this.#video.load();\n this.#setProgressVisual(0);\n this.#syncAudioControlState();\n this.#syncVideoLoading();\n this.#syncVideoState();\n }\n}\n","import { SimplePlayer } from './player/simple-player-element';\n\nexport { SimplePlayer } from './player/simple-player-element';\n\nif (!customElements.get('simple-player')) {\n customElements.define('simple-player', SimplePlayer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'simple-player': SimplePlayer;\n }\n}\n"],"names":["DEFAULT_ASPECT_RATIO","DEFAULT_PRELOAD_MARGIN","OBSERVED_ATTRIBUTES","getFullscreenElement","root","fullscreenDocument","isFullscreenSupported","fullscreenEnabled","player","video","fullscreenPlayer","fullscreenVideo","canFullscreenPlayer","canFullscreenVideo","requestPlayerFullscreen","requestFullscreen","canRequestPlayerFullscreen","requestVideoFullscreen","exitFullscreen","formatVideoTime","time","totalSeconds","seconds","totalMinutes","minutes","hours","detectAudioAvailability","fallback","audioTrackVideo","firefoxVideo","webkitVideo","getProgressMetrics","rect","sideInset","innerWidth","getProgressXFromPercent","percent","clampedPercent","getProgressPercentFromClientX","clientX","styles","template","_root","_cleanup","_observer","_initialized","_videoSourceLoaded","_player","_video","_button","_progressTrack","_controlTray","_controlTraySlots","_trayTime","_trayTimeText","_scrubTime","_scrubTimeText","_volumeControl","_volumePopover","_volumeTrack","_pictureInPictureControl","_fullscreenControl","_controlButtons","_progressFrame","_isScrubbing","_isTrackingScrub","_scrubWasPlaying","_scrubTargetTime","_scrubReturnTime","_scrubReturnPercent","_hasScrubReturnMarker","_isCommittedScrubPending","_committedScrubWasPlaying","_scrubStartX","_scrubLongPressTimer","_activeScrubPointerId","_optimisticPlaybackState","_videoLoadAttempt","_videoRetryTimer","_controlsHideTimer","_loadingStateTimer","_initialProgressSettleTimer","_suppressTouchButtonClickUntil","_suppressTouchControlClickUntil","_timeWidthObserver","_hasDecodedFirstFrame","_hasPresentedFirstFrame","_firstFrameRequestPending","_firstFramePresentationPending","_firstFrameRequestToken","_firstFrameFallbackTimer","_hasInitialProgressSettled","_initialProgressEstimateUnlockAt","_isPlaybackBuffering","_visualProgressTime","_visualProgressUpdatedAt","_lastRenderedProgressTime","_pausedVisualProgressTime","_pauseFrozenProgressPercent","_hasControlsCollision","_isProgressHoverPreviewing","_hasAudioTrack","_isPointerOverControlSurface","_lastPointerClientX","_lastPointerClientY","_lastPointerWasTouch","_isVolumeScrubbing","_isVolumeHovering","_activeVolumePointerId","_volumeCloseTimer","_volumeIconAnimationTimer","_controlTapTimer","_volumeIconState","_showRemainingTime","_timeAnimationTimer","_scrubDragThreshold","_scrubSnapDistance","_scrubReturnMarkerBodyInset","_scrubReturnMarkerMinTime","_scrubLongPressDelay","_controlsAutoHideDelay","_pointerControlsIdleDelay","_loadingStateDelay","_initialProgressSettleDelay","_initialProgressEstimateHold","_videoRetryDelay","_maxVideoLoadAttempts","_bufferedAheadTarget","_bufferedRangeFuzz","_controlsCollisionEnterMargin","_controlsCollisionExitMargin","_SimplePlayer_instances","setStringAttribute_fn","setOptionalControlAttributes_fn","syncAspectRatio_fn","syncAutoplayState_fn","syncOptionalControls_fn","hasPinnedTime_get","syncTimeVisibility_fn","bindEvents_fn","listen_fn","setupLazyLoading_fn","_preventNativeVideoAction","clearControlsHideTimer_fn","_hideControls","scheduleControlsHide_fn","scheduleTouchControlsHide_fn","showTouchControls_fn","showPointerControls_fn","hidePointerControls_fn","trackPointerPosition_fn","isPointInsidePlayer_fn","isPointInsideElement_fn","clearProgressHoverPreview_fn","syncHoverTargetsFromPointer_fn","areControlsVisible_fn","shouldSuppressControlAction_fn","isUnavailableControlButton_fn","syncPointerControlsFromLastPosition_fn","_handlePlayerPointerEnter","_handlePlayerPointerMove","_handleDocumentPointerMove","_handlePlayerPointerLeave","_handleControlSurfacePointerEnter","_handleControlSurfacePointerLeave","_handleControlSurfaceFocusIn","_handleControlSurfaceFocusOut","_handleControlButtonPointerEnter","clearControlTapTimer_fn","_clearControlTapActive","_handleControlButtonPointerDown","clearLoadingStateTimer_fn","clearVideoRetryTimer_fn","clearInitialProgressSettleTimer_fn","clearFirstFrameFallbackTimer_fn","clearVolumeIconAnimationTimer_fn","animateVolumeIconSwap_fn","_finishInitialProgressSettle","queueInitialProgressSettle_fn","hydrateVideoSource_fn","isLoopBoundaryBlip_fn","getBufferedAhead_fn","hasBufferedAhead_fn","setVideoLoading_fn","_syncVideoLoading","canStartImmediately_fn","isScrubPreviewLocked_fn","retryVideoLoad_fn","clearCommittedScrubPreview_fn","commitVideoReady_fn","requestFirstVideoFrame_fn","_markVideoReady","isVideoAdvancing_fn","syncVisualProgressClock_fn","clearPausedVisualProgress_fn","holdPausedVisualProgress_fn","freezeRenderedProgressForPause_fn","getVisualProgressTime_fn","setProgressVisual_fn","getProgressPercentFromTime_fn","getProgressMetrics_fn","getProgressXFromPercent_fn","getProgressPercentFromClientX_fn","setScrubReturnMarker_fn","getScrubPoint_fn","syncPinnedTimeText_fn","updateProgress_fn","previewSeekFromClientX_fn","clearControlsCollision_fn","syncControlsCollision_fn","stopProgressLoop_fn","startProgressLoop_fn","syncVideoState_fn","clearScrubLongPressTimer_fn","detectAudioAvailability_fn","_syncAudioControlState","setVolumeFromClientY_fn","releaseVolumePointer_fn","finishVolumeScrub_fn","_syncPictureInPictureState","getFullscreenElement_fn","isFullscreenSupported_fn","requestPlayerFullscreen_fn","requestVideoFullscreen_fn","exitFullscreen_fn","_syncFullscreenState","_handleFullscreenChange","resetFullscreenPointerState_fn","_enterScrubMode","releaseScrubPointer_fn","finishScrub_fn","cancelScrub_fn","formatTimeForDisplay_fn","clearTimeAnimationTimer_fn","animateTimeSwap_fn","_handleTimeToggleClick","_handleButtonClick","_handlePlayerPointerDown","_preventVolumeTrackClick","clearVolumeCloseTimer_fn","openVolumePopover_fn","_closeVolumePopover","scheduleVolumePopoverClose_fn","_handleVolumePointerEnter","_handleVolumePointerLeave","_handleVolumeControlClick","_handleVolumePointerDown","_handleVolumePointerMove","_handleVolumePointerUp","_handleVolumePointerCancel","_handleVolumeKeyDown","_handlePictureInPictureClick","_handleFullscreenClick","_handleProgressPointerEnter","_handleProgressPointerLeave","_handleProgressPointerDown","_handleProgressKeyDown","_handleProgressPointerMove","_handleProgressPointerUp","_handleProgressPointerCancel","_handleDocumentPointerUp","_handleDocumentPointerCancel","_handleWindowBlur","_handleWindowFocus","_handleVideoPlay","_handleVideoPause","_handleVideoEnded","_handleVideoLoadStart","_handleVideoWaiting","_handleVideoLoadedMetadata","_handleVideoPlaying","_handleVideoSeeked","_handleVideoError","_handleVideoTimeUpdate","_handleVideoVolumeChange","isTouchControls_fn","resetSource_fn","SimplePlayer","__privateAdd","event","__privateSet","__privateGet","__privateMethod","target","index","button","isReady","isMuted","visualVolume","volumePercent","nextIconState","isActive","isSupported","fullscreenElement","isFullscreenActive","shouldPlay","shouldFlipImmediately","buttonRect","isInsideButton","controlTrayRect","isInsideControlTray","progressRect","isInsideProgress","didRevealControls","step","nextVolume","baseTime","smallStep","largeStep","nextTime","value","cleanup","name","oldValue","newValue","enabled","isEnabled","controls","control","type","listener","entries","observer","entry","delay","wasVisible","forcePointer","clientY","element","hoveredControl","source","currentTime","start","end","remainingDuration","requiredBuffer","isLoading","immediate","shouldLoad","shouldShowLoading","requestToken","confirmFirstFrame","renderedTime","rawInset","inset","progressFromFill","visualTime","progressFromTime","frozenProgress","elapsed","estimatedTime","remainingPercent","markerEdgePercent","markerIsFullyOnFill","markerX","maxHoleLeft","holeLeft","markerIsInTrackBody","shouldSnap","targetTime","hasDuration","frozenTime","progressValue","updateVisual","scrubPoint","holderRect","timeRect","holderIsVisible","margin","timeTouchesHolder","tick","realIsPlaying","isPlaying","rounded","pointerId","activeElement","shouldCommit","wasDragging","duration","__publicField"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GCF3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"}
1
+ {"version":3,"file":"simple-player.js","sources":["../src/player/constants.ts","../src/player/fullscreen.ts","../src/player/media.ts","../src/player/progress.ts","../src/player/styles.ts","../src/player/template.ts","../src/player/simple-player-element.ts","../src/simple-player.ts"],"sourcesContent":["export const DEFAULT_ASPECT_RATIO = '16 / 9';\nexport const DEFAULT_PRELOAD_MARGIN = '360px 0px';\n\nexport const OBSERVED_ATTRIBUTES = [\n 'src',\n 'aspect-ratio',\n 'preload-margin',\n 'controls',\n 'disable-autoplay',\n 'enable-volume',\n 'disable-volume',\n 'disable-volume-slider',\n 'enable-picture-in-picture',\n 'disable-picture-in-picture',\n 'enable-fullscreen',\n 'disable-fullscreen',\n 'show-time',\n 'no-autoplay',\n 'no-volume',\n 'no-volume-slider',\n 'no-picture-in-picture',\n 'no-fullscreen',\n] as const;\n","import type { FullscreenDocument, FullscreenPlayer, FullscreenVideo } from './types';\n\nexport function getFullscreenElement(root: ShadowRoot): Element | null {\n const fullscreenDocument = document as FullscreenDocument;\n\n return (\n root.fullscreenElement ||\n document.fullscreenElement ||\n fullscreenDocument.webkitFullscreenElement ||\n fullscreenDocument.mozFullScreenElement ||\n fullscreenDocument.msFullscreenElement ||\n null\n );\n}\n\nexport function isFullscreenSupported(\n fullscreenEnabled: boolean,\n player: HTMLElement,\n video: HTMLVideoElement,\n): boolean {\n const fullscreenDocument = document as FullscreenDocument;\n const fullscreenPlayer = player as FullscreenPlayer;\n const fullscreenVideo = video as FullscreenVideo;\n const canFullscreenPlayer = !!(\n (\n document.fullscreenEnabled ??\n fullscreenDocument.webkitFullscreenEnabled ??\n fullscreenDocument.mozFullScreenEnabled ??\n fullscreenDocument.msFullscreenEnabled ??\n false\n ) &&\n (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n )\n );\n const canFullscreenVideo = !!(\n fullscreenVideo.webkitSupportsFullscreen ||\n fullscreenVideo.webkitEnterFullscreen ||\n fullscreenVideo.webkitEnterFullScreen\n );\n\n return !!(fullscreenEnabled && (canFullscreenPlayer || canFullscreenVideo));\n}\n\nexport function requestPlayerFullscreen(player: HTMLElement): Promise<void> {\n const fullscreenPlayer = player as FullscreenPlayer;\n const requestFullscreen = (\n fullscreenPlayer.requestFullscreen ||\n fullscreenPlayer.webkitRequestFullscreen ||\n fullscreenPlayer.mozRequestFullScreen ||\n fullscreenPlayer.msRequestFullscreen\n );\n\n return Promise.resolve(requestFullscreen?.call(fullscreenPlayer));\n}\n\nexport function canRequestPlayerFullscreen(player: HTMLElement): boolean {\n const fullscreenPlayer = player as FullscreenPlayer;\n\n return (\n typeof fullscreenPlayer.requestFullscreen === 'function' ||\n typeof fullscreenPlayer.webkitRequestFullscreen === 'function' ||\n typeof fullscreenPlayer.mozRequestFullScreen === 'function' ||\n typeof fullscreenPlayer.msRequestFullscreen === 'function'\n );\n}\n\nexport function requestVideoFullscreen(video: HTMLVideoElement): void {\n const fullscreenVideo = video as FullscreenVideo;\n const requestFullscreen = fullscreenVideo.webkitEnterFullscreen || fullscreenVideo.webkitEnterFullScreen;\n\n requestFullscreen?.call(fullscreenVideo);\n}\n\nexport function exitFullscreen(): Promise<void> {\n const fullscreenDocument = document as FullscreenDocument;\n const exitFullscreen = (\n document.exitFullscreen ||\n fullscreenDocument.webkitExitFullscreen ||\n fullscreenDocument.mozCancelFullScreen ||\n fullscreenDocument.msExitFullscreen\n );\n\n return Promise.resolve(exitFullscreen?.call(fullscreenDocument));\n}\n","export function formatVideoTime(time: number): string {\n if (!Number.isFinite(time) || time < 0) return '0:00';\n\n const totalSeconds = Math.floor(time);\n const seconds = totalSeconds % 60;\n const totalMinutes = Math.floor(totalSeconds / 60);\n const minutes = totalMinutes % 60;\n const hours = Math.floor(totalMinutes / 60);\n\n if (hours > 0) {\n return hours + ':' + String(minutes).padStart(2, '0') + ':' + String(seconds).padStart(2, '0');\n }\n\n return minutes + ':' + String(seconds).padStart(2, '0');\n}\n\nexport type AudioAvailability = 'available' | 'unavailable' | 'unknown';\n\nexport function detectAudioAvailability(video: HTMLVideoElement): AudioAvailability {\n const audioTrackVideo = video as HTMLVideoElement & { audioTracks?: { length: number } };\n if (audioTrackVideo.audioTracks && typeof audioTrackVideo.audioTracks.length === 'number') {\n return audioTrackVideo.audioTracks.length > 0 ? 'available' : 'unavailable';\n }\n\n const firefoxVideo = video as HTMLVideoElement & { mozHasAudio?: boolean };\n if (typeof firefoxVideo.mozHasAudio === 'boolean') {\n return firefoxVideo.mozHasAudio ? 'available' : 'unavailable';\n }\n\n const streamVideo = video as HTMLVideoElement & {\n captureStream?: () => MediaStream;\n mozCaptureStream?: () => MediaStream;\n };\n const captureStream = streamVideo.captureStream ?? streamVideo.mozCaptureStream;\n if (captureStream && video.readyState >= HTMLMediaElement.HAVE_METADATA) {\n try {\n return captureStream.call(video).getAudioTracks().length > 0 ? 'available' : 'unavailable';\n } catch {\n // Cross-origin media can block captureStream; keep probing with other browser hints.\n }\n }\n\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n if (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime > 0.25\n ) {\n return webkitVideo.webkitAudioDecodedByteCount > 0 ? 'available' : 'unavailable';\n }\n\n return 'unknown';\n}\n\nexport function isAudioAvailabilityPending(video: HTMLVideoElement): boolean {\n const webkitVideo = video as HTMLVideoElement & { webkitAudioDecodedByteCount?: number };\n return (\n typeof webkitVideo.webkitAudioDecodedByteCount === 'number' &&\n video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n video.currentTime <= 0.25\n );\n}\n","import type { ProgressMetrics } from './types';\n\nexport function getProgressMetrics(rect: DOMRect): ProgressMetrics {\n const sideInset = Math.min(2, Math.max(0, rect.width / 2));\n const innerWidth = Math.max(1, rect.width - (sideInset * 2));\n\n return { rect, sideInset, innerWidth };\n}\n\nexport function getProgressXFromPercent(percent: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n const clampedPercent = Math.min(1, Math.max(0, percent));\n\n return sideInset + (clampedPercent * innerWidth);\n}\n\nexport function getProgressPercentFromClientX(clientX: number, rect: DOMRect): number {\n const { sideInset, innerWidth } = getProgressMetrics(rect);\n\n return Math.min(1, Math.max(0, (clientX - rect.left - sideInset) / innerWidth));\n}\n","import { DEFAULT_ASPECT_RATIO } from './constants';\n\nexport const styles: string = `\n :host {\n --simple-player-aspect-ratio: ${DEFAULT_ASPECT_RATIO};\n --space: 4px;\n --white: #fff;\n --black: #000;\n --white-rgb: 255 255 255;\n --overlay-soft: rgb(0 0 0 / 0.42);\n --overlay-blur: 0px;\n --sp-glass-surface: rgb(255 255 255 / 0.04);\n --sp-glass-opacity: 0.28;\n --sp-control-glass-surface: rgb(255 255 255 / 0.12);\n --sp-control-glass-opacity: 0.62;\n --sp-control-hover-surface: rgb(255 255 255 / 0.14);\n --sp-glass-filter: invert(1) grayscale(1);\n --sp-shimmer-highlight: rgb(255 255 255 / 0.42);\n --sp-control-tray-display: block;\n --sp-enabled-controls-count: 3;\n --sp-control-tray-width: 0px;\n --sp-control-tray-expanded-width: calc((var(--sp-control-slot-size) * var(--sp-enabled-controls-count)) + (var(--sp-control-tray-padding) * 2));\n --sp-control-tray-gap: 0px;\n --sp-control-icon-size: 20px;\n --sp-control-icon-render-size: 20px;\n --sp-control-icon-opacity: 0.82;\n --sp-control-icon-hidden-opacity: 0;\n --sp-control-icon-hidden-transform: translateY(2px) scale(0.84);\n --sp-control-icon-hover-opacity: 0.96;\n --sp-control-icon-stroke-width: 1.6;\n --sp-control-icon-delay-1: 30ms;\n --sp-control-icon-delay-2: 55ms;\n --sp-control-icon-delay-3: 80ms;\n --sp-control-hover-opacity: 1;\n --sp-control-slot-hover-surface: transparent;\n --sp-control-tray-padding: 2px;\n --sp-control-slot-size: calc(var(--sp-control-icon-size) + 4px);\n --sp-touch-control-hover-offset: -9999px;\n --sp-volume-level: 100%;\n\n position: relative;\n display: block;\n width: 100%;\n aspect-ratio: var(--simple-player-aspect-ratio);\n isolation: isolate;\n overflow: hidden;\n contain: paint;\n background: #1E1E1E;\n }\n\n *,\n *::before,\n *::after {\n box-sizing: border-box;\n }\n\n .sp-video {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n object-fit: cover;\n }\n\n .sp-asset {\n pointer-events: none;\n opacity: 0;\n transition: opacity 160ms ease;\n user-select: none;\n -webkit-user-select: none;\n -webkit-user-drag: none;\n -webkit-touch-callout: none;\n }\n\n .sp-player.has-visible-frame .sp-asset {\n opacity: 1;\n }\n\n .sp-player {\n position: absolute;\n inset: 0;\n display: block;\n width: 100%;\n height: 100%;\n min-width: 100%;\n min-height: 100%;\n overflow: hidden;\n --sp-progress-inset: 100%;\n --sp-scrub-preview-left: 0px;\n --sp-return-marker-left: 0px;\n --sp-return-marker-base-opacity: 1;\n --sp-return-marker-hole-left: -9999px;\n user-select: none;\n -webkit-user-select: none;\n -webkit-touch-callout: none;\n -webkit-tap-highlight-color: transparent;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-player:fullscreen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-player:-webkit-full-screen {\n position: fixed;\n inset: 0;\n width: 100vw;\n height: 100vh;\n min-width: 100vw;\n min-height: 100vh;\n background: #1E1E1E;\n }\n\n .sp-overlay {\n position: absolute;\n inset: 0;\n z-index: 2;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background-color: var(--overlay-soft);\n backdrop-filter: blur(var(--overlay-blur));\n -webkit-backdrop-filter: blur(var(--overlay-blur));\n opacity: 0;\n transition: opacity 260ms ease;\n transform: translateZ(0);\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-controls-visible .sp-overlay,\n :host(:hover) .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay {\n opacity: 0;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button {\n position: absolute;\n top: 50%;\n left: 50%;\n z-index: 3;\n display: grid;\n place-items: center;\n width: 60px;\n height: 60px;\n padding: 0;\n border: 0;\n border-radius: 0;\n color: var(--white);\n background: transparent;\n cursor: pointer;\n opacity: 0;\n pointer-events: none;\n transform: translate(-50%, -50%) scale(0.96);\n transition: opacity 260ms ease, transform 260ms cubic-bezier(0.23, 1, 0.32, 1);\n -webkit-tap-highlight-color: transparent;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-controls-visible .sp-button,\n :host(:hover) .sp-button {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-button:focus {\n outline: 0;\n }\n\n .sp-icon {\n grid-area: 1 / 1;\n position: relative;\n z-index: 1;\n display: block;\n overflow: visible;\n transition: opacity 160ms ease, transform 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-icon--play {\n width: 54px;\n height: 60px;\n opacity: 1;\n transform: translate(4px, 0) rotate(0deg) scale(1);\n }\n\n .sp-icon--pause {\n width: 54px;\n height: 60px;\n opacity: 0;\n transform: translate(0, 0) rotate(-70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--play {\n opacity: 0;\n transform: translate(4px, 0) rotate(70deg) scale(0.72);\n }\n\n .sp-player.is-playing .sp-icon--pause {\n opacity: 1;\n transform: translate(0, 0) rotate(0deg) scale(1);\n }\n\n .sp-progress-cluster {\n position: absolute;\n top: calc(100% - 28px);\n left: 50%;\n z-index: 4;\n display: block;\n width: calc(100% - (var(--space) * 8));\n height: 28px;\n --sp-progress-height: 4px;\n transform: translateX(-50%);\n transition:\n top 360ms cubic-bezier(0.23, 1, 0.32, 1),\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n transform 360ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-progress {\n position: relative;\n flex: 1 1 auto;\n min-width: 0;\n height: 28px;\n cursor: pointer;\n touch-action: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster {\n top: 50%;\n left: 50%;\n width: min(148px, calc(100% - (var(--space) * 12)));\n height: 20px;\n --sp-progress-height: 4px;\n transform: translate(-50%, -50%);\n }\n\n .sp-progress-surface,\n .sp-progress-fill {\n position: absolute;\n bottom: calc(var(--space) * 2);\n left: 0;\n height: var(--sp-progress-height);\n border-radius: 3px;\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-progress-surface {\n right: 0;\n bottom: calc((var(--space) * 2) - 2px);\n z-index: 0;\n height: calc(var(--sp-progress-height) + 4px);\n border-radius: 5px;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n }\n\n .sp-progress-surface::after {\n content: '';\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n border-radius: inherit;\n background: linear-gradient(90deg, transparent 0%, var(--sp-shimmer-highlight) 46%, transparent 100%);\n transform: translateX(-120%);\n }\n\n .sp-player.is-loading .sp-progress-surface::after {\n opacity: 1;\n animation: sp-progress-shimmer 1.35s ease-in-out infinite;\n }\n\n .sp-player.is-loading.has-loaded-once .sp-progress-surface {\n opacity: 0.48;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-surface {\n background: rgb(255 255 255 / 0.08);\n opacity: 1;\n backdrop-filter: none;\n -webkit-backdrop-filter: none;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-fill,\n .sp-player.is-progress-settling .sp-progress-fill {\n opacity: 0;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover),\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-control-tray {\n position: absolute;\n display: var(--sp-control-tray-display);\n right: 0;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n z-index: 3;\n width: var(--sp-control-tray-expanded-width);\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: right bottom;\n transition:\n bottom 180ms ease,\n width 360ms cubic-bezier(0.23, 1, 0.32, 1),\n height 360ms cubic-bezier(0.23, 1, 0.32, 1),\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-pointer-active .sp-control-tray,\n .sp-player.is-controls-visible .sp-control-tray,\n :host(:hover) .sp-control-tray {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray::before {\n content: '';\n position: absolute;\n inset: 0;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n opacity: var(--sp-control-glass-opacity);\n overflow: hidden;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-control-tray-slots {\n position: absolute;\n inset: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n gap: 0;\n height: 100%;\n box-sizing: border-box;\n padding: var(--sp-control-tray-padding);\n border-radius: 5px;\n overflow: visible;\n opacity: 1;\n transition: height 180ms ease;\n }\n\n .sp-control-tray-slots::before {\n content: '';\n position: absolute;\n top: var(--sp-control-tray-padding);\n left: var(--sp-control-tray-padding);\n z-index: 0;\n width: var(--sp-control-slot-size);\n height: var(--sp-control-slot-size);\n border-radius: 3px;\n background: var(--sp-control-hover-surface);\n opacity: 0;\n pointer-events: none;\n transform: translateX(var(--sp-control-hover-offset, 0px));\n transition:\n opacity 120ms ease,\n transform 240ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: var(--sp-control-hover-opacity);\n transition:\n opacity 80ms ease 120ms,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n transform: translateX(var(--sp-touch-control-hover-offset));\n transition:\n opacity 80ms ease,\n transform 160ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-control-tray-slots:not(:has(.sp-control-button:hover))::before {\n transition:\n opacity 100ms ease,\n transform 0ms linear 100ms;\n }\n\n .sp-control-button {\n position: relative;\n z-index: 1;\n display: grid;\n place-items: center;\n flex: 0 0 auto;\n aspect-ratio: 1 / 1;\n width: var(--sp-control-slot-size);\n min-width: 0;\n height: var(--sp-control-slot-size);\n border: 0;\n border-radius: 3px;\n color: var(--white);\n background: transparent;\n padding: 0;\n cursor: pointer;\n transition: background-color 150ms ease, color 150ms ease;\n }\n\n .sp-control-button:focus {\n outline: 0;\n }\n\n .sp-control-button:hover {\n background: var(--sp-control-slot-hover-surface);\n }\n\n .sp-player:not(.has-volume-control) [data-sp-volume-control],\n .sp-player:not(.has-picture-in-picture-control) [data-sp-picture-in-picture-control],\n .sp-player:not(.has-fullscreen-control) [data-sp-fullscreen-control] {\n display: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control] {\n cursor: default;\n pointer-events: auto;\n }\n\n .sp-player.is-volume-unavailable .sp-volume-icon {\n transition: none;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover {\n background: transparent;\n }\n\n .sp-player.is-volume-unavailable [data-sp-volume-control]:hover .sp-control-icon,\n .sp-player.is-volume-unavailable [data-sp-volume-control].is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control]:hover)::before,\n .sp-player.is-volume-unavailable .sp-control-tray-slots:has([data-sp-volume-control].is-control-tap-active)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-icon {\n display: block;\n width: var(--sp-control-icon-render-size);\n height: var(--sp-control-icon-render-size);\n color: currentColor;\n overflow: visible;\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n transition:\n opacity 180ms ease,\n transform 280ms cubic-bezier(0.18, 0.9, 0.22, 1);\n transition-delay: 0ms;\n }\n\n .sp-control-icon [stroke] {\n stroke-width: var(--sp-control-icon-stroke-width);\n }\n\n .sp-volume-icon,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: none;\n }\n\n .sp-player.is-volume-sound .sp-volume-icon--sound,\n .sp-player.is-volume-muted .sp-volume-icon--muted {\n display: block;\n }\n\n .sp-player.is-volume-icon-animating .sp-volume-icon {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-popover {\n position: absolute;\n left: 0;\n bottom: calc(var(--sp-control-slot-size) + var(--sp-control-tray-padding) + 4px);\n z-index: -1;\n display: grid;\n place-items: center;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(8px) scale(0.98);\n transform-origin: center bottom;\n transition:\n opacity 140ms ease,\n filter 180ms ease,\n transform 260ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-volume-slot::after {\n content: '';\n position: absolute;\n right: 0;\n bottom: 100%;\n left: 0;\n height: calc(var(--sp-control-tray-padding) + 4px);\n z-index: 5;\n pointer-events: auto;\n }\n\n .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-volume-popover.is-scrubbing-volume {\n z-index: 4;\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n transition:\n opacity 150ms ease,\n filter 220ms ease,\n transform 260ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.is-volume-unavailable .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player:not(.has-volume-slider-control) .sp-volume-slot.is-volume-open .sp-volume-popover,\n .sp-player.is-volume-unavailable .sp-volume-popover.is-scrubbing-volume {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-volume-track {\n position: relative;\n z-index: 1;\n width: var(--sp-control-slot-size);\n height: 76px;\n border-radius: 5px;\n background: var(--sp-control-glass-surface);\n overflow: hidden;\n touch-action: none;\n cursor: ns-resize;\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n box-shadow: inset 0 0 0 1px rgb(var(--white-rgb) / 0.08);\n transform: translateZ(0);\n }\n\n .sp-volume-fill {\n position: absolute;\n right: 2px;\n bottom: 2px;\n left: 2px;\n height: max(0px, calc(var(--sp-volume-level) - 4px));\n min-height: 0;\n border-radius: 3px;\n background: var(--white);\n opacity: 1;\n transition: height 220ms cubic-bezier(0.23, 1, 0.32, 1);\n }\n\n .sp-fullscreen-icon,\n .sp-player.is-fullscreen .sp-fullscreen-icon--enter,\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--exit {\n display: none;\n }\n\n .sp-player:not(.is-fullscreen) .sp-fullscreen-icon--enter,\n .sp-player.is-fullscreen .sp-fullscreen-icon--exit {\n display: block;\n }\n\n .sp-player.is-pointer-active .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-icon,\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(1) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(1) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(1) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-1);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(2) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(2) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(2) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-2);\n }\n\n .sp-player.is-pointer-active .sp-control-button:nth-child(3) .sp-control-icon,\n .sp-player.is-controls-visible .sp-control-button:nth-child(3) .sp-control-icon,\n :host(:hover) .sp-control-button:nth-child(3) .sp-control-icon {\n transition-delay: var(--sp-control-icon-delay-3);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-control-tray,\n .sp-player.is-progress-settling .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n }\n\n .sp-player.has-controls-collision .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n filter: blur(1.4px);\n transform: translateY(-2px) scale(0.985);\n }\n\n .sp-progress-fill {\n display: block;\n z-index: 1;\n left: 2px;\n right: 2px;\n background: var(--white);\n border-radius: 3px;\n clip-path: inset(0 var(--sp-progress-inset) 0 0 round 3px);\n -webkit-mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n -webkit-mask-composite: xor;\n mask:\n linear-gradient(var(--black) 0 0),\n url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2 14' preserveAspectRatio='none'%3E%3Crect width='2' height='14' rx='1' fill='black'/%3E%3C/svg%3E\") var(--sp-return-marker-hole-left) 50% / 2px max(1px, calc(var(--sp-progress-height) - 3px)) no-repeat;\n mask-composite: exclude;\n transform: translateZ(0);\n will-change: clip-path;\n }\n\n .sp-progress-marker {\n position: absolute;\n bottom: calc((var(--space) * 2) + 1.5px);\n left: clamp(1px, var(--sp-return-marker-left), calc(100% - 1px));\n z-index: 2;\n width: 2px;\n height: max(1px, calc(var(--sp-progress-height) - 3px));\n border-radius: 2px;\n background: rgb(var(--white-rgb) / calc(var(--sp-return-marker-base-opacity) * 0.58));\n opacity: 0;\n overflow: hidden;\n pointer-events: none;\n transform: translateX(-50%) translateZ(0);\n transition: height 180ms ease, opacity 120ms ease;\n }\n\n .sp-player.is-scrubbing.has-return-marker .sp-progress-marker {\n opacity: 1;\n }\n\n .sp-time {\n position: absolute;\n display: block;\n bottom: calc(100% + var(--space));\n left: var(--sp-scrub-preview-left);\n z-index: 2;\n padding: 2px calc(var(--space) * 1.5);\n color: var(--white);\n background: transparent;\n border-radius: 4px;\n isolation: isolate;\n overflow: hidden;\n pointer-events: none;\n opacity: 0;\n transition: transform 120ms ease;\n transform: translateX(-50%) translateY(2px);\n white-space: nowrap;\n font: 500 12px/1.35 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n }\n\n .sp-time-surface {\n position: absolute;\n inset: 0;\n z-index: 0;\n border-radius: inherit;\n background: var(--sp-glass-surface);\n opacity: var(--sp-glass-opacity);\n backdrop-filter: var(--sp-glass-filter);\n -webkit-backdrop-filter: var(--sp-glass-filter);\n transform: translateZ(0);\n will-change: backdrop-filter, opacity;\n }\n\n .sp-time-text {\n position: relative;\n z-index: 1;\n }\n\n .sp-progress:hover .sp-time,\n .sp-player.is-progress-hovering .sp-time,\n .sp-player.is-scrubbing .sp-time {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n .sp-player.has-pinned-time .sp-time {\n display: none !important;\n }\n\n .sp-tray-time {\n position: absolute;\n display: none;\n bottom: calc(((var(--space) * 2) - 2px) + var(--sp-progress-height) + 8px);\n left: 0;\n z-index: 3;\n color: var(--white);\n isolation: isolate;\n overflow: visible;\n pointer-events: none;\n white-space: nowrap;\n opacity: 0;\n filter: blur(0.8px);\n transform: translateY(4px) scale(0.96);\n transform-origin: left bottom;\n transition:\n bottom 180ms ease,\n opacity 220ms ease,\n filter 260ms ease,\n transform 300ms cubic-bezier(0.18, 0.9, 0.22, 1);\n }\n\n .sp-player.has-pinned-time .sp-tray-time {\n display: block;\n }\n\n .sp-player.has-pinned-time.is-pointer-active .sp-tray-time,\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time,\n :host(:hover) .sp-player.has-pinned-time .sp-tray-time {\n opacity: 1;\n pointer-events: auto;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-tray-time-holder {\n position: relative;\n right: auto;\n bottom: auto;\n width: calc(var(--sp-tray-time-width, max-content) + (var(--sp-control-tray-padding) * 2));\n height: calc(var(--sp-control-slot-size) + (var(--sp-control-tray-padding) * 2));\n transition: width 240ms cubic-bezier(0.23, 1, 0.32, 1);\n overflow: hidden;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .sp-tray-time-holder .sp-control-tray-slots::before {\n width: calc(100% - (var(--sp-control-tray-padding) * 2));\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-tray-time-holder .sp-tray-time-text {\n aspect-ratio: auto;\n width: 100%;\n height: var(--sp-control-slot-size);\n max-height: var(--sp-control-slot-size);\n padding: 0 8px;\n font: 600 13px/1 system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n font-variant-numeric: tabular-nums;\n color: var(--white);\n border-radius: 3px;\n }\n\n .sp-tray-time-text {\n pointer-events: auto;\n cursor: pointer;\n }\n\n .sp-tray-time-text.is-time-animating {\n animation: sp-volume-icon-swap 240ms cubic-bezier(0.2, 0.8, 0.2, 1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once) .sp-tray-time {\n opacity: 0;\n }\n\n .sp-button:focus-visible,\n .sp-progress:focus-visible,\n .sp-control-button:focus-visible,\n .sp-volume-track:focus-visible {\n outline: 2px solid rgb(255 255 255 / 0.92);\n outline-offset: 3px;\n box-shadow: 0 0 0 5px rgb(0 0 0 / 0.32);\n }\n\n @media (max-width: 768px) and (hover: none) and (pointer: coarse) {\n .sp-overlay,\n .sp-button {\n transition-duration: 340ms;\n }\n\n .sp-player.is-pointer-active .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-overlay,\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n opacity: 0;\n }\n\n .sp-player.is-pointer-active .sp-button,\n .sp-player.is-loading:not(.has-loaded-once).is-pointer-active .sp-button {\n transform: translate(-50%, -50%) scale(0.96);\n }\n\n .sp-player.is-controls-visible .sp-overlay {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button {\n opacity: 1;\n transform: translate(-50%, -50%) scale(1);\n }\n\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-overlay,\n .sp-player.is-loading:not(.has-loaded-once).is-controls-visible .sp-button,\n .sp-player.is-scrubbing .sp-button {\n opacity: 0;\n pointer-events: none;\n }\n\n .sp-progress-cluster:has(.sp-progress:hover) {\n --sp-progress-height: 4px;\n }\n\n .sp-player.has-pinned-time.is-controls-visible .sp-tray-time {\n opacity: 1;\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n .sp-player.is-scrubbing .sp-progress-cluster {\n --sp-progress-height: 14px;\n }\n\n :host(:hover) .sp-overlay,\n :host(:hover) .sp-button,\n :host(:hover) .sp-control-tray {\n opacity: 0;\n pointer-events: none;\n }\n\n :host(:hover) .sp-control-icon {\n opacity: var(--sp-control-icon-hidden-opacity);\n transform: var(--sp-control-icon-hidden-transform);\n }\n\n .sp-player.is-controls-visible .sp-overlay,\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n opacity: 1;\n }\n\n .sp-player.is-controls-visible .sp-button,\n .sp-player.is-controls-visible .sp-control-tray {\n pointer-events: auto;\n }\n\n .sp-player.is-controls-visible .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button:hover)::before {\n opacity: 0;\n }\n\n .sp-control-button:hover .sp-control-icon {\n opacity: var(--sp-control-icon-opacity);\n transform: translateY(0) scale(1);\n }\n\n .sp-control-tray-slots:has(.sp-control-button.is-control-tap-active)::before {\n opacity: var(--sp-control-hover-opacity);\n }\n\n .sp-control-button.is-control-tap-active .sp-control-icon {\n opacity: var(--sp-control-icon-hover-opacity);\n transform: translateY(0) scale(1);\n }\n }\n\n @keyframes sp-progress-shimmer {\n 0% {\n transform: translateX(-120%);\n }\n\n 58%,\n 100% {\n transform: translateX(120%);\n }\n }\n\n @keyframes sp-volume-icon-swap {\n 0% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n\n 42% {\n filter: blur(1.2px);\n transform: translateY(0) scale(0.9);\n }\n\n 100% {\n filter: blur(0);\n transform: translateY(0) scale(1);\n }\n }\n`;\n","import { styles } from './styles';\n\nexport const template = document.createElement('template');\ntemplate.innerHTML = `\n <style>${styles}</style>\n <div class=\"sp-player is-loading\" data-sp-player>\n <video\n class=\"sp-video sp-asset\"\n autoplay\n muted\n playsinline\n loop\n preload=\"none\"\n controlslist=\"nodownload nofullscreen noremoteplayback\"\n disableRemotePlayback\n data-sp-video>\n </video>\n <span class=\"sp-overlay\" aria-hidden=\"true\"></span>\n <button class=\"sp-button\" type=\"button\" aria-label=\"Play video\" data-sp-button>\n <svg class=\"sp-icon sp-icon--play\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <path d=\"M3 3.5L15 10L3 16.5Z\" fill=\"currentColor\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-icon sp-icon--pause\" viewBox=\"0 0 18 20\" aria-hidden=\"true\">\n <rect x=\"3\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n <rect x=\"10\" y=\"3\" width=\"5\" height=\"14\" rx=\"1.5\" fill=\"currentColor\"></rect>\n </svg>\n </button>\n <div class=\"sp-progress-cluster\">\n <div class=\"sp-progress\" aria-label=\"Video progress\" role=\"slider\" tabindex=\"0\" data-sp-progress-track>\n <span class=\"sp-progress-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time\" data-sp-time>\n <span class=\"sp-time-surface\" aria-hidden=\"true\"></span>\n <span class=\"sp-time-text\" data-sp-time-text>0:00</span>\n </span>\n <span class=\"sp-progress-fill\" data-sp-progress></span>\n <span class=\"sp-progress-marker\" aria-hidden=\"true\"></span>\n </div>\n <span class=\"sp-tray-time\" data-sp-tray-time>\n <span class=\"sp-control-tray sp-tray-time-holder\">\n <span class=\"sp-control-tray-slots\">\n <button class=\"sp-control-button sp-tray-time-text\" type=\"button\" tabindex=\"-1\" data-sp-tray-time-text>0:00</button>\n </span>\n </span>\n </span>\n <span class=\"sp-control-tray\" data-sp-control-tray>\n <span class=\"sp-control-tray-slots\" data-sp-control-tray-slots>\n <button class=\"sp-control-button sp-volume-slot\" type=\"button\" aria-label=\"Toggle sound\" data-sp-volume-control>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--sound\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M8 7.00002H5C3.8954 7.00002 3 7.89542 3 9.00002V11C3 12.1046 3.8954 13 5 13H8L12.5227 16.7689C13.1093 17.2578 14 16.8406 14 16.077V3.92302C14 3.15942 13.1094 2.74222 12.5227 3.23112L8 7.00002Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M17.4141 8.58582C18.1951 9.36682 18.1951 10.6332 17.4141 11.4142\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </svg>\n <svg class=\"sp-control-icon sp-volume-icon sp-volume-icon--muted\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"M3 17L17 3\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n <path d=\"M15 16.0773C14.9998 17.6883 13.1207 18.5686 11.8828 17.5372L9.8333 15.8303C9.38114 15.4538 9.35003 14.7702 9.76611 14.3541C10.132 13.9882 10.7165 13.9617 11.114 14.2929L13 15.8644V11.5354C13 11.2702 13.1054 11.0158 13.2929 10.8283C13.9229 10.1983 15 10.6445 15 11.5354V16.0773Z\" fill=\"currentColor\"></path>\n <path d=\"M12 2.37218C13.2358 1.48685 15 2.36173 15 3.92296V4.87902L13 6.87902V4.13488L8.64062 7.76867C8.46092 7.91841 8.23392 8.00011 8 8.00011H5C4.44768 8.00011 4 8.4478 4 9.00011V11.0001C4.00009 11.5524 4.44774 12.0001 5 12.0001H7.87891L5.87891 14.0001H5C3.34317 14.0001 2.00009 12.6569 2 11.0001V9.00011C2 7.34323 3.34312 6.00011 5 6.00011H7.63672L11.8828 2.463L12 2.37218Z\" fill=\"currentColor\"></path>\n </svg>\n <span class=\"sp-volume-popover\" data-sp-volume-popover>\n <span class=\"sp-volume-track\" role=\"slider\" aria-label=\"Volume\" aria-valuemin=\"0\" aria-valuemax=\"100\" tabindex=\"0\" data-sp-volume-track>\n <span class=\"sp-volume-fill\" data-sp-volume-fill></span>\n </span>\n </span>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Picture in picture\" data-sp-picture-in-picture-control>\n <svg class=\"sp-control-icon\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <path d=\"m5.5,13c-1.381,0-2.5-1.119-2.5-2.5v-5c0-1.381,1.119-2.5,2.5-2.5h7c1.381,0,2.5,1.119,2.5,2.5v2.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></path>\n <rect x=\"9\" y=\"12\" width=\"8\" height=\"5\" rx=\"1.5\" ry=\"1.5\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></rect>\n <line x1=\"8\" y1=\"8\" x2=\"6\" y2=\"6\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></line>\n <polygon points=\"9 6 9 9 6 9 9 6\" fill=\"currentColor\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.6\"></polygon>\n </svg>\n </button>\n <button class=\"sp-control-button\" type=\"button\" aria-label=\"Enter fullscreen\" data-sp-fullscreen-control>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--enter\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"12.5 16 16 16 16 12.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"16\" y1=\"16\" x2=\"12\" y2=\"12\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"7.5 4 4 4 4 7.5\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"4\" y1=\"4\" x2=\"8\" y2=\"8\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n <svg class=\"sp-control-icon sp-fullscreen-icon sp-fullscreen-icon--exit\" viewBox=\"0 0 20 20\" aria-hidden=\"true\">\n <polyline points=\"16 12.5 12.5 12.5 12.5 16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"12\" y1=\"12\" x2=\"16\" y2=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n <polyline points=\"4 7.5 7.5 7.5 7.5 4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></polyline>\n <line x1=\"8\" y1=\"8\" x2=\"4\" y2=\"4\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></line>\n </svg>\n </button>\n </span>\n </span>\n </div>\n </div>\n`;\n","import { DEFAULT_ASPECT_RATIO, DEFAULT_PRELOAD_MARGIN, OBSERVED_ATTRIBUTES } from './constants';\nimport {\n canRequestPlayerFullscreen,\n exitFullscreen,\n getFullscreenElement,\n isFullscreenSupported,\n requestPlayerFullscreen,\n requestVideoFullscreen,\n} from './fullscreen';\nimport { detectAudioAvailability, formatVideoTime, isAudioAvailabilityPending } from './media';\nimport { getProgressMetrics, getProgressPercentFromClientX, getProgressXFromPercent } from './progress';\nimport { template } from './template';\nimport type { Cleanup, PlaybackState } from './types';\n\nexport class SimplePlayer extends HTMLElement {\n static observedAttributes = OBSERVED_ATTRIBUTES;\n\n #root: ShadowRoot;\n #cleanup: Cleanup[] = [];\n #observer: IntersectionObserver | null = null;\n #initialized = false;\n #videoSourceLoaded = false;\n #player!: HTMLElement;\n #video!: HTMLVideoElement;\n #button!: HTMLButtonElement;\n #progressTrack!: HTMLElement;\n #controlTray!: HTMLElement;\n #controlTraySlots!: HTMLElement;\n #trayTime!: HTMLElement;\n #trayTimeText!: HTMLElement;\n #scrubTime!: HTMLElement;\n #scrubTimeText!: HTMLElement;\n #volumeControl!: HTMLButtonElement;\n #volumePopover!: HTMLElement;\n #volumeTrack!: HTMLElement;\n #pictureInPictureControl!: HTMLButtonElement;\n #fullscreenControl!: HTMLButtonElement;\n #controlButtons: HTMLButtonElement[] = [];\n\n #progressFrame = 0;\n #isScrubbing = false;\n #isTrackingScrub = false;\n #scrubWasPlaying = false;\n #scrubTargetTime = 0;\n #scrubReturnTime = 0;\n #scrubReturnPercent = 0;\n #hasScrubReturnMarker = false;\n #isCommittedScrubPending = false;\n #committedScrubWasPlaying = false;\n #scrubStartX = 0;\n #scrubLongPressTimer = 0;\n #activeScrubPointerId: number | null = null;\n #optimisticPlaybackState: PlaybackState = null;\n #videoLoadAttempt = 0;\n #videoRetryTimer = 0;\n #controlsHideTimer = 0;\n #loadingStateTimer = 0;\n #initialProgressSettleTimer = 0;\n #suppressTouchButtonClickUntil = 0;\n #suppressTouchControlClickUntil = 0;\n #timeWidthObserver: ResizeObserver | null = null;\n #hasDecodedFirstFrame = false;\n #hasPresentedFirstFrame = false;\n #firstFrameRequestPending = false;\n #firstFramePresentationPending = false;\n #firstFrameRequestToken = 0;\n #firstFrameFallbackTimer = 0;\n #hasInitialProgressSettled = false;\n #initialProgressEstimateUnlockAt = 0;\n #isPlaybackBuffering = true;\n #visualProgressTime = 0;\n #visualProgressUpdatedAt = performance.now();\n #lastRenderedProgressTime = 0;\n #pausedVisualProgressTime: number | null = null;\n #pauseFrozenProgressPercent: number | null = null;\n #hasControlsCollision = false;\n #isProgressHoverPreviewing = false;\n #hasAudioTrack = false;\n #hasCheckedAudioTrack = false;\n #isPointerOverControlSurface = false;\n #lastPointerClientX: number | null = null;\n #lastPointerClientY: number | null = null;\n #lastPointerWasTouch = false;\n #isVolumeScrubbing = false;\n #isVolumeHovering = false;\n #activeVolumePointerId: number | null = null;\n #volumeCloseTimer = 0;\n #volumeIconAnimationTimer = 0;\n #controlTapTimer = 0;\n #volumeIconState: 'sound' | 'muted' | null = null;\n #showRemainingTime = false;\n #timeAnimationTimer = 0;\n\n readonly #scrubDragThreshold = 4;\n readonly #scrubSnapDistance = 3.5;\n readonly #scrubReturnMarkerBodyInset = 6;\n readonly #scrubReturnMarkerMinTime = 0.08;\n readonly #scrubLongPressDelay = 240;\n readonly #controlsAutoHideDelay = 1200;\n readonly #pointerControlsIdleDelay = 1600;\n readonly #loadingStateDelay = 140;\n readonly #initialProgressSettleDelay = 380;\n readonly #initialProgressEstimateHold = 650;\n readonly #videoRetryDelay = 2000;\n readonly #maxVideoLoadAttempts = 3;\n readonly #bufferedAheadTarget = 10;\n readonly #bufferedRangeFuzz = 0.18;\n readonly #controlsCollisionEnterMargin = 8;\n readonly #controlsCollisionExitMargin = 18;\n\n constructor() {\n super();\n this.#root = this.attachShadow({ mode: 'open' });\n this.#root.append(template.content.cloneNode(true));\n }\n\n get src() {\n return this.getAttribute('src') ?? '';\n }\n\n set src(value: string) {\n this.#setStringAttribute('src', value);\n }\n\n get aspectRatio() {\n return this.getAttribute('aspect-ratio') || DEFAULT_ASPECT_RATIO;\n }\n\n set aspectRatio(value: string) {\n this.#setStringAttribute('aspect-ratio', value);\n }\n\n get preloadMargin() {\n return this.getAttribute('preload-margin') || DEFAULT_PRELOAD_MARGIN;\n }\n\n set preloadMargin(value: string) {\n this.#setStringAttribute('preload-margin', value);\n }\n\n get autoplayEnabled() {\n return !this.hasAttribute('disable-autoplay') && !this.hasAttribute('no-autoplay');\n }\n\n set autoplayEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-autoplay');\n this.removeAttribute('no-autoplay');\n return;\n }\n\n this.setAttribute('disable-autoplay', '');\n }\n\n get controlsEnabled() {\n return this.hasAttribute('controls');\n }\n\n set controlsEnabled(value: boolean) {\n if (value) {\n this.setAttribute('controls', '');\n return;\n }\n\n this.removeAttribute('controls');\n }\n\n get timeVisible() {\n return this.hasAttribute('show-time');\n }\n\n set timeVisible(value: boolean) {\n if (value) {\n this.setAttribute('show-time', '');\n return;\n }\n\n this.removeAttribute('show-time');\n }\n\n get volumeEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-volume') &&\n !this.hasAttribute('no-volume')\n );\n }\n\n set volumeEnabled(value: boolean) {\n this.#setOptionalControlAttributes('volume', value);\n }\n\n get volumeSliderEnabled() {\n return !this.hasAttribute('disable-volume-slider') && !this.hasAttribute('no-volume-slider');\n }\n\n set volumeSliderEnabled(value: boolean) {\n if (value) {\n this.removeAttribute('disable-volume-slider');\n this.removeAttribute('no-volume-slider');\n return;\n }\n\n this.setAttribute('disable-volume-slider', '');\n }\n\n get pictureInPictureEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-picture-in-picture') &&\n !this.hasAttribute('no-picture-in-picture')\n );\n }\n\n set pictureInPictureEnabled(value: boolean) {\n this.#setOptionalControlAttributes('picture-in-picture', value);\n }\n\n get fullscreenEnabled() {\n return (\n this.controlsEnabled &&\n !this.hasAttribute('disable-fullscreen') &&\n !this.hasAttribute('no-fullscreen')\n );\n }\n\n set fullscreenEnabled(value: boolean) {\n this.#setOptionalControlAttributes('fullscreen', value);\n }\n\n connectedCallback() {\n this.#player = this.#root.querySelector('[data-sp-player]')!;\n this.#video = this.#root.querySelector('[data-sp-video]')!;\n this.#button = this.#root.querySelector('[data-sp-button]')!;\n this.#progressTrack = this.#root.querySelector('[data-sp-progress-track]')!;\n this.#controlTray = this.#root.querySelector('[data-sp-control-tray]')!;\n this.#controlTraySlots = this.#root.querySelector('[data-sp-control-tray-slots]')!;\n this.#trayTime = this.#root.querySelector('[data-sp-tray-time]')!;\n this.#trayTimeText = this.#root.querySelector('[data-sp-tray-time-text]')!;\n this.#scrubTime = this.#root.querySelector('[data-sp-time]')!;\n this.#scrubTimeText = this.#root.querySelector('[data-sp-time-text]')!;\n this.#volumeControl = this.#root.querySelector('[data-sp-volume-control]')!;\n this.#volumePopover = this.#root.querySelector('[data-sp-volume-popover]')!;\n this.#volumeTrack = this.#root.querySelector('[data-sp-volume-track]')!;\n this.#pictureInPictureControl = this.#root.querySelector('[data-sp-picture-in-picture-control]')!;\n this.#fullscreenControl = this.#root.querySelector('[data-sp-fullscreen-control]')!;\n this.#controlButtons = [this.#volumeControl, this.#pictureInPictureControl, this.#fullscreenControl];\n this.#syncAspectRatio();\n\n if (!this.#initialized) {\n this.#bindEvents();\n this.#initialized = true;\n }\n\n this.#syncAutoplayState();\n this.#setupLazyLoading();\n this.#syncOptionalControls();\n this.#syncTimeVisibility();\n this.#syncVideoLoading();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncVideoState();\n }\n\n disconnectedCallback() {\n this.#observer?.disconnect();\n this.#observer = null;\n this.#cleanup.forEach((cleanup) => cleanup());\n this.#cleanup = [];\n this.#initialized = false;\n this.#clearControlsHideTimer();\n this.#clearLoadingStateTimer();\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#clearScrubLongPressTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#clearVolumeCloseTimer();\n this.#clearVolumeIconAnimationTimer();\n this.#clearControlTapTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.style.removeProperty('--sp-touch-control-hover-offset');\n this.#clearControlsCollision();\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#isPointerOverControlSurface = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open');\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.#player.classList.remove('is-pointer-active');\n this.#stopProgressLoop();\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue === newValue) return;\n\n if (name === 'aspect-ratio') {\n this.#syncAspectRatio();\n return;\n }\n\n if (name === 'preload-margin' && this.isConnected) {\n this.#observer?.disconnect();\n this.#setupLazyLoading();\n return;\n }\n\n if (name === 'src' && this.isConnected) {\n this.#resetSource();\n this.#setupLazyLoading();\n return;\n }\n\n if ((name === 'disable-autoplay' || name === 'no-autoplay') && this.isConnected) {\n this.#syncAutoplayState();\n this.#syncAudioControlState();\n this.#syncVideoState();\n return;\n }\n\n if (name === 'show-time' && this.isConnected) {\n this.#syncTimeVisibility();\n return;\n }\n\n if (\n (\n name === 'controls' ||\n name.startsWith('enable-') ||\n name.startsWith('disable-') ||\n name.startsWith('no-')\n ) &&\n this.isConnected\n ) {\n this.#syncOptionalControls();\n this.#syncAudioControlState();\n this.#syncPictureInPictureState();\n this.#syncFullscreenState();\n this.#syncTimeVisibility();\n }\n }\n\n #setStringAttribute(name: string, value: string) {\n if (value === '') {\n this.removeAttribute(name);\n return;\n }\n\n this.setAttribute(name, value);\n }\n\n #setOptionalControlAttributes(name: 'volume' | 'picture-in-picture' | 'fullscreen', enabled: boolean) {\n if (enabled) {\n this.setAttribute(`enable-${name}`, '');\n this.removeAttribute(`disable-${name}`);\n this.removeAttribute(`no-${name}`);\n return;\n }\n\n this.removeAttribute(`enable-${name}`);\n this.setAttribute(`disable-${name}`, '');\n }\n\n #syncAspectRatio() {\n this.style.setProperty('--simple-player-aspect-ratio', this.aspectRatio);\n }\n\n #syncAutoplayState() {\n if (!this.#video) return;\n\n const isEnabled = this.autoplayEnabled;\n this.#video.autoplay = isEnabled;\n\n if (isEnabled) {\n this.#video.muted = true;\n this.#video.setAttribute('autoplay', '');\n this.#video.setAttribute('muted', '');\n return;\n }\n\n this.#video.removeAttribute('autoplay');\n\n if (!this.#videoSourceLoaded) {\n this.#video.muted = false;\n this.#video.removeAttribute('muted');\n }\n }\n\n #syncOptionalControls() {\n if (!this.#player) return;\n\n const hasVolumeControl = this.#isVolumeAvailable();\n const controls = [\n { button: this.#volumeControl, enabled: hasVolumeControl, className: 'has-volume-control' },\n { button: this.#pictureInPictureControl, enabled: this.pictureInPictureEnabled, className: 'has-picture-in-picture-control' },\n { button: this.#fullscreenControl, enabled: this.fullscreenEnabled, className: 'has-fullscreen-control' },\n ];\n\n let index = 0;\n for (const control of controls) {\n this.#player.classList.toggle(control.className, control.enabled);\n control.button.hidden = !control.enabled;\n\n if (control.enabled) {\n control.button.dataset.spControlIndex = `${index}`;\n index += 1;\n } else {\n delete control.button.dataset.spControlIndex;\n }\n }\n\n this.style.setProperty('--sp-enabled-controls-count', `${index}`);\n this.style.setProperty('--sp-control-tray-display', index > 0 ? 'block' : 'none');\n this.#player.classList.toggle('has-volume-slider-control', hasVolumeControl && this.volumeSliderEnabled);\n\n if (!hasVolumeControl || !this.volumeSliderEnabled) {\n this.#closeVolumePopover();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n }\n\n get #hasPinnedTime() {\n return this.timeVisible && this.controlsEnabled;\n }\n\n #syncTimeVisibility() {\n if (!this.#player) return;\n\n this.#player.classList.toggle('has-pinned-time', this.#hasPinnedTime);\n if (this.#hasPinnedTime) {\n this.#syncPinnedTimeText();\n }\n }\n\n #bindEvents() {\n this.#listen(this.#button, 'click', this.#handleButtonClick);\n this.#listen(this, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'pointerenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'pointermove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'pointerleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#player, 'mouseenter', this.#handlePlayerPointerEnter);\n this.#listen(this.#player, 'mousemove', this.#handlePlayerPointerMove);\n this.#listen(this.#player, 'mouseleave', this.#handlePlayerPointerLeave);\n this.#listen(this.#button, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#button, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#button, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#progressTrack, 'pointerenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'pointerleave', this.#handleProgressPointerLeave);\n this.#listen(this.#progressTrack, 'mouseenter', this.#handleProgressPointerEnter);\n this.#listen(this.#progressTrack, 'mouseleave', this.#handleProgressPointerLeave);\n this.#listen(this.#controlTray, 'pointerenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'pointerleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#controlTray, 'mouseenter', this.#handleControlSurfacePointerEnter);\n this.#listen(this.#controlTray, 'mouseleave', this.#handleControlSurfacePointerLeave);\n this.#listen(this.#root, 'focusin', this.#handleControlSurfaceFocusIn);\n this.#listen(this.#root, 'focusout', this.#handleControlSurfaceFocusOut);\n this.#listen(this.#player, 'pointerdown', this.#handlePlayerPointerDown);\n this.#listen(this.#player, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#player, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'dragstart', this.#preventNativeVideoAction);\n this.#listen(this.#video, 'selectstart', this.#preventNativeVideoAction);\n this.#listen(this.#progressTrack, 'pointerdown', this.#handleProgressPointerDown);\n this.#listen(this.#progressTrack, 'pointermove', this.#handleProgressPointerMove);\n this.#listen(this.#progressTrack, 'pointerup', this.#handleProgressPointerUp);\n this.#listen(this.#progressTrack, 'pointercancel', this.#handleProgressPointerCancel);\n this.#listen(this.#progressTrack, 'keydown', this.#handleProgressKeyDown);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeControl, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumePopover, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeTrack, 'pointerdown', this.#handleVolumePointerDown);\n this.#listen(this.#volumeTrack, 'pointermove', this.#handleVolumePointerMove);\n this.#listen(this.#volumeTrack, 'pointerup', this.#handleVolumePointerUp);\n this.#listen(this.#volumeTrack, 'pointercancel', this.#handleVolumePointerCancel);\n this.#listen(this.#volumeTrack, 'click', this.#preventVolumeTrackClick);\n this.#listen(this.#volumeTrack, 'keydown', this.#handleVolumeKeyDown);\n this.#listen(this.#pictureInPictureControl, 'click', this.#handlePictureInPictureClick);\n this.#listen(this.#fullscreenControl, 'click', this.#handleFullscreenClick);\n this.#listen(this.#trayTimeText, 'click', this.#handleTimeToggleClick);\n for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'mouseenter', this.#handleControlButtonPointerEnter);\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\n }\n\n if ('ResizeObserver' in window) {\n this.#timeWidthObserver = new ResizeObserver(() => {\n this.#syncTrayTimeWidth();\n });\n this.#timeWidthObserver.observe(this.#trayTimeText);\n this.#cleanup.push(() => {\n this.#timeWidthObserver?.disconnect();\n this.#timeWidthObserver = null;\n });\n }\n\n this.#listen(document, 'pointerup', this.#handleDocumentPointerUp);\n this.#listen(document, 'pointercancel', this.#handleDocumentPointerCancel);\n this.#listen(document, 'pointermove', this.#handleDocumentPointerMove);\n this.#listen(document, 'mousemove', this.#handleDocumentPointerMove);\n this.#listen(document, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'webkitfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'mozfullscreenchange', this.#handleFullscreenChange);\n this.#listen(document, 'MSFullscreenChange', this.#handleFullscreenChange);\n this.#listen(this.#root, 'fullscreenchange', this.#handleFullscreenChange);\n this.#listen(window, 'blur', this.#handleWindowBlur);\n this.#listen(window, 'focus', this.#handleWindowFocus);\n\n this.#listen(this.#video, 'play', this.#handleVideoPlay);\n this.#listen(this.#video, 'pause', this.#handleVideoPause);\n this.#listen(this.#video, 'ended', this.#handleVideoEnded);\n this.#listen(this.#video, 'loadstart', this.#handleVideoLoadStart);\n this.#listen(this.#video, 'waiting', this.#handleVideoWaiting);\n this.#listen(this.#video, 'stalled', this.#handleVideoWaiting);\n this.#listen(this.#video, 'seeking', this.#handleVideoWaiting);\n this.#listen(this.#video, 'loadeddata', this.#markVideoReady);\n this.#listen(this.#video, 'loadedmetadata', this.#handleVideoLoadedMetadata);\n this.#listen(this.#video, 'canplay', this.#markVideoReady);\n this.#listen(this.#video, 'canplaythrough', this.#markVideoReady);\n this.#listen(this.#video, 'playing', this.#handleVideoPlaying);\n this.#listen(this.#video, 'seeked', this.#handleVideoSeeked);\n this.#listen(this.#video, 'error', this.#handleVideoError);\n this.#listen(this.#video, 'progress', this.#syncVideoLoading);\n this.#listen(this.#video, 'suspend', this.#syncVideoLoading);\n this.#listen(this.#video, 'timeupdate', this.#handleVideoTimeUpdate);\n this.#listen(this.#video, 'volumechange', this.#handleVideoVolumeChange);\n this.#listen(this.#video, 'enterpictureinpicture', this.#syncPictureInPictureState);\n this.#listen(this.#video, 'leavepictureinpicture', this.#syncPictureInPictureState);\n }\n\n #syncTrayTimeWidth() {\n if (!this.#player || !this.#trayTimeText) return;\n this.#trayTimeText.style.width = 'fit-content';\n const width = Math.ceil(this.#trayTimeText.scrollWidth);\n this.#trayTimeText.style.width = '';\n this.#player.style.setProperty('--sp-tray-time-width', `${width}px`);\n }\n\n #listen(target: EventTarget, type: string, listener: EventListenerOrEventListenerObject) {\n target.addEventListener(type, listener);\n this.#cleanup.push(() => target.removeEventListener(type, listener));\n }\n\n #setupLazyLoading() {\n if (!this.src || this.#videoSourceLoaded) return;\n\n this.#observer?.disconnect();\n this.#video.dataset.src = this.src;\n\n if ('IntersectionObserver' in window) {\n this.#observer = new IntersectionObserver((entries, observer) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n observer.disconnect();\n this.#observer = null;\n void this.#hydrateVideoSource();\n }, { rootMargin: this.preloadMargin });\n\n this.#observer.observe(this.#player);\n return;\n }\n\n void this.#hydrateVideoSource();\n }\n\n #preventNativeVideoAction = (event: Event) => {\n event.preventDefault();\n };\n\n #clearControlsHideTimer() {\n if (!this.#controlsHideTimer) return;\n window.clearTimeout(this.#controlsHideTimer);\n this.#controlsHideTimer = 0;\n }\n\n #hideControls = () => {\n this.#controlsHideTimer = 0;\n if (this.#isTrackingScrub || this.#isScrubbing || this.#isVolumeScrubbing) return;\n\n if (this.#isTouchControls()) {\n this.#player.classList.remove('is-controls-visible');\n return;\n }\n\n if (this.#isPointerOverControlSurface) return;\n this.#player.classList.remove('is-pointer-active');\n };\n\n #scheduleControlsHide(delay = this.#isTouchControls() ? this.#controlsAutoHideDelay : this.#pointerControlsIdleDelay) {\n this.#clearControlsHideTimer();\n this.#controlsHideTimer = window.setTimeout(this.#hideControls, delay);\n }\n\n #scheduleTouchControlsHide() {\n if (!this.#isTouchControls()) return;\n this.#scheduleControlsHide(this.#controlsAutoHideDelay);\n }\n\n #showTouchControls() {\n if (!this.#isTouchControls()) return false;\n const wasVisible = this.#player.classList.contains('is-controls-visible');\n this.#player.classList.add('is-controls-visible');\n this.#scheduleTouchControlsHide();\n return !wasVisible;\n }\n\n #showPointerControls(forcePointer = false) {\n if (!forcePointer && this.#isTouchControls()) return;\n this.#player.classList.add('is-pointer-active');\n if (!this.#isPointerOverControlSurface) {\n this.#scheduleControlsHide(forcePointer ? this.#pointerControlsIdleDelay : undefined);\n } else {\n this.#clearControlsHideTimer();\n }\n }\n\n #hidePointerControls() {\n this.#isPointerOverControlSurface = false;\n this.#clearControlsHideTimer();\n this.#player.classList.remove('is-pointer-active');\n }\n\n #trackPointerPosition(event: Event) {\n if (event instanceof PointerEvent) {\n this.#lastPointerWasTouch = event.pointerType === 'touch';\n if (this.#lastPointerWasTouch) return false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n if (event instanceof MouseEvent) {\n this.#lastPointerWasTouch = false;\n this.#lastPointerClientX = event.clientX;\n this.#lastPointerClientY = event.clientY;\n return true;\n }\n\n return false;\n }\n\n #isPointInsidePlayer(clientX: number | null, clientY: number | null) {\n if (clientX === null || clientY === null) return false;\n if (clientX < 0 || clientY < 0 || clientX > window.innerWidth || clientY > window.innerHeight) return false;\n\n const rect = this.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #isPointInsideElement(element: Element | null, clientX: number, clientY: number) {\n if (!element) return false;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return false;\n\n return (\n clientX >= rect.left &&\n clientX <= rect.right &&\n clientY >= rect.top &&\n clientY <= rect.bottom\n );\n }\n\n #clearProgressHoverPreview() {\n if (!this.#isProgressHoverPreviewing) return;\n\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#clearControlsCollision();\n this.#syncPinnedTimeText();\n }\n\n #syncHoverTargetsFromPointer(clientX: number, clientY: number) {\n if (this.#isTouchControls()) return;\n\n if (!this.#isScrubPreviewLocked() && this.#isPointInsideElement(this.#progressTrack, clientX, clientY)) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(clientX, false, false);\n } else if (!this.#isScrubPreviewLocked()) {\n this.#clearProgressHoverPreview();\n }\n\n const hoveredControl = this.#controlButtons.find((button) => {\n return !button.hidden && !this.#isUnavailableControlButton(button) && this.#isPointInsideElement(button, clientX, clientY);\n }) ?? null;\n\n if (!hoveredControl) return;\n\n const index = Number(hoveredControl.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n }\n\n #areControlsVisible() {\n return (\n this.#player.classList.contains('is-controls-visible') ||\n this.#player.classList.contains('is-pointer-active') ||\n this.#root.activeElement instanceof HTMLElement\n );\n }\n\n #shouldSuppressControlAction() {\n return this.#isTouchControls() && performance.now() < this.#suppressTouchControlClickUntil;\n }\n\n #isUnavailableControlButton(button: HTMLElement | null) {\n return (\n button instanceof HTMLButtonElement &&\n (button.disabled || (button === this.#volumeControl && !this.#isVolumeAvailable()))\n );\n }\n\n #syncPointerControlsFromLastPosition() {\n if (!this.#lastPointerWasTouch && this.#isPointInsidePlayer(this.#lastPointerClientX, this.#lastPointerClientY)) {\n this.#showPointerControls(true);\n return;\n }\n\n this.#hidePointerControls();\n }\n\n #handlePlayerPointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#showPointerControls(true);\n };\n\n #handlePlayerPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#showPointerControls(true);\n };\n\n #handleDocumentPointerMove = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n if (event instanceof PointerEvent || event instanceof MouseEvent) {\n this.#syncHoverTargetsFromPointer(event.clientX, event.clientY);\n }\n this.#syncPointerControlsFromLastPosition();\n };\n\n #handlePlayerPointerLeave = () => {\n this.#hidePointerControls();\n };\n\n #handleControlSurfacePointerEnter = (event: Event) => {\n if (!this.#trackPointerPosition(event)) return;\n this.#isPointerOverControlSurface = true;\n this.#player.classList.add('is-pointer-active');\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfacePointerLeave = () => {\n this.#isPointerOverControlSurface = false;\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlSurfaceFocusIn = () => {\n if (this.#isTouchControls()) {\n this.#player.classList.add('is-controls-visible');\n } else {\n this.#player.classList.add('is-pointer-active');\n }\n\n this.#clearControlsHideTimer();\n };\n\n #handleControlSurfaceFocusOut = () => {\n this.#scheduleControlsHide(this.#pointerControlsIdleDelay);\n };\n\n #handleControlButtonPointerEnter = (event: Event) => {\n const target = event.currentTarget as HTMLElement | null;\n if (this.#isUnavailableControlButton(target)) return;\n\n const button = target as HTMLButtonElement;\n const index = Number(button.dataset.spControlIndex ?? 0);\n this.#controlTraySlots.style.setProperty('--sp-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n };\n\n #clearControlTapTimer() {\n if (!this.#controlTapTimer) return;\n window.clearTimeout(this.#controlTapTimer);\n this.#controlTapTimer = 0;\n }\n\n #clearControlTapActive = () => {\n this.#controlTapTimer = 0;\n this.#controlButtons.forEach((button) => button.classList.remove('is-control-tap-active'));\n this.style.removeProperty('--sp-touch-control-hover-offset');\n };\n\n #handleControlButtonPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent) || event.pointerType !== 'touch') return;\n\n const target = event.currentTarget as HTMLButtonElement | null;\n if (!target || !this.#areControlsVisible() || this.#isUnavailableControlButton(target)) return;\n\n const index = Number(target.dataset.spControlIndex ?? 0);\n this.#clearControlTapTimer();\n this.#controlButtons.forEach((button) => button.classList.toggle('is-control-tap-active', button === target));\n this.style.setProperty('--sp-touch-control-hover-offset', `calc(var(--sp-control-slot-size) * ${index})`);\n this.#controlTapTimer = window.setTimeout(this.#clearControlTapActive, 280);\n };\n\n #clearLoadingStateTimer() {\n if (!this.#loadingStateTimer) return;\n window.clearTimeout(this.#loadingStateTimer);\n this.#loadingStateTimer = 0;\n }\n\n #clearVideoRetryTimer() {\n if (!this.#videoRetryTimer) return;\n window.clearTimeout(this.#videoRetryTimer);\n this.#videoRetryTimer = 0;\n }\n\n #clearInitialProgressSettleTimer() {\n if (!this.#initialProgressSettleTimer) return;\n window.clearTimeout(this.#initialProgressSettleTimer);\n this.#initialProgressSettleTimer = 0;\n }\n\n #clearFirstFrameFallbackTimer() {\n if (!this.#firstFrameFallbackTimer) return;\n window.clearTimeout(this.#firstFrameFallbackTimer);\n this.#firstFrameFallbackTimer = 0;\n }\n\n #clearVolumeIconAnimationTimer() {\n if (!this.#volumeIconAnimationTimer) return;\n window.clearTimeout(this.#volumeIconAnimationTimer);\n this.#volumeIconAnimationTimer = 0;\n }\n\n #animateVolumeIconSwap() {\n this.#clearVolumeIconAnimationTimer();\n this.#player.classList.remove('is-volume-icon-animating');\n void this.#volumeControl.offsetWidth;\n this.#player.classList.add('is-volume-icon-animating');\n this.#volumeIconAnimationTimer = window.setTimeout(() => {\n this.#volumeIconAnimationTimer = 0;\n this.#player.classList.remove('is-volume-icon-animating');\n }, 240);\n }\n\n #finishInitialProgressSettle = () => {\n const wasSettling = Boolean(this.#initialProgressSettleTimer) || this.#player.classList.contains('is-progress-settling');\n if (!wasSettling) return;\n\n this.#clearInitialProgressSettleTimer();\n if (this.#hasInitialProgressSettled) {\n this.#player.classList.remove('is-progress-settling');\n return;\n }\n\n this.#hasInitialProgressSettled = true;\n this.#initialProgressEstimateUnlockAt = performance.now() + this.#initialProgressEstimateHold;\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n this.#player.classList.remove('is-progress-settling');\n this.#syncVideoState();\n };\n\n #queueInitialProgressSettle() {\n if (this.#hasInitialProgressSettled || this.#initialProgressSettleTimer) return;\n\n this.#player.classList.add('is-progress-settling');\n this.#setProgressVisual(0);\n this.#initialProgressSettleTimer = window.setTimeout(this.#finishInitialProgressSettle, this.#initialProgressSettleDelay);\n }\n\n async #hydrateVideoSource() {\n if (this.#videoSourceLoaded) return;\n\n const source = this.#video.dataset.src || this.src;\n if (!source) return;\n\n this.#clearVideoRetryTimer();\n this.#clearFirstFrameFallbackTimer();\n this.#videoLoadAttempt += 1;\n this.#videoSourceLoaded = true;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#syncAutoplayState();\n this.#video.src = source;\n this.#video.preload = 'auto';\n this.#video.load();\n\n if (this.#video.autoplay && this.#video.muted) {\n await this.#video.play().catch(() => undefined);\n }\n }\n\n #isLoopBoundaryBlip() {\n if (!this.#video.loop || this.#video.paused || !Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return false;\n return this.#video.currentTime < 0.28 || (this.#video.duration - this.#video.currentTime) < 0.28;\n }\n\n #getBufferedAhead(time = this.#video.currentTime) {\n if (!Number.isFinite(time)) return 0;\n\n const currentTime = Math.max(0, time);\n\n try {\n for (let index = 0; index < this.#video.buffered.length; index += 1) {\n const start = this.#video.buffered.start(index);\n const end = this.#video.buffered.end(index);\n\n if (currentTime + this.#bufferedRangeFuzz >= start && currentTime <= end + this.#bufferedRangeFuzz) {\n return Math.max(0, end - currentTime);\n }\n }\n } catch {\n return 0;\n }\n\n return 0;\n }\n\n #hasBufferedAhead(seconds = this.#bufferedAheadTarget) {\n if (\n !this.#videoSourceLoaded ||\n this.#video.error ||\n !this.#player.classList.contains('has-loaded-once') ||\n !Number.isFinite(this.#video.duration) ||\n this.#video.duration <= 0\n ) return false;\n\n const remainingDuration = Math.max(0, this.#video.duration - this.#video.currentTime);\n const requiredBuffer = Math.min(seconds, remainingDuration);\n\n return requiredBuffer <= this.#bufferedRangeFuzz || this.#getBufferedAhead() + this.#bufferedRangeFuzz >= requiredBuffer;\n }\n\n #setVideoLoading(isLoading: boolean, immediate = false) {\n this.#clearLoadingStateTimer();\n const shouldLoad = isLoading && !this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead();\n const shouldWaitForFirstFrame = isLoading && !this.#hasPresentedFirstFrame;\n const shouldShowLoading = shouldWaitForFirstFrame || shouldLoad;\n this.#isPlaybackBuffering = shouldShowLoading;\n\n if (!shouldShowLoading) {\n this.#player.classList.remove('is-loading');\n return;\n }\n\n if (immediate) {\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#loadingStateTimer = window.setTimeout(() => {\n this.#loadingStateTimer = 0;\n if (!this.#hasPresentedFirstFrame || (!this.#isLoopBoundaryBlip() && !this.#hasBufferedAhead())) {\n this.#isPlaybackBuffering = true;\n this.#player.classList.add('is-loading');\n return;\n }\n\n this.#isPlaybackBuffering = false;\n this.#player.classList.remove('is-loading');\n }, this.#loadingStateDelay);\n }\n\n #syncVideoLoading = () => {\n if (this.#video.error) {\n this.#setVideoLoading(true, true);\n return;\n }\n\n this.#setVideoLoading(\n (\n !this.#videoSourceLoaded ||\n !this.#hasPresentedFirstFrame ||\n this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA\n ),\n );\n };\n\n #canStartImmediately() {\n return (\n this.#videoSourceLoaded &&\n !this.#video.error &&\n this.#hasDecodedFirstFrame &&\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA ||\n (\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n !this.#player.classList.contains('is-loading')\n )\n )\n );\n }\n\n #isScrubPreviewLocked() {\n return this.#isTrackingScrub || this.#isScrubbing || this.#isCommittedScrubPending;\n }\n\n #retryVideoLoad() {\n if (this.#videoLoadAttempt >= this.#maxVideoLoadAttempts || this.#videoRetryTimer) return;\n\n this.#videoRetryTimer = window.setTimeout(() => {\n this.#videoRetryTimer = 0;\n this.#clearFirstFrameFallbackTimer();\n this.#videoSourceLoaded = false;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n\n if (!this.#player.classList.contains('has-loaded-once')) {\n this.#setProgressVisual(0);\n }\n\n this.#video.removeAttribute('src');\n this.#video.load();\n void this.#hydrateVideoSource();\n }, this.#videoRetryDelay);\n }\n\n #clearCommittedScrubPreview() {\n if (!this.#isCommittedScrubPending) return false;\n\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #commitVideoReady() {\n this.#clearVideoRetryTimer();\n const isFirstReady = !this.#player.classList.contains('has-loaded-once');\n\n if (isFirstReady) this.#queueInitialProgressSettle();\n\n this.#player.classList.add('has-loaded-once');\n this.#player.classList.add('has-visible-frame');\n this.#syncVideoLoading();\n this.#optimisticPlaybackState = null;\n if (this.#isCommittedScrubPending) {\n this.#clearCommittedScrubPreview();\n return true;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n return true;\n }\n\n #requestFirstVideoFrame() {\n if (this.#hasDecodedFirstFrame || this.#firstFrameRequestPending || this.#video.error) return;\n\n this.#firstFrameRequestPending = true;\n const requestToken = this.#firstFrameRequestToken;\n const confirmFirstFrame = () => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#clearFirstFrameFallbackTimer();\n this.#firstFrameRequestPending = false;\n this.#hasDecodedFirstFrame =\n !this.#video.error &&\n this.#video.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA &&\n this.#video.videoWidth > 0 &&\n this.#video.videoHeight > 0;\n\n if (this.#hasDecodedFirstFrame) {\n if (this.#firstFramePresentationPending || this.#hasPresentedFirstFrame) return;\n\n this.#firstFramePresentationPending = true;\n window.requestAnimationFrame(() => {\n window.requestAnimationFrame(() => {\n if (requestToken !== this.#firstFrameRequestToken) return;\n\n this.#firstFramePresentationPending = false;\n this.#hasPresentedFirstFrame = true;\n this.#commitVideoReady();\n this.#syncVideoState();\n });\n });\n this.#syncVideoState();\n return;\n }\n\n this.#syncVideoLoading();\n };\n\n if ('requestVideoFrameCallback' in this.#video) {\n this.#video.requestVideoFrameCallback(confirmFirstFrame);\n this.#firstFrameFallbackTimer = window.setTimeout(confirmFirstFrame, 180);\n return;\n }\n\n window.requestAnimationFrame(confirmFirstFrame);\n }\n\n #markVideoReady = () => {\n if (\n this.#video.error ||\n this.#video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA ||\n this.#video.videoWidth <= 0 ||\n this.#video.videoHeight <= 0\n ) {\n this.#syncVideoLoading();\n return false;\n }\n\n if (!this.#hasDecodedFirstFrame) {\n this.#requestFirstVideoFrame();\n this.#syncVideoLoading();\n return false;\n }\n\n const isReady = this.#commitVideoReady();\n this.#syncAudioControlState();\n return isReady;\n };\n\n #isVideoAdvancing() {\n return (\n !this.#video.paused &&\n (!this.#video.ended || this.#video.loop) &&\n this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA\n );\n }\n\n #syncVisualProgressClock(time = this.#video.currentTime) {\n this.#visualProgressTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#visualProgressUpdatedAt = performance.now();\n }\n\n #clearPausedVisualProgress() {\n this.#pausedVisualProgressTime = null;\n this.#pauseFrozenProgressPercent = null;\n }\n\n #holdPausedVisualProgress() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pausedVisualProgressTime = null;\n return;\n }\n\n const currentTime = Number.isFinite(this.#video.currentTime) ? Math.max(0, this.#video.currentTime) : 0;\n const renderedTime = Number.isFinite(this.#lastRenderedProgressTime) ? this.#lastRenderedProgressTime : currentTime;\n this.#pausedVisualProgressTime = Math.min(this.#video.duration, Math.max(currentTime, renderedTime));\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n }\n\n #freezeRenderedProgressForPause() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) {\n this.#pauseFrozenProgressPercent = null;\n this.#holdPausedVisualProgress();\n return;\n }\n\n const rawInset = this.#player.style.getPropertyValue('--sp-progress-inset');\n const inset = Number.parseFloat(rawInset);\n const progressFromFill = Number.isFinite(inset) ? Math.min(1, Math.max(0, 1 - (inset / 100))) : null;\n const visualTime = this.#getVisualProgressTime();\n const progressFromTime = Math.min(1, Math.max(0, visualTime / this.#video.duration));\n const frozenProgress = Math.max(progressFromFill ?? 0, progressFromTime);\n\n this.#pauseFrozenProgressPercent = frozenProgress;\n this.#pausedVisualProgressTime = frozenProgress * this.#video.duration;\n this.#syncVisualProgressClock(this.#pausedVisualProgressTime);\n this.#setProgressVisual(frozenProgress);\n this.#progressTrack.setAttribute('aria-valuenow', `${this.#pausedVisualProgressTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(this.#pausedVisualProgressTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n #getVisualProgressTime() {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime || 0;\n if (this.#isScrubPreviewLocked()) return this.#scrubTargetTime;\n if (this.#pausedVisualProgressTime !== null) return this.#pausedVisualProgressTime;\n if (!this.#isVideoAdvancing()) return this.#video.currentTime || 0;\n\n if (this.#isPlaybackBuffering || !this.#hasInitialProgressSettled || performance.now() < this.#initialProgressEstimateUnlockAt) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n if (this.#player.classList.contains('is-loading') && this.#video.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime || 0;\n }\n\n const elapsed = (performance.now() - this.#visualProgressUpdatedAt) / 1000;\n const estimatedTime = this.#visualProgressTime + elapsed;\n const visualTime = this.#video.loop\n ? estimatedTime % this.#video.duration\n : Math.min(estimatedTime, this.#video.duration);\n\n if (!this.#video.loop && this.#video.currentTime - visualTime > 0.45) {\n this.#syncVisualProgressClock();\n return this.#video.currentTime;\n }\n\n return visualTime;\n }\n\n #setProgressVisual(percent: number) {\n const clampedPercent = Math.min(1, Math.max(0, percent));\n const remainingPercent = (1 - clampedPercent) * 100;\n const { innerWidth } = this.#getProgressMetrics();\n const markerEdgePercent = 1 / innerWidth;\n const markerIsFullyOnFill =\n this.#isScrubbing &&\n this.#hasScrubReturnMarker &&\n this.#scrubReturnPercent + markerEdgePercent < clampedPercent;\n\n this.#player.style.setProperty('--sp-progress-inset', `${remainingPercent}%`);\n this.#player.style.setProperty('--sp-return-marker-base-opacity', markerIsFullyOnFill ? '0' : '1');\n\n if (markerIsFullyOnFill) {\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent);\n const maxHoleLeft = Math.max(0, innerWidth - 2);\n const holeLeft = Math.min(maxHoleLeft, Math.max(0, markerX - 3));\n\n this.#player.style.setProperty('--sp-return-marker-hole-left', `${holeLeft}px`);\n } else {\n this.#player.style.setProperty('--sp-return-marker-hole-left', '-9999px');\n }\n }\n\n #getProgressPercentFromTime(time: number) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return 0;\n\n return Math.min(1, Math.max(0, time / this.#video.duration));\n }\n\n #getProgressMetrics(rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressMetrics(rect);\n }\n\n #getProgressXFromPercent(percent: number, rect = this.#progressTrack.getBoundingClientRect()) {\n return getProgressXFromPercent(percent, rect);\n }\n\n #getProgressPercentFromClientX(clientX: number, rect: DOMRect) {\n return getProgressPercentFromClientX(clientX, rect);\n }\n\n #setScrubReturnMarker(time: number) {\n this.#scrubReturnTime = Number.isFinite(time) ? Math.max(0, time) : 0;\n this.#scrubReturnPercent = this.#getProgressPercentFromTime(this.#scrubReturnTime);\n const rect = this.#progressTrack.getBoundingClientRect();\n const markerX = this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerIsInTrackBody =\n markerX >= this.#scrubReturnMarkerBodyInset &&\n markerX <= Math.max(this.#scrubReturnMarkerBodyInset, rect.width - this.#scrubReturnMarkerBodyInset);\n\n this.#hasScrubReturnMarker = this.#scrubReturnTime > this.#scrubReturnMarkerMinTime && markerIsInTrackBody;\n this.#player.classList.toggle('has-return-marker', this.#hasScrubReturnMarker);\n this.#player.style.setProperty('--sp-return-marker-left', `${markerX}px`);\n }\n\n #getScrubPoint(clientX: number, rect: DOMRect, percent: number, shouldSnap = this.#isScrubbing) {\n const targetTime = percent * this.#video.duration;\n\n if (!shouldSnap || !this.#hasScrubReturnMarker) {\n return { percent, targetTime };\n }\n\n const markerX = rect.left + this.#getProgressXFromPercent(this.#scrubReturnPercent, rect);\n const markerDistance = Math.abs(clientX - markerX);\n const isInSnapZone = markerDistance <= this.#scrubSnapDistance;\n\n if (!isInSnapZone) {\n return { percent, targetTime };\n }\n\n return {\n percent: this.#scrubReturnPercent,\n targetTime: this.#scrubReturnTime,\n };\n }\n\n #syncPinnedTimeText(time = this.#getVisualProgressTime()) {\n if (!this.#hasPinnedTime || this.#isProgressHoverPreviewing || this.#isScrubPreviewLocked()) return;\n\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(time);\n this.#syncTrayTimeWidth();\n }\n\n #updateProgress(time = this.#getVisualProgressTime()) {\n const hasDuration = Number.isFinite(this.#video.duration) && this.#video.duration > 0;\n if (hasDuration && this.#pauseFrozenProgressPercent !== null) {\n const frozenTime = this.#pauseFrozenProgressPercent * this.#video.duration;\n this.#lastRenderedProgressTime = frozenTime;\n this.#setProgressVisual(this.#pauseFrozenProgressPercent);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', `${this.#video.duration}`);\n this.#progressTrack.setAttribute('aria-valuenow', `${frozenTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(frozenTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n this.#syncPinnedTimeText(frozenTime);\n return;\n }\n\n const renderedTime = hasDuration ? Math.min(this.#video.duration, Math.max(0, time)) : time;\n const progressValue = hasDuration ? renderedTime / this.#video.duration : 0;\n this.#lastRenderedProgressTime = Number.isFinite(renderedTime) ? Math.max(0, renderedTime) : 0;\n this.#setProgressVisual(progressValue);\n this.#progressTrack.setAttribute('aria-valuemin', '0');\n this.#progressTrack.setAttribute('aria-valuemax', hasDuration ? `${this.#video.duration}` : '0');\n this.#progressTrack.setAttribute('aria-valuenow', hasDuration ? `${renderedTime}` : '0');\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n hasDuration ? `${formatVideoTime(renderedTime)} of ${formatVideoTime(this.#video.duration)}` : 'Loading video',\n );\n this.#syncPinnedTimeText(renderedTime);\n }\n\n #previewSeekFromClientX(clientX: number, shouldSnap = this.#isScrubbing, updateVisual = true) {\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return this.#video.currentTime;\n\n const rect = this.#progressTrack.getBoundingClientRect();\n const percent = this.#getProgressPercentFromClientX(clientX, rect);\n const scrubPoint = this.#getScrubPoint(clientX, rect, percent, shouldSnap);\n\n if (updateVisual) {\n this.#setProgressVisual(scrubPoint.percent);\n }\n\n if (!this.#hasPinnedTime) {\n this.#player.style.setProperty('--sp-scrub-preview-left', `${this.#getProgressXFromPercent(scrubPoint.percent, rect)}px`);\n }\n\n this.#scrubTimeText.textContent = formatVideoTime(scrubPoint.targetTime);\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(scrubPoint.targetTime);\n this.#syncTrayTimeWidth();\n\n if (updateVisual) {\n this.#progressTrack.setAttribute('aria-valuenow', `${scrubPoint.targetTime}`);\n this.#progressTrack.setAttribute(\n 'aria-valuetext',\n `${formatVideoTime(scrubPoint.targetTime)} of ${formatVideoTime(this.#video.duration)}`,\n );\n }\n\n this.#syncControlsCollision();\n return scrubPoint.targetTime;\n }\n\n #clearControlsCollision() {\n this.#hasControlsCollision = false;\n this.#player?.classList.remove('has-controls-collision');\n }\n\n #syncControlsCollision() {\n if ((!this.#isScrubbing && !this.#isProgressHoverPreviewing) || !this.#controlTray || !this.#scrubTime || this.#hasPinnedTime) {\n this.#clearControlsCollision();\n return;\n }\n\n const holderRect = this.#controlTray.getBoundingClientRect();\n const timeRect = this.#scrubTime.getBoundingClientRect();\n const holderIsVisible = holderRect.width > 0 && holderRect.height > 0;\n const margin = this.#hasControlsCollision ? this.#controlsCollisionExitMargin : this.#controlsCollisionEnterMargin;\n const timeTouchesHolder =\n holderIsVisible &&\n timeRect.right >= holderRect.left - margin &&\n timeRect.left <= holderRect.right + margin &&\n timeRect.bottom >= holderRect.top - margin &&\n timeRect.top <= holderRect.bottom + margin;\n\n this.#hasControlsCollision = timeTouchesHolder;\n this.#player.classList.toggle('has-controls-collision', this.#hasControlsCollision);\n }\n\n #stopProgressLoop() {\n if (!this.#progressFrame) return;\n window.cancelAnimationFrame(this.#progressFrame);\n this.#progressFrame = 0;\n }\n\n #startProgressLoop() {\n this.#stopProgressLoop();\n this.#syncVisualProgressClock();\n\n const tick = () => {\n this.#updateProgress(this.#getVisualProgressTime());\n if (this.#isVideoAdvancing()) {\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n };\n\n this.#progressFrame = window.requestAnimationFrame(tick);\n }\n\n #syncVideoState() {\n const realIsPlaying = (!this.#video.paused && (!this.#video.ended || this.#video.loop)) || (this.#isScrubbing && this.#scrubWasPlaying);\n const isPlaying = this.#optimisticPlaybackState ? this.#optimisticPlaybackState === 'playing' : realIsPlaying;\n this.#player.classList.toggle('is-playing', isPlaying);\n this.#button.setAttribute('aria-label', isPlaying ? 'Pause video' : 'Play video');\n\n if (this.#isScrubbing) {\n this.#stopProgressLoop();\n return;\n }\n\n if (\n realIsPlaying &&\n this.#player.classList.contains('has-loaded-once') &&\n !this.#player.classList.contains('is-progress-settling')\n ) {\n this.#startProgressLoop();\n } else {\n this.#stopProgressLoop();\n this.#updateProgress();\n }\n }\n\n #clearScrubLongPressTimer() {\n if (!this.#scrubLongPressTimer) return;\n window.clearTimeout(this.#scrubLongPressTimer);\n this.#scrubLongPressTimer = 0;\n }\n\n #detectAudioAvailability() {\n return detectAudioAvailability(this.#video);\n }\n\n #isVolumeAvailable() {\n return this.volumeEnabled && this.#hasCheckedAudioTrack && this.#hasAudioTrack;\n }\n\n #clearVolumeInteractionState() {\n this.#clearVolumeCloseTimer();\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#isVolumeScrubbing = false;\n this.#isVolumeHovering = false;\n this.#activeVolumePointerId = null;\n this.#volumeControl.classList.remove('is-volume-open', 'is-control-tap-active');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n }\n\n #syncAudioControlState = () => {\n if (!this.volumeEnabled) {\n this.#player.classList.remove('is-volume-unavailable', 'is-volume-muted', 'is-volume-sound', 'is-volume-icon-animating');\n this.#clearVolumeInteractionState();\n this.#volumeControl.disabled = true;\n this.#volumeControl.setAttribute('aria-disabled', 'true');\n return;\n }\n\n if (!this.#hasCheckedAudioTrack) {\n const audioAvailability = this.#detectAudioAvailability();\n if (audioAvailability !== 'unknown') {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = audioAvailability === 'available';\n } else if (\n this.#video.readyState >= HTMLMediaElement.HAVE_METADATA &&\n !isAudioAvailabilityPending(this.#video)\n ) {\n this.#hasCheckedAudioTrack = true;\n this.#hasAudioTrack = true;\n }\n }\n\n const wasVolumeControlHidden = this.#volumeControl.hidden;\n const hasUsableAudio = this.#isVolumeAvailable();\n const isMuted = !hasUsableAudio || this.#video.muted || this.#video.volume <= 0;\n const visualVolume = hasUsableAudio && !this.#video.muted ? this.#video.volume : 0;\n const volumePercent = Math.round(visualVolume * 100);\n const nextIconState = isMuted ? 'muted' : 'sound';\n\n if (this.#volumeIconState && this.#volumeIconState !== nextIconState) {\n this.#animateVolumeIconSwap();\n }\n\n this.#volumeIconState = nextIconState;\n\n this.#player.classList.toggle('is-volume-unavailable', !hasUsableAudio);\n this.#player.classList.toggle('is-volume-muted', isMuted);\n this.#player.classList.toggle('is-volume-sound', !isMuted);\n this.#player.style.setProperty('--sp-volume-level', `${volumePercent}%`);\n this.#volumeControl.disabled = !hasUsableAudio;\n this.#volumeControl.setAttribute('aria-disabled', `${!hasUsableAudio}`);\n this.#volumeControl.setAttribute(\n 'aria-label',\n !hasUsableAudio ? 'Video has no audio' : isMuted ? 'Unmute video' : 'Mute video',\n );\n this.#volumeTrack.setAttribute('aria-valuenow', `${volumePercent}`);\n this.#volumeTrack.setAttribute('aria-valuetext', `${volumePercent}%`);\n\n if (!hasUsableAudio) {\n this.#clearVolumeInteractionState();\n }\n\n if (wasVolumeControlHidden === hasUsableAudio) {\n this.#syncOptionalControls();\n }\n };\n\n #setVolumeFromClientY(clientY: number) {\n if (!this.#isVolumeAvailable()) return;\n const rect = this.#volumeTrack.getBoundingClientRect();\n const percent = Math.min(1, Math.max(0, 1 - ((clientY - rect.top) / rect.height)));\n const rounded = Math.round(percent * 100) / 100;\n this.#video.volume = rounded;\n this.#video.muted = rounded <= 0;\n this.#syncAudioControlState();\n }\n\n #releaseVolumePointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#volumeTrack.hasPointerCapture(pointerId)) {\n this.#volumeTrack.releasePointerCapture(pointerId);\n }\n }\n\n #finishVolumeScrub(pointerId: number | null) {\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#volumeTrack.blur();\n this.#releaseVolumePointer(pointerId);\n this.#scheduleVolumePopoverClose(260);\n }\n\n #syncPictureInPictureState = () => {\n const isActive = document.pictureInPictureElement === this.#video;\n const video = this.#video as HTMLVideoElement & { requestPictureInPicture?: () => Promise<PictureInPictureWindow> };\n const isSupported = Boolean(this.pictureInPictureEnabled && document.pictureInPictureEnabled && video.requestPictureInPicture);\n this.#player.classList.toggle('is-picture-in-picture', isActive);\n this.#pictureInPictureControl.disabled = !isSupported;\n this.#pictureInPictureControl.setAttribute('aria-label', isActive ? 'Exit picture in picture' : 'Enter picture in picture');\n };\n\n #getFullscreenElement() {\n return getFullscreenElement(this.#root);\n }\n\n #isFullscreenSupported() {\n return isFullscreenSupported(this.fullscreenEnabled, this.#player, this.#video);\n }\n\n #requestPlayerFullscreen() {\n return requestPlayerFullscreen(this.#player);\n }\n\n #requestVideoFullscreen() {\n requestVideoFullscreen(this.#video);\n }\n\n #exitFullscreen() {\n return exitFullscreen();\n }\n\n #syncFullscreenState = () => {\n const fullscreenElement = this.#getFullscreenElement();\n const isActive = fullscreenElement === this.#player || fullscreenElement === this;\n const isSupported = this.#isFullscreenSupported();\n this.#player.classList.toggle('is-fullscreen', isActive);\n this.#fullscreenControl.disabled = !isSupported;\n this.#fullscreenControl.setAttribute('aria-label', isActive ? 'Exit fullscreen' : 'Enter fullscreen');\n return isActive;\n };\n\n #handleFullscreenChange = () => {\n const isFullscreenActive = this.#syncFullscreenState();\n this.#resetFullscreenPointerState(isFullscreenActive);\n };\n\n #resetFullscreenPointerState(isFullscreenActive: boolean) {\n this.#clearControlsHideTimer();\n this.#clearVolumeCloseTimer();\n this.#releaseScrubPointer(this.#activeScrubPointerId);\n this.#releaseVolumePointer(this.#activeVolumePointerId);\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#isPointerOverControlSurface = false;\n this.#isVolumeHovering = false;\n this.#isVolumeScrubbing = false;\n this.#activeVolumePointerId = null;\n this.#clearControlTapTimer();\n this.#clearControlTapActive();\n this.#controlTraySlots.style.removeProperty('--sp-control-hover-offset');\n this.#volumeControl.classList.remove('is-volume-open');\n this.#volumePopover.classList.remove('is-scrubbing-volume');\n this.#player.classList.remove('is-scrubbing');\n this.#player.classList.remove('is-pointer-active');\n\n const activeElement = this.#root.activeElement;\n if (activeElement instanceof HTMLElement) {\n activeElement.blur();\n }\n\n if (isFullscreenActive) {\n this.#syncPointerControlsFromLastPosition();\n } else {\n this.#hidePointerControls();\n }\n }\n\n #enterScrubMode = () => {\n if (!this.#isTrackingScrub || this.#isScrubbing) return;\n\n this.#clearPausedVisualProgress();\n this.#clearControlsHideTimer();\n this.#clearScrubLongPressTimer();\n this.#isScrubbing = true;\n this.#player.classList.add('is-scrubbing');\n this.#scrubTargetTime = this.#previewSeekFromClientX(this.#scrubStartX, true);\n if (this.#scrubWasPlaying) this.#video.pause();\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n this.#updateProgress(this.#scrubTargetTime);\n this.#stopProgressLoop();\n this.#syncVideoState();\n };\n\n #releaseScrubPointer(pointerId: number | null) {\n if (pointerId === null) return;\n if (this.#progressTrack.hasPointerCapture(pointerId)) {\n this.#progressTrack.releasePointerCapture(pointerId);\n }\n }\n\n async #finishScrub(clientX: number | null, pointerId: number | null, shouldCommit: boolean) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n const wasDragging = this.#isScrubbing;\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n\n if (shouldCommit && clientX !== null) {\n this.#clearPausedVisualProgress();\n this.#scrubTargetTime = this.#previewSeekFromClientX(clientX, wasDragging);\n this.#isCommittedScrubPending = true;\n this.#committedScrubWasPlaying = this.#scrubWasPlaying;\n this.#video.currentTime = this.#scrubTargetTime;\n this.#syncVisualProgressClock(this.#scrubTargetTime);\n }\n\n this.#updateProgress(this.#scrubTargetTime);\n\n if (wasDragging && this.#scrubWasPlaying) {\n await this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #cancelScrub(pointerId: number | null) {\n if (!this.#isTrackingScrub && !this.#isScrubbing) return;\n\n this.#clearScrubLongPressTimer();\n this.#isTrackingScrub = false;\n this.#isScrubbing = false;\n this.#isProgressHoverPreviewing = false;\n this.#player.classList.remove('is-progress-hovering');\n this.#activeScrubPointerId = null;\n this.#player.classList.remove('is-scrubbing');\n this.#clearControlsCollision();\n this.#releaseScrubPointer(pointerId);\n this.#syncVisualProgressClock();\n this.#updateProgress();\n\n if (this.#scrubWasPlaying) {\n void this.#video.play();\n }\n\n this.#scheduleTouchControlsHide();\n }\n\n #formatTimeForDisplay(time: number) {\n if (!this.#showRemainingTime) return formatVideoTime(time);\n const duration = Number.isFinite(this.#video.duration) ? this.#video.duration : 0;\n if (duration <= 0) return formatVideoTime(time);\n return `-${formatVideoTime(Math.max(0, duration - time))}`;\n }\n\n #clearTimeAnimationTimer() {\n if (!this.#timeAnimationTimer) return;\n window.clearTimeout(this.#timeAnimationTimer);\n this.#timeAnimationTimer = 0;\n }\n\n #animateTimeSwap() {\n this.#clearTimeAnimationTimer();\n this.#trayTimeText.classList.remove('is-time-animating');\n void this.#trayTimeText.offsetWidth;\n this.#trayTimeText.classList.add('is-time-animating');\n this.#timeAnimationTimer = window.setTimeout(() => {\n this.#timeAnimationTimer = 0;\n this.#trayTimeText.classList.remove('is-time-animating');\n }, 240);\n }\n\n #handleTimeToggleClick = (event: Event) => {\n event.stopPropagation();\n this.#showRemainingTime = !this.#showRemainingTime;\n this.#animateTimeSwap();\n if (this.#isScrubPreviewLocked() || this.#isProgressHoverPreviewing) {\n if (this.#trayTimeText) {\n this.#trayTimeText.textContent = this.#formatTimeForDisplay(this.#scrubTargetTime);\n this.#syncTrayTimeWidth();\n }\n } else {\n this.#syncPinnedTimeText(this.#getVisualProgressTime());\n }\n };\n\n #handleButtonClick = async () => {\n if (performance.now() < this.#suppressTouchButtonClickUntil) {\n return;\n }\n\n const shouldPlay = this.#optimisticPlaybackState\n ? this.#optimisticPlaybackState !== 'playing'\n : this.#video.paused || this.#video.ended;\n const shouldFlipImmediately = !shouldPlay || this.#canStartImmediately();\n\n this.#showTouchControls();\n\n if (shouldFlipImmediately) {\n this.#optimisticPlaybackState = shouldPlay ? 'playing' : 'paused';\n this.#syncVideoState();\n }\n\n if (shouldPlay) {\n this.#clearPausedVisualProgress();\n await this.#hydrateVideoSource();\n await this.#video.play().catch(() => {\n this.#optimisticPlaybackState = null;\n });\n } else {\n this.#freezeRenderedProgressForPause();\n this.#video.pause();\n }\n\n this.#syncVideoState();\n this.#scheduleTouchControlsHide();\n };\n\n #handlePlayerPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n\n const buttonRect = this.#button.getBoundingClientRect();\n const isInsideButton =\n event.clientX >= buttonRect.left &&\n event.clientX <= buttonRect.right &&\n event.clientY >= buttonRect.top &&\n event.clientY <= buttonRect.bottom;\n const controlTrayRect = this.#controlTray.getBoundingClientRect();\n const isInsideControlTray =\n event.clientX >= controlTrayRect.left &&\n event.clientX <= controlTrayRect.right &&\n event.clientY >= controlTrayRect.top &&\n event.clientY <= controlTrayRect.bottom;\n const progressRect = this.#progressTrack.getBoundingClientRect();\n const isInsideProgress =\n event.clientX >= progressRect.left &&\n event.clientX <= progressRect.right &&\n event.clientY >= progressRect.top &&\n event.clientY <= progressRect.bottom;\n const didRevealControls = this.#showTouchControls();\n\n if (didRevealControls && isInsideButton) {\n this.#suppressTouchButtonClickUntil = performance.now() + 260;\n }\n\n if (didRevealControls && (isInsideControlTray || isInsideProgress)) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n\n void this.#hydrateVideoSource();\n };\n\n #preventVolumeTrackClick = (event: Event) => {\n event.stopPropagation();\n };\n\n #clearVolumeCloseTimer() {\n if (!this.#volumeCloseTimer) return;\n window.clearTimeout(this.#volumeCloseTimer);\n this.#volumeCloseTimer = 0;\n }\n\n #openVolumePopover() {\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#clearVolumeCloseTimer();\n this.#volumeControl.classList.add('is-volume-open');\n }\n\n #closeVolumePopover = () => {\n this.#volumeCloseTimer = 0;\n if (this.#isVolumeHovering || this.#isVolumeScrubbing) return;\n this.#volumeControl.classList.remove('is-volume-open');\n };\n\n #scheduleVolumePopoverClose(delay = 150) {\n this.#clearVolumeCloseTimer();\n this.#volumeCloseTimer = window.setTimeout(this.#closeVolumePopover, delay);\n }\n\n #handleVolumePointerEnter = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = true;\n this.#openVolumePopover();\n };\n\n #handleVolumePointerLeave = () => {\n if (this.#isTouchControls()) return;\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#isVolumeHovering = false;\n this.#scheduleVolumePopoverClose();\n };\n\n #handleVolumeControlClick = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable()) {\n this.#clearVolumeInteractionState();\n return;\n }\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n this.#closeVolumePopover();\n if (this.#video.muted || this.#video.volume <= 0) {\n if (this.#video.volume <= 0) this.#video.volume = 0.7;\n this.#video.muted = false;\n } else {\n this.#video.muted = true;\n }\n\n this.#syncAudioControlState();\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#isVolumeAvailable() || !this.volumeSliderEnabled || this.#isTouchControls()) {\n this.#clearVolumeInteractionState();\n return;\n }\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#openVolumePopover();\n this.#isVolumeScrubbing = true;\n this.#activeVolumePointerId = event.pointerId;\n this.#volumePopover.classList.add('is-scrubbing-volume');\n this.#volumeTrack.setPointerCapture(event.pointerId);\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isVolumeScrubbing) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.preventDefault();\n event.stopPropagation();\n this.#setVolumeFromClientY(event.clientY);\n };\n\n #handleVolumePointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n this.#scheduleTouchControlsHide();\n };\n\n #handleVolumePointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId !== this.#activeVolumePointerId) return;\n event.stopPropagation();\n this.#finishVolumeScrub(event.pointerId);\n };\n\n #handleVolumeKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!this.#isVolumeAvailable()) {\n event.preventDefault();\n event.stopPropagation();\n this.#clearVolumeInteractionState();\n return;\n }\n if (!['ArrowUp', 'ArrowDown', 'Home', 'End'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n const step = event.shiftKey ? 0.1 : 0.05;\n const nextVolume =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? 1\n : this.#video.volume + (event.key === 'ArrowUp' ? step : -step);\n this.#video.volume = Math.min(1, Math.max(0, nextVolume));\n this.#video.muted = this.#video.volume <= 0;\n this.#syncAudioControlState();\n };\n\n #handlePictureInPictureClick = async () => {\n const video = this.#video as HTMLVideoElement & {\n requestPictureInPicture?: () => Promise<PictureInPictureWindow>;\n };\n\n if (!this.pictureInPictureEnabled || !document.pictureInPictureEnabled || !video.requestPictureInPicture) return;\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#showTouchControls();\n\n try {\n await this.#hydrateVideoSource();\n if (document.pictureInPictureElement === this.#video) {\n await document.exitPictureInPicture();\n } else {\n await video.requestPictureInPicture();\n }\n } catch {\n // Picture-in-Picture can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncPictureInPictureState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleFullscreenClick = async (event: Event) => {\n if (!this.#isFullscreenSupported()) return;\n event.preventDefault();\n event.stopPropagation();\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) return;\n this.#trackPointerPosition(event);\n this.#showTouchControls();\n\n try {\n const fullscreenElement = this.#getFullscreenElement();\n if (fullscreenElement === this.#player || fullscreenElement === this) {\n await this.#exitFullscreen();\n } else {\n await this.#hydrateVideoSource();\n if (canRequestPlayerFullscreen(this.#player)) {\n await this.#requestPlayerFullscreen();\n } else {\n this.#requestVideoFullscreen();\n }\n }\n } catch {\n // Fullscreen can be blocked by browser policy or missing user activation.\n } finally {\n this.#syncFullscreenState();\n this.#scheduleTouchControlsHide();\n }\n };\n\n #handleProgressPointerEnter = (event: Event) => {\n if (this.#isTouchControls() || this.#isScrubPreviewLocked()) return;\n if (!(event instanceof PointerEvent) && !(event instanceof MouseEvent)) return;\n\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n };\n\n #handleProgressPointerLeave = () => {\n if (this.#isScrubPreviewLocked()) return;\n\n this.#clearProgressHoverPreview();\n };\n\n #handleProgressPointerDown = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n event.preventDefault();\n\n if (!this.#areControlsVisible() || this.#shouldSuppressControlAction()) {\n this.#showTouchControls();\n if (this.#isTouchControls()) {\n this.#suppressTouchControlClickUntil = performance.now() + 260;\n }\n return;\n }\n\n this.#showTouchControls();\n this.#clearControlsHideTimer();\n this.#finishInitialProgressSettle();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#setScrubReturnMarker(this.#getVisualProgressTime());\n this.#isTrackingScrub = true;\n this.#activeScrubPointerId = event.pointerId;\n this.#scrubStartX = event.clientX;\n this.#scrubWasPlaying = !this.#video.paused && !this.#video.ended;\n this.#progressTrack.setPointerCapture(event.pointerId);\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX, false);\n this.#clearScrubLongPressTimer();\n this.#scrubLongPressTimer = window.setTimeout(this.#enterScrubMode, this.#scrubLongPressDelay);\n };\n\n #handleProgressKeyDown = (event: Event) => {\n if (!(event instanceof KeyboardEvent)) return;\n if (!Number.isFinite(this.#video.duration) || this.#video.duration <= 0) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageUp', 'PageDown'].includes(event.key)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.#handleControlSurfaceFocusIn();\n\n const baseTime = this.#getVisualProgressTime();\n const smallStep = event.shiftKey ? 10 : 5;\n const largeStep = Math.max(10, this.#video.duration * 0.1);\n const nextTime =\n event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? this.#video.duration\n : event.key === 'PageUp'\n ? baseTime + largeStep\n : event.key === 'PageDown'\n ? baseTime - largeStep\n : baseTime + (event.key === 'ArrowRight' ? smallStep : -smallStep);\n\n this.#video.currentTime = Math.min(this.#video.duration, Math.max(0, nextTime));\n this.#syncVisualProgressClock(this.#video.currentTime);\n this.#updateProgress(this.#video.currentTime);\n };\n\n #handleProgressPointerMove = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (!this.#isTrackingScrub) {\n if (!this.#isTouchControls()) {\n this.#isProgressHoverPreviewing = true;\n this.#player.classList.add('is-progress-hovering');\n this.#previewSeekFromClientX(event.clientX, false, false);\n }\n return;\n }\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n\n if (!this.#isScrubbing && Math.abs(event.clientX - this.#scrubStartX) >= this.#scrubDragThreshold) {\n this.#enterScrubMode();\n }\n\n if (!this.#isScrubbing) return;\n this.#scrubTargetTime = this.#previewSeekFromClientX(event.clientX);\n };\n\n #handleProgressPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleProgressPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeScrubPointerId !== null && event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleDocumentPointerUp = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n void this.#finishScrub(event.clientX, event.pointerId, true);\n };\n\n #handleDocumentPointerCancel = (event: Event) => {\n if (!(event instanceof PointerEvent)) return;\n if (this.#activeVolumePointerId !== null && event.pointerId === this.#activeVolumePointerId) {\n this.#finishVolumeScrub(event.pointerId);\n return;\n }\n if (this.#activeScrubPointerId === null || event.pointerId !== this.#activeScrubPointerId) return;\n this.#cancelScrub(event.pointerId);\n };\n\n #handleWindowBlur = () => {\n this.#finishVolumeScrub(this.#activeVolumePointerId);\n this.#cancelScrub(this.#activeScrubPointerId);\n };\n\n #handleWindowFocus = () => {\n if (this.#getFullscreenElement()) return;\n this.#hidePointerControls();\n };\n\n #handleVideoPlay = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoPause = () => {\n this.#optimisticPlaybackState = null;\n if (!this.#isScrubPreviewLocked()) this.#holdPausedVisualProgress();\n this.#syncVideoLoading();\n this.#syncVideoState();\n };\n\n #handleVideoEnded = () => {\n this.#optimisticPlaybackState = null;\n this.#clearPausedVisualProgress();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoLoadStart = () => {\n this.#setVideoLoading(true, true);\n };\n\n #handleVideoWaiting = () => {\n this.#setVideoLoading(true);\n };\n\n #handleVideoLoadedMetadata = () => {\n this.#clearPausedVisualProgress();\n this.#syncAudioControlState();\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoLoading();\n this.#updateProgress();\n };\n\n #handleVideoPlaying = () => {\n const isReady = this.#markVideoReady();\n this.#syncAudioControlState();\n if (isReady && !this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#syncVideoState();\n };\n\n #handleVideoSeeked = () => {\n this.#clearPausedVisualProgress();\n this.#syncVideoLoading();\n if (\n this.#isCommittedScrubPending &&\n (!this.#committedScrubWasPlaying || this.#video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA)\n ) {\n this.#clearCommittedScrubPreview();\n this.#syncVideoState();\n return;\n }\n\n if (!this.#isScrubPreviewLocked()) this.#syncVisualProgressClock();\n this.#updateProgress();\n };\n\n #handleVideoError = () => {\n this.#optimisticPlaybackState = null;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#player.classList.remove('has-visible-frame');\n this.#setVideoLoading(true, true);\n this.#syncVideoState();\n this.#retryVideoLoad();\n };\n\n #handleVideoTimeUpdate = () => {\n this.#syncAudioControlState();\n this.#updateProgress();\n };\n\n #handleVideoVolumeChange = () => {\n this.#syncAudioControlState();\n };\n\n #isTouchControls() {\n return (\n window.matchMedia('(max-width: 768px)').matches &&\n window.matchMedia('(hover: none), (pointer: coarse)').matches\n );\n }\n\n #resetSource() {\n if (!this.#video) return;\n this.#observer?.disconnect();\n this.#observer = null;\n this.#clearVideoRetryTimer();\n this.#clearInitialProgressSettleTimer();\n this.#videoSourceLoaded = false;\n this.#videoLoadAttempt = 0;\n this.#hasDecodedFirstFrame = false;\n this.#hasPresentedFirstFrame = false;\n this.#firstFrameRequestPending = false;\n this.#firstFramePresentationPending = false;\n this.#firstFrameRequestToken += 1;\n this.#hasInitialProgressSettled = false;\n this.#lastRenderedProgressTime = 0;\n this.#clearPausedVisualProgress();\n this.#hasAudioTrack = false;\n this.#hasCheckedAudioTrack = false;\n this.#clearVolumeInteractionState();\n this.#isCommittedScrubPending = false;\n this.#committedScrubWasPlaying = false;\n this.#optimisticPlaybackState = null;\n this.#player.classList.remove('has-loaded-once', 'has-visible-frame', 'is-progress-settling');\n this.#video.dataset.src = this.src;\n this.#video.pause();\n this.#video.removeAttribute('src');\n this.#video.preload = 'none';\n this.#syncAutoplayState();\n this.#video.load();\n this.#setProgressVisual(0);\n this.#syncAudioControlState();\n this.#syncVideoLoading();\n this.#syncVideoState();\n }\n}\n","import { SimplePlayer } from './player/simple-player-element';\n\nexport { SimplePlayer } from './player/simple-player-element';\n\nif (!customElements.get('simple-player')) {\n customElements.define('simple-player', SimplePlayer);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'simple-player': SimplePlayer;\n }\n}\n"],"names":["DEFAULT_ASPECT_RATIO","DEFAULT_PRELOAD_MARGIN","OBSERVED_ATTRIBUTES","getFullscreenElement","root","fullscreenDocument","isFullscreenSupported","fullscreenEnabled","player","video","fullscreenPlayer","fullscreenVideo","canFullscreenPlayer","canFullscreenVideo","requestPlayerFullscreen","requestFullscreen","canRequestPlayerFullscreen","requestVideoFullscreen","exitFullscreen","formatVideoTime","time","totalSeconds","seconds","totalMinutes","minutes","hours","detectAudioAvailability","audioTrackVideo","firefoxVideo","streamVideo","captureStream","webkitVideo","isAudioAvailabilityPending","getProgressMetrics","rect","sideInset","innerWidth","getProgressXFromPercent","percent","clampedPercent","getProgressPercentFromClientX","clientX","styles","template","SimplePlayer","#root","#cleanup","#observer","#initialized","#videoSourceLoaded","#player","#video","#button","#progressTrack","#controlTray","#controlTraySlots","#trayTime","#trayTimeText","#scrubTime","#scrubTimeText","#volumeControl","#volumePopover","#volumeTrack","#pictureInPictureControl","#fullscreenControl","#controlButtons","#progressFrame","#isScrubbing","#isTrackingScrub","#scrubWasPlaying","#scrubTargetTime","#scrubReturnTime","#scrubReturnPercent","#hasScrubReturnMarker","#isCommittedScrubPending","#committedScrubWasPlaying","#scrubStartX","#scrubLongPressTimer","#activeScrubPointerId","#optimisticPlaybackState","#videoLoadAttempt","#videoRetryTimer","#controlsHideTimer","#loadingStateTimer","#initialProgressSettleTimer","#suppressTouchButtonClickUntil","#suppressTouchControlClickUntil","#timeWidthObserver","#hasDecodedFirstFrame","#hasPresentedFirstFrame","#firstFrameRequestPending","#firstFramePresentationPending","#firstFrameRequestToken","#firstFrameFallbackTimer","#hasInitialProgressSettled","#initialProgressEstimateUnlockAt","#isPlaybackBuffering","#visualProgressTime","#visualProgressUpdatedAt","#lastRenderedProgressTime","#pausedVisualProgressTime","#pauseFrozenProgressPercent","#hasControlsCollision","#isProgressHoverPreviewing","#hasAudioTrack","#hasCheckedAudioTrack","#isPointerOverControlSurface","#lastPointerClientX","#lastPointerClientY","#lastPointerWasTouch","#isVolumeScrubbing","#isVolumeHovering","#activeVolumePointerId","#volumeCloseTimer","#volumeIconAnimationTimer","#controlTapTimer","#volumeIconState","#showRemainingTime","#timeAnimationTimer","#scrubDragThreshold","#scrubSnapDistance","#scrubReturnMarkerBodyInset","#scrubReturnMarkerMinTime","#scrubLongPressDelay","#controlsAutoHideDelay","#pointerControlsIdleDelay","#loadingStateDelay","#initialProgressSettleDelay","#initialProgressEstimateHold","#videoRetryDelay","#maxVideoLoadAttempts","#bufferedAheadTarget","#bufferedRangeFuzz","#controlsCollisionEnterMargin","#controlsCollisionExitMargin","value","#setStringAttribute","#setOptionalControlAttributes","#syncAspectRatio","#bindEvents","#syncAutoplayState","#setupLazyLoading","#syncOptionalControls","#syncTimeVisibility","#syncVideoLoading","#syncAudioControlState","#syncPictureInPictureState","#syncFullscreenState","#syncVideoState","cleanup","#clearControlsHideTimer","#clearLoadingStateTimer","#clearVideoRetryTimer","#clearInitialProgressSettleTimer","#clearScrubLongPressTimer","#clearFirstFrameFallbackTimer","#clearVolumeCloseTimer","#clearVolumeIconAnimationTimer","#clearControlTapTimer","#clearControlsCollision","button","#stopProgressLoop","name","oldValue","newValue","#resetSource","enabled","isEnabled","hasVolumeControl","#isVolumeAvailable","controls","index","control","#closeVolumePopover","#releaseVolumePointer","#hasPinnedTime","#syncPinnedTimeText","#listen","#handleButtonClick","#handlePlayerPointerEnter","#handlePlayerPointerMove","#handlePlayerPointerLeave","#handleControlSurfacePointerEnter","#handleControlSurfacePointerLeave","#handleProgressPointerEnter","#handleProgressPointerLeave","#handleControlSurfaceFocusIn","#handleControlSurfaceFocusOut","#handlePlayerPointerDown","#preventNativeVideoAction","#handleProgressPointerDown","#handleProgressPointerMove","#handleProgressPointerUp","#handleProgressPointerCancel","#handleProgressKeyDown","#handleVolumePointerEnter","#handleVolumePointerLeave","#handleVolumeControlClick","#handleVolumePointerDown","#handleVolumePointerMove","#handleVolumePointerUp","#handleVolumePointerCancel","#preventVolumeTrackClick","#handleVolumeKeyDown","#handlePictureInPictureClick","#handleFullscreenClick","#handleTimeToggleClick","#handleControlButtonPointerEnter","#handleControlButtonPointerDown","#syncTrayTimeWidth","#handleDocumentPointerUp","#handleDocumentPointerCancel","#handleDocumentPointerMove","#handleFullscreenChange","#handleWindowBlur","#handleWindowFocus","#handleVideoPlay","#handleVideoPause","#handleVideoEnded","#handleVideoLoadStart","#handleVideoWaiting","#markVideoReady","#handleVideoLoadedMetadata","#handleVideoPlaying","#handleVideoSeeked","#handleVideoError","#handleVideoTimeUpdate","#handleVideoVolumeChange","width","target","type","listener","entries","observer","entry","#hydrateVideoSource","event","#hideControls","#isTouchControls","#scheduleControlsHide","delay","#scheduleTouchControlsHide","#showTouchControls","wasVisible","#showPointerControls","forcePointer","#hidePointerControls","#trackPointerPosition","#isPointInsidePlayer","clientY","#isPointInsideElement","element","#clearProgressHoverPreview","#syncHoverTargetsFromPointer","#isScrubPreviewLocked","#previewSeekFromClientX","hoveredControl","#isUnavailableControlButton","#areControlsVisible","#shouldSuppressControlAction","#syncPointerControlsFromLastPosition","#clearControlTapActive","#animateVolumeIconSwap","#finishInitialProgressSettle","#syncVisualProgressClock","#updateProgress","#queueInitialProgressSettle","#setProgressVisual","source","#isLoopBoundaryBlip","#getBufferedAhead","currentTime","start","end","#hasBufferedAhead","remainingDuration","requiredBuffer","#setVideoLoading","isLoading","immediate","shouldLoad","shouldShowLoading","#canStartImmediately","#retryVideoLoad","#clearCommittedScrubPreview","#commitVideoReady","#requestFirstVideoFrame","requestToken","confirmFirstFrame","isReady","#isVideoAdvancing","#clearPausedVisualProgress","#holdPausedVisualProgress","renderedTime","#freezeRenderedProgressForPause","rawInset","inset","progressFromFill","visualTime","#getVisualProgressTime","progressFromTime","frozenProgress","elapsed","estimatedTime","remainingPercent","#getProgressMetrics","markerEdgePercent","markerIsFullyOnFill","markerX","#getProgressXFromPercent","maxHoleLeft","holeLeft","#getProgressPercentFromTime","#getProgressPercentFromClientX","#setScrubReturnMarker","markerIsInTrackBody","#getScrubPoint","shouldSnap","targetTime","#formatTimeForDisplay","hasDuration","frozenTime","progressValue","updateVisual","scrubPoint","#syncControlsCollision","holderRect","timeRect","holderIsVisible","margin","timeTouchesHolder","#startProgressLoop","tick","realIsPlaying","isPlaying","#detectAudioAvailability","#clearVolumeInteractionState","audioAvailability","wasVolumeControlHidden","hasUsableAudio","isMuted","visualVolume","volumePercent","nextIconState","#setVolumeFromClientY","rounded","pointerId","#finishVolumeScrub","#scheduleVolumePopoverClose","isActive","isSupported","#getFullscreenElement","#isFullscreenSupported","#requestPlayerFullscreen","#requestVideoFullscreen","#exitFullscreen","fullscreenElement","isFullscreenActive","#resetFullscreenPointerState","#releaseScrubPointer","activeElement","#enterScrubMode","#finishScrub","shouldCommit","wasDragging","#cancelScrub","duration","#clearTimeAnimationTimer","#animateTimeSwap","shouldPlay","shouldFlipImmediately","buttonRect","isInsideButton","controlTrayRect","isInsideControlTray","progressRect","isInsideProgress","didRevealControls","#openVolumePopover","step","nextVolume","baseTime","smallStep","largeStep","nextTime"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}