@grizzshutsdown/simpleplayer 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/simple-player.js +220 -220
- package/dist/simple-player.js.map +1 -1
- package/package.json +1 -1
- package/skill/simpleplayer/SKILL.md +10 -3
|
@@ -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, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumeControl, 'mouseenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'mouseleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumePopover, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'pointerleave', this.#handleVolumePointerLeave);\n this.#listen(this.#volumePopover, 'mouseenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumePopover, 'mouseleave', 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 }\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 for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\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 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, 'click', this.#handleVolumeControlClick);\n this.#listen(this.#volumeControl, 'pointerenter', this.#handleVolumePointerEnter);\n this.#listen(this.#volumeControl, 'pointerleave', this.#handleVolumePointerLeave);\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 }\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 for (const control of this.#controlButtons) {\n this.#listen(control, 'pointerdown', this.#handleControlButtonPointerDown);\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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"}
|