@theoplayer/web-ui 1.6.0 → 1.7.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"THEOplayerUI.node.mjs","sources":["../node_modules/@webcomponents/shadycss/src/interface.js","../src/components/ControlBar.ts","../src/util/CommonUtils.ts","../src/util/Attribute.ts","../src/components/Button.ts","../src/util/KeyCode.ts","../src/components/LinkButton.ts","../src/components/StateReceiverMixin.ts","../src/components/PlayButton.ts","../src/components/MuteButton.ts","../src/components/SeekButton.ts","../src/util/TimeUtils.ts","../src/components/TimeDisplay.ts","../src/components/DurationDisplay.ts","../src/util/EventUtils.ts","../src/components/RadioButton.ts","../src/util/GeometryUtils.ts","../src/util/KeyboardNavigation.ts","../src/components/RadioGroup.ts","../src/events/CloseMenuEvent.ts","../src/events/MenuChangeEvent.ts","../src/components/Menu.ts","../src/events/ToggleMenuEvent.ts","../src/components/MenuGroup.ts","../src/components/MenuButton.ts","../src/components/CloseMenuButton.ts","../src/components/MediaTrackRadioButton.ts","../src/components/TextTrackRadioButton.ts","../src/util/TrackUtils.ts","../src/components/TextTrackOffRadioButton.ts","../src/components/TrackRadioGroup.ts","../src/extensions/ExtensionSlot.ts","../src/util/ColorUtils.ts","../src/util/TextTrackStylePresets.ts","../src/components/TextTrackStyleDisplay.ts","../src/components/TextTrackStyleRadioGroup.ts","../src/components/TextTrackStyleMenu.ts","../src/components/LanguageMenu.ts","../src/components/LanguageMenuButton.ts","../src/components/PlaybackRateRadioGroup.ts","../src/components/PlaybackRateMenuButton.ts","../src/components/PlaybackRateMenu.ts","../src/components/PlaybackRateDisplay.ts","../src/components/ActiveQualityDisplay.ts","../src/components/QualityRadioButton.ts","../src/components/QualityRadioGroup.ts","../src/components/TextTrackStyleResetButton.ts","../src/components/SettingsMenu.ts","../src/components/SettingsMenuButton.ts","../src/events/EnterFullscreenEvent.ts","../src/events/ExitFullscreenEvent.ts","../src/components/FullscreenButton.ts","../src/util/ColorStops.ts","../src/components/Range.ts","../src/events/PreviewTimeChangeEvent.ts","../src/util/AdUtils.ts","../src/components/PreviewThumbnail.ts","../src/components/PreviewTimeDisplay.ts","../src/components/TimeRange.ts","../src/components/VolumeRange.ts","../src/components/ErrorDisplay.ts","../src/components/CastButton.ts","../src/components/ChromecastButton.ts","../src/components/ChromecastDisplay.ts","../src/components/AirPlayButton.ts","../src/components/LoadingIndicator.ts","../src/components/GestureReceiver.ts","../src/components/LiveButton.ts","../src/components/ads/AdDisplay.ts","../src/components/ads/AdCountdown.ts","../src/components/ads/AdClickThroughButton.ts","../src/components/ads/AdSkipButton.ts","../src/extensions/ExtensionRegistry.ts","../src/util/FullscreenUtils.ts","../src/util/Environment.ts","../src/events/StreamTypeChangeEvent.ts","../src/events/ReadyEvent.ts","../src/UIContainer.ts","../src/DefaultUI.ts"],"sourcesContent":["/**\n * @license\n * Copyright (c) 2020 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\nfunction setProperties(element, properties) {\n const style = element.style;\n for (const [propertyName, value] of Object.entries(properties)) {\n style.setProperty(propertyName, value);\n }\n}\n/**\n * True if the ShadyCSS scoped style polyfill is loaded and active.\n *\n * Note that the other functions in this module are safe to call even if the\n * polyfills are not loaded.\n */\nfunction scopedStylesArePolyfilled() {\n return (window.ShadyCSS !== undefined && window.ShadyCSS.nativeShadow === false);\n}\n/**\n * True if the ShadyCSS custom properties polyfill is loaded and active.\n *\n * Note that the other functions in this module are safe to call even if the\n * polyfills are not loaded.\n */\nfunction customPropertiesArePolyfilled() {\n return window.ShadyCSS !== undefined && window.ShadyCSS.nativeCss === false;\n}\n/**\n * Prepare the given custom element template for use with the ShadyCSS style\n * scoping polyfill. You only need to do this once per template.\n *\n * If ShadyCSS is not active, then this function does nothing.\n *\n * If ShadyCSS is active, then after styleElement is called on the first\n * instance of this element, <style> tags within this template will be moved to\n * the <head> and re-written to use globally scoped rules that emulate scoped\n * behavior.\n *\n * Note that LitElement and Polymer Library users do not typically need to call\n * this function, because it is called automatically.\n */\nexport function prepareTemplate(template, customElementName) {\n if (scopedStylesArePolyfilled()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n window.ShadyCSS.prepareTemplate(template, customElementName);\n }\n}\n/**\n * Activate scoped styles for the given element instance. This function should\n * typically be called inside connectedCallback. The template of this element\n * class must already have been registered with prepareTemplate.\n *\n * If ShadyCSS is not active, then this function does nothing.\n *\n * Note that LitElement and Polymer Library users do not typically need to call\n * this function, because it is called automatically.\n */\nexport function styleElement(element) {\n if (scopedStylesArePolyfilled()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n window.ShadyCSS.styleElement(element);\n }\n}\n/**\n * Propagate CSS custom properties on this element to all descendant shadow\n * roots, and optionally set new ones.\n *\n * Uses ShadyCSS custom property emulation if the polyfill is active, otherwise\n * calls native style.setProperty.\n */\nexport function styleSubtree(element, properties) {\n if (customPropertiesArePolyfilled()) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n window.ShadyCSS.styleSubtree(element, properties);\n }\n else if (properties != null) {\n setProperties(element, properties);\n }\n}\n//# sourceMappingURL=interface.js.map","import * as shadyCss from '@webcomponents/shadycss';\nimport controlBarCss from './ControlBar.css';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-control-bar', `<style>${controlBarCss}</style><slot></slot>`);\n\n/**\n * `<theoplayer-control-bar>` - A horizontal control bar that can contain other controls.\n *\n * @group Components\n */\nexport class ControlBar extends HTMLElement {\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template().content.cloneNode(true));\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n }\n}\n\ncustomElements.define('theoplayer-control-bar', ControlBar);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-control-bar': ControlBar;\n }\n}\n","import { Attribute } from './Attribute';\n\nexport type Constructor<T> = abstract new (...args: any[]) => T;\n\nexport function noOp(): void {\n return;\n}\n\nexport function isElement(node: Node): node is Element {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n\nexport function isHTMLElement(node: unknown): node is HTMLElement {\n return node instanceof HTMLElement;\n}\n\nexport function isHTMLSlotElement(element: Element): element is HTMLSlotElement {\n return element.localName.toLowerCase() === 'slot';\n}\n\nexport const isArray: (arg: unknown) => arg is any[] =\n typeof Array.isArray === 'function'\n ? Array.isArray\n : (arg): arg is any[] => {\n return Object.prototype.toString.call(arg) === '[object Array]';\n };\n\nexport const fromArrayLike: <T>(arrayLike: ArrayLike<T>) => T[] =\n typeof Array.from === 'function'\n ? (arrayLike) => {\n return Array.from(arrayLike);\n }\n : (arrayLike) => {\n return Array.prototype.slice.call(arrayLike);\n };\n\nexport const arrayFind: <T>(array: readonly T[], predicate: (element: T, index: number, array: readonly T[]) => boolean) => T | undefined =\n typeof Array.prototype.find === 'function'\n ? (array, predicate) => array.find(predicate)\n : (array, predicate) => {\n for (let i = 0; i < array.length; i++) {\n if (predicate(array[i], i, array)) {\n return array[i];\n }\n }\n return undefined;\n };\n\nexport const arrayFindIndex: <T>(array: readonly T[], predicate: (element: T, index: number, array: readonly T[]) => boolean) => number =\n typeof Array.prototype.findIndex === 'function'\n ? (array, predicate) => array.findIndex(predicate)\n : (array, predicate) => {\n for (let i = 0; i < array.length; i++) {\n if (predicate(array[i], i, array)) {\n return i;\n }\n }\n return -1;\n };\n\nexport function arrayRemove<T>(array: T[], element: T): boolean {\n const index = array.indexOf(element);\n if (index < 0) {\n return false;\n }\n arrayRemoveAt(array, index);\n return true;\n}\n\nexport function arrayRemoveAt<T>(array: T[], index: number): void {\n array.splice(index, 1);\n}\n\nexport type Comparator<T, U = T> = (a: T, b: U) => number;\n\nexport function arrayMinByKey<T>(array: ReadonlyArray<T>, keySelector: (element: T) => number): T | undefined {\n return arrayMinBy(array, (first, second) => keySelector(first) - keySelector(second));\n}\n\nexport function arrayMaxByKey<T>(array: ReadonlyArray<T>, keySelector: (element: T) => number): T | undefined {\n return arrayMaxBy(array, (first, second) => keySelector(first) - keySelector(second));\n}\n\nexport function arrayMinBy<T>(array: ReadonlyArray<T>, comparator: Comparator<T>): T | undefined {\n if (array.length === 0) {\n return undefined;\n }\n return array.reduce((first, second) => (comparator(first, second) <= 0 ? first : second));\n}\n\nexport function arrayMaxBy<T>(array: ReadonlyArray<T>, comparator: Comparator<T>): T | undefined {\n const minComparator = (a: T, b: T) => comparator(b, a);\n return arrayMinBy(array, minComparator);\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith\nexport const stringStartsWith: (string: string, search: string) => boolean =\n typeof String.prototype.startsWith === 'function'\n ? (string, search) => string.startsWith(search)\n : (string, search) => string.substring(0, search.length) === search;\n\nexport const localizeLanguageName: (languageCode: string) => string | undefined =\n typeof Intl !== 'undefined' && Intl.DisplayNames\n ? (languageCode) => {\n const displayNames = new Intl.DisplayNames([languageCode, 'en'], { type: 'language', fallback: 'none' });\n const localName = displayNames.of(languageCode);\n if (localName) {\n return localName.slice(0, 1).toUpperCase() + localName.slice(1);\n }\n }\n : (_languageCode) => undefined;\n\nexport function setTextContent(el: HTMLElement, text: string): void {\n if (typeof el.textContent === 'undefined') {\n el.innerText = text;\n } else {\n el.textContent = text;\n }\n}\n\nexport function containsComposedNode(rootNode: Node, childNode: Node): boolean {\n if (!rootNode || !childNode) {\n return false;\n }\n if (rootNode.contains(childNode)) {\n return true;\n }\n const childRoot = childNode.getRootNode();\n if ((childRoot as ShadowRoot).host) {\n return containsComposedNode(rootNode, (childRoot as ShadowRoot).host);\n }\n return false;\n}\n\nexport function toggleAttribute(element: Element, attribute: string, enabled: boolean): void {\n if (enabled) {\n element.setAttribute(attribute, '');\n } else {\n element.removeAttribute(attribute);\n }\n}\n\nexport function getChildren(element: Element): ArrayLike<Element> {\n if (element.shadowRoot) {\n return element.shadowRoot.children;\n }\n if (isHTMLSlotElement(element)) {\n const assignedNodes = element.assignedNodes();\n if (assignedNodes.length > 0) {\n return assignedNodes.filter(isElement);\n }\n }\n if (isHTMLElement(element)) {\n // Element.children does not exist for SVG elements in Internet Explorer.\n // Assume those won't contain any state receivers.\n return element.children;\n }\n return [];\n}\n\nexport function getTvFocusChildren(element: Element): HTMLElement[] | undefined {\n if (!isHTMLElement(element)) {\n return;\n }\n if (getComputedStyle(element).display === 'none') {\n return;\n }\n if (element.getAttribute(Attribute.TV_FOCUS) !== null) {\n return getFocusableChildren(element);\n }\n\n const children = getChildren(element);\n for (let i = 0; i < children.length; i++) {\n const result = getTvFocusChildren(children[i]);\n if (result) {\n return result;\n }\n }\n}\n\nexport function getFocusableChildren(element: HTMLElement): HTMLElement[] {\n const result: HTMLElement[] = [];\n collectFocusableChildren(element, result);\n return result;\n}\n\nfunction collectFocusableChildren(element: Element, result: HTMLElement[]) {\n if (!isHTMLElement(element)) {\n return;\n }\n if (getComputedStyle(element).display === 'none') {\n return;\n }\n if (element.hasAttribute('tabindex') && Number(element.getAttribute('tabindex')) >= 0) {\n result.push(element);\n return;\n }\n switch (element.tagName.toLowerCase()) {\n case 'button':\n case 'input':\n case 'textarea':\n case 'select':\n case 'details': {\n result.push(element);\n break;\n }\n case 'a': {\n if ((element as HTMLAnchorElement).href) {\n result.push(element);\n }\n break;\n }\n default: {\n const children = getChildren(element);\n for (let i = 0; i < children.length; i++) {\n collectFocusableChildren(children[i], result);\n }\n break;\n }\n }\n}\n\nexport function getActiveElement(): Element | null {\n let activeElement = document.activeElement;\n if (activeElement == null) {\n return null;\n }\n let nextActiveElement: Element | null | undefined;\n while ((nextActiveElement = activeElement.shadowRoot?.activeElement) != null) {\n activeElement = nextActiveElement;\n }\n return activeElement;\n}\n\nexport function upgradeCustomElementIfNeeded(element: Element): Promise<unknown> | undefined {\n const elementName = element.nodeName.toLowerCase();\n if (elementName.indexOf('-') >= 0) {\n if (customElements.get(elementName)) {\n customElements.upgrade(element);\n } else {\n return customElements.whenDefined(elementName);\n }\n }\n return undefined;\n}\n","export enum Attribute {\n CONFIGURATION = 'configuration',\n SOURCE = 'source',\n AUTOPLAY = 'autoplay',\n MUTED = 'muted',\n FULLSCREEN = 'fullscreen',\n FLUID = 'fluid',\n DEVICE_TYPE = 'device-type',\n MOBILE = 'mobile',\n TV = 'tv',\n TV_FOCUS = 'tv-focus',\n MOBILE_ONLY = 'mobile-only',\n MOBILE_HIDDEN = 'mobile-hidden',\n TV_ONLY = 'tv-only',\n TV_HIDDEN = 'tv-hidden',\n USER_IDLE = 'user-idle',\n USER_IDLE_TIMEOUT = 'user-idle-timeout',\n NO_AUTO_HIDE = 'no-auto-hide',\n DISABLED = 'disabled',\n HIDDEN = 'hidden',\n PAUSED = 'paused',\n ENDED = 'ended',\n VOLUME_LEVEL = 'volume-level',\n CASTING = 'casting',\n LOADING = 'loading',\n STREAM_TYPE = 'stream-type',\n LIVE = 'live',\n LIVE_ONLY = 'live-only',\n LIVE_HIDDEN = 'live-hidden',\n LIVE_THRESHOLD = 'live-threshold',\n DVR_THRESHOLD = 'dvr-threshold',\n REMAINING = 'remaining',\n REMAINING_WHEN_LIVE = 'remaining-when-live',\n SHOW_DURATION = 'show-duration',\n SEEK_OFFSET = 'seek-offset',\n MENU = 'menu',\n MENU_OPENED = 'menu-opened',\n MENU_CLOSE_ON_INPUT = 'menu-close-on-input',\n ARIA_LABEL = 'aria-label',\n ARIA_LIVE = 'aria-live',\n ARIA_CHECKED = 'aria-checked',\n HAS_AUDIO = 'has-audio',\n HAS_SUBTITLES = 'has-subtitles',\n HAS_ERROR = 'has-error',\n HAS_FIRST_PLAY = 'has-first-play',\n HAS_TITLE = 'has-title',\n CAST_STATE = 'cast-state',\n TRACK_TYPE = 'track-type',\n SHOW_OFF = 'show-off',\n PLAYING_AD = 'playing-ad',\n SHOW_AD_MARKERS = 'show-ad-markers',\n CLICKTHROUGH = 'clickthrough',\n PROPERTY = 'property',\n VALUE = 'value'\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport buttonCss from './Button.css';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nexport interface ButtonOptions {\n template: HTMLTemplateElement;\n}\n\nexport function buttonTemplate(button: string, extraCss: string = ''): string {\n return `<style>${buttonCss}\\n${extraCss}</style>${button}`;\n}\n\nconst defaultTemplate = createTemplate('theoplayer-button', buttonTemplate('<slot></slot>'));\n\n/**\n * `<theoplayer-button>` - A basic button.\n *\n * @attribute `disabled` - Whether the button is disabled. When disabled, the button cannot be clicked.\n * @group Components\n */\n// Based on howto-toggle-button\n// https://github.com/GoogleChromeLabs/howto-components/blob/079d0fa34ff9038b26ea8883b1db5dd6b677d7ba/elements/howto-toggle-button/howto-toggle-button.js\nexport class Button extends HTMLElement {\n static get observedAttributes() {\n return [Attribute.DISABLED];\n }\n\n /**\n * Creates a basic button.\n *\n * By default, the button renders the contents of its direct children (i.e. it has a single unnamed `<slot>`).\n * Subclasses can override this by passing a different {@link ButtonOptions.template} in the options,\n * using {@link buttonTemplate} to correctly style the custom template.\n *\n * @param options - The options for this button.\n */\n constructor(options?: ButtonOptions) {\n super();\n const template = options?.template ?? defaultTemplate();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template.content.cloneNode(true));\n\n this._upgradeProperty('disabled');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'button');\n }\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n // Let the screen reader user know that the text of the button may change\n this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n }\n\n this.addEventListener('click', this._onClick);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('click', this._onClick);\n }\n\n /**\n * Whether the button is disabled.\n *\n * When disabled, the button cannot be clicked.\n */\n get disabled() {\n return this.hasAttribute(Attribute.DISABLED);\n }\n\n set disabled(disabled: boolean) {\n toggleAttribute(this, Attribute.DISABLED, disabled);\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (attrName === Attribute.DISABLED && newValue !== oldValue) {\n const hasValue = newValue != null;\n this.setAttribute('aria-disabled', hasValue ? 'true' : 'false');\n // The `tabindex` attribute does not provide a way to fully remove focusability from an element.\n // Elements with `tabindex=-1` can still be focused with a mouse or by calling `focus()`.\n // To make sure an element is disabled and not focusable, remove the `tabindex` attribute.\n if (hasValue) {\n this.removeAttribute('tabindex');\n // If the focus is currently on this element, unfocus it by calling the `HTMLElement.blur()` method.\n this.blur();\n } else {\n this.setAttribute('tabindex', '0');\n }\n }\n if (Button.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onClick = () => {\n if (this.disabled) {\n return;\n }\n this.handleClick();\n };\n\n /**\n * Handle a button click.\n *\n * By default, this does nothing. Subclasses can override this method to add behavior to the button.\n */\n protected handleClick(): void {}\n}\n\ncustomElements.define('theoplayer-button', Button);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-button': Button;\n }\n}\n","export enum KeyCode {\n ENTER = 13,\n ESCAPE = 27,\n SPACE = 32,\n END = 35,\n HOME = 36,\n LEFT = 37,\n UP = 38,\n RIGHT = 39,\n DOWN = 40,\n // Multiple back key configurations depending on the platform\n // https://suite.st/docs/faq/tv-specific-keys-in-browser/\n BACK_SAMSUNG = 88,\n BACK_WEBOS = 461,\n BACK_TIZEN = 10009\n}\n\nexport type ArrowKeyCode = KeyCode.LEFT | KeyCode.UP | KeyCode.RIGHT | KeyCode.DOWN;\nexport type BackKeyCode = KeyCode.BACK_TIZEN | KeyCode.ESCAPE | KeyCode.BACK_SAMSUNG | KeyCode.BACK_WEBOS;\n\nexport function isArrowKey(keyCode: number): keyCode is ArrowKeyCode {\n return KeyCode.LEFT <= keyCode && keyCode <= KeyCode.DOWN;\n}\n\nexport function isBackKey(keyCode: number): keyCode is BackKeyCode {\n return keyCode === KeyCode.BACK_TIZEN || keyCode === KeyCode.ESCAPE || keyCode === KeyCode.BACK_SAMSUNG || keyCode === KeyCode.BACK_WEBOS;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport linkButtonCss from './LinkButton.css';\nimport { Attribute } from '../util/Attribute';\nimport type { ButtonOptions } from './Button';\nimport { Button, buttonTemplate } from './Button';\nimport { KeyCode } from '../util/KeyCode';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nexport function linkButtonTemplate(button: string, extraCss: string = ''): string {\n return buttonTemplate(`<a>${button}</a>`, `${linkButtonCss}\\n${extraCss}`);\n}\n\nconst defaultTemplate = createTemplate('theoplayer-link-button', linkButtonTemplate('<slot></slot>'));\n\n/**\n * `<theoplayer-link-button>` - A {@link Button | button} that opens a hyperlink.\n *\n * @attribute `disabled` - Whether the button is disabled. When disabled, the button cannot be clicked.\n * @group Components\n */\nexport class LinkButton extends HTMLElement {\n private readonly _linkEl: HTMLAnchorElement;\n\n static get observedAttributes() {\n return [Attribute.DISABLED];\n }\n\n constructor(options?: ButtonOptions) {\n super();\n\n const template = options?.template ?? defaultTemplate();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n\n this._linkEl = shadowRoot.querySelector('a')!;\n\n this._upgradeProperty('disabled');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'button');\n }\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '0');\n }\n if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n // Let the screen reader user know that the text of the button may change\n this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n }\n\n this._linkEl.addEventListener('keydown', this._onKeyDown);\n this._linkEl.addEventListener('click', this._onClick);\n }\n\n disconnectedCallback(): void {\n this._linkEl.removeEventListener('keydown', this._onKeyDown);\n this._linkEl.removeEventListener('click', this._onClick);\n }\n\n /**\n * Whether the button is disabled.\n *\n * When disabled, the button cannot be clicked.\n */\n get disabled() {\n return this.hasAttribute(Attribute.DISABLED);\n }\n\n set disabled(disabled: boolean) {\n toggleAttribute(this, Attribute.DISABLED, disabled);\n }\n\n protected setLink(href: string, target: string): void {\n this._linkEl.href = href;\n this._linkEl.target = target;\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (attrName === Attribute.DISABLED && newValue !== oldValue) {\n const hasValue = newValue != null;\n this.setAttribute('aria-disabled', hasValue ? 'true' : 'false');\n // The `tabindex` attribute does not provide a way to fully remove focusability from an element.\n // Elements with `tabindex=-1` can still be focused with a mouse or by calling `focus()`.\n // To make sure an element is disabled and not focusable, remove the `tabindex` attribute.\n if (hasValue) {\n this.removeAttribute('tabindex');\n // If the focus is currently on this element, unfocus it by calling the `HTMLElement.blur()` method.\n this.blur();\n } else {\n this.setAttribute('tabindex', '0');\n }\n }\n if (Button.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onKeyDown = (event: KeyboardEvent) => {\n // Don't handle modifier shortcuts typically used by assistive technology.\n if (event.altKey) return;\n\n switch (event.keyCode) {\n // Enter is already handled by the browser.\n // case KeyCode.ENTER:\n case KeyCode.SPACE:\n event.preventDefault();\n this._linkEl.click();\n break;\n // Any other key press is ignored and passed back to the browser.\n default:\n return;\n }\n };\n\n private readonly _onClick = () => {\n if (this.disabled) {\n return;\n }\n this.handleClick();\n };\n\n protected handleClick(): void {}\n}\n\ncustomElements.define('theoplayer-link-button', LinkButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-link-button': LinkButton;\n }\n}\n","import { type Constructor, fromArrayLike, getChildren, isArray } from '../util/CommonUtils';\nimport type { ChromelessPlayer, THEOplayerError, VideoQuality } from 'theoplayer/chromeless';\nimport type { DeviceType } from '../util/DeviceType';\nimport type { StreamType } from '../util/StreamType';\n\n/** @internal */\nexport const StateReceiverProps = 'theoplayerUiObservedProperties' as const;\n\nexport interface StateReceiverPropertyMap {\n player: ChromelessPlayer | undefined;\n fullscreen: boolean;\n deviceType: DeviceType;\n streamType: StreamType;\n playbackRate: number;\n activeVideoQuality: VideoQuality | undefined;\n targetVideoQualities: VideoQuality[] | undefined;\n error: THEOplayerError | undefined;\n previewTime: number;\n}\n\n/**\n * A custom element that automatically receives selected state updates\n * from an ancestor {@link UIContainer | `<theoplayer-ui>`} element.\n *\n * Do not implement this interface directly, instead use {@link StateReceiverMixin}.\n *\n * @see {@link StateReceiverMixin}\n */\nexport interface StateReceiverElement extends Partial<StateReceiverPropertyMap>, Element {\n /**\n * The names of the properties this element will receive.\n */\n readonly [StateReceiverProps]: Array<keyof StateReceiverPropertyMap>;\n}\n\n/** @internal */\nexport function isStateReceiverElement(element: Element): element is StateReceiverElement {\n return StateReceiverProps in element && isArray((element as Partial<StateReceiverElement>)[StateReceiverProps]);\n}\n\n/**\n * A [mixin class](https://www.typescriptlang.org/docs/handbook/mixins.html) to apply on the superclass of a custom element,\n * such that it will automatically receive selected state updates from an ancestor {@link UIContainer | `<theoplayer-ui>`} element.\n *\n * For each property name in `props`, the custom element *MUST* implement a corresponding property with a setter.\n * For example, if `props` equals `[\"player\", \"fullscreen\"]`, then the element must have writable `player` and `fullscreen`\n * properties.\n *\n * @param base - The superclass for the new element class.\n * @param props - The names of the properties this element will receive.\n * @returns A class constructor that extends `base` and implements {@link StateReceiverElement}.\n * @see {@link StateReceiverElement}\n */\nexport function StateReceiverMixin<T extends Constructor<Element>>(\n base: T,\n props: Array<keyof StateReceiverPropertyMap>\n): T & Constructor<StateReceiverElement> {\n abstract class StateReceiver extends base implements StateReceiverElement {\n get [StateReceiverProps](): Array<keyof StateReceiverPropertyMap> {\n return props;\n }\n }\n\n return StateReceiver;\n}\n\n/** @internal */\nexport async function forEachStateReceiverElement(\n element: Element,\n playerElement: HTMLElement,\n callback: (receiver: StateReceiverElement) => void\n): Promise<void> {\n // Don't look inside the THEOplayer chromeless player\n if (playerElement.contains(element)) {\n return;\n }\n // Upgrade custom elements if needed\n if (element.nodeName.indexOf('-') >= 0 && !isStateReceiverElement(element)) {\n // web-components-polyfill does not correctly resolve `whenDefined()`\n // when called during an upgrade reaction such as `connectedCallback()`.\n // Workaround by waiting one microtask.\n await Promise.resolve();\n await customElements.whenDefined(element.nodeName.toLowerCase());\n customElements.upgrade(element);\n }\n // Check the element\n if (isStateReceiverElement(element)) {\n callback(element);\n }\n // Check all its children\n const children = getChildren(element);\n if (children.length > 0) {\n await Promise.all(fromArrayLike(children).map((child) => forEachStateReceiverElement(child, playerElement, callback)));\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport playButtonCss from './PlayButton.css';\nimport playIcon from '../icons/play.svg';\nimport pauseIcon from '../icons/pause.svg';\nimport replayIcon from '../icons/replay.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-play-button',\n buttonTemplate(\n `<span part=\"play-icon\"><slot name=\"play-icon\">${playIcon}</slot></span>` +\n `<span part=\"pause-icon\"><slot name=\"pause-icon\">${pauseIcon}</slot></span>` +\n `<span part=\"replay-icon\"><slot name=\"replay-icon\">${replayIcon}</slot></span>`,\n playButtonCss\n )\n);\n\nconst PLAYER_EVENTS = ['seeking', 'seeked', 'ended', 'emptied', 'sourcechange'] as const;\n\n/**\n * `<theoplayer-play-button>` - A button that toggles whether the player is playing or paused.\n *\n * @attribute `paused` (readonly) - Whether the player is paused. Reflects `ui.player.paused`.\n * @attribute `ended` (readonly) - Whether the player is ended. Reflects `ui.player.ended`.\n * @group Components\n */\nexport class PlayButton extends StateReceiverMixin(Button, ['player']) {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.PAUSED, Attribute.ENDED];\n }\n\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('paused');\n this._upgradeProperty('ended');\n this._upgradeProperty('player');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._updateFromPlayer();\n this._updateAriaLabel();\n }\n\n get paused(): boolean {\n return this.hasAttribute(Attribute.PAUSED);\n }\n\n set paused(paused: boolean) {\n toggleAttribute(this, Attribute.PAUSED, paused);\n }\n\n get ended(): boolean {\n return this.hasAttribute(Attribute.ENDED);\n }\n\n set ended(ended: boolean) {\n toggleAttribute(this, Attribute.ENDED, ended);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener('play', this._onPlay);\n this._player.removeEventListener('pause', this._onPause);\n this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener('play', this._onPlay);\n this._player.addEventListener('pause', this._onPause);\n this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n }\n\n private readonly _onPlay = (): void => {\n this.paused = false;\n this._updateEnded();\n };\n\n private readonly _onPause = (): void => {\n this.paused = true;\n this._updateEnded();\n };\n\n private readonly _updateFromPlayer = (): void => {\n this.paused = this._player?.paused ?? true;\n this._updateEnded();\n this._updateDisabled();\n };\n\n private _updateEnded(): void {\n this.ended = this._player?.ended ?? false;\n }\n\n private readonly _updateDisabled = () => {\n this.disabled = this._player?.source === undefined;\n };\n\n protected override handleClick() {\n if (this._player !== undefined) {\n if (this._player.source === undefined) {\n // Do nothing if the player has no source.\n return;\n }\n if (this._player.paused) {\n this._player.play();\n } else {\n this._player.pause();\n }\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (PlayButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const label = this.ended ? 'replay' : this.paused ? 'play' : 'pause';\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-play-button', PlayButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-play-button': PlayButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport muteButtonCss from './MuteButton.css';\nimport offIcon from '../icons/volume-off.svg';\nimport lowIcon from '../icons/volume-low.svg';\nimport highIcon from '../icons/volume-high.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-mute-button',\n buttonTemplate(\n `<span part=\"off-icon\"><slot name=\"off-icon\">${offIcon}</slot></span>` +\n `<span part=\"low-icon\"><slot name=\"low-icon\">${lowIcon}</slot></span>` +\n `<span part=\"high-icon\"><slot name=\"high-icon\">${highIcon}</slot></span>`,\n muteButtonCss\n )\n);\n\nexport type VolumeLevel = 'off' | 'low' | 'high';\n\nconst PLAYER_EVENTS = ['volumechange'] as const;\n\n/**\n * `<theoplayer-mute-button>` - A button that toggles whether audio is muted or not.\n *\n * @attribute `volume-level` (readonly) - The volume level of the player.\n * Can be \"off\" (muted), \"low\" (volume < 50%) or \"high\" (volume >= 50%).\n * @group Components\n */\nexport class MuteButton extends StateReceiverMixin(Button, ['player']) {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.VOLUME_LEVEL];\n }\n\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('player');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._updateFromPlayer();\n this._updateAriaLabel();\n }\n\n /**\n * The volume level of the player.\n */\n get volumeLevel(): VolumeLevel {\n return (this.getAttribute(Attribute.VOLUME_LEVEL) as VolumeLevel | null) || 'off';\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n let volumeLevel: VolumeLevel = 'off';\n if (this._player !== undefined) {\n const volume = this._player.volume;\n const muted = this._player.muted;\n if (muted) {\n volumeLevel = 'off';\n } else if (volume < 0.5) {\n volumeLevel = 'low';\n } else {\n volumeLevel = 'high';\n }\n }\n this.setAttribute(Attribute.VOLUME_LEVEL, volumeLevel);\n };\n\n protected override handleClick() {\n if (this._player !== undefined) {\n this._player.muted = !this._player.muted;\n this._updateFromPlayer();\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (MuteButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const label = this.getAttribute(Attribute.VOLUME_LEVEL) === 'off' ? 'unmute' : 'mute';\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-mute-button', MuteButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-mute-button': MuteButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport seekButtonCss from './SeekButton.css';\nimport seekForwardIcon from '../icons/seek-forward.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport { setTextContent } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-seek-button',\n buttonTemplate(`<span part=\"icon\"><slot name=\"icon\">${seekForwardIcon}</slot></span>` + `<span part=\"offset\"></span>`, seekButtonCss)\n);\n\nconst DEFAULT_SEEK_OFFSET = 10;\n\n/**\n * `<theoplayer-seek-button>` - A button that seeks forward or backward by a fixed offset.\n *\n * @attribute `seek-offset` - The offset (in seconds) by which to seek forward (if positive) or backward (if negative).\n * @group Components\n */\nexport class SeekButton extends StateReceiverMixin(Button, ['player']) {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.SEEK_OFFSET];\n }\n\n private _player: ChromelessPlayer | undefined;\n private _offsetEl: HTMLElement;\n\n constructor() {\n super({ template: template() });\n this._offsetEl = this.shadowRoot!.querySelector('[part=\"offset\"]')!;\n this._upgradeProperty('player');\n this._upgradeProperty('seekOffset');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateAriaLabel();\n }\n\n /**\n * The offset (in seconds) by which to seek forward (if positive) or backward (if negative).\n */\n get seekOffset(): number {\n return Number(this.getAttribute(Attribute.SEEK_OFFSET) ?? DEFAULT_SEEK_OFFSET);\n }\n\n set seekOffset(value: number) {\n this.setAttribute(Attribute.SEEK_OFFSET, String(value));\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n this._player = player;\n }\n\n protected override handleClick() {\n if (this._player === undefined) {\n return;\n }\n const duration = this._player.duration;\n if (isNaN(duration)) {\n return;\n }\n this._player.currentTime = Math.max(0, Math.min(duration, this._player.currentTime + this.seekOffset));\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.SEEK_OFFSET) {\n setTextContent(this._offsetEl, String(Math.abs(this.seekOffset)));\n }\n if (SeekButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const seekOffset = this.seekOffset;\n const label = seekOffset >= 0 ? `seek forward by ${seekOffset} seconds` : `seek backward by ${-seekOffset} seconds`;\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-seek-button', SeekButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-seek-button': SeekButton;\n }\n}\n","function isValidNumber(x: number): boolean {\n return !isNaN(x) && isFinite(x);\n}\n\nexport function formatTime(time: number, guide: number = 0, preferNegative?: boolean): string {\n // Handle negative values at the end\n let negative = time < 0 || (preferNegative && time === 0);\n time = Math.abs(time);\n\n const guideMinutes = Math.floor((guide / 60) % 60);\n const guideHours = Math.floor(guide / 3600);\n\n let timeParts: string[];\n if (!isValidNumber(time)) {\n timeParts = [guideHours > 0 ? '--' : '', '--', '--'];\n } else {\n const seconds = Math.floor(time % 60);\n const minutes = Math.floor((time / 60) % 60);\n const hours = Math.floor(time / 3600);\n // Check if we need to show hours.\n const showHours = hours > 0 || guideHours > 0;\n // If hours are showing, we may need to add a leading zero to minutes.\n // Always show at least one digit of minutes.\n const showMinutesLeadingZero = showHours || guideMinutes >= 0;\n timeParts = [\n showHours ? `${hours}` : '',\n showMinutesLeadingZero && minutes < 10 ? `0${minutes}` : `${minutes}`,\n seconds < 10 ? `0${seconds}` : `${seconds}`\n ];\n }\n\n const timePhrase = timeParts.filter((part) => part !== '').join(':');\n return `${negative ? '-' : ''}${timePhrase}`;\n}\n\nconst timeUnitLabels = [\n ['hour', 'hours'],\n ['minute', 'minutes'],\n ['second', 'seconds']\n] as const;\n\nexport function toTimeUnitPhrase(timeUnitValue: number, unitIndex: 0 | 1 | 2): string {\n const unitLabel = timeUnitLabels[unitIndex][timeUnitValue === 1 ? 0 : 1];\n return `${timeUnitValue} ${unitLabel}`;\n}\n\nexport function formatAsTimePhrase(time: number, preferNegative?: boolean): string {\n if (!isValidNumber(time)) return '';\n const negative = time < 0 || (preferNegative && time === 0);\n time = Math.abs(time);\n\n const seconds = Math.floor(time % 60);\n const minutes = Math.floor(time / 60) % 60;\n const hours = Math.floor(time / 3600);\n\n const timePhrase = [\n hours === 0 ? '' : toTimeUnitPhrase(hours, 0),\n minutes === 0 ? '' : toTimeUnitPhrase(minutes, 1),\n seconds === 0 && (hours > 0 || minutes > 0) ? '' : toTimeUnitPhrase(seconds, 2)\n ]\n .filter((part) => part !== '')\n .join(', ');\n\n // If the time was negative, assume it represents some remaining amount of time/\"count down\".\n const negativeSuffix = negative ? ' remaining' : '';\n\n return `${timePhrase}${negativeSuffix}`;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport textDisplayCss from './TextDisplay.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { setTextContent } from '../util/CommonUtils';\nimport { formatAsTimePhrase, formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-time-display', `<style>${textDisplayCss}</style><span></span>`);\n\nconst PLAYER_EVENTS = ['timeupdate', 'seeking', 'seeked', 'durationchange'] as const;\n\nconst DEFAULT_MISSING_TIME_PHRASE = 'video not loaded, unknown time';\n\n/**\n * `<theoplayer-time-display>` - A control that displays the current time of the stream.\n *\n * @attribute `show-duration` - If set, also shows the duration of the stream.\n * @attribute `remaining` - If set, shows the remaining time of the stream. Not compatible with `show-duration`.\n * @attribute `remaining-when-live` - If set, and the stream is a livestream, shows the remaining time\n * (until the live point) of the stream.\n * @group Components\n */\nexport class TimeDisplay extends StateReceiverMixin(HTMLElement, ['player', 'streamType']) {\n private readonly _spanEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [Attribute.REMAINING, Attribute.REMAINING_WHEN_LIVE, Attribute.SHOW_DURATION, Attribute.STREAM_TYPE];\n }\n\n constructor() {\n super();\n\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._spanEl = shadowRoot.querySelector('span')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n // Tell screen readers not to automatically read the time as it changes\n this.setAttribute(Attribute.ARIA_LIVE, 'off');\n }\n\n this._updateFromPlayer();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n }\n\n get streamType(): StreamType {\n return (this.getAttribute(Attribute.STREAM_TYPE) || 'vod') as StreamType;\n }\n\n set streamType(streamType: StreamType) {\n this.setAttribute(Attribute.STREAM_TYPE, streamType);\n }\n\n private readonly _updateFromPlayer = () => {\n const currentTime = this._player ? this._player.currentTime : 0;\n const duration = this._player ? this._player.duration : NaN;\n const seekable = this._player?.seekable;\n const endTime = isFinite(duration) ? duration : seekable && seekable.length > 0 ? seekable.end(0) : NaN;\n const remaining = this.hasAttribute(Attribute.REMAINING) || (this.hasAttribute(Attribute.REMAINING_WHEN_LIVE) && this.streamType !== 'vod');\n let time = currentTime;\n if (remaining) {\n time = -((endTime || 0) - currentTime);\n }\n const showDuration = this.hasAttribute(Attribute.SHOW_DURATION);\n let text: string;\n if (showDuration && !remaining) {\n text = `${formatTime(time, endTime, remaining)} / ${formatTime(endTime)}`;\n } else {\n text = formatTime(time, endTime, remaining);\n }\n let ariaValueText: string;\n if (isNaN(duration)) {\n ariaValueText = DEFAULT_MISSING_TIME_PHRASE;\n } else if (showDuration) {\n ariaValueText = `${formatAsTimePhrase(time, remaining)} of ${formatAsTimePhrase(endTime)}`;\n } else {\n ariaValueText = formatAsTimePhrase(time, remaining);\n }\n setTextContent(this._spanEl, text);\n this.setAttribute('aria-valuetext', ariaValueText);\n };\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (TimeDisplay.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n this._updateFromPlayer();\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-time-display', TimeDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-time-display': TimeDisplay;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport textDisplayCss from './TextDisplay.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { setTextContent } from '../util/CommonUtils';\nimport { formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-duration-display', `<style>${textDisplayCss}</style><span></span>`);\n\nconst PLAYER_EVENTS = ['durationchange'] as const;\n\n/**\n * `<theoplayer-duration-display>` - A control that displays the duration of the stream.\n *\n * @group Components\n */\nexport class DurationDisplay extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _spanEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._spanEl = shadowRoot.querySelector('span')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.ARIA_LIVE)) {\n // Tell screen readers not to automatically read the duration as it changes\n this.setAttribute(Attribute.ARIA_LIVE, 'off');\n }\n\n this._updateFromPlayer();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n const duration = this._player ? this._player.duration : NaN;\n const text = formatTime(duration);\n setTextContent(this._spanEl, text);\n };\n}\n\ncustomElements.define('theoplayer-duration-display', DurationDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-duration-display': DurationDisplay;\n }\n}\n","// https://github.com/webmodules/custom-event/blob/master/index.js\n\n// Modern browsers\nfunction supportsNativeEvent() {\n try {\n const event = new Event('change');\n return 'change' === event.type;\n } catch (e) {}\n return false;\n}\n\nfunction supportsNativeCustomEvent() {\n try {\n const event = new CustomEvent('cat', { detail: { foo: 'bar' } });\n return 'cat' === event.type && 'bar' === event.detail.foo;\n } catch (e) {}\n return false;\n}\n\nfunction createWithNativeEvent(type: string, eventInitDict?: EventInit): Event {\n return new Event(type, eventInitDict);\n}\n\nfunction createWithNativeCustomEvent(type: string, eventInitDict?: CustomEventInit): CustomEvent {\n return new CustomEvent(type, eventInitDict);\n}\n\n// IE >= 9\nfunction createEventWithCreateEvent(type: string, eventInitDict?: EventInit): Event {\n const e = document.createEvent('Event');\n e.initEvent(type, eventInitDict?.bubbles || false, eventInitDict?.cancelable || false);\n return e;\n}\n\nfunction createCustomEventWithCreateEvent(type: string, eventInitDict?: CustomEventInit): CustomEvent {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, eventInitDict?.bubbles || false, eventInitDict?.cancelable || false, eventInitDict?.detail);\n return e;\n}\n\nexport type EventFactory = <TType extends string = string>(type: TType, eventInitDict?: EventInit) => Event & { readonly type: TType };\n\nexport type CustomEventFactory = <TType extends string = string, TDetail = any>(\n type: TType,\n eventInitDict?: CustomEventInit<TDetail>\n) => CustomEvent<TDetail> & { readonly type: TType };\n\n/**\n * Cross-browser `Event` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/Event/Event\n */\nexport const createEvent: EventFactory = (supportsNativeEvent() ? createWithNativeEvent : createEventWithCreateEvent) as EventFactory;\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n */\nexport const createCustomEvent: CustomEventFactory = (\n supportsNativeCustomEvent() ? createWithNativeCustomEvent : createCustomEventWithCreateEvent\n) as CustomEventFactory;\n","import { Button, type ButtonOptions, buttonTemplate } from './Button';\nimport { Attribute } from '../util/Attribute';\nimport * as shadyCss from '@webcomponents/shadycss';\nimport { createEvent } from '../util/EventUtils';\nimport type { RadioGroup } from './RadioGroup';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst defaultTemplate = createTemplate('theoplayer-radio-button', buttonTemplate('<slot></slot>'));\n\n/**\n * `<theoplayer-radio-button>` - A button that can be checked.\n *\n * When part of a {@link RadioGroup}, at most one button in the group can be checked.\n *\n * @group Components\n */\nexport class RadioButton extends Button {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.ARIA_CHECKED, Attribute.VALUE];\n }\n\n private _value: any = undefined;\n\n constructor(options?: ButtonOptions) {\n super({ template: defaultTemplate(), ...options });\n this._upgradeProperty('checked');\n }\n\n override connectedCallback() {\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'radio');\n }\n if (!this.hasAttribute('tabindex')) {\n this.setAttribute('tabindex', '-1');\n }\n\n super.connectedCallback();\n }\n\n /**\n * Whether this radio button is checked.\n */\n get checked(): boolean {\n return this.getAttribute(Attribute.ARIA_CHECKED) === 'true';\n }\n\n set checked(checked: boolean) {\n this.setAttribute(Attribute.ARIA_CHECKED, checked ? 'true' : 'false');\n }\n\n /**\n * The value associated with this radio button.\n */\n get value(): any {\n return this._value;\n }\n\n set value(value: any) {\n this._value = value;\n }\n\n protected handleClick(): void {\n this.checked = true;\n this.dispatchEvent(createEvent('input', { bubbles: true, composed: true }));\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.ARIA_CHECKED) {\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n } else if (attrName === Attribute.VALUE) {\n this.value = newValue;\n }\n if (RadioButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-radio-button', RadioButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-radio-button': RadioButton;\n }\n}\n","export class Rectangle implements DOMRect {\n x: number;\n y: number;\n width: number;\n height: number;\n\n constructor(x: number, y: number, width: number, height: number) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n get left(): number {\n return this.x;\n }\n\n set left(value: number) {\n this.x = value;\n }\n\n get right(): number {\n return this.x + this.width;\n }\n\n set right(value: number) {\n this.x = value - this.width;\n }\n\n get top(): number {\n return this.y;\n }\n\n set top(value: number) {\n this.y = value;\n }\n\n get bottom(): number {\n return this.y + this.height;\n }\n\n set bottom(value: number) {\n this.y = value - this.height;\n }\n\n static fromRect(rect: Partial<DOMRectReadOnly>): Rectangle {\n // Note: Internet Explorer doesn't support DOMRect.x and .y, only .left and .top\n return new Rectangle(rect.left ?? rect.x ?? 0, rect.top ?? rect.y ?? 0, rect.width ?? 0, rect.height ?? 0);\n }\n\n overlaps(other: DOMRectReadOnly): boolean {\n return this.x < other.right && this.right > other.x && this.y < other.bottom && this.bottom > other.y;\n }\n\n contains(other: DOMRectReadOnly): boolean {\n return this.x <= other.x && other.right <= this.right && this.y <= other.y && other.bottom <= this.bottom;\n }\n\n union(other: DOMRectReadOnly): Rectangle {\n const x = Math.min(this.x, other.x);\n const y = Math.min(this.y, other.y);\n const width = Math.max(this.right, other.right) - x;\n const height = Math.max(this.bottom, other.bottom) - y;\n return new Rectangle(x, y, width, height);\n }\n\n snapToPixels(): Rectangle {\n return new Rectangle(Math.round(this.x), Math.round(this.y), Math.round(this.width), Math.round(this.height));\n }\n\n clone(): Rectangle {\n return new Rectangle(this.x, this.y, this.width, this.height);\n }\n\n toJSON(): any {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n left: this.left,\n right: this.right,\n top: this.top,\n bottom: this.bottom\n };\n }\n}\n","import { type ArrowKeyCode, KeyCode } from './KeyCode';\nimport { arrayMinByKey, getActiveElement, isHTMLElement } from './CommonUtils';\nimport { Rectangle } from './GeometryUtils';\n\nexport function getFocusedChild(): HTMLElement | null {\n const focusedChild = getActiveElement();\n if (!focusedChild || focusedChild === document.body || !isHTMLElement(focusedChild)) {\n return null;\n }\n return focusedChild;\n}\n\nexport function navigateByArrowKey(container: HTMLElement, children: HTMLElement[], key: ArrowKeyCode): boolean {\n const focusedChild = getFocusedChild();\n if (focusedChild === null) {\n return false;\n }\n const containerRect = Rectangle.fromRect(container.getBoundingClientRect()).snapToPixels();\n const focusedRect = Rectangle.fromRect(focusedChild.getBoundingClientRect()).snapToPixels();\n const childrenWithRects = children\n .map(\n (child): ChildWithRect => ({\n child,\n rect: Rectangle.fromRect(child.getBoundingClientRect()).snapToPixels()\n })\n )\n .filter((x) => x.rect.width > 0 && x.rect.height > 0);\n // Find focusable children next to the focused child along the key's direction\n let candidates: ChildWithRect[];\n if (key === KeyCode.LEFT || key === KeyCode.RIGHT) {\n const bounds = focusedRect.clone();\n if (key === KeyCode.LEFT) {\n bounds.left = containerRect.left;\n bounds.width = focusedRect.left - containerRect.left;\n } else {\n bounds.left = focusedRect.right;\n bounds.width = containerRect.right - focusedRect.right;\n }\n candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n if (candidates.length === 0) {\n bounds.top = containerRect.top;\n bounds.height = containerRect.height;\n candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n }\n } else {\n const bounds = focusedRect.clone();\n if (key === KeyCode.UP) {\n bounds.top = containerRect.top;\n bounds.height = focusedRect.top - containerRect.top;\n } else {\n bounds.top = focusedRect.bottom;\n bounds.height = containerRect.bottom - focusedRect.bottom;\n }\n candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n if (candidates.length === 0) {\n bounds.left = containerRect.left;\n bounds.width = containerRect.width;\n candidates = childrenWithRects.filter((x) => bounds.overlaps(x.rect));\n }\n }\n // Find the candidate closest to the currently focused child\n const closestCandidate = arrayMinByKey(candidates, (x) => manhattanDistanceBetweenRects(x.rect, focusedRect));\n if (closestCandidate === undefined) {\n return false;\n }\n // Focus it\n closestCandidate.child.focus();\n return true;\n}\n\ninterface ChildWithRect {\n child: HTMLElement;\n rect: DOMRectReadOnly;\n}\n\nfunction manhattanDistanceBetweenRects(a: DOMRectReadOnly, b: DOMRectReadOnly): number {\n let distance = 0;\n if (a.right < b.left) {\n distance += b.left - a.right;\n } else if (b.right < a.left) {\n distance += a.left - b.right;\n }\n if (a.bottom < b.top) {\n distance += b.top - a.bottom;\n } else if (b.bottom < a.top) {\n distance += a.top - b.bottom;\n }\n return distance;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { isArrowKey, KeyCode } from '../util/KeyCode';\nimport { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { arrayFind, isElement, noOp, upgradeCustomElementIfNeeded } from '../util/CommonUtils';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport type { DeviceType } from '../util/DeviceType';\nimport { navigateByArrowKey } from '../util/KeyboardNavigation';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-radio-group', `<slot></slot>`);\n\n/**\n * `<theoplayer-radio-group>` - A group of {@link RadioButton}s. At most one button in the group can be checked.\n *\n * ## Behavior\n * This radio group implements the [roving tabindex](https://www.w3.org/WAI/ARIA/apg/example-index/radio/radio.html) pattern.\n * - `Tab` moves focus in or out of the radio group.\n * - `Up`/`Left` arrow moves focus to the previous radio button.\n * - `Down`/`Right` arrow moves focus to the next radio button.\n * - `Home` moves focus to the first radio button.\n * - `End` moves focus to the last radio button.\n *\n * @group Components\n */\n// Based on howto-radio-group\n// https://github.com/GoogleChromeLabs/howto-components/blob/079d0fa34ff9038b26ea8883b1db5dd6b677d7ba/elements/howto-radio-group/howto-radio-group.js\nexport class RadioGroup extends StateReceiverMixin(HTMLElement, ['deviceType']) {\n private _slot: HTMLSlotElement;\n private _radioButtons: RadioButton[] = [];\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._slot = shadowRoot.querySelector('slot')!;\n this._upgradeProperty('deviceType');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute('role')) {\n this.setAttribute('role', 'radiogroup');\n }\n\n this.addEventListener('keydown', this._onKeyDown);\n this.shadowRoot!.addEventListener('change', this._onButtonChange);\n this._slot.addEventListener('slotchange', this._onSlotChange);\n this._onSlotChange();\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('keydown', this._onKeyDown);\n this.shadowRoot!.removeEventListener('change', this._onButtonChange);\n this._slot.removeEventListener('slotchange', this._onSlotChange);\n }\n\n get deviceType(): DeviceType {\n return (this.getAttribute(Attribute.DEVICE_TYPE) || 'desktop') as DeviceType;\n }\n\n set deviceType(deviceType: DeviceType) {\n this.setAttribute(Attribute.DEVICE_TYPE, deviceType);\n }\n\n private readonly _onSlotChange = () => {\n const children = this._slot.assignedNodes({ flatten: true }).filter(isElement);\n const upgradePromises: Array<Promise<unknown>> = [];\n for (const child of children) {\n if (!isRadioButton(child)) {\n const promise = upgradeCustomElementIfNeeded(child);\n if (promise) {\n upgradePromises.push(promise);\n }\n }\n }\n if (upgradePromises.length > 0) {\n Promise.all(upgradePromises).then(this._onSlotChange, noOp);\n }\n\n this._radioButtons = children.filter(isRadioButton);\n\n let firstFocusedButton = this.focusedRadioButton;\n if (!firstFocusedButton) {\n this.firstRadioButton?.setAttribute('tabindex', '0');\n }\n };\n\n private readonly _onKeyDown = (event: KeyboardEvent) => {\n if (this.deviceType === 'tv' && isArrowKey(event.keyCode)) {\n if (navigateByArrowKey(this, this._radioButtons, event.keyCode)) {\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n switch (event.keyCode) {\n case KeyCode.UP:\n case KeyCode.LEFT: {\n if (this._focusPrevButton()) {\n event.preventDefault();\n }\n break;\n }\n case KeyCode.DOWN:\n case KeyCode.RIGHT: {\n if (this._focusNextButton()) {\n event.preventDefault();\n }\n break;\n }\n case KeyCode.HOME: {\n event.preventDefault();\n this.setFocusedRadioButton(this.firstRadioButton);\n break;\n }\n case KeyCode.END: {\n event.preventDefault();\n this.setFocusedRadioButton(this.lastRadioButton);\n break;\n }\n default: {\n break;\n }\n }\n };\n\n get focusedRadioButton(): RadioButton | null {\n return arrayFind(this._radioButtons, (button) => button.tabIndex === 0) ?? null;\n }\n\n get checkedRadioButton(): RadioButton | null {\n return arrayFind(this._radioButtons, (button) => button.checked) ?? null;\n }\n\n get firstRadioButton(): RadioButton | null {\n return this._radioButtons[0] ?? null;\n }\n\n get lastRadioButton(): RadioButton | null {\n const radioButtons = this._radioButtons;\n return radioButtons.length > 0 ? radioButtons[radioButtons.length - 1] : null;\n }\n\n allRadioButtons(): readonly RadioButton[] {\n return this._radioButtons;\n }\n\n private _prevRadioButton(node: RadioButton): RadioButton | null {\n const index = this._radioButtons.indexOf(node);\n if (index > 0) {\n return this._radioButtons[index - 1];\n }\n return null;\n }\n\n private _nextRadioButton(node: RadioButton): RadioButton | null {\n const index = this._radioButtons.indexOf(node);\n if (index >= 0 && index < this._radioButtons.length - 1) {\n return this._radioButtons[index + 1];\n }\n return null;\n }\n\n private _focusPrevButton(): boolean {\n let focusedButton = this.focusedRadioButton || this.firstRadioButton;\n if (!focusedButton) {\n return false;\n }\n if (focusedButton === this.firstRadioButton) {\n this.setFocusedRadioButton(this.lastRadioButton);\n } else {\n this.setFocusedRadioButton(this._prevRadioButton(focusedButton));\n }\n return true;\n }\n\n private _focusNextButton(): boolean {\n let focusedButton = this.focusedRadioButton || this.firstRadioButton;\n if (!focusedButton) {\n return false;\n }\n if (focusedButton === this.lastRadioButton) {\n this.setFocusedRadioButton(this.firstRadioButton);\n } else {\n this.setFocusedRadioButton(this._nextRadioButton(focusedButton));\n }\n return true;\n }\n\n setFocusedRadioButton(button: RadioButton | null): void {\n this._unfocusAll();\n if (button) {\n button.tabIndex = 0;\n button.focus();\n }\n }\n\n private _unfocusAll(): void {\n for (const button of this.allRadioButtons()) {\n button.tabIndex = -1;\n }\n }\n\n setCheckedRadioButton(checkedButton: RadioButton | null): void {\n for (const button of this.allRadioButtons()) {\n button.checked = button === checkedButton;\n }\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n }\n\n private readonly _onButtonChange = (event: Event) => {\n const button = event.target as RadioButton | null;\n if (button !== null && button.checked) {\n this.setCheckedRadioButton(event.target as RadioButton);\n }\n };\n}\n\ncustomElements.define('theoplayer-radio-group', RadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-radio-group': RadioGroup;\n }\n}\n\nfunction isRadioButton(node: Node): node is RadioButton {\n return node instanceof RadioButton;\n}\n","export const CLOSE_MENU_EVENT = 'theoplayermenuclose' as const;\n\nexport interface CloseMenuEvent extends CustomEvent<OpenMenuEventDetail> {\n type: typeof CLOSE_MENU_EVENT;\n}\n\nexport interface OpenMenuEventDetail {\n menu: string;\n}\n","export const MENU_CHANGE_EVENT = 'theoplayermenuchange' as const;\n\nexport interface MenuChangeEvent extends CustomEvent {\n type: typeof MENU_CHANGE_EVENT;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport menuCss from './Menu.css';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { MENU_CHANGE_EVENT, type MenuChangeEvent } from '../events/MenuChangeEvent';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nexport interface MenuOptions {\n template?: HTMLTemplateElement;\n}\n\nexport function menuTemplate(heading: string, content: string, extraCss: string = ''): string {\n return (\n `<style>${menuCss}${extraCss}</style>` +\n `<div part=\"heading\"><theoplayer-menu-close-button></theoplayer-menu-close-button>${heading}</div>` +\n `<div part=\"content\">${content}</div>`\n );\n}\n\nconst defaultTemplate = createTemplate('theoplayer-menu', menuTemplate('<slot name=\"heading\"></slot>', '<slot></slot>'));\n\n/**\n * `<theoplayer-menu>` - A menu that can be opened on top of the player.\n *\n * The menu has a heading at the top, with a {@link CloseMenuButton | close button} and a heading text.\n *\n * @attribute `menu-close-on-input` - Whether to automatically close the menu whenever one of its controls\n * receives an input (e.g. when a radio button is clicked).\n * @attribute `menu-opened` (readonly) - Whether the menu is currently open.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @group Components\n */\nexport class Menu extends HTMLElement {\n static get observedAttributes() {\n return [Attribute.MENU_OPENED, Attribute.MENU_CLOSE_ON_INPUT];\n }\n\n private readonly _contentEl: HTMLElement;\n\n /**\n * Creates a menu.\n *\n * By default, the button has an unnamed `<slot>` for its contents, and a named `\"heading\"` `<slot>` for its heading text.\n * Subclasses can override this by passing a different {@link MenuOptions.template} in the options,\n * using {@link menuTemplate} to correctly style the custom template.\n *\n * @param options - The options for this menu.\n */\n constructor(options?: MenuOptions) {\n super();\n const template = options?.template ?? defaultTemplate();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n\n this._contentEl = shadowRoot.querySelector('[part=\"content\"]')!;\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.MENU_OPENED)) {\n this.setAttribute('hidden', '');\n }\n\n this._contentEl.addEventListener('input', this._onContentInput);\n }\n\n disconnectedCallback(): void {\n this._contentEl.removeEventListener('input', this._onContentInput);\n }\n\n /**\n * Whether to automatically close the menu whenever one of its controls\n * receives an input (e.g. when a radio button is clicked).\n */\n get closeOnInput(): boolean {\n return this.hasAttribute(Attribute.MENU_CLOSE_ON_INPUT);\n }\n\n set closeOnInput(value: boolean) {\n toggleAttribute(this, Attribute.MENU_CLOSE_ON_INPUT, value);\n }\n\n /**\n * Open the menu.\n */\n openMenu(): void {\n this.setAttribute(Attribute.MENU_OPENED, '');\n }\n\n /**\n * Close the menu.\n */\n closeMenu(): void {\n this.removeAttribute(Attribute.MENU_OPENED);\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.MENU_OPENED) {\n toggleAttribute(this, Attribute.HIDDEN, newValue == null);\n const changeEvent: MenuChangeEvent = createCustomEvent(MENU_CHANGE_EVENT, { bubbles: true });\n this.dispatchEvent(changeEvent);\n }\n if (Menu.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onContentInput = (): void => {\n // Close menu when clicking any button\n if (this.hasAttribute(Attribute.MENU_CLOSE_ON_INPUT)) {\n const event: CloseMenuEvent = createCustomEvent(CLOSE_MENU_EVENT, {\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(event);\n }\n };\n}\n\ncustomElements.define('theoplayer-menu', Menu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-menu': Menu;\n }\n}\n","export const TOGGLE_MENU_EVENT = 'theoplayermenutoggle' as const;\n\nexport interface ToggleMenuEvent extends CustomEvent<OpenMenuEventDetail> {\n type: typeof TOGGLE_MENU_EVENT;\n}\n\nexport interface OpenMenuEventDetail {\n menu: string;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport menuGroupCss from './MenuGroup.css';\nimport { Attribute } from '../util/Attribute';\nimport { arrayFind, arrayFindIndex, fromArrayLike, isElement, isHTMLElement, noOp, upgradeCustomElementIfNeeded } from '../util/CommonUtils';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from '../events/ToggleMenuEvent';\nimport { isBackKey } from '../util/KeyCode';\nimport { createCustomEvent } from '../util/EventUtils';\nimport type { MenuChangeEvent } from '../events/MenuChangeEvent';\nimport { MENU_CHANGE_EVENT } from '../events/MenuChangeEvent';\nimport { Menu } from './Menu';\nimport { createTemplate } from '../util/TemplateUtils';\n\nexport interface MenuGroupOptions {\n template?: HTMLTemplateElement;\n}\n\nexport function menuGroupTemplate(content: string, extraCss: string = ''): string {\n return `<style>${menuGroupCss}${extraCss}</style>${content}`;\n}\n\nconst defaultTemplate = createTemplate('theoplayer-menu-group', menuGroupTemplate(`<slot></slot>`));\n\ninterface OpenMenuEntry {\n menu: Menu | MenuGroup;\n opener: HTMLElement | undefined;\n}\n\n/**\n * `<theoplayer-menu-group>` - A group of {@link Menu}s.\n *\n * This can contain multiple other menus, which can be opened with {@link MenuGroup.openMenu}.\n * When a {@link MenuButton} in one menu opens another menu in this group, it is opened as a \"submenu\".\n * When a submenu is closed, the menu that originally opened it is shown again.\n *\n * @attribute `menu-opened` (readonly) - Whether any menu in the group is currently open.\n * @group Components\n */\nexport class MenuGroup extends HTMLElement {\n static get observedAttributes() {\n return [Attribute.MENU_OPENED];\n }\n\n private readonly _menuSlot: HTMLSlotElement | null;\n private _menus: Array<Menu | MenuGroup> = [];\n private readonly _openMenuStack: OpenMenuEntry[] = [];\n\n constructor(options?: MenuGroupOptions) {\n super();\n const template = options?.template ?? defaultTemplate();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template.content.cloneNode(true));\n\n this._menuSlot = shadowRoot.querySelector('slot');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.MENU_OPENED)) {\n this.setAttribute('hidden', '');\n }\n\n this._onMenuListChange();\n\n this.shadowRoot!.addEventListener(TOGGLE_MENU_EVENT, this._onToggleMenu);\n this.shadowRoot!.addEventListener(CLOSE_MENU_EVENT, this._onCloseMenu);\n this.shadowRoot!.addEventListener(MENU_CHANGE_EVENT, this._onMenuChange);\n this._menuSlot?.addEventListener('slotchange', this._onMenuListChange);\n }\n\n disconnectedCallback(): void {\n this.shadowRoot!.removeEventListener(TOGGLE_MENU_EVENT, this._onToggleMenu);\n this.shadowRoot!.removeEventListener(CLOSE_MENU_EVENT, this._onCloseMenu);\n this.shadowRoot!.removeEventListener(MENU_CHANGE_EVENT, this._onMenuChange);\n this._menuSlot?.removeEventListener('slotchange', this._onMenuListChange);\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.MENU_OPENED) {\n const hasValue = newValue != null;\n if (hasValue) {\n this.removeAttribute('hidden');\n this.removeEventListener('keydown', this._onKeyDown);\n this.addEventListener('keydown', this._onKeyDown);\n } else {\n this.setAttribute('hidden', '');\n this.removeEventListener('keydown', this._onKeyDown);\n }\n const changeEvent: MenuChangeEvent = createCustomEvent(MENU_CHANGE_EVENT, { bubbles: true });\n this.dispatchEvent(changeEvent);\n }\n if (MenuGroup.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n /**\n * Get the menu with the given ID.\n *\n * @param [menuId] - The ID of the menu. If unset, returns this menu group.\n */\n getMenuById(menuId?: string): Menu | MenuGroup | undefined {\n if (!menuId || menuId === this.id) {\n return this;\n }\n return arrayFind(this._menus, (menu) => menu.id === menuId);\n }\n\n /**\n * Open the menu with the given ID.\n *\n * If no ID is given, the first menu in the group is opened.\n *\n * If there's already an open menu, then the new menu is opened as a \"submenu\".\n * When it closed, the previous menu is opened.\n *\n * @param [menuId] - The ID of the menu to open.\n * @param [opener] - The control that opened the menu. When the menu is closed, focus is moved back to this control.\n * @returns True if the given menu was found.\n */\n openMenu(menuId?: string, opener?: HTMLElement): boolean {\n let menuToOpen = this.getMenuById(menuId);\n if (menuToOpen === this) {\n menuToOpen = this._menus[0];\n }\n if (!menuToOpen) {\n return false;\n }\n\n const previousEntry = this.getCurrentMenu_();\n const index = arrayFindIndex(this._openMenuStack, (entry) => entry.menu === menuToOpen);\n if (index >= 0) {\n // Already open.\n // Close subsequent menus to move menu back to top of the stack.\n this.closeMenusFromIndex_(index + 1);\n } else {\n // Not yet open, add to top of the stack.\n this._openMenuStack.push({ menu: menuToOpen, opener });\n }\n\n if (previousEntry) {\n previousEntry.menu.closeMenu();\n }\n menuToOpen.openMenu();\n this.setAttribute(Attribute.MENU_OPENED, '');\n\n menuToOpen.focus();\n return true;\n }\n\n /**\n * Closes the menu with the given ID.\n *\n * If no ID is given, then the entire menu group is closed.\n *\n * If the given menu has opened one or more submenus, then those are also closed.\n * If the last open menu is closed, then the menu group also becomes closed.\n *\n * @param [menuId] - The ID of the menu to close.\n * @returns True if the given menu was found and closed.\n */\n closeMenu(menuId?: string): boolean {\n let menuToClose = this.getMenuById(menuId);\n if (menuToClose === this) {\n menuToClose = this._openMenuStack[0]?.menu;\n }\n if (!menuToClose) {\n return false;\n }\n const index = arrayFindIndex(this._openMenuStack, (entry) => entry.menu === menuToClose);\n if (index < 0) {\n return false;\n }\n\n const oldEntry = this._openMenuStack[index];\n // Close this menu and all subsequent menus\n this.closeMenusFromIndex_(index);\n\n const nextEntry = this.getCurrentMenu_();\n if (nextEntry !== undefined) {\n nextEntry.menu.openMenu();\n this.setAttribute(Attribute.MENU_OPENED, '');\n if (oldEntry.opener && nextEntry.menu.contains(oldEntry.opener)) {\n oldEntry.opener.focus();\n } else {\n nextEntry.menu.focus();\n }\n return true;\n }\n\n this.removeAttribute(Attribute.MENU_OPENED);\n oldEntry.opener?.focus();\n return true;\n }\n\n private closeMenusFromIndex_(index: number): void {\n const menusToClose = this._openMenuStack.length - index;\n for (let i = this._openMenuStack.length - 1; i >= index; i--) {\n this._openMenuStack[i].menu.closeMenu();\n }\n this._openMenuStack.splice(index, menusToClose);\n }\n\n /**\n * Whether this menu group has a currently open menu.\n */\n hasCurrentMenu(): boolean {\n return this._openMenuStack.length > 0;\n }\n\n private getCurrentMenu_(): OpenMenuEntry | undefined {\n return this._openMenuStack.length > 0 ? this._openMenuStack[this._openMenuStack.length - 1] : undefined;\n }\n\n /**\n * Close the current menu.\n */\n closeCurrentMenu(): boolean {\n const currentMenu = this.getCurrentMenu_();\n if (currentMenu !== undefined) {\n this.closeMenu(currentMenu.menu.id);\n return true;\n }\n return false;\n }\n\n /**\n * Whether the menu with the given ID is currently open.\n *\n * @param [menuId] - The ID of the menu.\n */\n isMenuOpen(menuId?: string): boolean {\n const menu = this.getMenuById(menuId);\n if (!menu) {\n return false;\n }\n return this._openMenuStack.some((entry) => entry.menu === menu);\n }\n\n /**\n * Update the list of menus whenever the `<slot>` contents change.\n * Note: the `slotchange` event bubbles up, so we don't have to manually attach\n * this listener to each nested `<slot>`.\n */\n private readonly _onMenuListChange = () => {\n const children: Element[] = [\n ...fromArrayLike(this.shadowRoot!.children),\n ...(this._menuSlot ? this._menuSlot.assignedNodes({ flatten: true }).filter(isElement) : [])\n ];\n const upgradePromises: Array<Promise<unknown>> = [];\n for (const child of children) {\n if (!isMenuElement(child)) {\n const promise = upgradeCustomElementIfNeeded(child);\n if (promise) {\n upgradePromises.push(promise);\n }\n }\n }\n if (upgradePromises.length > 0) {\n Promise.all(upgradePromises).then(this._onMenuListChange, noOp);\n }\n const newMenus = children.filter(isMenuElement);\n // Close all removed menus\n for (const oldMenu of this._menus) {\n if (newMenus.indexOf(oldMenu) < 0) {\n this.closeMenu(oldMenu.id);\n }\n }\n // Ensure newly added menus start as closed\n for (const newMenu of newMenus) {\n if (this._menus.indexOf(newMenu) < 0) {\n newMenu.closeMenu();\n }\n }\n this._menus = newMenus;\n };\n\n private readonly _onToggleMenu = (rawEvent: Event): void => {\n const event = rawEvent as ToggleMenuEvent;\n const menuId = event.detail.menu;\n if (!this.getMenuById(menuId)) {\n // Not our menu, allow event to bubble further up.\n return;\n }\n event.stopPropagation();\n const opener = isHTMLElement(event.target) ? event.target : undefined;\n if (this.isMenuOpen(menuId)) {\n this.closeMenu(menuId);\n } else {\n this.openMenu(menuId, opener);\n }\n };\n\n private readonly _onCloseMenu = (rawEvent: Event): void => {\n const event = rawEvent as CloseMenuEvent;\n if (this.closeCurrentMenu()) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private readonly _onMenuChange = (rawEvent: Event): void => {\n const event = rawEvent as MenuChangeEvent;\n const currentMenu = this.getCurrentMenu_();\n // If the current menu is another menu container which no longer has an open menu, close it\n if (currentMenu && currentMenu.menu === event.target && currentMenu.menu instanceof MenuGroup && !currentMenu.menu.hasCurrentMenu()) {\n this.closeCurrentMenu();\n }\n };\n\n private readonly _onKeyDown = (event: KeyboardEvent) => {\n // Don't handle modifier shortcuts typically used by assistive technology.\n if (event.altKey) return;\n\n if (isBackKey(event.keyCode)) {\n if (this.closeCurrentMenu()) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n };\n}\n\ncustomElements.define('theoplayer-menu-group', MenuGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-menu-group': MenuGroup;\n }\n}\n\nfunction isMenuElement(element: Node): element is Menu | MenuGroup {\n if (!isHTMLElement(element)) {\n return false;\n }\n return element instanceof Menu || element instanceof MenuGroup;\n}\n","import { Button, type ButtonOptions, buttonTemplate } from './Button';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from '../events/ToggleMenuEvent';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-menu-button', buttonTemplate(`<slot></slot>`));\n\n/**\n * `<theoplayer-menu-button>` - A menu button that opens a {@link Menu}.\n *\n * @attribute `menu` - The ID of the menu to open.\n * @group Components\n */\nexport class MenuButton extends Button {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.MENU];\n }\n\n constructor(options?: Partial<ButtonOptions>) {\n super({ template: template(), ...options });\n\n this._upgradeProperty('menu');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute('aria-haspopup')) {\n this.setAttribute('aria-haspopup', 'true');\n }\n }\n\n /**\n * The ID of the menu to open.\n */\n get menu(): string | null {\n return this.getAttribute(Attribute.MENU);\n }\n\n set menu(menuId: string | null) {\n if (menuId) {\n this.setAttribute(Attribute.MENU, menuId);\n } else {\n this.removeAttribute(Attribute.MENU);\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (attrName === Attribute.MENU) {\n if (!this.hasAttribute('aria-controls') || this.getAttribute('aria-controls') === oldValue) {\n this.setAttribute('aria-controls', newValue);\n }\n }\n }\n\n protected override handleClick() {\n const menu = this.menu;\n if (menu) {\n const event: ToggleMenuEvent = createCustomEvent(TOGGLE_MENU_EVENT, {\n bubbles: true,\n composed: true,\n detail: { menu }\n });\n this.dispatchEvent(event);\n }\n }\n}\n\ncustomElements.define('theoplayer-menu-button', MenuButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-menu-button': MenuButton;\n }\n}\n","import { Button, buttonTemplate } from './Button';\nimport backIcon from '../icons/back.svg';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { CLOSE_MENU_EVENT, type CloseMenuEvent } from '../events/CloseMenuEvent';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-menu-close-button', buttonTemplate(`<span part=\"icon\"><slot>${backIcon}</slot></span>`));\n\n/**\n * `<theoplayer-menu-close-button>` - A button that closes its parent menu.\n *\n * This button must be placed inside a {@link Menu | `<theoplayer-menu>`}.\n *\n * @group Components\n */\nexport class CloseMenuButton extends Button {\n static get observedAttributes() {\n return [...Button.observedAttributes];\n }\n\n constructor() {\n super({ template: template() });\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute(Attribute.ARIA_LABEL)) {\n this.setAttribute(Attribute.ARIA_LABEL, 'close menu');\n }\n }\n\n protected override handleClick() {\n const event: CloseMenuEvent = createCustomEvent(CLOSE_MENU_EVENT, {\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(event);\n }\n}\n\ncustomElements.define('theoplayer-menu-close-button', CloseMenuButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-menu-close-button': CloseMenuButton;\n }\n}\n","import { RadioButton } from './RadioButton';\nimport { buttonTemplate } from './Button';\nimport type { MediaTrack } from 'theoplayer/chromeless';\nimport { localizeLanguageName, setTextContent } from '../util/CommonUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-media-track-radio-button', buttonTemplate(`<slot></slot>`));\n\nconst TRACK_EVENTS = ['change', 'update'] as const;\n\n/**\n * `<theoplayer-media-track-radio-button>` - A radio button that shows the label of a given media track,\n * and switches to that track when clicked.\n *\n * @group Components\n */\nexport class MediaTrackRadioButton extends RadioButton {\n private _slotEl: HTMLSlotElement;\n private _track: MediaTrack | undefined = undefined;\n\n constructor() {\n super({ template: template() });\n this._slotEl = this.shadowRoot!.querySelector('slot')!;\n\n this._upgradeProperty('track');\n }\n\n /**\n * The media track that is controlled by this radio button.\n */\n get track(): MediaTrack | undefined {\n return this._track;\n }\n\n set track(track: MediaTrack | undefined) {\n if (this._track === track) {\n return;\n }\n if (this._track) {\n this._track.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n this._track = track;\n this._updateFromTrack();\n if (track) {\n track.addEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n }\n\n private _updateFromTrack(): void {\n setTextContent(this._slotEl, this._track ? getTrackLabel(this._track) : '');\n this.checked = this._track ? this._track.enabled : false;\n }\n\n private _updateTrack(): void {\n if (this._track) {\n this._track.enabled = this.checked;\n }\n }\n\n private readonly _onTrackChange = () => {\n this._updateFromTrack();\n };\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (attrName === Attribute.ARIA_CHECKED && oldValue !== newValue) {\n this._updateTrack();\n }\n }\n}\n\nfunction getTrackLabel(track: MediaTrack): string {\n let label = track.label;\n if (label) {\n return label;\n }\n let languageCode = track.language;\n if (!languageCode) {\n return '';\n }\n return localizeLanguageName(languageCode) || languageCode || '';\n}\n\ncustomElements.define('theoplayer-media-track-radio-button', MediaTrackRadioButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-media-track-radio-button': MediaTrackRadioButton;\n }\n}\n","import { RadioButton } from './RadioButton';\nimport { buttonTemplate } from './Button';\nimport type { TextTrack } from 'theoplayer/chromeless';\nimport { localizeLanguageName, setTextContent } from '../util/CommonUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-text-track-radio-button', buttonTemplate(`<slot></slot>`));\n\nconst TRACK_EVENTS = ['change', 'update'] as const;\n\n/**\n * `<theoplayer-text-track-radio-button>` -A radio button that shows the label of a given text track, and switches to that track when clicked.\n *\n * @group Components\n */\nexport class TextTrackRadioButton extends RadioButton {\n private _slotEl: HTMLSlotElement;\n private _track: TextTrack | undefined = undefined;\n\n constructor() {\n super({ template: template() });\n this._slotEl = this.shadowRoot!.querySelector('slot')!;\n this._upgradeProperty('track');\n }\n\n /**\n * The text track that is controlled by this radio button.\n */\n get track(): TextTrack | undefined {\n return this._track;\n }\n\n set track(track: TextTrack | undefined) {\n if (this._track === track) {\n return;\n }\n if (this._track) {\n this._track.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n this._track = track;\n this._updateFromTrack();\n if (track) {\n track.addEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n }\n\n private _updateFromTrack(): void {\n setTextContent(this._slotEl, this._track ? getTrackLabel(this._track) : '');\n this.checked = this._track ? this._track.mode === 'showing' : false;\n }\n\n private _updateTrack(): void {\n if (this._track) {\n this._track.mode = this.checked ? 'showing' : 'disabled';\n }\n }\n\n private readonly _onTrackChange = () => {\n this._updateFromTrack();\n };\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (attrName === Attribute.ARIA_CHECKED && oldValue !== newValue) {\n this._updateTrack();\n }\n }\n}\n\nfunction getTrackLabel(track: TextTrack): string {\n let label = track.label;\n if (label) {\n return label;\n }\n let languageCode = track.language;\n if (!languageCode) {\n return '';\n }\n return localizeLanguageName(languageCode) || languageCode || '';\n}\n\ncustomElements.define('theoplayer-text-track-radio-button', TextTrackRadioButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-radio-button': TextTrackRadioButton;\n }\n}\n","import type { MediaTrack, Quality, TextTrack, VideoQuality } from 'theoplayer/chromeless';\n\nexport function isSubtitleTrack(track: TextTrack): boolean {\n return track.kind === 'subtitles' || track.kind === 'captions';\n}\n\nexport function getTargetQualities(videoTrack: MediaTrack | undefined): Quality[] | undefined {\n let targetQualities = videoTrack?.targetQuality;\n if (targetQualities !== undefined && !Array.isArray(targetQualities)) {\n targetQualities = [targetQualities];\n }\n return targetQualities;\n}\n\nexport function formatQualityLabel(quality: VideoQuality | undefined): string | undefined {\n if (!quality) {\n return undefined;\n }\n if (quality.label && quality.label !== '') {\n return quality.label;\n }\n if (quality.height) {\n return `${quality.height}p`;\n }\n if (quality.bandwidth) {\n return formatBandwidth(quality);\n }\n return undefined;\n}\n\nfunction formatBandwidth(quality: VideoQuality): string | undefined {\n if (!quality.bandwidth) {\n return undefined;\n } else if (quality.bandwidth > 1e7) {\n return `${(quality.bandwidth / 1e6).toFixed(0)}Mbps`;\n } else if (quality.bandwidth > 1e6) {\n return `${(quality.bandwidth / 1e6).toFixed(1)}Mbps`;\n } else {\n return `${(quality.bandwidth / 1e3).toFixed(0)}kbps`;\n }\n}\n","import { RadioButton } from './RadioButton';\nimport { buttonTemplate } from './Button';\nimport type { TextTracksList } from 'theoplayer/chromeless';\nimport { isSubtitleTrack } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-text-track-off-radio-button', buttonTemplate(`<slot>Off</slot>`));\n\nconst TRACK_EVENTS = ['change'] as const;\n\n/**\n * `<theoplayer-text-track-off-radio-button>` - A radio button that disables the active subtitle track when clicked.\n *\n * @group Components\n */\nexport class TextTrackOffRadioButton extends RadioButton {\n private _trackList: TextTracksList | undefined = undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('trackList');\n }\n\n get trackList(): TextTracksList | undefined {\n return this._trackList;\n }\n\n set trackList(trackList: TextTracksList | undefined) {\n if (this._trackList) {\n this._trackList.removeEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n this._trackList = trackList;\n this._updateFromTrackList();\n if (trackList) {\n trackList.addEventListener(TRACK_EVENTS, this._onTrackChange);\n }\n }\n\n private _updateFromTrackList(): void {\n this.checked = this._trackList ? !hasShowingSubtitleTrack(this._trackList) : true;\n }\n\n private _updateTrackList(): void {\n if (this._trackList && this.checked) {\n disableSubtitleTracks(this._trackList);\n }\n }\n\n private readonly _onTrackChange = () => {\n this._updateFromTrackList();\n };\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (attrName === Attribute.ARIA_CHECKED && oldValue !== newValue) {\n this._updateTrackList();\n }\n }\n}\n\nfunction hasShowingSubtitleTrack(trackList: TextTracksList): boolean {\n return trackList.filter(isSubtitleTrack).some((x) => x.mode === 'showing');\n}\n\nfunction disableSubtitleTracks(trackList: TextTracksList): void {\n for (const track of trackList) {\n if (isSubtitleTrack(track) && track.mode === 'showing') {\n track.mode = 'disabled';\n }\n }\n}\n\ncustomElements.define('theoplayer-text-track-off-radio-button', TextTrackOffRadioButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-off-radio-button': TextTrackOffRadioButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, MediaTrackList, TextTrack, TextTracksList } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { MediaTrackRadioButton } from './MediaTrackRadioButton';\nimport { TextTrackRadioButton } from './TextTrackRadioButton';\nimport { isSubtitleTrack } from '../util/TrackUtils';\nimport { TextTrackOffRadioButton } from './TextTrackOffRadioButton';\nimport { fromArrayLike, toggleAttribute } from '../util/CommonUtils';\nimport { createEvent } from '../util/EventUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-track-radio-group',\n `<style>${verticalRadioGroupCss}</style><theoplayer-radio-group></theoplayer-radio-group>`\n);\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\nexport type TrackType = 'audio' | 'video' | 'subtitles';\n\n/**\n * `<theoplayer-track-radio-group>` - A radio group that shows a list of media or text tracks,\n * from which the user can choose an active track.\n *\n * @attribute `track-type` - The track type of the available tracks. Can be \"audio\", \"video\" or \"subtitles\".\n * @attribute `show-off` - If set, shows an \"off\" button to disable all tracks.\n * Can only be used with the \"subtitles\" track type.\n * @group Components\n */\nexport class TrackRadioGroup extends StateReceiverMixin(HTMLElement, ['player']) {\n static get observedAttributes() {\n return [Attribute.TRACK_TYPE, Attribute.SHOW_OFF];\n }\n\n private readonly _radioGroup: RadioGroup;\n private _offButton: TextTrackOffRadioButton | undefined;\n private _player: ChromelessPlayer | undefined;\n private _tracksList: MediaTrackList | TextTracksList | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._radioGroup = shadowRoot.querySelector('theoplayer-radio-group')!;\n\n this._upgradeProperty('trackType');\n this._upgradeProperty('showOffButton');\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!(this._radioGroup instanceof RadioGroup)) {\n customElements.upgrade(this._radioGroup);\n }\n\n this._updateOffButton();\n this._updateTracks();\n\n this.shadowRoot!.addEventListener('change', this._onChange);\n }\n\n disconnectedCallback(): void {\n this.shadowRoot!.removeEventListener('change', this._onChange);\n }\n\n /**\n * The track type of the available tracks.\n */\n get trackType(): TrackType {\n return (this.getAttribute(Attribute.TRACK_TYPE) || 'audio') as TrackType;\n }\n\n set trackType(value: TrackType) {\n this.setAttribute(Attribute.TRACK_TYPE, value || 'audio');\n }\n\n /**\n * If set, shows an \"off\" button to disable all tracks.\n *\n * Can only be used with the `\"subtitles\"` track type.\n */\n get showOffButton(): boolean {\n return this.hasAttribute(Attribute.SHOW_OFF);\n }\n\n set showOffButton(value: boolean) {\n toggleAttribute(this, Attribute.SHOW_OFF, value);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n this._player = player;\n this._updateTracksList();\n this._updateTracks();\n }\n\n private _getTracksList(): MediaTrackList | TextTracksList | undefined {\n if (this._player === undefined) {\n return undefined;\n }\n const trackType = this.trackType;\n if (trackType === 'audio') {\n return this._player.audioTracks;\n } else if (trackType === 'video') {\n return this._player.videoTracks;\n } else if (trackType === 'subtitles') {\n return this._player.textTracks;\n } else {\n return undefined;\n }\n }\n\n private _updateTracksList(): void {\n const oldList = this._tracksList;\n const newList = this._getTracksList();\n if (oldList !== newList) {\n oldList?.removeEventListener(TRACK_EVENTS, this._updateTracks);\n newList?.addEventListener(TRACK_EVENTS, this._updateTracks);\n this._tracksList = newList;\n this._updateOffButton();\n }\n }\n\n private _getTracks(): readonly (MediaTrack | TextTrack)[] {\n if (this._player === undefined) {\n return [];\n }\n const trackType = this.trackType;\n if (trackType === 'audio') {\n return this._player.audioTracks;\n } else if (trackType === 'video') {\n return this._player.videoTracks;\n } else if (trackType === 'subtitles') {\n return this._player.textTracks.filter(isSubtitleTrack);\n } else {\n return [];\n }\n }\n\n private readonly _updateTracks = (): void => {\n let oldButtons = fromArrayLike(this._radioGroup.children) as (MediaTrackRadioButton | TextTrackRadioButton)[];\n const newTracks = this._getTracks();\n if (this._offButton !== undefined) {\n // First child is the \"off\" button, skip it.\n oldButtons = oldButtons.slice(1);\n }\n for (const oldButton of oldButtons) {\n if (!oldButton.track || newTracks.indexOf(oldButton.track) < 0) {\n this._radioGroup.removeChild(oldButton);\n }\n }\n for (const newTrack of newTracks) {\n if (!hasButtonForTrack(oldButtons, newTrack)) {\n let newButton = this._createTrackButton(newTrack);\n this._radioGroup.appendChild(newButton);\n }\n }\n };\n\n private _createTrackButton(track: MediaTrack | TextTrack): MediaTrackRadioButton | TextTrackRadioButton {\n if (this.trackType === 'subtitles') {\n let button = new TextTrackRadioButton();\n button.track = track as TextTrack;\n return button;\n } else {\n let button = new MediaTrackRadioButton();\n button.track = track as MediaTrack;\n return button;\n }\n }\n\n private _updateOffButton(): void {\n if (this.trackType === 'subtitles' && this.showOffButton) {\n if (this._offButton === undefined) {\n this._offButton = new TextTrackOffRadioButton();\n this._radioGroup.insertBefore(this._offButton, this._radioGroup.firstChild);\n }\n this._offButton.trackList = this._tracksList! as TextTracksList;\n } else if (this._offButton !== undefined) {\n this._radioGroup.removeChild(this._offButton);\n this._offButton = undefined;\n }\n }\n\n private readonly _onChange = () => {\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n };\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.TRACK_TYPE) {\n this._updateTracksList();\n this._updateTracks();\n } else if (attrName === Attribute.SHOW_OFF) {\n this._updateOffButton();\n this._updateTracks();\n }\n if (TrackRadioGroup.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-track-radio-group', TrackRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-track-radio-group': TrackRadioGroup;\n }\n}\n\nfunction hasButtonForTrack(buttons: readonly (MediaTrackRadioButton | TextTrackRadioButton)[], track: MediaTrack | TextTrack): boolean {\n for (let i = 0; i < buttons.length; i++) {\n if (buttons[i].track === track) {\n return true;\n }\n }\n return false;\n}\n","export enum ExtensionSlot {\n TopControlBar = 'top-control-bar',\n BottomControlBar = 'bottom-control-bar',\n Menu = 'menu'\n}\n","import { stringStartsWith } from './CommonUtils';\n\nexport interface RgbaColor {\n r_: number; // 0..255\n g_: number; // 0..255\n b_: number; // 0..255\n a_: number; // 0..1\n}\n\nfunction parseHexColor(hex: string): RgbaColor | null {\n const m = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n return m\n ? {\n r_: parseInt(m[1], 16),\n g_: parseInt(m[2], 16),\n b_: parseInt(m[3], 16),\n a_: 1\n }\n : null;\n}\n\nfunction parseRgbaColor(rgbaString: string): RgbaColor | null {\n const m = rgbaString.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)$/i);\n return m\n ? {\n r_: parseInt(m[1], 10),\n g_: parseInt(m[2], 10),\n b_: parseInt(m[3], 10),\n a_: m[4] ? parseFloat(m[4]) : 1\n }\n : null;\n}\n\nexport function parseColor(colorString: string | null | undefined): RgbaColor | null {\n if (!colorString) {\n return null;\n } else if (stringStartsWith(colorString, 'rgb')) {\n return parseRgbaColor(colorString);\n } else if (stringStartsWith(colorString, '#')) {\n return parseHexColor(colorString);\n } else {\n return null;\n }\n}\n\nexport function toRgba(color: RgbaColor): string {\n return `rgba(${color.r_},${color.g_},${color.b_},${color.a_})`;\n}\n\nexport function toRgb(color: RgbaColor): string {\n return `rgb(${color.r_},${color.g_},${color.b_})`;\n}\n\nexport function colorWithAlpha(color: RgbaColor, alpha: number): RgbaColor {\n return {\n r_: color.r_,\n g_: color.g_,\n b_: color.b_,\n a_: alpha\n };\n}\n\nexport function rgbEquals(left: RgbaColor, right: RgbaColor): boolean {\n return left.r_ === right.r_ && left.g_ === right.g_ && left.b_ === right.b_;\n}\n\nexport const COLOR_WHITE: RgbaColor = parseColor('#ffffff')!;\nexport const COLOR_BLACK: RgbaColor = parseColor('#000000')!;\n","import type { EdgeStyle } from 'theoplayer/chromeless';\n\nexport const knownColors: ReadonlyArray<[string, string]> = [\n ['White', 'rgb(255,255,255)'],\n ['Yellow', 'rgb(255,255,0)'],\n ['Green', 'rgb(0,255,0)'],\n ['Cyan', 'rgb(0,255,255)'],\n ['Blue', 'rgb(0,0,255)'],\n ['Magenta', 'rgb(255,0,255)'],\n ['Red', 'rgb(255,0,0)'],\n ['Black', 'rgb(0,0,0)']\n];\n\nexport const knownFontFamilies: ReadonlyArray<[string, string]> = [\n ['Monospace Serif', '\"Courier New\", Courier, \"Nimbus Mono L\", \"Cutive Mono\", monospace'],\n ['Proportional Serif', '\"Times New Roman\", Times, Georgia, Cambria, \"PT Serif Caption\", serif'],\n ['Monospace Sans', '\"Deja Vu Sans Mono\", \"Lucida Console\", Monaco, Consolas, \"PT Mono\", monospace'],\n ['Proportional Sans', 'Arial, Helvetica, Verdana, \"PT Sans Caption\", sans-serif']\n];\n\nexport const knownEdgeStyles: ReadonlyArray<[string, EdgeStyle]> = [\n ['None', 'none'],\n ['Drop shadow', 'dropshadow'],\n ['Raised', 'raised'],\n ['Depressed', 'depressed'],\n ['Uniform', 'uniform']\n];\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, EdgeStyle } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { parseColor, toRgb } from '../util/ColorUtils';\nimport type { TextTrackStyleOption } from './TextTrackStyleRadioGroup';\nimport { arrayFind, setTextContent } from '../util/CommonUtils';\nimport { knownColors, knownEdgeStyles, knownFontFamilies } from '../util/TextTrackStylePresets';\n\n/**\n * `<theoplayer-text-track-style-display>` - A control that displays the value of a single text track style option\n * in a human-readable format.\n *\n * @attribute `property` - The property name of the text track style option. One of {@link TextTrackStyleOption}.\n * @group Components\n */\nexport class TextTrackStyleDisplay extends StateReceiverMixin(HTMLElement, ['player']) {\n static get observedAttributes() {\n return [Attribute.PROPERTY];\n }\n\n private readonly _spanEl: HTMLSpanElement;\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n this._spanEl = document.createElement('span');\n shadowRoot.appendChild(this._spanEl);\n\n this._upgradeProperty('property');\n this._upgradeProperty('player');\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.PROPERTY)) {\n this.property = 'fontColor';\n }\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * The property name of the text track style option.\n */\n get property(): TextTrackStyleOption {\n return this.getAttribute(Attribute.PROPERTY) as TextTrackStyleOption;\n }\n\n set property(value: TextTrackStyleOption) {\n this.setAttribute(Attribute.PROPERTY, value);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.textTrackStyle.removeEventListener('change', this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.textTrackStyle.addEventListener('change', this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = (): void => {\n if (this._player === undefined) {\n return;\n }\n const property = this.property;\n switch (property) {\n case 'fontFamily': {\n setTextContent(this._spanEl, getFontFamilyLabel(this._player.textTrackStyle.fontFamily));\n break;\n }\n case 'fontColor':\n case 'backgroundColor':\n case 'windowColor': {\n setTextContent(this._spanEl, getColorLabel(this._player.textTrackStyle[property]));\n break;\n }\n case 'fontOpacity': {\n setTextContent(this._spanEl, getOpacityLabel(this._player.textTrackStyle.fontColor));\n break;\n }\n case 'backgroundOpacity': {\n setTextContent(this._spanEl, getOpacityLabel(this._player.textTrackStyle.backgroundColor));\n break;\n }\n case 'windowOpacity': {\n setTextContent(this._spanEl, getOpacityLabel(this._player.textTrackStyle.windowColor));\n break;\n }\n case 'edgeStyle': {\n setTextContent(this._spanEl, getEdgeStyleLabel(this._player.textTrackStyle.edgeStyle));\n break;\n }\n default: {\n const value = this._player.textTrackStyle[property];\n setTextContent(this._spanEl, value ? value : 'Default');\n break;\n }\n }\n };\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.PROPERTY) {\n this._updateFromPlayer();\n }\n if (TextTrackStyleDisplay.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-text-track-style-display', TextTrackStyleDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-style-display': TextTrackStyleDisplay;\n }\n}\n\nfunction getFontFamilyLabel(fontFamily: string | null | undefined): string {\n if (!fontFamily) {\n return 'Default';\n }\n const knownFontFamily = arrayFind(knownFontFamilies, ([_, value]) => value === fontFamily);\n if (knownFontFamily) {\n return knownFontFamily[0];\n }\n return 'Custom';\n}\n\nfunction getColorLabel(color: string | null | undefined): string {\n if (!color) {\n return 'Default';\n }\n const parsedColor = parseColor(color);\n if (parsedColor) {\n const colorRgb = toRgb(parsedColor);\n const knownColor = arrayFind(knownColors, ([_, value]) => value === colorRgb);\n if (knownColor) {\n return knownColor[0];\n }\n }\n return 'Custom';\n}\n\nfunction getOpacityLabel(color: string | null | undefined): string {\n if (!color) {\n return 'Default';\n }\n const parsedColor = parseColor(color);\n if (parsedColor) {\n return `${parsedColor.a_ * 100}%`;\n }\n return 'Custom';\n}\n\nfunction getEdgeStyleLabel(edgeStyle: EdgeStyle | null | undefined): string {\n if (!edgeStyle) {\n return 'Default';\n }\n const knownEdgeStyle = arrayFind(knownEdgeStyles, ([_, value]) => value === edgeStyle);\n if (knownEdgeStyle) {\n return knownEdgeStyle[0];\n }\n return 'Custom';\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, EdgeStyle } from 'theoplayer/chromeless';\nimport type { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { Attribute } from '../util/Attribute';\nimport { COLOR_BLACK, COLOR_WHITE, colorWithAlpha, parseColor, type RgbaColor, rgbEquals, toRgb, toRgba } from '../util/ColorUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-text-track-style-radio-group',\n `<style>${verticalRadioGroupCss}</style><theoplayer-radio-group><slot></slot></theoplayer-radio-group>`\n);\n\nexport interface TextTrackStyleMap {\n fontFamily: string | undefined;\n fontColor: string | undefined;\n fontOpacity: number | undefined;\n fontSize: string | undefined;\n backgroundColor: string | undefined;\n backgroundOpacity: number | undefined;\n windowColor: string | undefined;\n windowOpacity: number | undefined;\n edgeStyle: EdgeStyle | undefined;\n}\n\nexport type TextTrackStyleOption = keyof TextTrackStyleMap;\n\n/**\n * `<theoplayer-text-track-style-radio-group>` - A radio group that shows a list of values for a text track style option,\n * from which the user can choose a desired value.\n *\n * @attribute `property` - The property name of the text track style option. One of {@link TextTrackStyleOption}.\n * @slot {@link RadioButton} - The possible options for the text track style option.\n * For example: `<theoplayer-radio-button value=\"#ff0000\">Red</theoplayer-radio-button>`\n * @group Components\n */\nexport class TextTrackStyleRadioGroup extends StateReceiverMixin(HTMLElement, ['player']) {\n static get observedAttributes() {\n return [Attribute.PROPERTY];\n }\n\n private readonly _radioGroup: RadioGroup;\n private readonly _optionsSlot: HTMLSlotElement;\n private _player: ChromelessPlayer | undefined;\n private _value: any;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._radioGroup = shadowRoot.querySelector('theoplayer-radio-group')!;\n this._optionsSlot = shadowRoot.querySelector('slot')!;\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!(this._radioGroup instanceof RadioGroup)) {\n customElements.upgrade(this._radioGroup);\n }\n\n this._upgradeProperty('property');\n this._upgradeProperty('value');\n this._upgradeProperty('player');\n\n if (!this.hasAttribute(Attribute.PROPERTY)) {\n this.property = 'fontColor';\n }\n\n this._updateChecked();\n this.shadowRoot!.addEventListener('change', this._onChange);\n this._optionsSlot.addEventListener('slotchange', this._updateChecked);\n }\n\n disconnectedCallback(): void {\n this.shadowRoot!.removeEventListener('change', this._onChange);\n this._optionsSlot.removeEventListener('slotchange', this._updateChecked);\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * The property name of the text track style option.\n */\n get property(): TextTrackStyleOption {\n return this.getAttribute(Attribute.PROPERTY) as TextTrackStyleOption;\n }\n\n set property(value: TextTrackStyleOption) {\n this.setAttribute(Attribute.PROPERTY, value);\n }\n\n /**\n * The currently chosen value for the text track style option.\n */\n get value(): string {\n return this._value;\n }\n\n set value(value: string) {\n if (this._value === value) {\n return;\n }\n this._value = value;\n this._updateToPlayer();\n this._updateChecked();\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.textTrackStyle.removeEventListener('change', this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.textTrackStyle.addEventListener('change', this._updateFromPlayer);\n }\n }\n\n private readonly _updateChecked = (): void => {\n const buttons = this._radioGroup.allRadioButtons();\n for (const button of buttons) {\n button.checked = button.value === this.value;\n }\n };\n\n private readonly _onChange = (): void => {\n const button = this._radioGroup.checkedRadioButton as RadioButton | null;\n if (button !== null && this.value !== button.value) {\n this.value = button.value;\n }\n };\n\n private readonly _updateFromPlayer = (): void => {\n if (this._player === undefined) {\n return;\n }\n switch (this.property) {\n case 'fontColor': {\n const color = this._player.textTrackStyle.fontColor;\n this.value = color ? toRgb(parseColor(color) ?? COLOR_WHITE) : '';\n break;\n }\n case 'backgroundColor': {\n const color = this._player.textTrackStyle.backgroundColor;\n this.value = color ? toRgb(parseColor(color) ?? COLOR_BLACK) : '';\n break;\n }\n case 'windowColor': {\n const color = this._player.textTrackStyle.windowColor;\n this.value = color ? toRgb(parseColor(color) ?? COLOR_BLACK) : '';\n break;\n }\n case 'fontOpacity': {\n const color = this._player.textTrackStyle.fontColor;\n this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n break;\n }\n case 'backgroundOpacity': {\n const color = this._player.textTrackStyle.backgroundColor;\n this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n break;\n }\n case 'windowOpacity': {\n const color = this._player.textTrackStyle.windowColor;\n this.value = color ? String((parseColor(color)?.a_ ?? 1) * 100) : '';\n break;\n }\n default: {\n this.value = this._player.textTrackStyle[this.property] ?? '';\n break;\n }\n }\n };\n\n private _updateToPlayer(): void {\n if (this._player === undefined) {\n return;\n }\n switch (this.property) {\n case 'fontColor': {\n this._player.textTrackStyle.fontColor = updateColor(this.value, this._player.textTrackStyle.fontColor, COLOR_WHITE);\n break;\n }\n case 'backgroundColor': {\n this._player.textTrackStyle.backgroundColor = updateColor(this.value, this._player.textTrackStyle.backgroundColor, COLOR_BLACK);\n break;\n }\n case 'windowColor': {\n this._player.textTrackStyle.windowColor = updateColor(this.value, this._player.textTrackStyle.windowColor, COLOR_BLACK);\n break;\n }\n case 'fontOpacity': {\n this._player.textTrackStyle.fontColor = updateOpacity(this.value, this._player.textTrackStyle.fontColor, COLOR_WHITE);\n break;\n }\n case 'backgroundOpacity': {\n this._player.textTrackStyle.backgroundColor = updateOpacity(this.value, this._player.textTrackStyle.backgroundColor, COLOR_BLACK);\n break;\n }\n case 'windowOpacity': {\n this._player.textTrackStyle.windowColor = updateOpacity(this.value, this._player.textTrackStyle.windowColor, COLOR_BLACK);\n break;\n }\n default: {\n this._player.textTrackStyle[this.property] = this.value == '' ? undefined : (this.value as any);\n break;\n }\n }\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.PROPERTY) {\n this._updateFromPlayer();\n }\n if (TextTrackStyleRadioGroup.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\nfunction updateColor(colorValue: string, previousColor: string | undefined, defaultColor: RgbaColor): string | undefined {\n const alpha = parseColor(previousColor)?.a_ ?? 1;\n if (colorValue === '' && alpha === 1) {\n return undefined;\n } else {\n const color = parseColor(colorValue) ?? defaultColor;\n return toRgba(colorWithAlpha(color, alpha));\n }\n}\n\nfunction updateOpacity(opacityValue: string, colorValue: string | undefined, defaultColor: RgbaColor): string | undefined {\n const color = parseColor(colorValue) ?? defaultColor;\n if (opacityValue === '' && rgbEquals(color, defaultColor)) {\n return undefined;\n } else {\n const alpha = opacityValue == '' ? 1 : Number(opacityValue) / 100;\n return toRgba(colorWithAlpha(color, alpha));\n }\n}\n\ncustomElements.define('theoplayer-text-track-style-radio-group', TextTrackStyleRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-style-radio-group': TextTrackStyleRadioGroup;\n }\n}\n","import { MenuGroup, menuGroupTemplate } from './MenuGroup';\nimport textTrackStyleMenuHtml from './TextTrackStyleMenu.html';\nimport textTrackStyleMenuCss from './TextTrackStyleMenu.css';\nimport menuTableCss from './MenuTable.css';\nimport { createTemplate } from '../util/TemplateUtils';\n\n// Load components used in template\nimport './TextTrackStyleDisplay';\nimport './TextTrackStyleRadioGroup';\n\nconst template = createTemplate(\n 'theoplayer-text-track-style-menu',\n menuGroupTemplate(textTrackStyleMenuHtml, `${menuTableCss}\\n${textTrackStyleMenuCss}`)\n);\n\n/**\n * `<theoplayer-text-track-style-menu>` - A menu to change the {@link theoplayer!TextTrackStyle | text track style} of the player.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @group Components\n */\nexport class TextTrackStyleMenu extends MenuGroup {\n constructor() {\n super({ template: template() });\n }\n}\n\ncustomElements.define('theoplayer-text-track-style-menu', TextTrackStyleMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-style-menu': TextTrackStyleMenu;\n }\n}\n","import { MenuGroup, menuGroupTemplate } from './MenuGroup';\nimport * as shadyCss from '@webcomponents/shadycss';\nimport languageMenuHtml from './LanguageMenu.html';\nimport languageMenuCss from './LanguageMenu.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, TextTrack } from 'theoplayer/chromeless';\nimport { isSubtitleTrack } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\n// Load components used in template\nimport './TrackRadioGroup';\nimport './TextTrackStyleMenu';\n\nconst template = createTemplate('theoplayer-language-menu', menuGroupTemplate(languageMenuHtml, languageMenuCss));\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * `<theoplayer-language-menu>` - A menu to change the spoken language and subtitles of the stream.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @group Components\n */\nexport class LanguageMenu extends StateReceiverMixin(MenuGroup, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [...MenuGroup.observedAttributes, Attribute.HAS_AUDIO, Attribute.HAS_SUBTITLES];\n }\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('player');\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.audioTracks.removeEventListener(TRACK_EVENTS, this._updateAudioTracks);\n this._player.textTracks.removeEventListener(TRACK_EVENTS, this._updateTextTracks);\n }\n this._player = player;\n this._updateAudioTracks();\n this._updateTextTracks();\n if (this._player !== undefined) {\n this._player.audioTracks.addEventListener(TRACK_EVENTS, this._updateAudioTracks);\n this._player.textTracks.addEventListener(TRACK_EVENTS, this._updateTextTracks);\n }\n }\n\n private readonly _updateAudioTracks = (): void => {\n const newAudioTracks: readonly MediaTrack[] = this._player?.audioTracks ?? [];\n // Hide audio track selection if there's only one track.\n toggleAttribute(this, Attribute.HAS_AUDIO, newAudioTracks.length > 1);\n };\n\n private readonly _updateTextTracks = (): void => {\n const newSubtitleTracks: readonly TextTrack[] = this._player?.textTracks.filter(isSubtitleTrack) ?? [];\n // Hide subtitle track selection if there are no tracks. If there's one, we still show an \"off\" option.\n toggleAttribute(this, Attribute.HAS_SUBTITLES, newSubtitleTracks.length > 0);\n };\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (LanguageMenu.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-language-menu', LanguageMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-language-menu': LanguageMenu;\n }\n}\n","import { MenuButton } from './MenuButton';\nimport { buttonTemplate } from './Button';\nimport languageIcon from '../icons/language.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { isSubtitleTrack } from '../util/TrackUtils';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-language-menu-button', buttonTemplate(`<span part=\"icon\"><slot>${languageIcon}</slot></span>`));\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * `<theoplayer-language-menu-button>` - A menu button that opens a {@link LanguageMenu}.\n *\n * When there are no alternative audio languages or subtitles, this button automatically hides itself.\n *\n * @attribute `menu` - The ID of the language menu.\n * @group Components\n */\nexport class LanguageMenuButton extends StateReceiverMixin(MenuButton, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('player');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute(Attribute.ARIA_LABEL)) {\n this.setAttribute(Attribute.ARIA_LABEL, 'open language menu');\n }\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.audioTracks.removeEventListener(TRACK_EVENTS, this._updateTracks);\n this._player.textTracks.removeEventListener(TRACK_EVENTS, this._updateTracks);\n }\n this._player = player;\n this._updateTracks();\n if (this._player !== undefined) {\n this._player.audioTracks.addEventListener(TRACK_EVENTS, this._updateTracks);\n this._player.textTracks.addEventListener(TRACK_EVENTS, this._updateTracks);\n }\n }\n\n private readonly _updateTracks = (): void => {\n const hasTracks = this._player !== undefined && (this._player.audioTracks.length >= 2 || this._player.textTracks.some(isSubtitleTrack));\n toggleAttribute(this, Attribute.HIDDEN, !hasTracks);\n };\n}\n\ncustomElements.define('theoplayer-language-menu-button', LanguageMenuButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-language-menu-button': LanguageMenuButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport type { RadioButton } from './RadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-playback-rate-radio-group',\n `<style>${verticalRadioGroupCss}</style><theoplayer-radio-group><slot></slot></theoplayer-radio-group>`\n);\n\n/**\n * `<theoplayer-playback-rate-radio-group>` - A radio group that shows a list of playback rates,\n * from which the user can choose a desired playback rate.\n *\n * @slot {@link RadioButton} - The possible options for the playback rate.\n * The value of each radio button must be a valid number.\n * For example: `<theoplayer-radio-button value=\"2\">2x</theoplayer-radio-button>`\n * @group Components\n */\nexport class PlaybackRateRadioGroup extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _radioGroup: RadioGroup;\n private readonly _optionsSlot: HTMLSlotElement;\n private _player: ChromelessPlayer | undefined;\n private _value: number = 1;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._radioGroup = shadowRoot.querySelector('theoplayer-radio-group')!;\n this._optionsSlot = shadowRoot.querySelector('slot')!;\n\n this._upgradeProperty('value');\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!(this._radioGroup instanceof RadioGroup)) {\n customElements.upgrade(this._radioGroup);\n }\n\n this._updateChecked();\n this.shadowRoot!.addEventListener('change', this._onChange);\n this._optionsSlot.addEventListener('slotchange', this._updateChecked);\n }\n\n disconnectedCallback(): void {\n this.shadowRoot!.removeEventListener('change', this._onChange);\n this._optionsSlot.removeEventListener('slotchange', this._updateChecked);\n }\n\n /**\n * The currently chosen playback rate.\n */\n get value(): number {\n return this._value;\n }\n\n set value(value: number) {\n value = Number(value);\n if (this._value === value) {\n return;\n }\n this._value = value;\n if (this._player !== undefined) {\n this._player.playbackRate = value;\n }\n this._updateChecked();\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener('ratechange', this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener('ratechange', this._updateFromPlayer);\n }\n }\n\n private readonly _updateChecked = (): void => {\n const buttons = this._radioGroup.allRadioButtons();\n for (const button of buttons) {\n button.checked = Number(button.value) === this.value;\n }\n };\n\n private readonly _onChange = (): void => {\n const button = this._radioGroup.checkedRadioButton as RadioButton | null;\n if (button !== null && this.value !== Number(button.value)) {\n this.value = button.value;\n }\n };\n\n private readonly _updateFromPlayer = (): void => {\n if (this._player !== undefined) {\n this.value = this._player.playbackRate;\n }\n };\n}\n\ncustomElements.define('theoplayer-playback-rate-radio-group', PlaybackRateRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-playback-rate-radio-group': PlaybackRateRadioGroup;\n }\n}\n","import { buttonTemplate } from './Button';\nimport { MenuButton } from './MenuButton';\nimport speedIcon from '../icons/speed.svg';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-playback-rate-button', buttonTemplate(`<span part=\"icon\"><slot>${speedIcon}</slot></span>`));\n\n/**\n * `<theoplayer-playback-rate-menu-button>` - A menu button that opens a [playback rate menu]{@link PlaybackRateMenu}.\n *\n * @attribute menu - The ID of the playback rate menu.\n * @group Components\n */\nexport class PlaybackRateMenuButton extends MenuButton {\n constructor() {\n super({ template: template() });\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute(Attribute.ARIA_LABEL)) {\n this.setAttribute(Attribute.ARIA_LABEL, 'open playback speed menu');\n }\n }\n}\n\ncustomElements.define('theoplayer-playback-rate-menu-button', PlaybackRateMenuButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-playback-rate-menu-button': PlaybackRateMenuButton;\n }\n}\n","import { Menu, menuTemplate } from './Menu';\nimport playbackRateMenuHtml from './PlaybackRateMenu.html';\nimport { createTemplate } from '../util/TemplateUtils';\n\n// Load components used in template\nimport './PlaybackRateRadioGroup';\n\nconst template = createTemplate(\n 'theoplayer-playback-rate-menu',\n menuTemplate(`<span slot=\"heading\"><slot name=\"heading\">Playback speed</slot></span>`, playbackRateMenuHtml)\n);\n\n/**\n * `<theoplayer-playback-rate-menu>` - A menu to change the playback rate of the player.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @group Components\n */\nexport class PlaybackRateMenu extends Menu {\n constructor() {\n super({ template: template() });\n }\n}\n\ncustomElements.define('theoplayer-playback-rate-menu', PlaybackRateMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-playback-rate-menu': PlaybackRateMenu;\n }\n}\n","import { StateReceiverMixin } from './StateReceiverMixin';\nimport { setTextContent } from '../util/CommonUtils';\nimport * as shadyCss from '@webcomponents/shadycss';\n\n/**\n * `<theoplayer-playback-rate-display>` - A control that displays the current playback rate of the player.\n *\n * @group Components\n */\nexport class PlaybackRateDisplay extends StateReceiverMixin(HTMLElement, ['playbackRate']) {\n private readonly _spanEl: HTMLSpanElement;\n private _playbackRate: number = 1;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n this._spanEl = document.createElement('span');\n shadowRoot.appendChild(this._spanEl);\n\n this._upgradeProperty('playbackRate');\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n get playbackRate(): number {\n return this._playbackRate;\n }\n\n set playbackRate(value: number) {\n this._playbackRate = value;\n setTextContent(this._spanEl, value === 1 ? 'Normal' : `${value}x`);\n }\n}\n\ncustomElements.define('theoplayer-playback-rate-display', PlaybackRateDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-playback-rate-display': PlaybackRateDisplay;\n }\n}\n","import { StateReceiverMixin } from './StateReceiverMixin';\nimport { setTextContent } from '../util/CommonUtils';\nimport type { VideoQuality } from 'theoplayer/chromeless';\nimport { formatQualityLabel } from '../util/TrackUtils';\nimport * as shadyCss from '@webcomponents/shadycss';\n\n/**\n * `<theoplayer-active-quality-display>` - A control that displays the name of the active video quality.\n *\n * @group Components\n */\nexport class ActiveQualityDisplay extends StateReceiverMixin(HTMLElement, ['activeVideoQuality', 'targetVideoQualities']) {\n private readonly _spanEl: HTMLSpanElement;\n private _activeVideoQuality: VideoQuality | undefined = undefined;\n private _targetVideoQualities: VideoQuality[] | undefined = undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n this._spanEl = document.createElement('span');\n shadowRoot.appendChild(this._spanEl);\n\n this._upgradeProperty('activeVideoQuality');\n this._upgradeProperty('targetVideoQualities');\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n get activeVideoQuality(): VideoQuality | undefined {\n return this._activeVideoQuality;\n }\n\n set activeVideoQuality(quality: VideoQuality | undefined) {\n this._activeVideoQuality = quality;\n this.update_();\n }\n\n get targetVideoQualities(): VideoQuality[] | undefined {\n return this._targetVideoQualities;\n }\n\n set targetVideoQualities(qualities: VideoQuality[] | undefined) {\n this._targetVideoQualities = qualities;\n this.update_();\n }\n\n private update_(): void {\n // If no target quality is selected, or more than one target quality is selected,\n // treat as \"automatic\" quality selection.\n const hasSingleTargetQuality = this._targetVideoQualities !== undefined && this._targetVideoQualities.length === 1;\n const targetQuality = hasSingleTargetQuality ? this._targetVideoQualities![0] : undefined;\n // Always show the target quality immediately, even if it's not the active quality yet.\n const selectedQuality = targetQuality ?? this._activeVideoQuality;\n const qualityLabel = formatQualityLabel(selectedQuality);\n let label: string;\n if (hasSingleTargetQuality) {\n // Manual quality selection: \"720p\" or \"Unknown\"\n label = qualityLabel ?? `Unknown`;\n } else {\n // Automatic quality selection: \"Automatic\" or \"Automatic (720p)\"\n label = `Automatic${qualityLabel ? ` (${qualityLabel})` : ''}`;\n }\n setTextContent(this._spanEl, label);\n }\n}\n\ncustomElements.define('theoplayer-active-quality-display', ActiveQualityDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-active-quality-display': ActiveQualityDisplay;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { RadioButton } from './RadioButton';\nimport { buttonTemplate } from './Button';\nimport type { MediaTrack, VideoQuality } from 'theoplayer/chromeless';\nimport { setTextContent } from '../util/CommonUtils';\nimport { Attribute } from '../util/Attribute';\nimport { formatQualityLabel } from '../util/TrackUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-quality-radio-button', buttonTemplate(`<slot></slot>`));\n\nconst TRACK_EVENTS = ['activequalitychanged', 'targetqualitychanged'] as const;\nconst QUALITY_EVENTS = ['update'] as const;\n\n/**\n * `<theoplayer-quality-radio-button>` - A radio button that shows the label of a given video quality,\n * and switches the video track's {@link theoplayer!MediaTrack.targetQuality | target quality} to that quality when clicked.\n *\n * @group Components\n */\nexport class QualityRadioButton extends RadioButton {\n private _slotEl: HTMLSlotElement;\n private _track: MediaTrack | undefined = undefined;\n private _quality: VideoQuality | undefined = undefined;\n\n constructor() {\n super({ template: template() });\n this._slotEl = this.shadowRoot!.querySelector('slot')!;\n\n this._upgradeProperty('track');\n this._upgradeProperty('quality');\n }\n\n /**\n * The video track containing the quality being controlled.\n */\n get track(): MediaTrack | undefined {\n return this._track;\n }\n\n set track(track: MediaTrack | undefined) {\n if (this._track === track) {\n return;\n }\n if (this._track) {\n this._track.removeEventListener(TRACK_EVENTS, this._updateFromTrack);\n }\n this._track = track;\n this._updateFromTrack();\n if (track) {\n track.addEventListener(TRACK_EVENTS, this._updateFromTrack);\n }\n }\n\n /**\n * The video quality being controlled.\n */\n get quality(): VideoQuality | undefined {\n return this._quality;\n }\n\n set quality(quality: VideoQuality | undefined) {\n if (this._quality === quality) {\n return;\n }\n if (this._quality) {\n this._quality.removeEventListener(QUALITY_EVENTS, this._updateFromQuality);\n }\n this._quality = quality;\n this._updateFromTrack();\n if (quality) {\n quality.addEventListener(QUALITY_EVENTS, this._updateFromQuality);\n }\n }\n\n private readonly _updateFromTrack = () => {\n if (this._track !== undefined) {\n const targetQualities = this._track.targetQuality;\n if (this._quality === undefined) {\n this.checked = targetQualities === undefined;\n } else {\n this.checked = Array.isArray(targetQualities) ? targetQualities.indexOf(this._quality) >= 0 : targetQualities === this._quality;\n }\n }\n this._updateFromQuality();\n };\n\n private readonly _updateFromQuality = () => {\n setTextContent(this._slotEl, formatQualityLabel(this._quality) ?? 'Automatic');\n };\n\n private _updateTargetQuality(): void {\n if (this._track && this.checked) {\n this._track.targetQuality = this._quality;\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.ARIA_CHECKED) {\n this._updateTargetQuality();\n }\n if (QualityRadioButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-quality-radio-button', QualityRadioButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-quality-radio-button': QualityRadioButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { RadioGroup } from './RadioGroup';\nimport verticalRadioGroupCss from './VerticalRadioGroup.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, MediaTrack, Quality, VideoQuality } from 'theoplayer/chromeless';\nimport { arrayFind, fromArrayLike } from '../util/CommonUtils';\nimport { QualityRadioButton } from './QualityRadioButton';\nimport { createEvent } from '../util/EventUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-quality-radio-group',\n `<style>${verticalRadioGroupCss}</style><theoplayer-radio-group></theoplayer-radio-group>`\n);\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack', 'change'] as const;\n\n/**\n * `<theoplayer-quality-radio-group>` - A radio group that shows a list of available video qualities,\n * from which the user can choose a desired target quality.\n *\n * @group Components\n */\nexport class QualityRadioGroup extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _radioGroup: RadioGroup;\n private _player: ChromelessPlayer | undefined;\n private _track: MediaTrack | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._radioGroup = shadowRoot.querySelector('theoplayer-radio-group')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!(this._radioGroup instanceof RadioGroup)) {\n customElements.upgrade(this._radioGroup);\n }\n\n this._updateTrack();\n this.shadowRoot!.addEventListener('change', this._onChange);\n }\n\n disconnectedCallback(): void {\n this.shadowRoot!.removeEventListener('change', this._onChange);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.videoTracks.removeEventListener(TRACK_EVENTS, this._updateTrack);\n }\n this._player = player;\n this._updateTrack();\n if (this._player !== undefined) {\n this._player.videoTracks.addEventListener(TRACK_EVENTS, this._updateTrack);\n }\n }\n\n private readonly _onChange = () => {\n this.dispatchEvent(createEvent('change', { bubbles: true }));\n };\n\n private readonly _updateTrack = (): void => {\n const track = this._player ? arrayFind(this._player.videoTracks, (track) => track.enabled) : undefined;\n if (this._track === track) {\n return;\n }\n this._track = track;\n this._update();\n };\n\n private readonly _update = (): void => {\n const buttons = fromArrayLike(this._radioGroup.children) as QualityRadioButton[];\n const availableQualities: VideoQuality[] = this._track ? (this._track.qualities as Quality[] as VideoQuality[]) : [];\n // If there is only one available quality, *only* show the \"Automatic\" option (without the single quality).\n // Otherwise, add an \"Automatic\" option at the front.\n let qualities: (VideoQuality | undefined)[] = availableQualities.length === 1 ? [undefined] : [undefined, ...availableQualities];\n let i = 0;\n // Add buttons for each quality\n while (i < buttons.length && i < qualities.length) {\n const button = buttons[i];\n button.track = this._track;\n button.quality = qualities[i];\n i++;\n }\n while (i < buttons.length) {\n this._radioGroup.removeChild(buttons[i]);\n i++;\n }\n while (i < qualities.length) {\n const button = new QualityRadioButton();\n button.track = this._track;\n button.quality = qualities[i];\n this._radioGroup.appendChild(button);\n i++;\n }\n };\n}\n\ncustomElements.define('theoplayer-quality-radio-group', QualityRadioGroup);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-quality-radio-group': QualityRadioGroup;\n }\n}\n","import { Button, buttonTemplate } from './Button';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-text-track-style-reset-button', buttonTemplate(`<slot>Reset</slot>`));\n\n/**\n * `<theoplayer-text-track-style-reset-button>` - A button that resets the text track style.\n *\n * @group Components\n */\nexport class TextTrackStyleResetButton extends StateReceiverMixin(Button, ['player']) {\n static get observedAttributes() {\n return [...Button.observedAttributes];\n }\n\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n this._player = player;\n }\n\n protected override handleClick() {\n if (this._player === undefined) {\n return;\n }\n const { textTrackStyle } = this._player;\n textTrackStyle.fontFamily = undefined;\n textTrackStyle.fontColor = undefined;\n textTrackStyle.fontSize = undefined;\n textTrackStyle.backgroundColor = undefined;\n textTrackStyle.windowColor = undefined;\n textTrackStyle.edgeStyle = undefined;\n }\n}\n\ncustomElements.define('theoplayer-text-track-style-reset-button', TextTrackStyleResetButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-text-track-style-reset-button': TextTrackStyleResetButton;\n }\n}\n","import { MenuGroup, menuGroupTemplate } from './MenuGroup';\nimport settingsMenuHtml from './SettingsMenu.html';\nimport menuTableCss from './MenuTable.css';\nimport { createTemplate } from '../util/TemplateUtils';\n\n// Load components used in template\nimport './ActiveQualityDisplay';\nimport './PlaybackRateDisplay';\nimport './PlaybackRateMenu';\n\nconst template = createTemplate('theoplayer-settings-menu', menuGroupTemplate(settingsMenuHtml, menuTableCss));\n\n/**\n * `<theoplayer-settings-menu>` - A menu to change the settings of the player,\n * such as the active video quality and the playback speed.\n *\n * @slot `heading` - A slot for the menu's heading.\n *\n * @group Components\n */\nexport class SettingsMenu extends MenuGroup {\n constructor() {\n super({ template: template() });\n }\n}\n\ncustomElements.define('theoplayer-settings-menu', SettingsMenu);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-settings-menu': SettingsMenu;\n }\n}\n","import { MenuButton } from './MenuButton';\nimport { buttonTemplate } from './Button';\nimport settingsIcon from '../icons/settings.svg';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-settings-menu-button', buttonTemplate(`<span part=\"icon\"><slot>${settingsIcon}</slot></span>`));\n\n/**\n * `<theoplayer-settings-menu-button>` - A menu button that opens a {@link SettingsMenu}.\n *\n * @attribute `menu` - The ID of the settings menu.\n * @group Components\n */\nexport class SettingsMenuButton extends MenuButton {\n constructor() {\n super({ template: template() });\n }\n\n override connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute(Attribute.ARIA_LABEL)) {\n this.setAttribute(Attribute.ARIA_LABEL, 'open settings menu');\n }\n }\n}\n\ncustomElements.define('theoplayer-settings-menu-button', SettingsMenuButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-settings-menu-button': SettingsMenuButton;\n }\n}\n","export const ENTER_FULLSCREEN_EVENT = 'theoplayerfullscreenenter' as const;\n\nexport interface EnterFullscreenEvent extends CustomEvent {\n type: typeof ENTER_FULLSCREEN_EVENT;\n}\n","export const EXIT_FULLSCREEN_EVENT = 'theoplayerfullscreenexit' as const;\n\nexport interface ExitFullscreenEvent extends CustomEvent {\n type: typeof EXIT_FULLSCREEN_EVENT;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from './Button';\nimport fullscreenButtonCss from './FullscreenButton.css';\nimport enterIcon from '../icons/fullscreen-enter.svg';\nimport exitIcon from '../icons/fullscreen-exit.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { createCustomEvent } from '../util/EventUtils';\nimport { ENTER_FULLSCREEN_EVENT, type EnterFullscreenEvent } from '../events/EnterFullscreenEvent';\nimport { EXIT_FULLSCREEN_EVENT, type ExitFullscreenEvent } from '../events/ExitFullscreenEvent';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-fullscreen-button',\n buttonTemplate(\n `<span part=\"enter-icon\"><slot name=\"enter-icon\">${enterIcon}</slot></span>` +\n `<span part=\"exit-icon\"><slot name=\"exit-icon\">${exitIcon}</slot></span>`,\n fullscreenButtonCss\n )\n);\n\n/**\n * `<theoplayer-fullscreen-button>` - A button that toggles fullscreen.\n *\n * @group Components\n */\nexport class FullscreenButton extends StateReceiverMixin(Button, ['fullscreen']) {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.FULLSCREEN];\n }\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('fullscreen');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateAriaLabel();\n }\n\n get fullscreen(): boolean {\n return this.hasAttribute(Attribute.FULLSCREEN);\n }\n\n set fullscreen(fullscreen: boolean) {\n toggleAttribute(this, Attribute.FULLSCREEN, fullscreen);\n }\n\n protected override handleClick(): void {\n if (!this.fullscreen) {\n const event: EnterFullscreenEvent = createCustomEvent(ENTER_FULLSCREEN_EVENT, {\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(event);\n } else {\n const event: ExitFullscreenEvent = createCustomEvent(EXIT_FULLSCREEN_EVENT, {\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(event);\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (FullscreenButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const label = this.fullscreen ? 'exit fullscreen' : 'enter fullscreen';\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-fullscreen-button', FullscreenButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-fullscreen-button': FullscreenButton;\n }\n}\n","import { arrayFindIndex } from './CommonUtils';\n\nexport type ColorStop = [color: string, percent: number];\n\nexport class ColorStops {\n private _stops: ColorStop[] = [['transparent', 100]];\n\n constructor() {}\n\n add(color: string, from: number, to: number): void {\n from = Math.max(from, 0);\n to = Math.min(to, 100);\n if (from >= to) {\n return;\n }\n const previousIndex = arrayFindIndex(this._stops, ([, percent]) => from <= percent);\n if (previousIndex < 0) {\n return;\n }\n const [previousColor, previousPercent] = this._stops[previousIndex];\n const newStops: ColorStop[] = [];\n if (from > 0) {\n newStops.push([previousColor, from]);\n }\n newStops.push([color, to]);\n if (to < previousPercent) {\n // New stop is fully contained within previous stop\n // Split previous stop\n newStops.push([previousColor, previousPercent]);\n this._stops.splice(previousIndex, 1, ...newStops);\n } else {\n // New stop extends beyond previous stop\n // Remove overlapping stops\n let nextIndex = previousIndex + 1;\n while (nextIndex < this._stops.length) {\n if (to < this._stops[nextIndex][1]) {\n break;\n }\n nextIndex++;\n }\n this._stops.splice(previousIndex, nextIndex - previousIndex, ...newStops);\n }\n }\n\n toGradientStops(): string {\n const gradientStops: string[] = [];\n let prevPercent = 0;\n for (const [color, percent] of this._stops) {\n if (percent < prevPercent) continue;\n gradientStops.push(`${color} ${prevPercent}%`);\n gradientStops.push(`${color} ${percent}%`);\n prevPercent = percent;\n }\n return gradientStops.join(', ');\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport rangeCss from './Range.css';\nimport { Attribute } from '../util/Attribute';\nimport { ColorStops } from '../util/ColorStops';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { DeviceType } from '../util/DeviceType';\nimport { isArrowKey, KeyCode } from '../util/KeyCode';\n\nexport interface RangeOptions {\n template: HTMLTemplateElement;\n}\n\nexport function rangeTemplate(range: string, extraCss: string = ''): string {\n return `<style>${rangeCss}\\n${extraCss}</style><div part=\"container\"><div part=\"background\"></div><div part=\"pointer\"></div>${range}</div>`;\n}\n\n/**\n * A slider to select a value from a range.\n *\n * @attribute `disabled` - Whether the range is disabled.\n * When disabled, the slider value cannot be changed, and the slider thumb is hidden.\n *\n * @group Components\n */\nexport abstract class Range extends StateReceiverMixin(HTMLElement, ['deviceType']) {\n static get observedAttributes() {\n return [Attribute.DISABLED, Attribute.HIDDEN];\n }\n\n protected readonly _rangeEl: HTMLInputElement;\n protected readonly _pointerEl: HTMLElement;\n private _lastRangeWidth: number = 0;\n\n constructor(options: RangeOptions) {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(options.template.content.cloneNode(true));\n\n this._rangeEl = shadowRoot.querySelector('input[type=\"range\"]')!;\n this._rangeEl.addEventListener('input', this._onInput);\n // Internet Explorer does not fire 'input' events for <input> elements... use 'change' instead.\n this._rangeEl.addEventListener('change', this._onInput);\n this._rangeEl.addEventListener('keydown', this._onKeyDown);\n\n this._pointerEl = shadowRoot.querySelector('[part=\"pointer\"]')!;\n\n this._upgradeProperty('disabled');\n this._upgradeProperty('value');\n this._upgradeProperty('min');\n this._upgradeProperty('max');\n this._upgradeProperty('step');\n this._upgradeProperty('deviceType');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n this._rangeEl.setAttribute(Attribute.ARIA_LABEL, this.getAriaLabel());\n this.update();\n\n this.addEventListener('pointermove', this._updatePointerBar);\n }\n\n disconnectedCallback(): void {\n this.removeEventListener('pointermove', this._updatePointerBar);\n }\n\n /**\n * Whether the range is disabled.\n *\n * When disabled, the slider value cannot be changed, and the slider thumb is hidden.\n */\n get disabled() {\n return this.hasAttribute(Attribute.DISABLED);\n }\n\n set disabled(disabled: boolean) {\n toggleAttribute(this, Attribute.DISABLED, disabled);\n }\n\n /**\n * The current value.\n */\n get value(): number {\n return this._rangeEl.valueAsNumber;\n }\n\n set value(value: number) {\n this._rangeEl.valueAsNumber = value;\n this.handleInput();\n }\n\n /**\n * The minimum allowed value.\n */\n get min(): number {\n return Number(this._rangeEl.min);\n }\n\n set min(min: number) {\n this._rangeEl.min = String(min);\n this.update();\n }\n\n /**\n * The maximum allowed value.\n */\n get max(): number {\n return Number(this._rangeEl.max);\n }\n\n set max(max: number) {\n this._rangeEl.max = String(max);\n this.update();\n }\n\n /**\n * The granularity at which the value can change.\n *\n * If set to `\"any\"`, the value can change with arbitrary precision.\n */\n get step(): number | 'any' {\n const raw = this._rangeEl.step;\n return raw === 'any' ? raw : Number(raw);\n }\n\n set step(step: number | 'any') {\n this._rangeEl.step = String(step);\n }\n\n get deviceType(): DeviceType {\n return (this.getAttribute(Attribute.DEVICE_TYPE) || 'desktop') as DeviceType;\n }\n\n set deviceType(deviceType: DeviceType) {\n this.setAttribute(Attribute.DEVICE_TYPE, deviceType);\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n const hasValue = newValue != null;\n if (attrName === Attribute.DISABLED) {\n this.setAttribute('aria-disabled', hasValue ? 'true' : 'false');\n toggleAttribute(this._rangeEl, Attribute.DISABLED, hasValue);\n } else if (attrName === Attribute.HIDDEN) {\n if (!hasValue) {\n this.update();\n }\n }\n if (Range.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onInput = () => {\n this.handleInput();\n };\n\n protected handleInput(): void {\n this.update();\n }\n\n protected update(): void {\n if (this.hasAttribute(Attribute.HIDDEN)) {\n return;\n }\n this._rangeEl.setAttribute('aria-valuetext', this.getAriaValueText());\n this.updateBar_();\n }\n\n /**\n * The value for the `aria-label` attribute of the `<input type=\"range\">` element.\n */\n protected abstract getAriaLabel(): string;\n\n /**\n * The value for the `aria-valuetext` attribute of the `<input type=\"range\">` element.\n */\n protected abstract getAriaValueText(): string;\n\n /**\n * Native ranges have a single color for the whole track, which is different\n * from most video players that have a colored \"bar\" to the left of the handle\n * showing playback progress or volume level. Here we're building that bar\n * by using a background gradient that moves with the range value.\n */\n private updateBar_() {\n const gradientStops = this.getBarColors().toGradientStops();\n shadyCss.styleSubtree(this, {\n '--theoplayer-range-track-progress-internal': `linear-gradient(to right, ${gradientStops})`\n });\n }\n\n /**\n * Build the color gradient for the range bar.\n * Creating an array so progress-bar can insert the buffered bar.\n */\n protected getBarColors(): ColorStops {\n const relativeValue = this.value - this.min;\n const relativeMax = this.max - this.min;\n let rangePercent = (relativeValue / relativeMax) * 100;\n if (isNaN(rangePercent)) {\n rangePercent = 0;\n }\n\n // Use the last non-zero range width, in case the range is temporarily hidden.\n const rangeWidth = this._rangeEl.offsetWidth;\n if (rangeWidth > 0) {\n this._lastRangeWidth = rangeWidth;\n }\n\n let thumbPercent = 0;\n // If the range thumb is at min or max don't correct the time range.\n // Ideally the thumb center would go all the way to min and max values\n // but input[type=range] doesn't play like that.\n if (this.min < this.value && this.value < this.max) {\n const thumbWidth = getComputedStyle(this).getPropertyValue('--theoplayer-range-thumb-width') || '10px';\n const thumbOffset = parseInt(thumbWidth) * (0.5 - rangePercent / 100);\n thumbPercent = (thumbOffset / this._lastRangeWidth) * 100;\n }\n\n const stops = new ColorStops();\n stops.add('var(--theoplayer-range-bar-color, #fff)', 0, rangePercent + thumbPercent);\n return stops;\n }\n\n private readonly _updatePointerBar = (e: PointerEvent): void => {\n if (this.disabled) {\n return;\n }\n // Get mouse position percent\n const rangeRect = this._rangeEl.getBoundingClientRect();\n let mousePercent = (e.clientX - rangeRect.left) / rangeRect.width;\n // Lock between 0 and 1\n mousePercent = Math.max(0, Math.min(1, mousePercent));\n this.updatePointer_(mousePercent, rangeRect);\n };\n\n protected updatePointer_(mousePercent: number, rangeRect: DOMRectReadOnly): void {\n this._pointerEl.style.width = `${mousePercent * rangeRect.width}px`;\n }\n\n private readonly _onKeyDown = (e: KeyboardEvent): void => {\n this.handleKeyDown_(e);\n };\n\n protected handleKeyDown_(e: KeyboardEvent) {\n if (this.deviceType === 'tv' && isArrowKey(e.keyCode)) {\n // On TV devices, only allow left/right arrow keys to move the slider.\n if (e.keyCode === KeyCode.LEFT || e.keyCode === KeyCode.RIGHT) {\n // Stop propagation, to prevent <theoplayer-ui> from navigating to a different control\n // while we're moving the slider.\n e.stopPropagation();\n } else if (e.keyCode === KeyCode.UP || e.keyCode === KeyCode.DOWN) {\n // Prevent default, to stop the browser from moving the slider.\n e.preventDefault();\n }\n }\n }\n}\n","export const PREVIEW_TIME_CHANGE_EVENT = 'theoplayerpreviewtimechange' as const;\n\nexport interface PreviewTimeChangeEvent extends CustomEvent<PreviewTimeChangeEventDetail> {\n type: typeof PREVIEW_TIME_CHANGE_EVENT;\n}\n\nexport interface PreviewTimeChangeEventDetail {\n previewTime: number;\n}\n","import type { Ad } from 'theoplayer/chromeless';\n\nexport function isLinearAd(ad: Ad): boolean {\n return ad.type === 'linear';\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport previewThumbnailCss from './PreviewThumbnail.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer, TextTrack, TextTrackCue, TextTrackCueList } from 'theoplayer/chromeless';\nimport { arrayFind, noOp } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-preview-thumbnail', `<style>${previewThumbnailCss}</style><canvas></canvas>`);\n\nconst TRACK_EVENTS = ['addtrack', 'removetrack'] as const;\n\n/**\n * `<theoplayer-preview-thumbnail>` - A display that shows the thumbnail image at the current preview time\n * of a {@link TimeRange | `<theoplayer-time-range>`}.\n *\n * The first `metadata` text track whose label equals `\"thumbnails\"` is used as source for the thumbnails.\n * This track is expected to contain cues whose content is the URL for the thumbnail image.\n * If the thumbnail image URL ends with a [spatial fragment](https://www.w3.org/TR/media-frags/#naming-space)\n * (e.g. `#xywh=180,80,60,40`), then the thumbnail is clipped to the rectangle defined by that fragment.\n *\n * If the stream does not contain thumbnails, then this display shows nothing.\n * @group Components\n */\nexport class PreviewThumbnail extends StateReceiverMixin(HTMLElement, ['player', 'previewTime']) {\n private readonly _canvasEl: HTMLCanvasElement;\n private readonly _canvasContext: CanvasRenderingContext2D;\n private readonly _thumbnailImageSource: HTMLImageElement;\n\n private _player: ChromelessPlayer | undefined;\n private _previewTime: number = NaN;\n private _thumbnailTextTrack: TextTrack | undefined;\n private _lastLoadedThumbnailUrl: string | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._canvasEl = shadowRoot.querySelector('canvas')!;\n this._canvasContext = this._canvasEl.getContext('2d')!;\n\n this._thumbnailImageSource = document.createElement('img');\n this._thumbnailImageSource.decoding = 'async';\n\n this._upgradeProperty('previewTime');\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.textTracks.removeEventListener(TRACK_EVENTS, this._updateThumbnailTextTrack);\n }\n this._player = player;\n this._updateThumbnailTextTrack();\n if (this._player !== undefined) {\n this._player.textTracks.addEventListener(TRACK_EVENTS, this._updateThumbnailTextTrack);\n }\n }\n\n get previewTime(): number {\n return this._previewTime;\n }\n\n set previewTime(previewTime: number) {\n this._previewTime = previewTime;\n this.updateThumbnail_();\n }\n\n private readonly _updateThumbnailTextTrack = (): void => {\n const oldTrack = this._thumbnailTextTrack;\n const newTrack = this._player ? arrayFind(this._player.textTracks, isThumbnailTextTrack) : undefined;\n if (oldTrack === newTrack) {\n return;\n }\n this._thumbnailTextTrack = newTrack;\n this.updateThumbnail_();\n };\n\n private updateThumbnail_(): void {\n const track = this._thumbnailTextTrack;\n if (track === undefined) {\n this.hideThumbnail_();\n return;\n }\n if (track.mode === 'disabled') {\n track.mode = 'hidden';\n }\n const cue = getCueAtTime(track.cues!, this._previewTime);\n if (cue === undefined) {\n this.hideThumbnail_();\n return;\n }\n const content = (cue.content as string).trim();\n const sprite = parseSpriteUrl(content);\n // Resolve relative URLs against track's URL (or page URL)\n let thumbnailUrl = sprite ? sprite.url : content;\n thumbnailUrl = new URL(thumbnailUrl, track.src || location.href).href;\n // Load thumbnail image, if not yet loaded\n if (this._lastLoadedThumbnailUrl !== thumbnailUrl) {\n this.loadThumbnailImage_(thumbnailUrl);\n return;\n }\n this.showThumbnail_(sprite);\n }\n\n private loadThumbnailImage_(url: string): void {\n if (this._thumbnailImageSource.src === url) {\n // Already loading this URL, wait for the current load to complete.\n return;\n }\n const onLoad = () => {\n this._lastLoadedThumbnailUrl = url;\n this.updateThumbnail_();\n };\n if (typeof this._thumbnailImageSource.decode === 'function') {\n // Load and decode in parallel\n this._thumbnailImageSource.src = url;\n this._thumbnailImageSource.decode().then(onLoad, noOp);\n } else {\n // Load in parallel, decode synchronously\n this._thumbnailImageSource.onload = onLoad;\n // Reset `src` to ensure `onload` will be triggered.\n this._thumbnailImageSource.src = '';\n this._thumbnailImageSource.src = url;\n }\n }\n\n private showThumbnail_(sprite: Sprite | undefined): void {\n if (sprite) {\n // Draw part of image\n this._canvasEl.width = sprite.w;\n this._canvasEl.height = sprite.h;\n this._canvasContext.drawImage(this._thumbnailImageSource, sprite.x, sprite.y, sprite.w, sprite.h, 0, 0, sprite.w, sprite.h);\n } else {\n // Draw entire image\n this._canvasEl.width = this._thumbnailImageSource.naturalWidth;\n this._canvasEl.height = this._thumbnailImageSource.naturalHeight;\n this._canvasContext.drawImage(this._thumbnailImageSource, 0, 0);\n }\n this._canvasEl.style.display = 'block';\n }\n\n private hideThumbnail_(): void {\n this._canvasEl.style.display = 'none';\n }\n}\n\ncustomElements.define('theoplayer-preview-thumbnail', PreviewThumbnail);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-preview-thumbnail': PreviewThumbnail;\n }\n}\n\nfunction isThumbnailTextTrack(track: TextTrack): boolean {\n return track.kind === 'metadata' && track.label === 'thumbnails';\n}\n\nfunction getCueAtTime(cues: TextTrackCueList, time: number): TextTrackCue | undefined {\n if (cues.length === 0) {\n return undefined;\n }\n let result = cues[0];\n for (let cue of cues) {\n if (cue.startTime <= time) {\n result = cue;\n } else if (time >= cue.endTime) {\n return result;\n }\n }\n return result;\n}\n\ninterface Sprite {\n url: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nfunction parseSpriteUrl(spriteUrl: string): Sprite | undefined {\n const match = spriteUrl.match(/^(.+)#xywh=(\\d+),(\\d+),(\\d+),(\\d+)$/);\n if (!match) {\n return undefined;\n }\n const [, url, x, y, w, h] = match;\n return {\n url,\n x: +x,\n y: +y,\n w: +w,\n h: +h\n };\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport textDisplayCss from './TextDisplay.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { setTextContent } from '../util/CommonUtils';\nimport { formatTime } from '../util/TimeUtils';\nimport { Attribute } from '../util/Attribute';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport type { StreamType } from '../util/StreamType';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-preview-time-display', `<style>${textDisplayCss}</style><span></span>`);\n\nconst PLAYER_EVENTS = ['timeupdate', 'seeking', 'seeked', 'durationchange'] as const;\n\n/**\n * `<theoplayer-preview-time-display>` - A display that shows the current preview time of a {@link TimeRange | `<theoplayer-time-range>`}.\n *\n * @attribute `remaining` - If set, shows the remaining time of the stream.\n * @attribute `remaining-when-live` - If set, and the stream is a livestream, shows the remaining time\n * (until the live point) of the stream.\n * @group Components\n */\nexport class PreviewTimeDisplay extends StateReceiverMixin(HTMLElement, ['player', 'previewTime', 'streamType']) {\n private readonly _spanEl: HTMLElement;\n private _previewTime: number = NaN;\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [Attribute.REMAINING, Attribute.REMAINING_WHEN_LIVE, Attribute.STREAM_TYPE];\n }\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._spanEl = shadowRoot.querySelector('span')!;\n\n this._upgradeProperty('previewTime');\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n this._update();\n }\n\n get previewTime(): number {\n return this._previewTime;\n }\n\n set previewTime(previewTime: number) {\n this._previewTime = previewTime;\n this._update();\n }\n\n get streamType(): StreamType {\n return (this.getAttribute(Attribute.STREAM_TYPE) || 'vod') as StreamType;\n }\n\n set streamType(streamType: StreamType) {\n this.setAttribute(Attribute.STREAM_TYPE, streamType);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PLAYER_EVENTS, this._update);\n }\n this._player = player;\n this._update();\n if (this._player !== undefined) {\n this._player.addEventListener(PLAYER_EVENTS, this._update);\n }\n }\n\n private readonly _update = (): void => {\n let previewTime = this._previewTime;\n const duration = this._player ? this._player.duration : NaN;\n const seekable = this._player?.seekable;\n const endTime = isFinite(duration) ? duration : seekable && seekable.length > 0 ? seekable.end(0) : NaN;\n const remaining = this.hasAttribute(Attribute.REMAINING) || (this.hasAttribute(Attribute.REMAINING_WHEN_LIVE) && this.streamType !== 'vod');\n if (remaining) {\n previewTime = -((endTime || 0) - previewTime);\n }\n setTextContent(this._spanEl, formatTime(previewTime, endTime, remaining));\n };\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (newValue === oldValue) {\n return;\n }\n if (PreviewTimeDisplay.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n this._update();\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-preview-time-display', PreviewTimeDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-preview-time-display': PreviewTimeDisplay;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Range, rangeTemplate } from './Range';\nimport timeRangeHtml from './TimeRange.html';\nimport timeRangeCss from './TimeRange.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { formatAsTimePhrase } from '../util/TimeUtils';\nimport { createCustomEvent } from '../util/EventUtils';\nimport type { PreviewTimeChangeEvent } from '../events/PreviewTimeChangeEvent';\nimport { PREVIEW_TIME_CHANGE_EVENT } from '../events/PreviewTimeChangeEvent';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { isLinearAd } from '../util/AdUtils';\nimport type { ColorStops } from '../util/ColorStops';\nimport { KeyCode } from '../util/KeyCode';\nimport { createTemplate } from '../util/TemplateUtils';\n\n// Load components used in template\nimport './PreviewThumbnail';\nimport './PreviewTimeDisplay';\n\nconst template = createTemplate('theoplayer-time-range', rangeTemplate(timeRangeHtml, timeRangeCss));\n\nconst UPDATE_EVENTS = ['timeupdate', 'durationchange', 'ratechange', 'seeking', 'seeked'] as const;\nconst AUTO_ADVANCE_EVENTS = ['play', 'pause', 'ended', 'readystatechange', 'error'] as const;\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak', 'adbegin', 'adend', 'adskip', 'addad', 'updatead'] as const;\nconst DEFAULT_MISSING_TIME_PHRASE = 'video not loaded, unknown time';\n\n/**\n * Width of an ad marker on the progress bar, in percent of the total bar width.\n */\nconst AD_MARKER_WIDTH = 1;\n\n/**\n * `<theoplayer-time-range>` - A seek bar, showing the current time of the player,\n * and which seeks the player when clicked or dragged.\n *\n * @slot `preview` - A slot holding a preview of the seek time, shown while hovering the seek bar.\n * By default, this shows the {@link PreviewTimeDisplay | preview time} and\n * the {@link PreviewThumbnail | preview thumbnail}.\n * @group Components\n */\nexport class TimeRange extends StateReceiverMixin(Range, ['player', 'streamType', 'deviceType']) {\n static get observedAttributes() {\n return [...Range.observedAttributes, Attribute.SHOW_AD_MARKERS];\n }\n\n private readonly _previewRailEl: HTMLElement;\n private readonly _previewBoxEl: HTMLElement;\n\n private _player: ChromelessPlayer | undefined;\n private _pausedWhileScrubbing: boolean = false;\n\n private _autoAdvanceId: number = 0;\n private _lastUpdateTime: number = 0;\n private _lastCurrentTime: number = 0;\n private _lastPlaybackRate: number = 0;\n\n constructor() {\n super({ template: template() });\n\n this._previewRailEl = this.shadowRoot!.querySelector('.theoplayer-time-range-preview-rail')!;\n this._previewBoxEl = this._previewRailEl.querySelector('[part~=\"preview-box\"]')!;\n\n this._rangeEl.setAttribute(Attribute.ARIA_LIVE, 'off');\n this._rangeEl.addEventListener('mousedown', this._pauseOnScrubStart);\n this._rangeEl.addEventListener('touchstart', this._pauseOnScrubStart);\n\n this._upgradeProperty('player');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._toggleAutoAdvance();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n this._toggleAutoAdvance();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(UPDATE_EVENTS, this._updateFromPlayer);\n this._player.removeEventListener(AUTO_ADVANCE_EVENTS, this._toggleAutoAdvance);\n this._player.ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n }\n this._player = player;\n this._updateFromPlayer();\n this._toggleAutoAdvance();\n if (this._player !== undefined) {\n this._player.addEventListener(UPDATE_EVENTS, this._updateFromPlayer);\n this._player.addEventListener(AUTO_ADVANCE_EVENTS, this._toggleAutoAdvance);\n this._player.ads?.addEventListener(AD_EVENTS, this._onAdChange);\n }\n }\n\n get streamType(): StreamType {\n return (this.getAttribute(Attribute.STREAM_TYPE) || 'vod') as StreamType;\n }\n\n set streamType(streamType: StreamType) {\n this.setAttribute(Attribute.STREAM_TYPE, streamType);\n }\n\n private readonly _updateFromPlayer = () => {\n if (this._player === undefined) {\n return;\n }\n this._lastUpdateTime = performance.now();\n this._lastCurrentTime = this._player.currentTime;\n this._lastPlaybackRate = this._player.playbackRate;\n const seekable = this._player.seekable;\n if (seekable.length !== 0) {\n this.min = seekable.start(0);\n this.max = seekable.end(0);\n } else {\n this.min = 0;\n this.max = this._player.duration;\n }\n if (!isFinite(this._lastCurrentTime)) {\n const isLive = this._player.duration === Infinity;\n this._lastCurrentTime = isLive ? this.max : this.min;\n }\n this._rangeEl.valueAsNumber = this._lastCurrentTime;\n this.update();\n this._updateDisabled();\n };\n\n private readonly _updateDisabled = () => {\n let disabled = this.streamType === 'live';\n if (this._player !== undefined) {\n disabled ||= this._player.seekable.length === 0;\n }\n if (this.disabled !== disabled) {\n this.disabled = disabled;\n }\n };\n\n protected override getAriaLabel(): string {\n return 'seek';\n }\n\n protected override getAriaValueText(): string {\n const currentTimePhrase = formatAsTimePhrase(this.value);\n const totalTimePhrase = formatAsTimePhrase(this.max);\n if (currentTimePhrase && totalTimePhrase) {\n return `${currentTimePhrase} of ${totalTimePhrase}`;\n }\n return DEFAULT_MISSING_TIME_PHRASE;\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.STREAM_TYPE) {\n this._updateDisabled();\n } else if (attrName === Attribute.SHOW_AD_MARKERS) {\n this.update();\n }\n if (TimeRange.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n protected override handleInput(): void {\n if (this._player !== undefined && this._player.currentTime !== this.value) {\n this._player.currentTime = this.value;\n }\n super.handleInput();\n }\n\n private readonly _pauseOnScrubStart = () => {\n if (this._pausedWhileScrubbing) {\n // Already scrubbing.\n return;\n }\n if (this._player === undefined || this._player.paused) {\n // Player is already paused.\n return;\n }\n this._pausedWhileScrubbing = true;\n this._player.pause();\n document.addEventListener('mouseup', this._playOnScrubEnd);\n document.addEventListener('touchend', this._playOnScrubEnd);\n };\n\n private readonly _playOnScrubEnd = () => {\n if (!this._pausedWhileScrubbing) {\n return;\n }\n this._pausedWhileScrubbing = false;\n document.removeEventListener('mouseup', this._playOnScrubEnd);\n document.removeEventListener('touchend', this._playOnScrubEnd);\n if (this._player !== undefined && this._player.paused) {\n this._player.play();\n }\n };\n\n private shouldAutoAdvance_(): boolean {\n return (\n this.isConnected &&\n this._player !== undefined &&\n !this._player.paused &&\n !this._player.ended &&\n !this._player.errorObject &&\n this._player.readyState >= 3\n );\n }\n\n private readonly _toggleAutoAdvance = () => {\n if (this.shouldAutoAdvance_()) {\n if (this._autoAdvanceId === 0) {\n this._updateFromPlayer();\n this._autoAdvanceId = requestAnimationFrame(this._autoAdvanceWhilePlaying);\n }\n } else {\n if (this._autoAdvanceId !== 0) {\n this._updateFromPlayer();\n cancelAnimationFrame(this._autoAdvanceId);\n this._autoAdvanceId = 0;\n }\n }\n };\n\n private readonly _autoAdvanceWhilePlaying = () => {\n if (!this.shouldAutoAdvance_()) {\n this._autoAdvanceId = 0;\n return;\n }\n\n const delta = (performance.now() - this._lastUpdateTime) / 1000;\n this._rangeEl.valueAsNumber = this._lastCurrentTime + delta * this._lastPlaybackRate;\n this.update();\n\n this._autoAdvanceId = requestAnimationFrame(this._autoAdvanceWhilePlaying);\n };\n\n protected override updatePointer_(mousePercent: number, rangeRect: DOMRectReadOnly): void {\n super.updatePointer_(mousePercent, rangeRect);\n\n // Update preview rail, keeping the preview box within bounds\n let previewPos = rangeRect.left + mousePercent * rangeRect.width;\n const previewBoxRect = this._previewBoxEl.getBoundingClientRect();\n const minPreviewPos = rangeRect.left + previewBoxRect.width / 2;\n const maxPreviewPos = rangeRect.right - previewBoxRect.width / 2;\n previewPos = Math.max(minPreviewPos, Math.min(maxPreviewPos, previewPos));\n const previewPosFraction = (previewPos - rangeRect.left) / rangeRect.width;\n this._previewRailEl.style.transform = `translateX(${(previewPosFraction * 100 * 100).toFixed(6)}%)`;\n\n // Propagate preview time to parent\n if (this._player === undefined) {\n return;\n }\n const { min, max } = this;\n const previewTime = min + mousePercent * (max - min);\n const previewTimeChangeEvent: PreviewTimeChangeEvent = createCustomEvent(PREVIEW_TIME_CHANGE_EVENT, {\n bubbles: true,\n composed: true,\n detail: { previewTime }\n });\n this.dispatchEvent(previewTimeChangeEvent);\n }\n\n protected override getBarColors(): ColorStops {\n const colorStops = super.getBarColors();\n if (!this.hasAttribute(Attribute.SHOW_AD_MARKERS) || !this._player || !this._player.ads) {\n return colorStops;\n }\n if (this._player.ads.playing) {\n // Currently playing a linear ad\n return colorStops;\n }\n const { min, max } = this;\n for (const adBreak of this._player.ads.scheduledAdBreaks) {\n if (adBreak.ads !== undefined && adBreak.ads.length > 0 && !adBreak.ads.some(isLinearAd)) {\n // Ad break definitely does not contain any linear ads\n continue;\n }\n let adBreakTime = adBreak.timeOffset;\n if (adBreakTime < 0) {\n // Post-rolls have timeOffset == -1\n adBreakTime = this._player.duration;\n }\n if (min <= adBreakTime && adBreakTime <= max) {\n const adBreakPercent = ((adBreakTime - min) / (max - min)) * 100;\n let adBreakFrom: number;\n let adBreakTo: number;\n if (adBreakPercent + AD_MARKER_WIDTH < 100) {\n adBreakFrom = adBreakPercent;\n adBreakTo = adBreakPercent + AD_MARKER_WIDTH;\n } else {\n adBreakFrom = 100 - AD_MARKER_WIDTH;\n adBreakTo = 100;\n }\n colorStops.add('var(--theoplayer-time-range-ad-marker-color, #ffc50f)', adBreakFrom, adBreakTo);\n }\n }\n return colorStops;\n }\n\n private readonly _onAdChange = () => {\n this.update();\n };\n\n protected override handleKeyDown_(e: KeyboardEvent) {\n super.handleKeyDown_(e);\n if (this.deviceType === 'tv' && e.keyCode === KeyCode.ENTER) {\n if (this._player !== undefined) {\n if (this._player.paused) {\n this._player.play();\n } else {\n this._player.pause();\n }\n }\n }\n }\n}\n\ncustomElements.define('theoplayer-time-range', TimeRange);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-time-range': TimeRange;\n }\n}\n","import { Range, rangeTemplate } from './Range';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-volume-range', rangeTemplate(`<input type=\"range\" min=\"0\" max=\"1\" step=\"any\" value=\"0\">`));\n\nfunction formatAsPercentString(value: number, max: number) {\n return `${Math.round((value / max) * 100)}%`;\n}\n\n/**\n * `<theoplayer-volume-range>` - A volume slider, showing the current audio volume of the player,\n * and which changes the volume when clicked or dragged.\n *\n * @group Components\n */\nexport class VolumeRange extends StateReceiverMixin(Range, ['player', 'deviceType']) {\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('player');\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener('volumechange', this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener('volumechange', this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n if (this._player !== undefined) {\n this.value = this._player.volume;\n }\n };\n\n protected override getAriaLabel(): string {\n return 'volume';\n }\n\n protected override getAriaValueText(): string {\n return formatAsPercentString(this.value, this.max);\n }\n\n protected override handleInput(): void {\n if (this._player !== undefined && this._player.volume !== this.value) {\n this._player.volume = this.value;\n }\n super.handleInput();\n }\n}\n\ncustomElements.define('theoplayer-volume-range', VolumeRange);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-volume-range': VolumeRange;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport errorDisplayCss from './ErrorDisplay.css';\nimport errorIcon from '../icons/error.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { THEOplayerError } from 'theoplayer/chromeless';\nimport { setTextContent, toggleAttribute } from '../util/CommonUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-error-display',\n `<style>${errorDisplayCss}</style>` +\n `<div part=\"icon\"><slot name=\"icon\">${errorIcon}</slot></div>` +\n `<div part=\"text\">` +\n `<h1 part=\"heading\"><slot name=\"heading\">An error occurred</slot></h1>` +\n `<p part=\"message\"><slot name=\"message\"></slot></p>` +\n `</div>` +\n `<div part=\"fullscreen-controls\">` +\n `<slot name=\"fullscreen-controls\"><theoplayer-fullscreen-button></theoplayer-fullscreen-button></slot>` +\n `</div>`\n);\n\n/**\n * `<theoplayer-error-display>` - A screen that shows the details of a fatal player error.\n *\n * @group Components\n */\nexport class ErrorDisplay extends StateReceiverMixin(HTMLElement, ['error', 'fullscreen']) {\n private readonly _messageSlot: HTMLSlotElement;\n private _error: THEOplayerError | undefined;\n\n static get observedAttributes() {\n return [Attribute.FULLSCREEN];\n }\n\n constructor() {\n super();\n\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._messageSlot = shadowRoot.querySelector('slot[name=\"message\"]')!;\n\n this._upgradeProperty('error');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n }\n\n /**\n * The error.\n */\n get error(): THEOplayerError | undefined {\n return this._error;\n }\n\n set error(error: THEOplayerError | undefined) {\n this._error = error;\n setTextContent(this._messageSlot, error ? error.message : '');\n }\n\n get fullscreen(): boolean {\n return this.hasAttribute(Attribute.FULLSCREEN);\n }\n\n set fullscreen(fullscreen: boolean) {\n toggleAttribute(this, Attribute.FULLSCREEN, fullscreen);\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (ErrorDisplay.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-error-display', ErrorDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-error-display': ErrorDisplay;\n }\n}\n","import { Button, type ButtonOptions } from './Button';\nimport { Attribute } from '../util/Attribute';\nimport type { CastState, VendorCast } from 'theoplayer/chromeless';\nimport * as shadyCss from '@webcomponents/shadycss';\n\n/**\n * A generic button to start and stop casting.\n *\n * For a concrete implementation, see {@link ChromecastButton} and {@link AirPlayButton}.\n * @group Components\n */\nexport class CastButton extends Button {\n private _castApi: VendorCast | undefined;\n\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.CAST_STATE];\n }\n\n constructor(options?: ButtonOptions) {\n super(options);\n this._upgradeProperty('castState');\n this._upgradeProperty('castApi');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n if (!this.hasAttribute(Attribute.CAST_STATE)) {\n this.setAttribute(Attribute.CAST_STATE, 'unavailable');\n }\n this._updateCastState();\n }\n\n /**\n * The cast API for this cast button.\n */\n get castApi(): VendorCast | undefined {\n return this._castApi;\n }\n\n set castApi(castApi: VendorCast | undefined) {\n if (this._castApi !== undefined) {\n this._castApi.removeEventListener('statechange', this._updateCastState);\n }\n this._castApi = castApi;\n this._updateCastState();\n if (this._castApi !== undefined) {\n this._castApi.addEventListener('statechange', this._updateCastState);\n }\n }\n\n /**\n * The current cast state.\n */\n get castState(): CastState {\n return this.getAttribute(Attribute.CAST_STATE) as CastState;\n }\n\n protected override handleClick(): void {\n if (this._castApi) {\n this._updateCastState();\n const state = this.castState;\n if (state === 'available') {\n this._castApi.start();\n } else if (state === 'connecting' || state === 'connected') {\n this._castApi.stop();\n }\n }\n }\n\n private readonly _updateCastState = (): void => {\n const castState = this._castApi ? this._castApi.state : 'unavailable';\n this.setAttribute(Attribute.CAST_STATE, castState);\n };\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (CastButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n","import type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { CastButton } from './CastButton';\nimport chromecastButtonHtml from './ChromecastButton.html';\nimport chromecastButtonCss from './ChromecastButton.css';\nimport { buttonTemplate } from './Button';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-chromecast-button', buttonTemplate(chromecastButtonHtml, chromecastButtonCss));\n\nconst maskId = 'theoplayer-chromecast-rings-mask';\nlet chromecastButtonId = 0;\n\n/**\n * `<theoplayer-chromecast-button>` - A button to start and stop casting using Chromecast.\n *\n * @group Components\n */\nexport class ChromecastButton extends StateReceiverMixin(CastButton, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n\n // Make ID attributes unique\n const id = ++chromecastButtonId;\n const mask = this.shadowRoot!.querySelector<SVGClipPathElement>(`svg clipPath#${maskId}`);\n const rings = this.shadowRoot!.querySelector<SVGGElement>(`svg .theoplayer-chromecast-rings`)!;\n const uniqueMaskId = `${maskId}-${id}`;\n mask?.setAttribute('id', uniqueMaskId);\n rings.setAttribute('clip-path', uniqueMaskId);\n\n this._upgradeProperty('player');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateAriaLabel();\n }\n\n get player() {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n this._player = player;\n this.castApi = player?.cast?.chromecast;\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (ChromecastButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const label =\n this.castState === 'connecting' || this.castState === 'connected' ? 'stop casting to Chromecast' : 'start casting to Chromecast';\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-chromecast-button', ChromecastButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-chromecast-button': ChromecastButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport chromecastDisplayCss from './ChromecastDisplay.css';\nimport chromecastIcon from '../icons/chromecast-48px.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { setTextContent } from '../util/CommonUtils';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-chromecast-display',\n `<style>${chromecastDisplayCss}</style>` +\n `<div part=\"icon\"><slot name=\"icon\">${chromecastIcon}</slot></div>` +\n `<div part=\"text\">` +\n `<p part=\"heading\"><slot name=\"heading\">Playing on</slot></p>` +\n `<p part=\"receiver\">Chromecast Receiver</p>` +\n `</div>`\n);\n\nconst CAST_EVENTS = ['statechange'] as const;\n\n/**\n * `<theoplayer-chromecast-display>` - A control that displays the casting status while using Chromecast.\n *\n * @group Components\n */\nexport class ChromecastDisplay extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _receiverNameEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._receiverNameEl = shadowRoot.querySelector('[part=\"receiver\"]')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n if (!this.hasAttribute(Attribute.HIDDEN)) {\n this.setAttribute(Attribute.HIDDEN, '');\n }\n this._updateFromPlayer();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n this._player?.cast?.chromecast?.removeEventListener(CAST_EVENTS, this._updateFromPlayer);\n this._player = player;\n this._updateFromPlayer();\n this._player?.cast?.chromecast?.addEventListener(CAST_EVENTS, this._updateFromPlayer);\n }\n\n private readonly _updateFromPlayer = () => {\n const chromecast = this._player?.cast?.chromecast;\n if (chromecast === undefined || chromecast.state !== 'connected') {\n this.setAttribute(Attribute.HIDDEN, '');\n return;\n }\n setTextContent(this._receiverNameEl, chromecast.receiverName || '');\n this.removeAttribute(Attribute.HIDDEN);\n };\n}\n\ncustomElements.define('theoplayer-chromecast-display', ChromecastDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-chromecast-display': ChromecastDisplay;\n }\n}\n","import type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { CastButton } from './CastButton';\nimport airPlayButtonHtml from './AirPlayButton.html';\nimport airPlayButtonCss from './AirPlayButton.css';\nimport { buttonTemplate } from './Button';\nimport { Attribute } from '../util/Attribute';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-airplay-button', buttonTemplate(airPlayButtonHtml, airPlayButtonCss));\n\n/**\n * `<theoplayer-airplay-button>` - A button to start and stop casting using AirPlay.\n *\n * @group Components\n */\nexport class AirPlayButton extends StateReceiverMixin(CastButton, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n this._upgradeProperty('player');\n }\n\n override connectedCallback() {\n super.connectedCallback();\n this._updateAriaLabel();\n }\n\n get player() {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n this._player = player;\n this.castApi = player?.cast?.airplay;\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (AirPlayButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n this._updateAriaLabel();\n }\n }\n\n private _updateAriaLabel(): void {\n const label = this.castState === 'connecting' || this.castState === 'connected' ? 'stop playing on AirPlay' : 'start playing on AirPlay';\n this.setAttribute(Attribute.ARIA_LABEL, label);\n }\n}\n\ncustomElements.define('theoplayer-airplay-button', AirPlayButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-airplay-button': AirPlayButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport loadingIndicatorCss from './LoadingIndicator.css';\nimport loadingIndicatorHtml from './LoadingIndicator.html';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { Attribute } from '../util/Attribute';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-loading-indicator', `<style>${loadingIndicatorCss}</style>${loadingIndicatorHtml}`);\n\nconst PLAYER_EVENTS = ['readystatechange', 'play', 'pause', 'playing', 'seeking', 'seeked'] as const;\n\n/**\n * `<theoplayer-loading-indicator>` - An indicator that shows whether the player is currently waiting for more data to resume playback.\n *\n * @attribute `loading` (readonly) - Whether the player is waiting for more data. If set, the indicator is shown.\n * @group Components\n */\nexport class LoadingIndicator extends StateReceiverMixin(HTMLElement, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [Attribute.LOADING];\n }\n\n constructor() {\n super();\n\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n this._updateFromPlayer();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.addEventListener(PLAYER_EVENTS, this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n const loading = this._player !== undefined && !this._player.paused && (this._player.seeking || this._player.readyState < 3);\n toggleAttribute(this, Attribute.LOADING, loading);\n };\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n if (LoadingIndicator.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-loading-indicator', LoadingIndicator);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-loading-indicator': LoadingIndicator;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport gestureReceiverCss from './GestureReceiver.css';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-gesture-receiver', `<style>${gestureReceiverCss}</style>`);\n\n/**\n * `<theoplayer-gesture-receiver>` - An overlay that receives and handles gestures on the player.\n *\n * On desktop devices, this plays or pauses the player whenever it is clicked.\n * On mobile devices, this currently does nothing.\n *\n * @group Components\n */\nexport class GestureReceiver extends StateReceiverMixin(HTMLElement, ['player']) {\n private _player: ChromelessPlayer | undefined;\n private _pointerType: string = '';\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n this.setAttribute('tabindex', '-1');\n this.setAttribute('aria-hidden', 'true');\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.element.removeEventListener('pointerdown', this._onPointerDown);\n this._player.element.removeEventListener('click', this._onClick);\n }\n this._player = player;\n if (this._player !== undefined) {\n this._player.element.addEventListener('pointerdown', this._onPointerDown);\n this._player.element.addEventListener('click', this._onClick);\n }\n }\n\n private readonly _onPointerDown = (event: PointerEvent) => {\n this._pointerType = event.pointerType;\n };\n\n private readonly _onClick = (event: MouseEvent) => {\n // If the browser doesn't support yet `pointerType` on `click` events,\n // we use the type from the previous `pointerdown` event.\n const pointerType = (event as PointerEvent).pointerType ?? this._pointerType;\n if (pointerType === 'touch') {\n this.handleTap(event);\n } else if (pointerType === 'mouse') {\n this.handleMouseClick(event);\n }\n };\n\n handleTap(_event: MouseEvent): void {\n // Do nothing.\n }\n\n handleMouseClick(_event: MouseEvent): void {\n // Toggle play/pause.\n if (this._player !== undefined) {\n if (this._player.source === undefined) {\n // Do nothing if the player has no source.\n return;\n }\n if (this._player.ads?.playing) {\n // Clicking during a linear ad should open the ad's clickthrough URL instead.\n return;\n }\n if (this._player.paused) {\n this._player.play();\n } else {\n this._player.pause();\n }\n }\n }\n}\n\ncustomElements.define('theoplayer-gesture-receiver', GestureReceiver);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-gesture-receiver': GestureReceiver;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from './Button';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport liveButtonCss from './LiveButton.css';\nimport liveIcon from '../icons/live.svg';\nimport { StateReceiverMixin } from './StateReceiverMixin';\nimport { Attribute } from '../util/Attribute';\nimport type { StreamType } from '../util/StreamType';\nimport { toggleAttribute } from '../util/CommonUtils';\nimport { createTemplate } from '../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-live-button',\n buttonTemplate(\n `<span part=\"icon\"><slot name=\"icon\">${liveIcon}</slot></span>` +\n `<slot name=\"spacer\"> </slot>` +\n `<span part=\"text\"><slot name=\"text\">LIVE</slot></span>`,\n liveButtonCss\n )\n);\n\nconst PAUSED_EVENTS = ['play', 'pause', 'playing', 'emptied'] as const;\nconst LIVE_EVENTS = ['seeking', 'seeked', 'timeupdate', 'durationchange', 'emptied'] as const;\n\nconst DEFAULT_LIVE_THRESHOLD = 10;\n\n/**\n * `<theoplayer-live-button>` - A button that shows whether the player is currently playing at the live point,\n * and seeks to the live point when clicked.\n *\n * @attribute `live-threshold` - The maximum distance (in seconds) from the live point that the player's current time\n * can be for it to still be considered \"at the live point\". If unset, defaults to 10 seconds.\n * @attribute `live` (readonly) - Whether the player is considered to be playing at the live point.\n * @group Components\n */\nexport class LiveButton extends StateReceiverMixin(Button, ['player', 'streamType']) {\n static get observedAttributes() {\n return [...Button.observedAttributes, Attribute.STREAM_TYPE, Attribute.LIVE, Attribute.PAUSED, Attribute.LIVE_THRESHOLD];\n }\n\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super({ template: template() });\n\n this._upgradeProperty('paused');\n this._upgradeProperty('streamType');\n this._upgradeProperty('liveThreshold');\n this._upgradeProperty('live');\n this._upgradeProperty('player');\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n if (!this.hasAttribute(Attribute.ARIA_LABEL)) {\n this.setAttribute(Attribute.ARIA_LABEL, 'seek to live');\n }\n }\n\n get paused(): boolean {\n return this.hasAttribute(Attribute.PAUSED);\n }\n\n set paused(paused: boolean) {\n toggleAttribute(this, Attribute.PAUSED, paused);\n }\n\n get streamType(): StreamType {\n return (this.getAttribute(Attribute.STREAM_TYPE) || 'vod') as StreamType;\n }\n\n set streamType(streamType: StreamType) {\n this.setAttribute(Attribute.STREAM_TYPE, streamType);\n }\n\n get liveThreshold(): number {\n return Number(this.getAttribute(Attribute.LIVE_THRESHOLD) ?? DEFAULT_LIVE_THRESHOLD);\n }\n\n set liveThreshold(value: number) {\n value = Number(value);\n this.setAttribute(Attribute.LIVE_THRESHOLD, String(isNaN(value) ? 0 : value));\n }\n\n get live(): boolean {\n return this.hasAttribute(Attribute.LIVE);\n }\n\n set live(live: boolean) {\n toggleAttribute(this, Attribute.LIVE, live);\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener(PAUSED_EVENTS, this._updatePaused);\n this._player.removeEventListener(LIVE_EVENTS, this._updateLive);\n }\n this._player = player;\n this._updatePaused();\n this._updateLive();\n if (this._player !== undefined) {\n this._player.addEventListener(PAUSED_EVENTS, this._updatePaused);\n this._player.addEventListener(LIVE_EVENTS, this._updateLive);\n }\n }\n\n private readonly _updatePaused = () => {\n this.paused = this._player !== undefined ? this._player.paused : true;\n };\n\n private readonly _updateLive = () => {\n const live = this._player !== undefined ? isLive(this._player, this.liveThreshold) : false;\n if (this.live !== live) {\n this.live = live;\n }\n };\n\n protected override handleClick() {\n if (this._player === undefined) {\n return;\n }\n if (this._player.hesp && this._player.hesp.manifest !== undefined) {\n this._player.hesp.goLive();\n } else {\n this._player.currentTime = Infinity;\n this._player.play();\n }\n }\n\n override attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (newValue === oldValue) {\n return;\n }\n if (attrName === Attribute.LIVE_THRESHOLD) {\n this._updateLive();\n }\n if (LiveButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n}\n\ncustomElements.define('theoplayer-live-button', LiveButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-live-button': LiveButton;\n }\n}\n\nfunction isLive(player: ChromelessPlayer, threshold: number): boolean {\n if (player.duration === Infinity) {\n const seekable = player.seekable;\n if (seekable.length > 0) {\n return seekable.end(seekable.length - 1) - player.currentTime <= threshold;\n }\n }\n return false;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport textDisplayCss from '../TextDisplay.css';\nimport adDisplayCss from './AdDisplay.css';\nimport { StateReceiverMixin } from '../StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind, setTextContent } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { createTemplate } from '../../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-ad-display', `<style>${textDisplayCss}\\n${adDisplayCss}</style><span></span>`);\n\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak', 'adbegin', 'adend', 'adskip', 'addad', 'updatead'] as const;\n\n/**\n * `<theoplayer-ad-countdown>` - A control that shows when an advertisement is playing,\n * and the number of the current ad in the ad break (if the break has multiple ads).\n *\n * @group Components\n */\nexport class AdDisplay extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _spanEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._spanEl = shadowRoot.querySelector('span')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n this._updateFromPlayer();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.ads?.removeEventListener(AD_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.ads?.addEventListener(AD_EVENTS, this._updateFromPlayer);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n const ads = this._player?.ads;\n const linearAds = (ads?.currentAdBreak?.ads ?? []).filter(isLinearAd);\n if (ads === undefined || !ads.playing || linearAds.length === 0) {\n setTextContent(this._spanEl, '');\n this.style.display = 'none';\n return;\n }\n if (linearAds.length > 1) {\n const currentAds = this._player!.ads!.currentAds || [];\n const currentLinearAd = arrayFind(currentAds, isLinearAd);\n if (currentLinearAd) {\n const currentAdIndex = linearAds.indexOf(currentLinearAd);\n if (currentAdIndex >= 0) {\n setTextContent(this._spanEl, `Ad ${currentAdIndex + 1} of ${linearAds.length}`);\n this.style.display = '';\n return;\n }\n }\n }\n setTextContent(this._spanEl, 'Ad');\n this.style.display = '';\n };\n}\n\ncustomElements.define('theoplayer-ad-display', AdDisplay);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-ad-display': AdDisplay;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport textDisplayCss from '../TextDisplay.css';\nimport adCountdownCss from './AdCountdown.css';\nimport { StateReceiverMixin } from '../StateReceiverMixin';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { setTextContent } from '../../util/CommonUtils';\nimport { createTemplate } from '../../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-ad-countdown', `<style>${textDisplayCss}\\n${adCountdownCss}</style><span></span>`);\n\nconst AD_EVENTS = ['adbreakbegin', 'adbreakend', 'adbreakchange', 'updateadbreak'] as const;\n\n/**\n * `<theoplayer-ad-countdown>` - A control that displays the remaining time of the current ad break.\n *\n * @group Components\n */\nexport class AdCountdown extends StateReceiverMixin(HTMLElement, ['player']) {\n private readonly _spanEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n constructor() {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open' });\n shadowRoot.appendChild(template().content.cloneNode(true));\n this._spanEl = shadowRoot.querySelector('span')!;\n\n this._upgradeProperty('player');\n }\n\n protected _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n this._update();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener('timeupdate', this._update);\n this._player.ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n }\n this._player = player;\n this._onAdChange();\n if (this._player !== undefined) {\n this._player.ads?.addEventListener(AD_EVENTS, this._onAdChange);\n }\n }\n\n private readonly _onAdChange = () => {\n if (this._player?.ads?.playing) {\n this._player.removeEventListener('timeupdate', this._update);\n this._player.addEventListener('timeupdate', this._update);\n } else {\n this._player?.removeEventListener('timeupdate', this._update);\n }\n this._update();\n };\n\n private readonly _update = (): void => {\n const ads = this._player?.ads;\n let maxRemainingDuration = ads?.currentAdBreak?.maxRemainingDuration;\n if (ads === undefined || !ads.playing || maxRemainingDuration === undefined || maxRemainingDuration < 0) {\n setTextContent(this._spanEl, '');\n this.style.display = 'none';\n return;\n }\n maxRemainingDuration = Math.ceil(maxRemainingDuration);\n setTextContent(this._spanEl, `Content will resume in ${maxRemainingDuration}s`);\n this.style.display = '';\n };\n}\n\ncustomElements.define('theoplayer-ad-countdown', AdCountdown);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-ad-countdown': AdCountdown;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { LinkButton, linkButtonTemplate } from '../LinkButton';\nimport { StateReceiverMixin } from '../StateReceiverMixin';\nimport { Attribute } from '../../util/Attribute';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { createTemplate } from '../../util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-ad-clickthrough-button', linkButtonTemplate(`<slot>Visit Advertiser</slot>`));\n\nconst AD_EVENTS = ['adbegin', 'adend', 'adloaded', 'updatead', 'adskip'] as const;\n\n/**\n * `<theoplayer-ad-clickthrough-button>` - A button to open the advertisement's click-through webpage.\n *\n * @group Components\n */\nexport class AdClickThroughButton extends StateReceiverMixin(LinkButton, ['player']) {\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [...LinkButton.observedAttributes, Attribute.CLICKTHROUGH];\n }\n\n constructor() {\n super({ template: template() });\n\n this.disabled = true;\n this.style.display = 'none';\n\n this._upgradeProperty('clickThrough');\n this._upgradeProperty('player');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._updateFromPlayer();\n }\n\n get clickThrough(): string | null {\n return this.getAttribute(Attribute.CLICKTHROUGH);\n }\n\n set clickThrough(clickThrough: string | null) {\n if (clickThrough == null) {\n this.removeAttribute(Attribute.CLICKTHROUGH);\n } else {\n this.setAttribute(Attribute.CLICKTHROUGH, clickThrough);\n }\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.ads?.removeEventListener(AD_EVENTS, this._updateFromPlayer);\n }\n this._player = player;\n this._updateFromPlayer();\n if (this._player !== undefined) {\n this._player.ads?.addEventListener(AD_EVENTS, this._updateFromPlayer);\n }\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (attrName === Attribute.CLICKTHROUGH && newValue !== oldValue) {\n const hasValue = newValue != null;\n const href = newValue ? String(newValue).trim() : '#';\n this.setLink(href, '_blank');\n this.disabled = !hasValue;\n if (hasValue) {\n this.style.display = '';\n } else {\n this.style.display = 'none';\n }\n }\n if (AdClickThroughButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _updateFromPlayer = () => {\n const ads = this._player?.ads;\n if (!ads || !ads.playing) {\n // No ads playing.\n this.clickThrough = null;\n return;\n }\n const linearAd = arrayFind(ads.currentAds ?? [], isLinearAd);\n if (linearAd === undefined) {\n // No linear ad\n this.clickThrough = null;\n return;\n }\n if (linearAd.integration === 'google-ima') {\n // Google IMA always shows their own clickthrough button.\n this.clickThrough = null;\n return;\n }\n const clickThrough = linearAd.clickThrough;\n if (!clickThrough) {\n // Linear ad has no clickthrough URL.\n this.clickThrough = null;\n return;\n }\n this.clickThrough = clickThrough;\n };\n\n protected override handleClick(): void {\n this._player?.pause();\n }\n}\n\ncustomElements.define('theoplayer-ad-clickthrough-button', AdClickThroughButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-ad-clickthrough-button': AdClickThroughButton;\n }\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { Button, buttonTemplate } from '../Button';\nimport adSkipButtonCss from './AdSkipButton.css';\nimport skipNextIcon from '../../icons/skip-next.svg';\nimport { StateReceiverMixin } from '../StateReceiverMixin';\nimport { Attribute } from '../../util/Attribute';\nimport type { ChromelessPlayer } from 'theoplayer/chromeless';\nimport { arrayFind, setTextContent } from '../../util/CommonUtils';\nimport { isLinearAd } from '../../util/AdUtils';\nimport { createTemplate } from '../../util/TemplateUtils';\n\nconst template = createTemplate(\n 'theoplayer-ad-skip-button',\n buttonTemplate(\n `<span part=\"countdown\">Skip in 0 seconds</span>` +\n `<span part=\"skip\">` +\n `<span part=\"skip-text\"><slot name=\"skip-text\">Skip Ad</slot></span> ` +\n `<span part=\"skip-icon\"><slot name=\"skip-icon\">${skipNextIcon}</slot></span>` +\n `</span>`,\n adSkipButtonCss\n )\n);\n\nconst AD_EVENTS = ['adbegin', 'adend', 'adloaded', 'updatead', 'adskip'] as const;\n\n/**\n * `<theoplayer-ad-skip-button>` - A button that skips the current advertisement (if skippable).\n * If the ad cannot be skipped yet, it shows the remaining time until it can be skipped.\n *\n * @group Components\n */\nexport class AdSkipButton extends StateReceiverMixin(Button, ['player']) {\n private readonly _countdownEl: HTMLElement;\n private readonly _skipEl: HTMLElement;\n private _player: ChromelessPlayer | undefined;\n\n static get observedAttributes() {\n return [...Button.observedAttributes];\n }\n\n constructor() {\n super({ template: template() });\n this._countdownEl = this.shadowRoot!.querySelector('[part=\"countdown\"]')!;\n this._skipEl = this.shadowRoot!.querySelector('[part=\"skip\"]')!;\n\n this._upgradeProperty('player');\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._update();\n }\n\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n set player(player: ChromelessPlayer | undefined) {\n if (this._player === player) {\n return;\n }\n if (this._player !== undefined) {\n this._player.removeEventListener('timeupdate', this._update);\n this._player.ads?.removeEventListener(AD_EVENTS, this._onAdChange);\n }\n this._player = player;\n this._onAdChange();\n if (this._player !== undefined) {\n this._player.ads?.addEventListener(AD_EVENTS, this._onAdChange);\n }\n }\n\n protected override handleClick(): void {\n this._player?.ads?.skip();\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any) {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n if (AdSkipButton.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onAdChange = () => {\n if (this._player?.ads?.playing) {\n this._player.removeEventListener('timeupdate', this._update);\n this._player.addEventListener('timeupdate', this._update);\n } else {\n this._player?.removeEventListener('timeupdate', this._update);\n }\n this._update();\n };\n\n private readonly _update = (): void => {\n const ads = this._player?.ads;\n if (!ads || !ads.playing) {\n // No ads playing.\n this.style.display = 'none';\n return;\n }\n const linearAd = arrayFind(ads.currentAds ?? [], isLinearAd);\n if (linearAd === undefined) {\n // No linear ad.\n this.style.display = 'none';\n return;\n }\n if (linearAd.integration === 'google-ima') {\n // Google IMA always shows their own skip button.\n this.style.display = 'none';\n return;\n }\n const skipOffset = linearAd.skipOffset;\n if (skipOffset === undefined || skipOffset < 0 || (linearAd.duration !== undefined && skipOffset >= linearAd.duration)) {\n // Linear ad is not skippable.\n this.style.display = 'none';\n return;\n }\n const currentTime = this._player!.currentTime;\n if (currentTime < skipOffset) {\n // Show countdown.\n const timeToSkip = Math.ceil(skipOffset - currentTime);\n setTextContent(this._countdownEl, `Skip in ${timeToSkip}s`);\n this._countdownEl.style.visibility = 'visible';\n this._skipEl.style.visibility = 'hidden';\n this._skipEl.style.pointerEvents = 'none';\n this.style.display = '';\n this.setAttribute(Attribute.DISABLED, '');\n this.setAttribute(Attribute.ARIA_LIVE, 'off');\n } else {\n // Show skip button.\n this._countdownEl.style.visibility = 'hidden';\n this._skipEl.style.visibility = 'visible';\n this._skipEl.style.pointerEvents = '';\n this.style.display = '';\n this.removeAttribute(Attribute.DISABLED);\n this.setAttribute(Attribute.ARIA_LIVE, 'polite');\n }\n };\n}\n\ncustomElements.define('theoplayer-ad-skip-button', AdSkipButton);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-ad-skip-button': AdSkipButton;\n }\n}\n","import type { DefaultUI } from '../DefaultUI';\n\n/**\n * An extension for the default UI.\n *\n * This is called whenever a `<theoplayer-default-ui>` element is created.\n * The extension can then choose to modify this element, for example by appending extra elements\n * or attaching extra event listeners.\n *\n * @example\n * The following extension adds an extra button to the bottom control bar of every default UI:\n * ```javascript\n * THEOplayerUI.registerExtension((ui) => {\n * // Create a new button\n * const button = new THEOplayerUI.Button();\n * button.innerHTML = \"Click me!\";\n * button.addEventListener(\"click\", () => alert(\"I was clicked!\"));\n * // Place it in the bottom control bar\n * button.slot = \"bottom-control-bar\";\n * ui.appendChild(button);\n * });\n * ```\n * See the documentation of `<theoplayer-default-ui>` for more information about the available slots\n * in which you can add extra elements.\n */\nexport type Extension = (ui: DefaultUI) => void;\n\nconst extensionRegistry: Extension[] = [];\n\n/**\n * Registers an extension for the default UI.\n *\n * @param extension The extension.\n * @see {@link Extension}\n */\nexport function registerExtension(extension: Extension): void {\n extensionRegistry.push(extension);\n}\n\nexport function applyExtensions(ui: DefaultUI): void {\n for (const extension of extensionRegistry) {\n extension(ui);\n }\n}\n","export interface FullscreenAPIMap {\n requestFullscreen_: 'requestFullscreen';\n exitFullscreen_: 'exitFullscreen';\n fullscreenElement_: 'fullscreenElement';\n fullscreenEnabled_: 'fullscreenEnabled';\n fullscreenchange_: 'fullscreenchange';\n fullscreenerror_: 'fullscreenerror';\n}\n\nexport const fullscreenAPI: FullscreenAPIMap | undefined = (() => {\n if (typeof document === 'undefined') {\n return;\n }\n\n // browser API methods\n // map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js\n const apiMap: string[][] = [\n // Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n ['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],\n // WebKit\n [\n 'webkitRequestFullscreen',\n 'webkitExitFullscreen',\n 'webkitFullscreenElement',\n 'webkitFullscreenEnabled',\n 'webkitfullscreenchange',\n 'webkitfullscreenerror'\n ],\n // Old WebKit (Safari 5.1)\n [\n 'webkitRequestFullScreen',\n 'webkitCancelFullScreen',\n 'webkitCurrentFullScreenElement',\n 'webkitCancelFullScreen',\n 'webkitfullscreenchange',\n 'webkitfullscreenerror'\n ],\n // Mozilla\n ['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],\n // Microsoft\n ['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']\n ];\n\n for (let browserMap of apiMap) {\n // check for exitFullscreen function\n if (browserMap[1] in document) {\n return {\n requestFullscreen_: browserMap[0],\n exitFullscreen_: browserMap[1],\n fullscreenElement_: browserMap[2],\n fullscreenEnabled_: browserMap[3],\n fullscreenchange_: browserMap[4],\n fullscreenerror_: browserMap[5]\n } as FullscreenAPIMap;\n }\n }\n\n return undefined;\n})();\n","/**\n * User-Agent Client Hints\n * https://wicg.github.io/ua-client-hints/\n */\ninterface NavigatorUA extends Navigator {\n readonly userAgentData: NavigatorUAData;\n}\n\ninterface NavigatorUAData {\n readonly mobile: boolean;\n}\n\nexport function isMobile(): boolean {\n if (typeof navigator !== 'object') {\n return false;\n }\n if ((navigator as NavigatorUA).userAgentData) {\n return (navigator as NavigatorUA).userAgentData.mobile;\n }\n const userAgent = navigator.userAgent;\n if (!userAgent) {\n return false;\n }\n return /Android|iPhone|iPad|iPod|Mobile Safari|Windows Phone/i.test(userAgent);\n}\n\nexport function isTv(): boolean {\n if (typeof navigator !== 'object') {\n return false;\n }\n const userAgent = navigator.userAgent;\n if (!userAgent) {\n return false;\n }\n return /\\b(tv|smart-tv|smarttv|appletv|crkey|googletv|hbbtv|pov_tv|roku|viera|nettv|philipstv)\\b/i.test(userAgent);\n}\n","import type { StreamType } from '../util/StreamType';\n\nexport const STREAM_TYPE_CHANGE_EVENT = 'theoplayerstreamtypechange' as const;\n\nexport interface StreamTypeChangeEvent extends CustomEvent<StreamTypeChangeEventDetail> {\n type: typeof STREAM_TYPE_CHANGE_EVENT;\n}\n\nexport interface StreamTypeChangeEventDetail {\n streamType: StreamType;\n}\n","export const READY_EVENT = 'theoplayerready' as const;\n\nexport interface ReadyEvent extends CustomEvent<undefined> {\n type: typeof READY_EVENT;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport { ChromelessPlayer, type MediaTrack, type PlayerConfiguration, type SourceDescription, type VideoQuality } from 'theoplayer/chromeless';\nimport elementCss from './UIContainer.css';\nimport elementHtml from './UIContainer.html';\nimport {\n arrayFind,\n arrayRemove,\n containsComposedNode,\n getFocusableChildren,\n getTvFocusChildren,\n isElement,\n isHTMLElement,\n noOp,\n toggleAttribute\n} from './util/CommonUtils';\nimport { forEachStateReceiverElement, type StateReceiverElement, StateReceiverProps } from './components/StateReceiverMixin';\nimport { TOGGLE_MENU_EVENT, type ToggleMenuEvent } from './events/ToggleMenuEvent';\nimport { CLOSE_MENU_EVENT } from './events/CloseMenuEvent';\nimport { ENTER_FULLSCREEN_EVENT, type EnterFullscreenEvent } from './events/EnterFullscreenEvent';\nimport { EXIT_FULLSCREEN_EVENT, type ExitFullscreenEvent } from './events/ExitFullscreenEvent';\nimport { fullscreenAPI } from './util/FullscreenUtils';\nimport { Attribute } from './util/Attribute';\nimport { isMobile, isTv } from './util/Environment';\nimport { Rectangle } from './util/GeometryUtils';\nimport { PREVIEW_TIME_CHANGE_EVENT, type PreviewTimeChangeEvent } from './events/PreviewTimeChangeEvent';\nimport type { StreamType } from './util/StreamType';\nimport type { StreamTypeChangeEvent } from './events/StreamTypeChangeEvent';\nimport { STREAM_TYPE_CHANGE_EVENT } from './events/StreamTypeChangeEvent';\nimport { createCustomEvent } from './util/EventUtils';\nimport { getTargetQualities } from './util/TrackUtils';\nimport { MenuGroup } from './components/MenuGroup';\nimport { MENU_CHANGE_EVENT } from './events/MenuChangeEvent';\nimport type { DeviceType } from './util/DeviceType';\nimport { getFocusedChild, navigateByArrowKey } from './util/KeyboardNavigation';\nimport { isArrowKey, isBackKey, KeyCode } from './util/KeyCode';\nimport { READY_EVENT } from './events/ReadyEvent';\nimport { createTemplate } from './util/TemplateUtils';\n\n// Load components used in template\nimport './components/GestureReceiver';\n\nconst template = createTemplate('theoplayer-ui', `<style>${elementCss}</style>${elementHtml}`);\n\nconst DEFAULT_USER_IDLE_TIMEOUT = 2;\nconst DEFAULT_TV_USER_IDLE_TIMEOUT = 5;\nconst DEFAULT_DVR_THRESHOLD = 60;\n\n/**\n * `<theoplayer-ui>` - The container element for a THEOplayer UI.\n *\n * This element provides a basic layout structure for a general player UI, and handles the creation and management\n * of a {@link theoplayer!ChromelessPlayer | THEOplayer player instance} for this UI.\n *\n * ## Usage\n *\n * 1. Create a `<theoplayer-ui>` element.\n * 1. Place your UI elements as children of the `<theoplayer-ui>`.\n * Set their `slot` attribute to one of the defined slots (see below) to place them in the layout.\n * 1. Set its `configuration` attribute or property to a valid player configuration.\n * 1. Set its `source` attribute or property to a valid stream source.\n *\n * ## Customization\n *\n * This element does not provide any UI elements by default, you need to add all elements as children of\n * the `<theoplayer-ui>` element. If you're looking for a simple out-of-the-box player experience instead,\n * see {@link DefaultUI | `<theoplayer-default-ui>`}.\n *\n * The styling can be controlled using CSS custom properties (see below).\n *\n * @attribute `configuration` - The THEOplayer {@link theoplayer!PlayerConfiguration | PlayerConfiguration}, as a JSON string.\n * @attribute `source` - The THEOplayer {@link theoplayer!SourceDescription | SourceDescription}, as a JSON string.\n * @attribute `fluid` - If set, the player automatically adjusts its height to fit the video's aspect ratio.\n * @attribute `muted` - If set, the player starts out as muted. Reflects `ui.player.muted`.\n * @attribute `autoplay` - If set, the player attempts to automatically start playing (if allowed).\n * @attribute `device-type` - The device type, either \"desktop\", \"mobile\" or \"tv\".\n * Can be used in CSS to show/hide certain device-specific UI controls.\n * @attribute `mobile` - Whether the user is on a mobile device. Equivalent to `device-type == \"mobile\"`.\n * @attribute `tv` - Whether the user is on a TV device. Equivalent to `device-type == \"tv\"`.\n * @attribute `stream-type` - The stream type, either \"vod\", \"live\" or \"dvr\".\n * Can be used to show/hide certain UI controls specific for livestreams, such as\n * a {@link LiveButton | `<theoplayer-live-button>`}.\n * If you know in advance that the source will be a livestream, you can set this attribute to avoid a screen flicker\n * when the player switches between its VOD-specific and live-only controls.\n * @attribute `user-idle` (readonly) - Whether the user is considered to be \"idle\".\n * When the user is idle and the video is playing, all slotted UI elements will be hidden\n * (unless they have the `no-auto-hide` attribute).\n * @attribute `user-idle-timeout` - The timeout (in seconds) between when the user stops interacting with the UI,\n * and when the user is considered to be \"idle\".\n * @attribute `dvr-threshold` - The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n * and its stream type to be set to \"dvr\".\n * @attribute `paused` (readonly) - Whether the player is paused. Reflects `ui.player.paused`.\n * @attribute `ended` (readonly) - Whether the player is ended. Reflects `ui.player.ended`.\n * @attribute `casting` (readonly) - Whether the player is casting. Reflects `ui.player.cast.casting`.\n * @attribute `playing-ad` (readonly) - Whether the player is playing a linear ad. Reflects `ui.player.ads.playing`.\n * @attribute `has-error` (readonly) - Whether the player has encountered a fatal error.\n * @attribute `has-first-play` (readonly) - Whether the player has (previously) started playback for this stream.\n * Can be used in CSS to show/hide certain initial controls, such as a poster image or a centered play button.\n *\n * @slot `(no` name, default slot) - A slot for controls at the bottom of the player.\n * Can be used for controls such as a play button ({@link PlayButton | `<theoplayer-play-button>`}) or a seek bar\n * ({@link TimeRange | `<theoplayer-time-range>`}).\n * @slot `top-chrome` - A slot for controls at the top of the player.\n * Can be used to display the stream's title, or for a cast button ({@link ChromecastButton | `<theoplayer-chromecast-button>`}).\n * @slot `middle-chrome` - A slot for controls in the middle of the player (between the top and bottom chrome).\n * @slot `centered-chrome` - A slot for controls centered on the player, on top of other controls.\n * @slot `centered-loading` - A slot for a loading indicator centered on the player, on top of other controls\n * but behind the centered chrome.\n * @slot `menu` - A slot for extra menus (see {@link Menu | `<theoplayer-menu>`}).\n * @slot `error` - A slot for an error display, to show when the player encounters a fatal error\n * (see {@link ErrorDisplay | `<theoplayer-error-display>`}).\n * @group Components\n */\nexport class UIContainer extends HTMLElement {\n /**\n * Fired when the backing player is created, and the {@link UIContainer.player} property is set.\n *\n * @group Events\n */\n static READY_EVENT: typeof READY_EVENT = READY_EVENT;\n\n static get observedAttributes() {\n return [\n Attribute.CONFIGURATION,\n Attribute.SOURCE,\n Attribute.MUTED,\n Attribute.AUTOPLAY,\n Attribute.FULLSCREEN,\n Attribute.FLUID,\n Attribute.DEVICE_TYPE,\n Attribute.PAUSED,\n Attribute.ENDED,\n Attribute.CASTING,\n Attribute.PLAYING_AD,\n Attribute.HAS_ERROR,\n Attribute.HAS_FIRST_PLAY,\n Attribute.STREAM_TYPE,\n Attribute.DVR_THRESHOLD,\n Attribute.USER_IDLE,\n Attribute.USER_IDLE_TIMEOUT\n ];\n }\n\n private _configuration: PlayerConfiguration = {};\n private readonly _playerEl: HTMLElement;\n private readonly _menuEl: HTMLElement;\n private readonly _menuGroup: MenuGroup;\n private _menuOpener: HTMLElement | undefined;\n private readonly _topChromeEl: HTMLElement;\n private readonly _topChromeSlot: HTMLSlotElement;\n private readonly _bottomChromeEl: HTMLElement;\n private readonly _bottomChromeSlot: HTMLSlotElement;\n\n private _pointerType: string = '';\n private _lastPointerUpTime: number = 0;\n private readonly _mutationObserver: MutationObserver;\n private readonly _resizeObserver: ResizeObserver | undefined;\n private readonly _stateReceivers: StateReceiverElement[] = [];\n private _player: ChromelessPlayer | undefined = undefined;\n private _source: SourceDescription | undefined = undefined;\n private _userIdleTimer: number = 0;\n private _previewTime: number = NaN;\n private _activeVideoTrack: MediaTrack | undefined = undefined;\n\n /**\n * Creates a new THEOplayer UI container element.\n *\n * @param configuration - The player configuration.\n * Will be passed to the {@link theoplayer!ChromelessPlayer | ChromelessPlayer} constructor to create\n * the underlying THEOplayer instance.\n * Can also be set later on through the {@link configuration} property.\n */\n constructor(configuration: PlayerConfiguration = {}) {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._configuration = configuration;\n\n this._playerEl = shadowRoot.querySelector('[part~=\"media-layer\"]')!;\n this._menuEl = shadowRoot.querySelector('[part~=\"menu-layer\"]')!;\n this._menuGroup = shadowRoot.querySelector('theoplayer-menu-group')!;\n this._topChromeEl = shadowRoot.querySelector('[part~=\"top\"]')!;\n this._topChromeSlot = shadowRoot.querySelector('slot[name=\"top-chrome\"]')!;\n this._bottomChromeEl = shadowRoot.querySelector('[part~=\"bottom\"]')!;\n this._bottomChromeSlot = shadowRoot.querySelector('slot:not([name])')!;\n\n this._mutationObserver = new MutationObserver(this._onMutation);\n if (typeof ResizeObserver !== 'undefined') {\n this._resizeObserver = new ResizeObserver(this._updateTextTrackMargins);\n }\n\n shadowRoot.addEventListener(TOGGLE_MENU_EVENT, this._onToggleMenu);\n shadowRoot.addEventListener(ENTER_FULLSCREEN_EVENT, this._onEnterFullscreen);\n shadowRoot.addEventListener(EXIT_FULLSCREEN_EVENT, this._onExitFullscreen);\n shadowRoot.addEventListener(PREVIEW_TIME_CHANGE_EVENT, this._onPreviewTimeChange);\n\n this._topChromeSlot.addEventListener('transitionstart', this._onChromeSlotTransition);\n this._topChromeSlot.addEventListener('transitionend', this._onChromeSlotTransition);\n this._bottomChromeSlot.addEventListener('transitionstart', this._onChromeSlotTransition);\n this._bottomChromeSlot.addEventListener('transitionend', this._onChromeSlotTransition);\n\n this._upgradeProperty('configuration');\n this._upgradeProperty('source');\n this._upgradeProperty('fluid');\n this._upgradeProperty('muted');\n this._upgradeProperty('autoplay');\n this._upgradeProperty('userIdleTimeout');\n this._upgradeProperty('streamType');\n\n this.tryInitializePlayer_();\n }\n\n private _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * The underlying THEOplayer player instance.\n *\n * This is constructed automatically as soon as a valid {@link configuration} is set.\n */\n get player(): ChromelessPlayer | undefined {\n return this._player;\n }\n\n /**\n * The player configuration.\n *\n * Used to create the underlying THEOplayer instance.\n */\n get configuration(): PlayerConfiguration {\n return this._configuration;\n }\n\n set configuration(playerConfiguration: PlayerConfiguration) {\n this.removeAttribute(Attribute.CONFIGURATION);\n this._setConfiguration(playerConfiguration);\n }\n\n private _setConfiguration(playerConfiguration: PlayerConfiguration): void {\n this._configuration = playerConfiguration ?? {};\n this.tryInitializePlayer_();\n }\n\n /**\n * The player's current source.\n */\n get source(): SourceDescription | undefined {\n return this._player ? this._player.source : this._source;\n }\n\n set source(value: SourceDescription | undefined) {\n this.removeAttribute(Attribute.SOURCE);\n this._setSource(value);\n }\n\n private _setSource(value: SourceDescription | undefined): void {\n if (this._player) {\n this._player.source = value;\n } else {\n this._source = value;\n }\n }\n\n /**\n * Whether to automatically adjusts the player's height to fit the video's aspect ratio.\n */\n get fluid(): boolean {\n return this.hasAttribute(Attribute.FLUID);\n }\n\n set fluid(value: boolean) {\n toggleAttribute(this, Attribute.FLUID, value);\n }\n\n /**\n * Whether the player's audio is muted.\n */\n get muted(): boolean {\n return this.hasAttribute(Attribute.MUTED);\n }\n\n set muted(value: boolean) {\n toggleAttribute(this, Attribute.MUTED, value);\n }\n\n /**\n * Whether the player should attempt to automatically start playback.\n */\n get autoplay(): boolean {\n return this.hasAttribute(Attribute.AUTOPLAY);\n }\n\n set autoplay(value: boolean) {\n toggleAttribute(this, Attribute.AUTOPLAY, value);\n }\n\n /**\n * Whether the UI is in fullscreen mode.\n */\n get fullscreen(): boolean {\n return this.hasAttribute(Attribute.FULLSCREEN);\n }\n\n /**\n * Whether the player is paused.\n */\n get paused(): boolean {\n return this.hasAttribute(Attribute.PAUSED);\n }\n\n /**\n * Whether the player is ended.\n */\n get ended(): boolean {\n return this.hasAttribute(Attribute.ENDED);\n }\n\n /**\n * Whether the player is casting to a remote receiver.\n */\n get casting(): boolean {\n return this.hasAttribute(Attribute.CASTING);\n }\n\n /**\n * The timeout (in seconds) between when the user stops interacting with the UI,\n * and when the user is considered to be \"idle\".\n */\n get userIdleTimeout(): number {\n const defaultTimeout = this.deviceType === 'tv' ? DEFAULT_TV_USER_IDLE_TIMEOUT : DEFAULT_USER_IDLE_TIMEOUT;\n return Number(this.getAttribute(Attribute.USER_IDLE_TIMEOUT) ?? defaultTimeout);\n }\n\n set userIdleTimeout(value: number) {\n value = Number(value);\n this.setAttribute(Attribute.USER_IDLE_TIMEOUT, String(isNaN(value) ? 0 : value));\n }\n\n /**\n * The device type, either \"desktop\", \"mobile\" or \"tv\".\n */\n get deviceType(): DeviceType {\n return (this.getAttribute(Attribute.DEVICE_TYPE) as DeviceType) || 'desktop';\n }\n\n /**\n * The stream type, either \"vod\", \"live\" or \"dvr\".\n *\n * If you know in advance that the source will be a livestream, you can set this property to avoid a screen flicker\n * when the player switches between its VOD-specific and live-only controls.\n */\n get streamType(): StreamType {\n return (this.getAttribute(Attribute.STREAM_TYPE) as StreamType) || 'vod';\n }\n\n set streamType(streamType: StreamType) {\n this.setAttribute(Attribute.STREAM_TYPE, streamType);\n }\n\n /**\n * The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n * and its stream type to be set to \"dvr\".\n */\n get dvrThreshold(): number {\n return Number(this.getAttribute(Attribute.DVR_THRESHOLD) ?? DEFAULT_DVR_THRESHOLD);\n }\n\n set dvrThreshold(value: number) {\n value = Number(value);\n this.setAttribute(Attribute.DVR_THRESHOLD, String(isNaN(value) ? 0 : value));\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!(this._menuGroup instanceof MenuGroup)) {\n customElements.upgrade(this._menuGroup);\n }\n\n if (!this.hasAttribute(Attribute.DEVICE_TYPE)) {\n const deviceType: DeviceType = isMobile() ? 'mobile' : isTv() ? 'tv' : 'desktop';\n this.setAttribute(Attribute.DEVICE_TYPE, deviceType);\n }\n if (!this.hasAttribute(Attribute.PAUSED)) {\n this.setAttribute(Attribute.PAUSED, '');\n }\n\n this.tryInitializePlayer_();\n\n for (const receiver of this._stateReceivers) {\n this.propagateStateToReceiver_(receiver);\n }\n void forEachStateReceiverElement(this, this._playerEl, this.registerStateReceiver_);\n this._mutationObserver.observe(this, { childList: true, subtree: true });\n this.shadowRoot!.addEventListener('slotchange', this._onSlotChange);\n\n this._resizeObserver?.observe(this);\n this._updateTextTrackMargins();\n\n this._menuGroup.addEventListener(CLOSE_MENU_EVENT, this._onCloseMenu);\n this._menuGroup.addEventListener(MENU_CHANGE_EVENT, this._onMenuChange);\n\n if (fullscreenAPI !== undefined) {\n document.addEventListener(fullscreenAPI.fullscreenchange_, this._onFullscreenChange);\n document.addEventListener(fullscreenAPI.fullscreenerror_, this._onFullscreenChange);\n this._onFullscreenChange();\n }\n\n this.setUserIdle_();\n if (this.deviceType === 'tv') {\n window.addEventListener('keydown', this._onTvKeyDown);\n }\n this.addEventListener('keyup', this._onKeyUp);\n this.addEventListener('pointerup', this._onPointerUp);\n this.addEventListener('pointermove', this._onPointerMove);\n this.addEventListener('mouseleave', this._onMouseLeave);\n }\n\n private tryInitializePlayer_(): void {\n if (this._player !== undefined) {\n return;\n }\n if (this._configuration.license === undefined && this._configuration.licenseUrl === undefined) {\n return;\n }\n\n this._player = new ChromelessPlayer(this._playerEl, this._configuration);\n if (this._source) {\n this._player.source = this._source;\n this._source = undefined;\n }\n this._player.muted = this.muted;\n this._player.autoplay = this.autoplay;\n\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('player') >= 0) {\n receiver.player = this._player;\n }\n }\n\n this._updateAspectRatio();\n this._updateError();\n this._updatePausedAndEnded();\n this._updateCasting();\n this._player.addEventListener('resize', this._updateAspectRatio);\n this._player.addEventListener(['error', 'sourcechange', 'emptied'], this._updateError);\n this._player.addEventListener('volumechange', this._updateMuted);\n this._player.addEventListener('play', this._onPlay);\n this._player.addEventListener('pause', this._onPause);\n this._player.addEventListener(['ended', 'emptied'], this._updatePausedAndEnded);\n this._player.addEventListener(['durationchange', 'sourcechange', 'emptied'], this._updateStreamType);\n this._player.addEventListener('ratechange', this._updatePlaybackRate);\n this._player.addEventListener('sourcechange', this._onSourceChange);\n this._player.videoTracks.addEventListener(['addtrack', 'removetrack', 'change'], this._updateActiveVideoTrack);\n this._player.cast?.addEventListener('castingchange', this._updateCasting);\n this._player.addEventListener(['durationchange', 'sourcechange', 'emptied'], this._updatePlayingAd);\n this._player.ads?.addEventListener(['adbreakbegin', 'adbreakend', 'adbegin', 'adend', 'adskip'], this._updatePlayingAd);\n\n this.dispatchEvent(createCustomEvent(READY_EVENT));\n }\n\n disconnectedCallback(): void {\n this._resizeObserver?.disconnect();\n this._mutationObserver.disconnect();\n this.shadowRoot!.removeEventListener('slotchange', this._onSlotChange);\n for (const receiver of this._stateReceivers) {\n this.removeStateFromReceiver_(receiver);\n }\n this._stateReceivers.length = 0;\n\n this._menuGroup.removeEventListener(CLOSE_MENU_EVENT, this._onCloseMenu);\n this._menuGroup.removeEventListener(MENU_CHANGE_EVENT, this._onMenuChange);\n\n if (fullscreenAPI !== undefined) {\n document.removeEventListener(fullscreenAPI.fullscreenchange_, this._onFullscreenChange);\n document.removeEventListener(fullscreenAPI.fullscreenerror_, this._onFullscreenChange);\n }\n\n window.removeEventListener('keydown', this._onTvKeyDown);\n this.removeEventListener('keyup', this._onKeyUp);\n this.removeEventListener('pointerup', this._onPointerUp);\n this.removeEventListener('click', this._onClickAfterPointerUp, true);\n this.removeEventListener('pointermove', this._onPointerMove);\n this.removeEventListener('mouseleave', this._onMouseLeave);\n\n if (this._player) {\n this._player.destroy();\n this._player = undefined;\n }\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any): void {\n if (newValue === oldValue) {\n return;\n }\n const hasValue = newValue != null;\n if (attrName === Attribute.CONFIGURATION) {\n this._setConfiguration(newValue ? (JSON.parse(newValue) as PlayerConfiguration) : {});\n } else if (attrName === Attribute.SOURCE) {\n this._setSource(newValue ? (JSON.parse(newValue) as SourceDescription) : undefined);\n } else if (attrName === Attribute.MUTED) {\n if (this._player) {\n this._player.muted = hasValue;\n }\n } else if (attrName === Attribute.AUTOPLAY) {\n if (this._player) {\n this._player.autoplay = hasValue;\n }\n } else if (attrName === Attribute.FULLSCREEN) {\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('fullscreen') >= 0) {\n receiver.fullscreen = hasValue;\n }\n }\n } else if (attrName === Attribute.DEVICE_TYPE) {\n toggleAttribute(this, Attribute.MOBILE, newValue === 'mobile');\n toggleAttribute(this, Attribute.TV, newValue === 'tv');\n window.removeEventListener('keydown', this._onTvKeyDown);\n if (newValue === 'tv') {\n window.addEventListener('keydown', this._onTvKeyDown);\n }\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('deviceType') >= 0) {\n receiver.deviceType = newValue;\n }\n }\n } else if (attrName === Attribute.STREAM_TYPE) {\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('streamType') >= 0) {\n receiver.streamType = newValue;\n }\n }\n const streamTypeChangeEvent: StreamTypeChangeEvent = createCustomEvent(STREAM_TYPE_CHANGE_EVENT, {\n bubbles: true,\n composed: true,\n detail: { streamType: newValue }\n });\n this.dispatchEvent(streamTypeChangeEvent);\n } else if (attrName === Attribute.FLUID) {\n this._updateAspectRatio();\n } else if (attrName === Attribute.USER_IDLE || attrName === Attribute.PAUSED || attrName === Attribute.CASTING) {\n this._updateTextTrackMargins();\n } else if (attrName === Attribute.DVR_THRESHOLD) {\n this._updateStreamType();\n }\n if (UIContainer.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _onMutation = (mutations: MutationRecord[]): void => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n const { addedNodes, removedNodes } = mutation;\n for (let i = 0; i < addedNodes.length; i++) {\n const node = addedNodes[i];\n if (isElement(node)) {\n void forEachStateReceiverElement(node, this._playerEl, this.registerStateReceiver_);\n }\n }\n for (let i = 0; i < removedNodes.length; i++) {\n const node = removedNodes[i];\n if (isElement(node)) {\n void forEachStateReceiverElement(node, this._playerEl, this.unregisterStateReceiver_);\n }\n }\n }\n }\n };\n\n private readonly _onSlotChange = (): void => {\n void forEachStateReceiverElement(this, this._playerEl, this.registerStateReceiver_);\n this._updateTextTrackMargins();\n };\n\n private readonly registerStateReceiver_ = (receiver: StateReceiverElement): void => {\n if (this._stateReceivers.indexOf(receiver) >= 0) {\n return;\n }\n this._stateReceivers.push(receiver);\n this.propagateStateToReceiver_(receiver);\n };\n\n private readonly unregisterStateReceiver_ = (receiver: StateReceiverElement): void => {\n if (!arrayRemove(this._stateReceivers, receiver)) {\n return;\n }\n this.removeStateFromReceiver_(receiver);\n };\n\n private propagateStateToReceiver_(receiver: StateReceiverElement): void {\n const receiverProps = receiver[StateReceiverProps];\n if (receiverProps.indexOf('player') >= 0) {\n receiver.player = this._player;\n }\n if (receiverProps.indexOf('fullscreen') >= 0) {\n receiver.fullscreen = this.fullscreen;\n }\n if (receiverProps.indexOf('deviceType') >= 0) {\n receiver.deviceType = this.deviceType;\n }\n if (receiverProps.indexOf('streamType') >= 0) {\n receiver.streamType = this.streamType;\n }\n if (this._player !== undefined) {\n if (receiverProps.indexOf('playbackRate') >= 0) {\n receiver.playbackRate = this._player.playbackRate;\n }\n if (receiverProps.indexOf('error') >= 0) {\n receiver.error = this._player.errorObject;\n }\n if (receiverProps.indexOf('activeVideoQuality') >= 0) {\n receiver.activeVideoQuality = this._activeVideoTrack?.activeQuality as VideoQuality | undefined;\n }\n if (receiverProps.indexOf('targetVideoQualities') >= 0) {\n receiver.targetVideoQualities = getTargetQualities(this._activeVideoTrack) as VideoQuality[] | undefined;\n }\n }\n if (receiverProps.indexOf('previewTime') >= 0) {\n receiver.previewTime = this._previewTime;\n }\n }\n\n private removeStateFromReceiver_(receiver: StateReceiverElement): void {\n const receiverProps = receiver[StateReceiverProps];\n if (receiverProps.indexOf('player') >= 0) {\n receiver.player = undefined;\n }\n }\n\n private openMenu_(menuToOpen: string, opener: HTMLElement | undefined): void {\n const topChromeRect = Rectangle.fromRect(this._topChromeEl.getBoundingClientRect());\n const bottomChromeRect = Rectangle.fromRect(this._bottomChromeEl.getBoundingClientRect());\n\n // Open menu in same quadrant as its opener\n // If there's no opener, open in bottom right corner by default\n let alignBottom: boolean = true;\n let alignRight: boolean = true;\n if (opener !== undefined) {\n const playerRect = Rectangle.fromRect(this.getBoundingClientRect());\n const openerRect = Rectangle.fromRect(opener.getBoundingClientRect());\n if (playerRect.width > 0 && playerRect.height > 0) {\n alignBottom = openerRect.top >= playerRect.top + playerRect.height / 2;\n alignRight = openerRect.left >= playerRect.left + playerRect.width / 2;\n }\n }\n\n this._menuGroup.openMenu(menuToOpen, opener);\n this._menuOpener = opener;\n\n const props = {\n '--theoplayer-menu-offset-top': `${Math.round(topChromeRect.height)}px`,\n '--theoplayer-menu-offset-bottom': `${Math.round(bottomChromeRect.height)}px`,\n '--theoplayer-menu-margin-top': alignBottom ? 'auto' : '0',\n '--theoplayer-menu-margin-bottom': alignBottom ? '0' : 'auto',\n '--theoplayer-menu-margin-left': alignRight ? 'auto' : '0',\n '--theoplayer-menu-margin-right': alignRight ? '0' : 'auto'\n };\n shadyCss.styleSubtree(this, props);\n }\n\n private closeMenu_(): void {\n // Menu group might not be upgraded yet\n this._menuGroup.closeMenu?.();\n this._menuOpener?.focus();\n this._menuOpener = undefined;\n }\n\n private readonly _onToggleMenu = (rawEvent: Event): void => {\n const event = rawEvent as ToggleMenuEvent;\n event.stopPropagation();\n const menuId = event.detail.menu;\n if (!this._menuGroup.getMenuById(menuId)) {\n console.error(`<theoplayer-ui>: cannot find menu with ID \"${menuId}\"`);\n return;\n }\n const opener = isHTMLElement(event.target) ? event.target : undefined;\n if (this._menuGroup.isMenuOpen(menuId)) {\n this.closeMenu_();\n } else {\n // Always close the previous menu first\n this.closeMenu_();\n this.openMenu_(menuId, opener);\n }\n };\n\n private readonly _onCloseMenu = (event: Event): void => {\n event.stopPropagation();\n this.closeMenu_();\n };\n\n private readonly _onMenuChange = (): void => {\n this._menuEl.removeEventListener('pointerdown', this._onMenuPointerDown);\n this._menuEl.removeEventListener('click', this._onMenuClick);\n if (this._menuGroup.hasCurrentMenu()) {\n this._menuEl.addEventListener('pointerdown', this._onMenuPointerDown);\n this._menuEl.addEventListener('click', this._onMenuClick);\n this.setAttribute(Attribute.MENU_OPENED, '');\n } else {\n this.removeAttribute(Attribute.MENU_OPENED);\n }\n };\n\n private readonly _onMenuPointerDown = (event: PointerEvent) => {\n this._pointerType = event.pointerType;\n };\n\n private readonly _onMenuClick = (event: MouseEvent) => {\n // If the browser doesn't support yet `pointerType` on `click` events,\n // we use the type from the previous `pointerdown` event.\n const pointerType = (event as PointerEvent).pointerType ?? this._pointerType;\n if (event.target === this._menuEl && pointerType === 'mouse') {\n // Close menu when clicking (with mouse) on menu backdrop\n if (this._menuGroup.closeCurrentMenu()) {\n event.preventDefault();\n }\n }\n };\n\n private readonly _onEnterFullscreen = (rawEvent: Event): void => {\n const event = rawEvent as EnterFullscreenEvent;\n event.stopPropagation();\n if (fullscreenAPI && document[fullscreenAPI.fullscreenEnabled_] && this[fullscreenAPI.requestFullscreen_]) {\n const promise = this[fullscreenAPI.requestFullscreen_]();\n if (promise && promise.then) {\n promise.then(noOp, noOp);\n }\n } else if (this._player && this._player.presentation.supportsMode('fullscreen')) {\n this._player.presentation.requestMode('fullscreen');\n }\n };\n\n private readonly _onExitFullscreen = (rawEvent: Event): void => {\n const event = rawEvent as ExitFullscreenEvent;\n event.stopPropagation();\n if (fullscreenAPI) {\n const promise = document[fullscreenAPI.exitFullscreen_]();\n if (promise && promise.then) {\n promise.then(noOp, noOp);\n }\n }\n if (this._player && this._player.presentation.currentMode === 'fullscreen') {\n this._player.presentation.requestMode('inline');\n }\n };\n\n private readonly _onFullscreenChange = (): void => {\n let isFullscreen: boolean = false;\n if (fullscreenAPI !== undefined) {\n const fullscreenElement = document[fullscreenAPI.fullscreenElement_];\n if (fullscreenElement) {\n // If <theoplayer-ui> is nested within another custom element,\n // then document.fullscreenElement will equal that other custom element.\n // Look for the nearest shadow host that is contained in the fullscreen element.\n isFullscreen = containsComposedNode(fullscreenElement, this);\n }\n }\n if (!isFullscreen && this._player !== undefined && this._player.presentation.currentMode === 'fullscreen') {\n isFullscreen = true;\n }\n toggleAttribute(this, Attribute.FULLSCREEN, isFullscreen);\n };\n\n private readonly _updateAspectRatio = (): void => {\n if (this._player === undefined) {\n return;\n }\n const { videoWidth, videoHeight } = this._player;\n if (videoWidth > 0 && videoHeight > 0) {\n shadyCss.styleSubtree(this, {\n '--theoplayer-video-width': `${videoWidth}`,\n '--theoplayer-video-height': `${videoHeight}`\n });\n } else {\n shadyCss.styleSubtree(this, {\n '--theoplayer-video-width': '',\n '--theoplayer-video-height': ''\n });\n }\n };\n\n private readonly _updateError = (): void => {\n const error = this._player?.errorObject;\n toggleAttribute(this, Attribute.HAS_ERROR, error !== undefined);\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('error') >= 0) {\n receiver.error = error;\n }\n }\n };\n\n private readonly _onPlay = (): void => {\n this.setAttribute(Attribute.HAS_FIRST_PLAY, '');\n this.removeAttribute(Attribute.PAUSED);\n this._updateEnded();\n };\n\n private readonly _onPause = (): void => {\n this.setAttribute(Attribute.PAUSED, '');\n this._updateEnded();\n };\n\n private readonly _updatePausedAndEnded = (): void => {\n const paused = this._player ? this._player.paused : true;\n toggleAttribute(this, Attribute.PAUSED, paused);\n this._updateEnded();\n };\n\n private readonly _updateEnded = (): void => {\n const ended = this._player ? this._player.ended : false;\n toggleAttribute(this, Attribute.ENDED, ended);\n };\n\n private readonly _updateStreamType = (): void => {\n if (this._player === undefined) {\n return;\n }\n const duration = this._player.duration;\n if (isNaN(duration)) {\n return;\n }\n let streamType: StreamType;\n if (duration === Infinity) {\n streamType = 'live';\n const dvrThreshold = this.dvrThreshold;\n const seekable = this._player.seekable;\n if (dvrThreshold <= 0 || (seekable.length > 0 && seekable.end(seekable.length - 1) - seekable.start(0) >= dvrThreshold)) {\n streamType = 'dvr';\n }\n } else {\n streamType = 'vod';\n }\n this.streamType = streamType;\n };\n\n private readonly _updatePlaybackRate = (): void => {\n if (this._player === undefined) {\n return;\n }\n const playbackRate = this._player.playbackRate;\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('playbackRate') >= 0) {\n receiver.playbackRate = playbackRate;\n }\n }\n };\n\n private readonly _updateMuted = (): void => {\n if (this._player === undefined) {\n return;\n }\n this.muted = this._player.muted;\n };\n\n private readonly _updateActiveVideoTrack = (): void => {\n if (this._player === undefined) {\n return;\n }\n const activeVideoTrack = arrayFind(this._player.videoTracks, (track) => track.enabled);\n if (this._activeVideoTrack !== activeVideoTrack) {\n this._activeVideoTrack?.removeEventListener('activequalitychanged', this._updateActiveVideoQuality);\n this._activeVideoTrack?.removeEventListener('targetqualitychanged', this._updateTargetVideoQualities);\n this._activeVideoTrack = activeVideoTrack;\n this._updateActiveVideoQuality();\n this._updateTargetVideoQualities();\n this._activeVideoTrack?.addEventListener('activequalitychanged', this._updateActiveVideoQuality);\n this._activeVideoTrack?.addEventListener('targetqualitychanged', this._updateTargetVideoQualities);\n }\n };\n\n private readonly _updateActiveVideoQuality = (): void => {\n const activeVideoQuality = this._activeVideoTrack?.activeQuality as VideoQuality | undefined;\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('activeVideoQuality') >= 0) {\n receiver.activeVideoQuality = activeVideoQuality;\n }\n }\n };\n\n private readonly _updateTargetVideoQualities = (): void => {\n const targetVideoQualities = getTargetQualities(this._activeVideoTrack) as VideoQuality[] | undefined;\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('targetVideoQualities') >= 0) {\n receiver.targetVideoQualities = targetVideoQualities;\n }\n }\n };\n\n private readonly _updateCasting = (): void => {\n const casting = this._player?.cast?.casting ?? false;\n toggleAttribute(this, Attribute.CASTING, casting);\n };\n\n private readonly _updatePlayingAd = (): void => {\n const playingAd = this._player?.ads?.playing ?? false;\n toggleAttribute(this, Attribute.PLAYING_AD, playingAd);\n };\n\n private readonly _onSourceChange = (): void => {\n this.closeMenu_();\n const isPlaying = this._player !== undefined && !this._player.paused;\n toggleAttribute(this, Attribute.HAS_FIRST_PLAY, isPlaying);\n };\n\n private isUserIdle_(): boolean {\n // Must match the auto-hide rule from the CSS\n return this.hasAttribute(Attribute.USER_IDLE) && !this.paused && !this.casting && !this._menuGroup.hasCurrentMenu();\n }\n\n private setUserActive_(): void {\n clearTimeout(this._userIdleTimer);\n this.removeAttribute(Attribute.USER_IDLE);\n }\n\n private readonly setUserIdle_ = (): void => {\n clearTimeout(this._userIdleTimer);\n this._userIdleTimer = 0;\n\n if (this.userIdleTimeout < 0) {\n return;\n }\n this.setAttribute(Attribute.USER_IDLE, '');\n\n if (this.deviceType == 'tv' && this.isUserIdle_()) {\n // Blur active element so that first key press on TV doesn't result in an action.\n const focusedChild = getFocusedChild();\n if (focusedChild !== null) {\n focusedChild.blur();\n }\n }\n };\n\n private readonly scheduleUserIdle_ = (): void => {\n this.setUserActive_();\n\n clearTimeout(this._userIdleTimer);\n\n // Setting the timeout to -1 turns off idle detection.\n if (this.userIdleTimeout < 0) {\n this._userIdleTimer = 0;\n return;\n }\n\n this._userIdleTimer = setTimeout(this.setUserIdle_, this.userIdleTimeout * 1000);\n };\n\n private isPlayerOrMedia_(node: Node): boolean {\n return node === this || this._playerEl.contains(node);\n }\n\n private readonly _onTvKeyDown = (event: KeyboardEvent): void => {\n if (isBackKey(event.keyCode)) {\n this.setUserIdle_();\n return;\n }\n const tvFocusChildren = getTvFocusChildren(this);\n const focusableChildren = getFocusableChildren(this);\n let focusedChild = getFocusedChild();\n if (!focusedChild) {\n const children = tvFocusChildren ?? focusableChildren;\n if (children.length > 0) {\n children[0].focus();\n focusedChild = children[0];\n }\n }\n\n if (this.isUserIdle_()) {\n // First button press should only make the UI visible\n return;\n }\n if (event.keyCode === KeyCode.ENTER) {\n if (this._player !== undefined && focusedChild !== null) {\n focusedChild.click();\n }\n } else if (isArrowKey(event.keyCode) && navigateByArrowKey(this, focusableChildren, event.keyCode)) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private readonly _onKeyUp = (event: KeyboardEvent): void => {\n // Show the controls while navigating with the keyboard.\n if (!isBackKey(event.keyCode)) {\n this.scheduleUserIdle_();\n }\n };\n\n private readonly _onPointerUp = (event: PointerEvent): void => {\n if (event.pointerType === 'touch') {\n // On mobile, when you tap the media while the controls are showing, immediately hide the controls.\n // Otherwise, show the controls (and schedule a timer to hide them again later on).\n if (this.isPlayerOrMedia_(event.target! as Node) && !this.hasAttribute(Attribute.USER_IDLE)) {\n this.setUserIdle_();\n } else {\n if (this.isUserIdle_()) {\n // Ignore the next \"click\" event, to prevent accidental button clicks\n // when the user only intended to show the controls.\n this._lastPointerUpTime = performance.now();\n this.addEventListener('click', this._onClickAfterPointerUp, true);\n }\n this.scheduleUserIdle_();\n }\n }\n };\n\n private readonly _onClickAfterPointerUp = (event: MouseEvent): void => {\n this.removeEventListener('click', this._onClickAfterPointerUp, true);\n if (performance.now() - this._lastPointerUpTime < 10) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n private readonly _onPointerMove = (event: PointerEvent): void => {\n // \"pointermove\" doesn't happen with touch on taps on iOS, but does on Android. Therefore, only run for mouse.\n if (event.pointerType !== 'mouse') return;\n\n this.setUserActive_();\n\n // If hovering a control, keep the user active even when they stop moving.\n // Otherwise, when hovering the media, we can consider the user to be idle.\n if (this.isPlayerOrMedia_(event.target! as Node)) {\n this.scheduleUserIdle_();\n }\n };\n\n private readonly _onMouseLeave = (): void => {\n // Immediately hide the controls when mouse leaves the player.\n this.setUserIdle_();\n };\n\n private readonly _onChromeSlotTransition = (event: TransitionEvent): void => {\n // When the control bars become visible, move the text tracks out of the way.\n // When they become invisible, move the text tracks back.\n if (event.propertyName === 'opacity') {\n this._updateTextTrackMargins();\n }\n };\n\n private readonly _updateTextTrackMargins = (): void => {\n const player = this._player;\n if (player === undefined) {\n return;\n }\n const topChromeRect = getVisibleRect(this._topChromeSlot);\n const bottomChromeRect = getVisibleRect(this._bottomChromeSlot);\n player.textTrackStyle.marginTop = topChromeRect?.height;\n player.textTrackStyle.marginBottom = bottomChromeRect?.height;\n };\n\n private readonly _onPreviewTimeChange = (rawEvent: Event): void => {\n const event = rawEvent as PreviewTimeChangeEvent;\n this._previewTime = event.detail.previewTime;\n\n for (const receiver of this._stateReceivers) {\n if (receiver[StateReceiverProps].indexOf('previewTime') >= 0) {\n receiver.previewTime = this._previewTime;\n }\n }\n };\n}\n\ncustomElements.define('theoplayer-ui', UIContainer);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-ui': UIContainer;\n }\n}\n\nfunction getVisibleRect(slot: HTMLSlotElement): Rectangle | undefined {\n let result: Rectangle | undefined;\n const children = slot.assignedNodes().filter(isHTMLElement);\n for (const child of children) {\n if (getComputedStyle(child).opacity !== '0') {\n const childRect = Rectangle.fromRect(child.getBoundingClientRect());\n if (childRect.width > 0 && childRect.height > 0) {\n result = result ? result.union(childRect) : childRect;\n }\n }\n }\n return result;\n}\n","import * as shadyCss from '@webcomponents/shadycss';\nimport type { ChromelessPlayer, PlayerConfiguration, SourceDescription } from 'theoplayer/chromeless';\nimport type { UIContainer } from './UIContainer';\nimport defaultUiCss from './DefaultUI.css';\nimport defaultUiHtml from './DefaultUI.html';\nimport { Attribute } from './util/Attribute';\nimport { applyExtensions } from './extensions/ExtensionRegistry';\nimport { isMobile, isTv } from './util/Environment';\nimport type { DeviceType } from './util/DeviceType';\nimport type { StreamType } from './util/StreamType';\nimport type { TimeRange } from './components/TimeRange';\nimport { STREAM_TYPE_CHANGE_EVENT } from './events/StreamTypeChangeEvent';\nimport { READY_EVENT } from './events/ReadyEvent';\nimport { toggleAttribute } from './util/CommonUtils';\nimport { createCustomEvent } from './util/EventUtils';\nimport { createTemplate } from './util/TemplateUtils';\n\nconst template = createTemplate('theoplayer-default-ui', `<style>${defaultUiCss}</style>${defaultUiHtml}`);\n\n/**\n * `<theoplayer-default-ui>` - A default UI for THEOplayer.\n *\n * This default UI provides a great player experience out-of-the-box, that works well on all types of devices\n * and for all types of streams. It provides all the common playback controls for playing, seeking,\n * changing languages and qualities. It also supports advertisements and casting.\n *\n * ## Usage\n *\n * 1. Create a `<theoplayer-default-ui>` element.\n * 1. Set its `configuration` attribute or property to a valid player configuration.\n * 1. Set its `source` attribute or property to a valid stream source.\n * 1. Optionally, customize the player using CSS custom properties and/or extra controls.\n *\n * ## Customization\n *\n * The styling can be controlled using CSS custom properties (see {@link UIContainer | `<theoplayer-ui>`}).\n * Additional controls can be added to the `top-control-bar` and `bottom-control-bar` slots.\n * For more extensive customizations, we recommend defining your own custom UI using\n * a {@link UIContainer | `<theoplayer-ui>`}.\n *\n * @attribute `configuration` - The THEOplayer {@link theoplayer!PlayerConfiguration | PlayerConfiguration}, as a JSON string.\n * @attribute `source` - The THEOplayer {@link theoplayer!SourceDescription | SourceDescription}, as a JSON string.\n * @attribute `fluid` - If set, the player automatically adjusts its height to fit the video's aspect ratio.\n * @attribute `muted` - If set, the player starts out as muted. Reflects `ui.player.muted`.\n * @attribute `autoplay` - If set, the player attempts to automatically start playing (if allowed).\n * @attribute `device-type` - The device type, either \"desktop\", \"mobile\" or \"tv\".\n * Can be used in CSS to show/hide certain device-specific UI controls.\n * @attribute `mobile` - Whether the user is on a mobile device. Equivalent to `device-type == \"mobile\"`.\n * @attribute `tv` - Whether the user is on a TV device. Equivalent to `device-type == \"tv\"`.\n * @attribute `stream-type` - The stream type, either \"vod\", \"live\" or \"dvr\".\n * Can be used to show/hide certain UI controls specific for livestreams, such as\n * a {@link LiveButton | `<theoplayer-live-button>`}.\n * If you know in advance that the source will be a livestream, you can set this attribute to avoid a screen flicker\n * when the player switches between its VOD-specific and live-only controls.\n * @attribute `user-idle-timeout` - The timeout (in seconds) between when the user stops interacting with the UI,\n * and when the user is considered to be \"idle\".\n * @attribute `dvr-threshold` - The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n * and its stream type to be set to \"dvr\".\n *\n * @slot `title` - A slot for the stream's title in the top control bar.\n * @slot `top-control-bar` - A slot for extra UI controls in the top control bar.\n * @slot `bottom-control-bar` - A slot for extra UI controls in the bottom control bar.\n * @slot `menu` - A slot for extra menus (see {@link Menu | `<theoplayer-menu>`}).\n * @group Components\n */\nexport class DefaultUI extends HTMLElement {\n /**\n * Fired when the backing player is created, and the {@link DefaultUI.player} property is set.\n *\n * @group Events\n */\n static READY_EVENT: typeof READY_EVENT = READY_EVENT;\n\n static get observedAttributes() {\n return [\n Attribute.CONFIGURATION,\n Attribute.SOURCE,\n Attribute.MUTED,\n Attribute.AUTOPLAY,\n Attribute.FLUID,\n Attribute.DEVICE_TYPE,\n Attribute.STREAM_TYPE,\n Attribute.USER_IDLE_TIMEOUT,\n Attribute.DVR_THRESHOLD,\n Attribute.HAS_TITLE\n ];\n }\n\n private readonly _ui: UIContainer;\n private readonly _titleSlot: HTMLSlotElement;\n private readonly _timeRange: TimeRange;\n private _appliedExtensions: boolean = false;\n\n /**\n * Creates a new THEOplayer default UI.\n *\n * @param configuration - The player configuration.\n * Will be passed to the {@link theoplayer!ChromelessPlayer | ChromelessPlayer} constructor to create\n * the underlying THEOplayer instance.\n * Can also be set later on through the {@link configuration} property.\n */\n constructor(configuration: PlayerConfiguration = {}) {\n super();\n const shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: true });\n shadowRoot.appendChild(template().content.cloneNode(true));\n\n this._ui = shadowRoot.querySelector('theoplayer-ui')!;\n this._ui.addEventListener(READY_EVENT, this._dispatchReadyEvent);\n this._ui.addEventListener(STREAM_TYPE_CHANGE_EVENT, this._updateStreamType);\n this.setConfiguration_(configuration);\n\n this._titleSlot = shadowRoot.querySelector('slot[name=\"title\"]')!;\n this._titleSlot.addEventListener('slotchange', this._onTitleSlotChange);\n\n this._timeRange = shadowRoot.querySelector('theoplayer-time-range')!;\n\n this._upgradeProperty('configuration');\n this._upgradeProperty('source');\n this._upgradeProperty('fluid');\n this._upgradeProperty('muted');\n this._upgradeProperty('autoplay');\n this._upgradeProperty('streamType');\n this._upgradeProperty('userIdleTimeout');\n this._upgradeProperty('dvrThreshold');\n }\n\n private _upgradeProperty(prop: keyof this) {\n if (this.hasOwnProperty(prop)) {\n let value = this[prop];\n delete this[prop];\n this[prop] = value;\n }\n }\n\n /**\n * The underlying THEOplayer player instance.\n *\n * This is constructed automatically as soon as a valid {@link configuration} is set.\n */\n get player(): ChromelessPlayer | undefined {\n return this._ui.player;\n }\n\n /**\n * The player configuration.\n *\n * Used to create the underlying THEOplayer instance.\n */\n get configuration(): PlayerConfiguration {\n return this._ui.configuration;\n }\n\n set configuration(configuration: PlayerConfiguration) {\n this.removeAttribute(Attribute.CONFIGURATION);\n this.setConfiguration_(configuration);\n }\n\n private setConfiguration_(configuration: PlayerConfiguration) {\n this._ui.configuration = {\n ...configuration,\n ads: {\n ...(configuration.ads ?? {}),\n // Always disable Google IMA's own ad countdown,\n // since we show our own countdown in the default UI.\n showCountdown: false\n }\n };\n }\n\n /**\n * The player's current source.\n */\n get source(): SourceDescription | undefined {\n return this._ui.source;\n }\n\n set source(value: SourceDescription | undefined) {\n this.removeAttribute(Attribute.SOURCE);\n this._ui.source = value;\n }\n\n /**\n * Whether to automatically adjusts the player's height to fit the video's aspect ratio.\n */\n get fluid(): boolean {\n return this._ui.fluid;\n }\n\n set fluid(value: boolean) {\n this._ui.fluid = value;\n }\n\n /**\n * Whether the player's audio is muted.\n */\n get muted(): boolean {\n return this._ui.muted;\n }\n\n set muted(value: boolean) {\n this._ui.muted = value;\n }\n\n /**\n * Whether the player should attempt to automatically start playback.\n */\n get autoplay(): boolean {\n return this._ui.autoplay;\n }\n\n set autoplay(value: boolean) {\n this._ui.autoplay = value;\n }\n\n /**\n * The stream type, either \"vod\", \"live\" or \"dvr\".\n *\n * If you know in advance that the source will be a livestream, you can set this property to avoid a screen flicker\n * when the player switches between its VOD-specific and live-only controls.\n */\n get streamType(): StreamType {\n return this._ui.streamType;\n }\n\n set streamType(value: StreamType) {\n this._ui.streamType = value;\n }\n\n /**\n * The timeout (in seconds) between when the user stops interacting with the UI,\n * and when the user is considered to be \"idle\".\n */\n get userIdleTimeout(): number {\n return this._ui.userIdleTimeout;\n }\n\n set userIdleTimeout(value: number) {\n this._ui.userIdleTimeout = value;\n }\n\n /**\n * The minimum length (in seconds) of a livestream's sliding window for the stream to be DVR\n * and its stream type to be set to \"dvr\".\n */\n get dvrThreshold(): number {\n return this._ui.dvrThreshold;\n }\n\n set dvrThreshold(value: number) {\n this._ui.dvrThreshold = value;\n }\n\n connectedCallback(): void {\n shadyCss.styleElement(this);\n\n if (!this.hasAttribute(Attribute.DEVICE_TYPE)) {\n const deviceType: DeviceType = isMobile() ? 'mobile' : isTv() ? 'tv' : 'desktop';\n this.setAttribute(Attribute.DEVICE_TYPE, deviceType);\n }\n\n if (!this._appliedExtensions) {\n this._appliedExtensions = true;\n applyExtensions(this);\n shadyCss.styleSubtree(this);\n }\n\n this._onTitleSlotChange();\n }\n\n disconnectedCallback(): void {\n return;\n }\n\n attributeChangedCallback(attrName: string, oldValue: any, newValue: any): void {\n if (newValue === oldValue) {\n return;\n }\n const hasValue = newValue != null;\n if (attrName === Attribute.SOURCE) {\n this._ui.source = newValue ? (JSON.parse(newValue) as SourceDescription) : undefined;\n } else if (attrName === Attribute.CONFIGURATION) {\n this.setConfiguration_(newValue ? (JSON.parse(newValue) as PlayerConfiguration) : {});\n } else if (attrName === Attribute.MUTED) {\n this.muted = hasValue;\n } else if (attrName === Attribute.AUTOPLAY) {\n this.autoplay = hasValue;\n } else if (attrName === Attribute.FLUID) {\n this.fluid = hasValue;\n } else if (attrName === Attribute.DEVICE_TYPE) {\n toggleAttribute(this, Attribute.MOBILE, newValue === 'mobile');\n toggleAttribute(this, Attribute.TV, newValue === 'tv');\n this._ui.setAttribute(Attribute.DEVICE_TYPE, newValue);\n } else if (attrName === Attribute.STREAM_TYPE) {\n this.streamType = newValue;\n } else if (attrName === Attribute.USER_IDLE_TIMEOUT) {\n this.userIdleTimeout = Number(newValue);\n } else if (attrName === Attribute.DVR_THRESHOLD) {\n this.dvrThreshold = Number(newValue);\n }\n if (DefaultUI.observedAttributes.indexOf(attrName as Attribute) >= 0) {\n shadyCss.styleSubtree(this);\n }\n }\n\n private readonly _updateStreamType = () => {\n this.setAttribute(Attribute.STREAM_TYPE, this.streamType);\n // Hide seekbar when stream is live with no DVR\n toggleAttribute(this._timeRange, Attribute.HIDDEN, this.streamType === 'live');\n };\n\n private readonly _dispatchReadyEvent = () => {\n this.dispatchEvent(createCustomEvent(READY_EVENT));\n };\n\n private readonly _onTitleSlotChange = () => {\n toggleAttribute(this, Attribute.HAS_TITLE, this._titleSlot.assignedNodes().length > 0);\n };\n}\n\ncustomElements.define('theoplayer-default-ui', DefaultUI);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'theoplayer-default-ui': DefaultUI;\n }\n}\n"],"names":["styleElement","element","undefined","window","ShadyCSS","nativeShadow","styleSubtree","properties","nativeCss","setProperties","style","propertyName","value","Object","entries","setProperty","template","createTemplate","ControlBar","HTMLElement","connectedCallback","shadyCss","constructor","shadowRoot","attachShadow","mode","delegatesFocus","appendChild","content","cloneNode","noOp","isElement","node","nodeType","Node","ELEMENT_NODE","isHTMLElement","customElements","define","Attribute","isArray","Array","arg","prototype","toString","call","fromArrayLike","from","arrayLike","slice","arrayFind","find","array","predicate","i","length","arrayFindIndex","findIndex","stringStartsWith","String","startsWith","string","search","substring","localizeLanguageName","Intl","DisplayNames","languageCode","displayNames","type","fallback","localName","of","toUpperCase","_languageCode","setTextContent","el","text","textContent","innerText","toggleAttribute","attribute","enabled","setAttribute","removeAttribute","getChildren","children","toLowerCase","assignedNodes","filter","getFocusableChildren","result","collectFocusableChildren","getComputedStyle","display","hasAttribute","Number","getAttribute","push","tagName","href","upgradeCustomElementIfNeeded","elementName","nodeName","indexOf","get","whenDefined","upgrade","buttonTemplate","button","extraCss","defaultTemplate","Button","observedAttributes","DISABLED","_upgradeProperty","prop","hasOwnProperty","ARIA_LIVE","addEventListener","_onClick","disconnectedCallback","removeEventListener","disabled","attributeChangedCallback","attrName","oldValue","newValue","hasValue","blur","handleClick","options","isArrowKey","keyCode","KeyCode","isBackKey","linkButtonTemplate","LinkButton","_linkEl","_onKeyDown","setLink","target","event","altKey","SPACE","preventDefault","click","querySelector","StateReceiverProps","isStateReceiverElement","StateReceiverMixin","base","props","forEachStateReceiverElement","playerElement","callback","contains","Promise","resolve","all","map","child","PLAYER_EVENTS","PlayButton","PAUSED","ENDED","_updateFromPlayer","_updateAriaLabel","paused","ended","player","_player","_onPlay","_onPause","_updateEnded","_this__player","_this__player_ended","source","play","pause","label","ARIA_LABEL","_this__player_paused","_updateDisabled","MuteButton","VOLUME_LEVEL","volumeLevel","muted","volume","SeekButton","SEEK_OFFSET","seekOffset","_this_getAttribute","duration","isNaN","currentTime","Math","max","min","_offsetEl","abs","isValidNumber","x","isFinite","formatTime","time","guide","preferNegative","timeParts","negative","guideMinutes","floor","guideHours","seconds","minutes","hours","showHours","showMinutesLeadingZero","timePhrase","part","join","timeUnitLabels","toTimeUnitPhrase","timeUnitValue","unitIndex","unitLabel","formatAsTimePhrase","TimeDisplay","REMAINING","REMAINING_WHEN_LIVE","SHOW_DURATION","STREAM_TYPE","streamType","ariaValueText","NaN","seekable","endTime","end","remaining","showDuration","_spanEl","DurationDisplay","createEvent","supportsNativeEvent","Event","e","eventInitDict","document","initEvent","bubbles","cancelable","createCustomEvent","supportsNativeCustomEvent","CustomEvent","detail","foo","initCustomEvent","RadioButton","ARIA_CHECKED","VALUE","checked","_value","dispatchEvent","composed","Rectangle","left","right","width","top","y","bottom","height","fromRect","rect","overlaps","other","union","snapToPixels","round","clone","toJSON","getFocusedChild","focusedChild","getActiveElement","activeElement","nextActiveElement","body","navigateByArrowKey","container","key","keySelector","candidates","containerRect","getBoundingClientRect","focusedRect","childrenWithRects","LEFT","RIGHT","bounds","UP","closestCandidate","a","distance","b","arrayMinBy","comparator","reduce","first","second","focus","RadioGroup","_onButtonChange","_slot","_onSlotChange","deviceType","DEVICE_TYPE","focusedRadioButton","_radioButtons","tabIndex","checkedRadioButton","firstRadioButton","_this__radioButtons_","lastRadioButton","radioButtons","allRadioButtons","_prevRadioButton","index","_nextRadioButton","_focusPrevButton","focusedButton","setFocusedRadioButton","_focusNextButton","_unfocusAll","setCheckedRadioButton","checkedButton","flatten","upgradePromises","isRadioButton","promise","then","_this_firstRadioButton","stopPropagation","DOWN","HOME","END","CLOSE_MENU_EVENT","MENU_CHANGE_EVENT","menuTemplate","heading","Menu","MENU_OPENED","MENU_CLOSE_ON_INPUT","_contentEl","_onContentInput","closeOnInput","openMenu","closeMenu","HIDDEN","changeEvent","TOGGLE_MENU_EVENT","menuGroupTemplate","MenuGroup","_this__menuSlot","_onMenuListChange","_onToggleMenu","_onCloseMenu","_onMenuChange","_menuSlot","getMenuById","menuId","id","_menus","menu","opener","menuToOpen","previousEntry","getCurrentMenu_","_openMenuStack","entry","closeMenusFromIndex_","oldEntry","_this__openMenuStack_","menuToClose","nextEntry","menusToClose","splice","hasCurrentMenu","closeCurrentMenu","currentMenu","isMenuOpen","some","isMenuElement","newMenus","oldMenu","newMenu","rawEvent","MenuButton","MENU","CloseMenuButton","TRACK_EVENTS","MediaTrackRadioButton","track","_track","_onTrackChange","_updateFromTrack","_slotEl","getTrackLabel","language","_updateTrack","TextTrackRadioButton","isSubtitleTrack","kind","getTargetQualities","videoTrack","targetQualities","targetQuality","formatQualityLabel","quality","bandwidth","formatBandwidth","toFixed","TextTrackOffRadioButton","trackList","_trackList","_updateFromTrackList","_updateTrackList","disableSubtitleTracks","TrackRadioGroup","TRACK_TYPE","SHOW_OFF","_radioGroup","_updateOffButton","_updateTracks","_onChange","trackType","showOffButton","_updateTracksList","_getTracksList","audioTracks","videoTracks","textTracks","oldList","_tracksList","newList","_getTracks","_createTrackButton","_offButton","insertBefore","firstChild","removeChild","oldButtons","newTracks","oldButton","newTrack","hasButtonForTrack","buttons","newButton","ExtensionSlot","parseColor","colorString","parseRgbaColor","rgbaString","m","match","r_","parseInt","g_","b_","a_","parseFloat","parseHexColor","hex","toRgba","color","toRgb","colorWithAlpha","alpha","COLOR_WHITE","COLOR_BLACK","knownColors","knownFontFamilies","knownEdgeStyles","TextTrackStyleDisplay","PROPERTY","property","textTrackStyle","getFontFamilyLabel","fontFamily","knownFontFamily","param","_","getColorLabel","parsedColor","colorRgb","knownColor","getOpacityLabel","fontColor","backgroundColor","windowColor","getEdgeStyleLabel","edgeStyle","knownEdgeStyle","createElement","TextTrackStyleRadioGroup","_updateChecked","_optionsSlot","_updateToPlayer","updateColor","updateOpacity","_this__player_textTrackStyle_this_property","colorValue","previousColor","defaultColor","opacityValue","menuTableCss","TextTrackStyleMenu","LanguageMenu","HAS_AUDIO","HAS_SUBTITLES","_updateAudioTracks","_updateTextTracks","_this__player_audioTracks","newAudioTracks","_this__player_textTracks_filter","newSubtitleTracks","LanguageMenuButton","hasTracks","PlaybackRateRadioGroup","playbackRate","PlaybackRateMenuButton","PlaybackRateMenu","PlaybackRateDisplay","_playbackRate","ActiveQualityDisplay","activeVideoQuality","_activeVideoQuality","update_","targetVideoQualities","_targetVideoQualities","qualities","hasSingleTargetQuality","selectedQuality","qualityLabel","QUALITY_EVENTS","QualityRadioButton","_quality","_updateFromQuality","_updateTargetQuality","QualityRadioGroup","_update","availableQualities","TextTrackStyleResetButton","fontSize","SettingsMenu","SettingsMenuButton","ENTER_FULLSCREEN_EVENT","EXIT_FULLSCREEN_EVENT","FullscreenButton","FULLSCREEN","fullscreen","ColorStops","add","to","previousIndex","_stops","percent","previousPercent","newStops","nextIndex","toGradientStops","gradientStops","prevPercent","rangeTemplate","range","Range","_rangeEl","getAriaLabel","update","_updatePointerBar","valueAsNumber","handleInput","step","raw","getAriaValueText","updateBar_","getBarColors","relativeValue","relativeMax","rangePercent","rangeWidth","offsetWidth","_lastRangeWidth","thumbPercent","thumbWidth","getPropertyValue","thumbOffset","stops","updatePointer_","mousePercent","rangeRect","_pointerEl","handleKeyDown_","_onInput","clientX","PREVIEW_TIME_CHANGE_EVENT","isLinearAd","ad","PreviewThumbnail","_updateThumbnailTextTrack","previewTime","_previewTime","updateThumbnail_","_thumbnailTextTrack","hideThumbnail_","cue","getCueAtTime","cues","startTime","trim","sprite","parseSpriteUrl","spriteUrl","url","w","h","thumbnailUrl","URL","src","location","_lastLoadedThumbnailUrl","loadThumbnailImage_","showThumbnail_","_thumbnailImageSource","onLoad","decode","onload","_canvasEl","_canvasContext","drawImage","naturalWidth","naturalHeight","oldTrack","isThumbnailTextTrack","getContext","decoding","PreviewTimeDisplay","UPDATE_EVENTS","AUTO_ADVANCE_EVENTS","AD_EVENTS","TimeRange","SHOW_AD_MARKERS","_toggleAutoAdvance","_this__player_ads","_this__player_ads1","ads","_onAdChange","currentTimePhrase","totalTimePhrase","shouldAutoAdvance_","isConnected","errorObject","readyState","previewPos","previewBoxRect","_previewBoxEl","minPreviewPos","maxPreviewPos","previewPosFraction","_previewRailEl","transform","previewTimeChangeEvent","colorStops","playing","adBreak","scheduledAdBreaks","adBreakTime","timeOffset","adBreakFrom","adBreakTo","adBreakPercent","ENTER","_pausedWhileScrubbing","_autoAdvanceId","_lastUpdateTime","_lastCurrentTime","_lastPlaybackRate","performance","now","start","isLive","Infinity","_pauseOnScrubStart","_playOnScrubEnd","requestAnimationFrame","_autoAdvanceWhilePlaying","cancelAnimationFrame","delta","VolumeRange","ErrorDisplay","error","_error","_messageSlot","message","CastButton","CAST_STATE","_updateCastState","castApi","_castApi","castState","state","stop","maskId","chromecastButtonId","ChromecastButton","cast","chromecast","mask","rings","uniqueMaskId","CAST_EVENTS","ChromecastDisplay","_this__player_cast_chromecast","_this__player_cast","_this__player_cast_chromecast1","_this__player_cast1","_this__player1","_receiverNameEl","receiverName","AirPlayButton","airplay","LoadingIndicator","LOADING","loading","seeking","GestureReceiver","_onPointerDown","handleTap","_event","handleMouseClick","_pointerType","pointerType","_event_pointerType","PAUSED_EVENTS","LIVE_EVENTS","LiveButton","LIVE","LIVE_THRESHOLD","liveThreshold","live","_updatePaused","_updateLive","hesp","manifest","goLive","threshold","AdDisplay","linearAds","currentAdBreak","currentAds","currentLinearAd","currentAdIndex","AdCountdown","maxRemainingDuration","ceil","AdClickThroughButton","CLICKTHROUGH","clickThrough","linearAd","integration","AdSkipButton","skip","skipOffset","_countdownEl","visibility","_skipEl","pointerEvents","extensionRegistry","registerExtension","extension","fullscreenAPI","browserMap","requestFullscreen_","exitFullscreen_","fullscreenElement_","fullscreenEnabled_","fullscreenchange_","fullscreenerror_","isMobile","navigator","userAgentData","mobile","userAgent","test","isTv","STREAM_TYPE_CHANGE_EVENT","READY_EVENT","UIContainer","CONFIGURATION","SOURCE","MUTED","AUTOPLAY","FLUID","CASTING","PLAYING_AD","HAS_ERROR","HAS_FIRST_PLAY","DVR_THRESHOLD","USER_IDLE","USER_IDLE_TIMEOUT","configuration","_configuration","playerConfiguration","_setConfiguration","tryInitializePlayer_","_source","_setSource","fluid","autoplay","casting","userIdleTimeout","defaultTimeout","dvrThreshold","_this__resizeObserver","_menuGroup","receiver","_stateReceivers","propagateStateToReceiver_","_playerEl","registerStateReceiver_","_mutationObserver","observe","childList","subtree","_resizeObserver","_updateTextTrackMargins","_onFullscreenChange","setUserIdle_","_onTvKeyDown","_onKeyUp","_onPointerUp","_onPointerMove","_onMouseLeave","license","licenseUrl","ChromelessPlayer","_updateAspectRatio","_updateError","_updatePausedAndEnded","_updateCasting","_updateMuted","_updateStreamType","_updatePlaybackRate","_onSourceChange","_updateActiveVideoTrack","_updatePlayingAd","disconnect","removeStateFromReceiver_","_onClickAfterPointerUp","destroy","JSON","parse","MOBILE","TV","streamTypeChangeEvent","receiverProps","_this__activeVideoTrack","_activeVideoTrack","activeQuality","openMenu_","topChromeRect","_topChromeEl","bottomChromeRect","_bottomChromeEl","alignBottom","alignRight","playerRect","openerRect","_menuOpener","closeMenu_","_this__menuGroup_closeMenu","_this__menuGroup","_this__menuOpener","isUserIdle_","setUserActive_","clearTimeout","_userIdleTimer","isPlayerOrMedia_","_lastPointerUpTime","_onMutation","mutations","mutation","addedNodes","removedNodes","unregisterStateReceiver_","arrayRemove","arrayRemoveAt","console","_menuEl","_onMenuPointerDown","_onMenuClick","_onEnterFullscreen","presentation","supportsMode","requestMode","_onExitFullscreen","currentMode","isFullscreen","fullscreenElement","containsComposedNode","rootNode","childNode","childRoot","getRootNode","host","videoWidth","videoHeight","activeVideoTrack","_this__activeVideoTrack1","_this__activeVideoTrack2","_this__activeVideoTrack3","_updateActiveVideoQuality","_updateTargetVideoQualities","_this__player_cast_casting","_this__player_ads_playing","playingAd","isPlaying","scheduleUserIdle_","setTimeout","tvFocusChildren","getTvFocusChildren","TV_FOCUS","focusableChildren","_onChromeSlotTransition","getVisibleRect","_topChromeSlot","_bottomChromeSlot","marginTop","marginBottom","_onPreviewTimeChange","MutationObserver","ResizeObserver","slot","opacity","childRect","DefaultUI","HAS_TITLE","_ui","setConfiguration_","showCountdown","_appliedExtensions","applyExtensions","ui","_onTitleSlotChange","_timeRange","_dispatchReadyEvent","_titleSlot"],"mappings":"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","x_google_ignoreList":[0]}